New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
p4zmeso.F90 in branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zmeso.F90 @ 4148

Last change on this file since 4148 was 4148, checked in by cetlod, 10 years ago

merge in trunk changes between r3853 and r3940 and commit the changes, see ticket #1169

File size: 17.9 KB
Line 
1MODULE p4zmeso
2   !!======================================================================
3   !!                         ***  MODULE p4zmeso  ***
4   !! TOP :   PISCES Compute the sources/sinks for mesozooplankton
5   !!======================================================================
6   !! History :   1.0  !  2002     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Quota model for iron
9   !!----------------------------------------------------------------------
10#if defined key_pisces
11   !!----------------------------------------------------------------------
12   !!   'key_pisces'                                       PISCES bio-model
13   !!----------------------------------------------------------------------
14   !!   p4z_meso       :   Compute the sources/sinks for mesozooplankton
15   !!   p4z_meso_init  :   Initialization of the parameters for mesozooplankton
16   !!----------------------------------------------------------------------
17   USE oce_trc         !  shared variables between ocean and passive tracers
18   USE trc             !  passive tracers common variables
19   USE sms_pisces      !  PISCES Source Minus Sink variables
20   USE p4zsink         !  vertical flux of particulate matter due to sinking
21   USE p4zint          !  interpolation and computation of various fields
22   USE p4zprod         !  production
23   USE prtctl_trc      !  print control for debugging
24   USE iom             !  I/O manager
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   p4z_meso              ! called in p4zbio.F90
30   PUBLIC   p4z_meso_init         ! called in trcsms_pisces.F90
31
32   !! * Shared module variables
33   REAL(wp), PUBLIC ::  part2        !: part of calcite not dissolved in mesozoo guts
34   REAL(wp), PUBLIC ::  xprefc       !: mesozoo preference for POC
35   REAL(wp), PUBLIC ::  xprefp       !: mesozoo preference for nanophyto
36   REAL(wp), PUBLIC ::  xprefz       !: mesozoo preference for diatoms
37   REAL(wp), PUBLIC ::  xprefpoc     !: mesozoo preference for POC
38   REAL(wp), PUBLIC ::  xthresh2zoo  !: zoo feeding threshold for mesozooplankton
39   REAL(wp), PUBLIC ::  xthresh2dia  !: diatoms feeding threshold for mesozooplankton
40   REAL(wp), PUBLIC ::  xthresh2phy  !: nanophyto feeding threshold for mesozooplankton
41   REAL(wp), PUBLIC ::  xthresh2poc  !: poc feeding threshold for mesozooplankton
42   REAL(wp), PUBLIC ::  xthresh2     !: feeding threshold for mesozooplankton
43   REAL(wp), PUBLIC ::  resrat2      !: exsudation rate of mesozooplankton
44   REAL(wp), PUBLIC ::  mzrat2       !: microzooplankton mortality rate
45   REAL(wp), PUBLIC ::  grazrat2     !: maximal mesozoo grazing rate
46   REAL(wp), PUBLIC ::  xkgraz2      !: non assimilated fraction of P by mesozoo
47   REAL(wp), PUBLIC ::  unass2       !: Efficicency of mesozoo growth
48   REAL(wp), PUBLIC ::  sigma2       !: Fraction of mesozoo excretion as DOM
49   REAL(wp), PUBLIC ::  epsher2      !: half sturation constant for grazing 2
50   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate
51
52   !!* Substitution
53#  include "top_substitute.h90"
54   !!----------------------------------------------------------------------
55   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
56   !! $Id: p4zmeso.F90 3160 2011-11-20 14:27:18Z cetlod $
57   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
58   !!----------------------------------------------------------------------
59
60CONTAINS
61
62   SUBROUTINE p4z_meso( kt, jnt )
63      !!---------------------------------------------------------------------
64      !!                     ***  ROUTINE p4z_meso  ***
65      !!
66      !! ** Purpose :   Compute the sources/sinks for mesozooplankton
67      !!
68      !! ** Method  : - ???
69      !!---------------------------------------------------------------------
70      INTEGER, INTENT(in) ::   kt, jnt ! ocean time step
71      INTEGER  :: ji, jj, jk
72      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam
73      REAL(wp) :: zgraze2 , zdenom, zdenom2, zncratio
74      REAL(wp) :: zfact   , zstep, zfood, zfoodlim, zproport
75      REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2
76      REAL(wp) :: zepshert, zepsherv, zgrarsig, zgraztot, zgraztotf
77      REAL(wp) :: zgrarem2, zgrafer2, zgrapoc2, zprcaca, zmortz2, zgrasrat
78#if defined key_kriest
79      REAL znumpoc
80#endif
81      REAL(wp) :: zrespz2, ztortz2, zgrazd, zgrazz, zgrazpof
82      REAL(wp) :: zgrazn, zgrazpoc, zgraznf, zgrazf
83      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg
84      CHARACTER (len=25) :: charout
85      REAL(wp) :: zrfact2
86      REAL(wp), POINTER, DIMENSION(:,:,:) :: zgrazing
87
88      !!---------------------------------------------------------------------
89      !
90      IF( nn_timing == 1 )  CALL timing_start('p4z_meso')
91      !
92      IF( ln_diatrc .AND. lk_iomput ) THEN
93         CALL wrk_alloc( jpi, jpj, jpk, zgrazing )
94         zgrazing(:,:,:) = 0._wp
95      ENDIF
96
97      DO jk = 1, jpkm1
98         DO jj = 1, jpj
99            DO ji = 1, jpi
100               zcompam   = MAX( ( trn(ji,jj,jk,jpmes) - 1.e-8 ), 0.e0 )
101# if defined key_degrad
102               zstep     = xstep * facvol(ji,jj,jk)
103# else
104               zstep     = xstep
105# endif
106               zfact     = zstep * tgfunc2(ji,jj,jk) * zcompam
107
108               !  Respiration rates of both zooplankton
109               !  -------------------------------------
110               zrespz2   = resrat2 * zfact * trn(ji,jj,jk,jpmes) / ( xkmort + trn(ji,jj,jk,jpmes) )  &
111                  &      + resrat2 * zfact * 3. * nitrfac(ji,jj,jk)
112
113               !  Zooplankton mortality. A square function has been selected with
114               !  no real reason except that it seems to be more stable and may mimic predation
115               !  ---------------------------------------------------------------
116               ztortz2   = mzrat2 * 1.e6 * zfact * trn(ji,jj,jk,jpmes)
117               !
118
119               zcompadi  = MAX( ( trn(ji,jj,jk,jpdia) - xthresh2dia ), 0.e0 )
120               zcompaz   = MAX( ( trn(ji,jj,jk,jpzoo) - xthresh2zoo ), 0.e0 )
121               zcompaph  = MAX( ( trn(ji,jj,jk,jpphy) - xthresh2phy ), 0.e0 )
122               zcompapoc = MAX( ( trn(ji,jj,jk,jppoc) - xthresh2poc ), 0.e0 )
123
124               zfood     = xprefc * zcompadi + xprefz * zcompaz + xprefp * zcompaph + xprefpoc * zcompapoc 
125               zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) )
126               zdenom    = zfoodlim / ( xkgraz2 + zfoodlim )
127               zdenom2   = zdenom / ( zfood + rtrn )
128               zgraze2   = grazrat2 * zstep * tgfunc2(ji,jj,jk) * trn(ji,jj,jk,jpmes) 
129
130               zgrazd    = zgraze2  * xprefc   * zcompadi  * zdenom2 
131               zgrazz    = zgraze2  * xprefz   * zcompaz   * zdenom2 
132               zgrazn    = zgraze2  * xprefp   * zcompaph  * zdenom2 
133               zgrazpoc  = zgraze2  * xprefpoc * zcompapoc * zdenom2 
134
135               zgraznf   = zgrazn   * trn(ji,jj,jk,jpnfe) / ( trn(ji,jj,jk,jpphy) + rtrn)
136               zgrazf    = zgrazd   * trn(ji,jj,jk,jpdfe) / ( trn(ji,jj,jk,jpdia) + rtrn)
137               zgrazpof  = zgrazpoc * trn(ji,jj,jk,jpsfe) / ( trn(ji,jj,jk,jppoc) + rtrn)
138
139               !  Mesozooplankton flux feeding on GOC
140               !  ----------------------------------
141# if ! defined key_kriest
142               zgrazffeg = grazflux  * zstep * wsbio4(ji,jj,jk) * trn(ji,jj,jk,jpgoc) * trn(ji,jj,jk,jpmes)
143               zgrazfffg = zgrazffeg * trn(ji,jj,jk,jpbfe) / (trn(ji,jj,jk,jpgoc) + rtrn)
144# endif
145               zgrazffep = grazflux  * zstep *  wsbio3(ji,jj,jk) * trn(ji,jj,jk,jppoc) * trn(ji,jj,jk,jpmes)
146               zgrazfffp = zgrazffep * trn(ji,jj,jk,jpsfe) / (trn(ji,jj,jk,jppoc) + rtrn)
147              !
148# if ! defined key_kriest
149              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg
150              ! Compute the proportion of filter feeders
151              zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztot)
152              ! Compute fractionation of aggregates. It is assumed that diatoms based aggregates are more prone to fractionation
153              ! since they are more porous (marine snow instead of fecal pellets)
154              zratio    = trn(ji,jj,jk,jpgsi) / ( trn(ji,jj,jk,jpgoc) + rtrn )
155              zratio2   = zratio * zratio
156              zfrac     = zproport * zgrazffeg * ( 0.1 + 3.9 * zratio2 / ( 1.**2 + zratio2 ) )
157
158              zfracfe   = zfrac * trn(ji,jj,jk,jpbfe) / (trn(ji,jj,jk,jpgoc) + rtrn)
159
160              zgrazffep = zproport * zgrazffep
161              zgrazffeg = zproport * zgrazffeg
162              zgrazfffp = zproport * zgrazfffp
163              zgrazfffg = zproport * zgrazfffg
164              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg
165              zgraztotf = zgrazf + zgraznf + zgrazz * ferat3 + zgrazpof + zgrazfffp + zgrazfffg
166# else
167              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep
168              ! Compute the proportion of filter feeders
169              zproport  = zgrazffep / ( zgraztot + rtrn )
170              zgrazffep = zproport * zgrazffep
171              zgrazfffp = zproport * zgrazfffp
172              zgraztot  = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep
173              zgraztotf = zgrazf + zgraznf + zgrazz * ferat3 + zgrazpof + zgrazfffp
174# endif
175
176              ! Total grazing ( grazing by microzoo is already computed in p4zmicro )
177              IF( ln_diatrc .AND. lk_iomput )  zgrazing(ji,jj,jk) = zgraztot
178
179              !    Mesozooplankton efficiency
180              !    --------------------------
181              zgrasrat   =  zgraztotf / ( zgraztot + rtrn )
182              zncratio   = (  xprefc   * zcompadi * quotad(ji,jj,jk)  &
183                  &         + xprefp   * zcompaph * quotan(ji,jj,jk)  &
184                  &         + xprefz   * zcompaz                      &
185                  &         + xprefpoc * zcompapoc   ) / ( zfood + rtrn )
186               zepshert  = epsher2 * MIN( 1., zncratio )
187               zepsherv  = zepshert * MIN( 1., zgrasrat / ferat3 )
188               zgrarem2  =  zgraztot * ( 1. - zepsherv - unass2 ) + zrespz2  &
189                  &       + ( 1. - zepsherv - unass2 ) /( 1. - zepsherv ) * ztortz2
190               zgrafer2  =  zgraztot * MAX( 0. , ( 1. - unass2 ) * zgrasrat - ferat3 * zepsherv )    &
191                  &       + ferat3 * ( zrespz2 + ( 1. - zepsherv - unass2 ) /( 1. - zepsherv ) * ztortz2 )
192               zgrapoc2  = zgraztot * unass2
193
194               !   Update the arrays TRA which contain the biological sources and sinks
195               zgrarsig  = zgrarem2 * sigma2
196               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig
197               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig
198               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem2 - zgrarsig
199               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig
200               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgrafer2
201               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarsig
202               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgrarsig             
203
204               zmortz2 = ztortz2 + zrespz2
205               zmortzgoc = unass2 / ( 1. - zepsherv ) * ztortz2
206               tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) - zmortz2 + zepsherv * zgraztot 
207               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazd
208               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zgrazz
209               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgrazn
210               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgrazn * trn(ji,jj,jk,jpnch) / ( trn(ji,jj,jk,jpphy) + rtrn )
211               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazd * trn(ji,jj,jk,jpdch) / ( trn(ji,jj,jk,jpdia) + rtrn )
212               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazd * trn(ji,jj,jk,jpdsi) / ( trn(ji,jj,jk,jpdia) + rtrn )
213               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazd * trn(ji,jj,jk,jpdsi) / ( trn(ji,jj,jk,jpdia) + rtrn )
214               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgraznf
215               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazf
216
217               zprcaca = xfracal(ji,jj,jk) * zgrazn
218               ! calcite production
219               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
220               !
221               zprcaca = part2 * zprcaca
222               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprcaca
223               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * zprcaca
224               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) + zprcaca
225#if defined key_kriest
226               znumpoc = trn(ji,jj,jk,jpnum) / ( trn(ji,jj,jk,jppoc) + rtrn )
227               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zmortzgoc - zgrazpoc - zgrazffep + zgrapoc2
228               tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) - zgrazpoc * znumpoc + zgrapoc2 * xkr_dmeso      &
229               &                   + zmortzgoc * xkr_dmeso - zgrazffep * znumpoc * wsbio4(ji,jj,jk) / ( wsbio3(ji,jj,jk) + rtrn )
230               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + ferat3 * zmortz2 - zgrazfffp - zgrazpof + zgraztotf * unass2
231#else
232               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfrac
233               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zmortzgoc - zgrazffeg + zgrapoc2 - zfrac
234               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe
235               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + ferat3 * zmortzgoc - zgrazfffg + zgraztotf * unass2 - zfracfe
236#endif
237            END DO
238         END DO
239      END DO
240      !
241      IF( ln_diatrc .AND. lk_iomput .AND. jnt == nrdttrc ) THEN
242         zrfact2 = 1.e3 * rfact2r
243         CALL iom_put( "GRAZ2", zgrazing(:,:,:) * zrfact2 * tmask(:,:,:) )  ! Total grazing of phyto by zooplankton
244         CALL iom_put( "PCAL" , prodcal(:,:,:)  * zrfact2 * tmask(:,:,:) )  ! Calcite production
245      ENDIF
246      !
247      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
248        WRITE(charout, FMT="('meso')")
249        CALL prt_ctl_trc_info(charout)
250        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
251      ENDIF
252      !
253      IF( ln_diatrc .AND. lk_iomput )  CALL wrk_dealloc( jpi, jpj, jpk, zgrazing )
254      !
255      IF( nn_timing == 1 )  CALL timing_stop('p4z_meso')
256      !
257   END SUBROUTINE p4z_meso
258
259   SUBROUTINE p4z_meso_init
260
261      !!----------------------------------------------------------------------
262      !!                  ***  ROUTINE p4z_meso_init  ***
263      !!
264      !! ** Purpose :   Initialization of mesozooplankton parameters
265      !!
266      !! ** Method  :   Read the nampismes namelist and check the parameters
267      !!      called at the first timestep (nittrc000)
268      !!
269      !! ** input   :   Namelist nampismes
270      !!
271      !!----------------------------------------------------------------------
272
273      NAMELIST/nampismes/ part2, grazrat2, resrat2, mzrat2, xprefc, xprefp, xprefz,   &
274         &                xprefpoc, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
275         &                xthresh2, xkgraz2, epsher2, sigma2, unass2, grazflux
276      INTEGER :: ios                 ! Local integer output status for namelist read
277
278      REWIND( numnatp_ref )              ! Namelist nampismes in reference namelist : Pisces mesozooplankton
279      READ  ( numnatp_ref, nampismes, IOSTAT = ios, ERR = 901)
280901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismes in reference namelist', lwp )
281
282      REWIND( numnatp_cfg )              ! Namelist nampismes in configuration namelist : Pisces mesozooplankton
283      READ  ( numnatp_cfg, nampismes, IOSTAT = ios, ERR = 902 )
284902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismes in configuration namelist', lwp )
285      WRITE ( numonp, nampismes )
286
287
288      IF(lwp) THEN                         ! control print
289         WRITE(numout,*) ' ' 
290         WRITE(numout,*) ' Namelist parameters for mesozooplankton, nampismes'
291         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
292         WRITE(numout,*) '    part of calcite not dissolved in mesozoo guts  part2        =', part2
293         WRITE(numout,*) '    mesozoo preference for phyto                   xprefc       =', xprefc
294         WRITE(numout,*) '    mesozoo preference for POC                     xprefp       =', xprefp
295         WRITE(numout,*) '    mesozoo preference for zoo                     xprefz       =', xprefz
296         WRITE(numout,*) '    mesozoo preference for poc                     xprefpoc     =', xprefpoc
297         WRITE(numout,*) '    microzoo feeding threshold  for mesozoo        xthresh2zoo  =', xthresh2zoo
298         WRITE(numout,*) '    diatoms feeding threshold  for mesozoo         xthresh2dia  =', xthresh2dia
299         WRITE(numout,*) '    nanophyto feeding threshold for mesozoo        xthresh2phy  =', xthresh2phy
300         WRITE(numout,*) '    poc feeding threshold for mesozoo              xthresh2poc  =', xthresh2poc
301         WRITE(numout,*) '    feeding threshold for mesozooplankton          xthresh2     =', xthresh2
302         WRITE(numout,*) '    exsudation rate of mesozooplankton             resrat2      =', resrat2
303         WRITE(numout,*) '    mesozooplankton mortality rate                 mzrat2       =', mzrat2
304         WRITE(numout,*) '    maximal mesozoo grazing rate                   grazrat2     =', grazrat2
305         WRITE(numout,*) '    mesozoo flux feeding rate                      grazflux     =', grazflux
306         WRITE(numout,*) '    non assimilated fraction of P by mesozoo       unass2       =', unass2
307         WRITE(numout,*) '    Efficicency of Mesozoo growth                  epsher2      =', epsher2
308         WRITE(numout,*) '    Fraction of mesozoo excretion as DOM           sigma2       =', sigma2
309         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2      =', xkgraz2
310      ENDIF
311
312
313   END SUBROUTINE p4z_meso_init
314
315
316#else
317   !!======================================================================
318   !!  Dummy module :                                   No PISCES bio-model
319   !!======================================================================
320CONTAINS
321   SUBROUTINE p4z_meso                    ! Empty routine
322   END SUBROUTINE p4z_meso
323#endif 
324
325   !!======================================================================
326END MODULE  p4zmeso
Note: See TracBrowser for help on using the repository browser.