source: NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p4zmeso.F90 @ 12537

Last change on this file since 12537 was 12537, checked in by aumont, 11 months ago

Comments in routines have been revised and significantly augmented

  • Property svn:keywords set to Id
File size: 31.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   !!   p4z_meso        : Compute the sources/sinks for mesozooplankton
11   !!   p4z_meso_init   : Initialization of the parameters for mesozooplankton
12   !!   p4z_meso_alloc  : Allocate variables for mesozooplankton
13   !!----------------------------------------------------------------------
14   USE oce_trc         ! shared variables between ocean and passive tracers
15   USE trc             ! passive tracers common variables
16   USE sms_pisces      ! PISCES Source Minus Sink variables
17   USE p4zprod         ! production
18   USE prtctl_trc      ! print control for debugging
19   USE iom             ! I/O manager
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   p4z_meso              ! called in p4zbio.F90
25   PUBLIC   p4z_meso_init         ! called in trcsms_pisces.F90
26   PUBLIC   p4z_meso_alloc        ! called in trcini_pisces.F90
27
28   !! * Shared module variables
29   REAL(wp), PUBLIC ::  part2        !: part of calcite not dissolved in mesozoo guts
30   REAL(wp), PUBLIC ::  xpref2d      !: mesozoo preference for diatoms
31   REAL(wp), PUBLIC ::  xpref2n      !: mesozoo preference for nanophyto
32   REAL(wp), PUBLIC ::  xpref2z      !: mesozoo preference for microzooplankton
33   REAL(wp), PUBLIC ::  xpref2c      !: mesozoo preference for POC
34   REAL(wp), PUBLIC ::  xthresh2zoo  !: zoo feeding threshold for mesozooplankton
35   REAL(wp), PUBLIC ::  xthresh2dia  !: diatoms feeding threshold for mesozooplankton
36   REAL(wp), PUBLIC ::  xthresh2phy  !: nanophyto feeding threshold for mesozooplankton
37   REAL(wp), PUBLIC ::  xthresh2poc  !: poc feeding threshold for mesozooplankton
38   REAL(wp), PUBLIC ::  xthresh2     !: feeding threshold for mesozooplankton
39   REAL(wp), PUBLIC ::  resrat2      !: exsudation rate of mesozooplankton
40   REAL(wp), PUBLIC ::  mzrat2       !: microzooplankton mortality rate
41   REAL(wp), PUBLIC ::  grazrat2     !: maximal mesozoo grazing rate
42   REAL(wp), PUBLIC ::  xkgraz2      !: non assimilated fraction of P by mesozoo
43   REAL(wp), PUBLIC ::  unass2       !: Efficicency of mesozoo growth
44   REAL(wp), PUBLIC ::  sigma2       !: Fraction of mesozoo excretion as DOM
45   REAL(wp), PUBLIC ::  epsher2      !: growth efficiency
46   REAL(wp), PUBLIC ::  epsher2min   !: minimum growth efficiency at high food for grazing 2
47   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate
48   REAL(wp), PUBLIC ::  xfracmig     !: Fractional biomass of meso that performs DVM
49   LOGICAL , PUBLIC ::  ln_dvm_meso  !: Boolean to activate DVM of mesozooplankton
50   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig  !: DVM of mesozooplankton : migration depth
51   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig    !: Vertical indice of the the migration depth
52
53   !!----------------------------------------------------------------------
54   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
55   !! $Id$
56   !! Software governed by the CeCILL license (see ./LICENSE)
57   !!----------------------------------------------------------------------
58CONTAINS
59
60   SUBROUTINE p4z_meso( kt, knt )
61      !!---------------------------------------------------------------------
62      !!                     ***  ROUTINE p4z_meso  ***
63      !!
64      !! ** Purpose :   Compute the sources/sinks for mesozooplankton
65      !!                This includes ingestion and assimilation, flux feeding
66      !!                and mortality. We use a passive prey switching 
67      !!                parameterization.
68      !!                All living compartments smaller than mesozooplankton
69      !!                are potential preys of mesozooplankton as well as small
70      !!                sinking particles
71      !!
72      !! ** Method  : - ???
73      !!---------------------------------------------------------------------
74      INTEGER, INTENT(in) ::   kt, knt   ! ocean time step and ???
75      !
76      INTEGER  :: ji, jj, jk, jkt
77      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam
78      REAL(wp) :: zgraze2 , zdenom, zdenom2, zfact   , zfood, zfoodlim, zproport, zbeta
79      REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2, zfracal, zgrazcal
80      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgrarsig, zgraztotc, zgraztotn, zgraztotf
81      REAL(wp) :: zmigreltime, zprcaca, zmortz, zgrasrat, zgrasratn
82      REAL(wp) :: zrespz, ztortz, zgrazd, zgrazz, zgrazpof, zgrazn, zgrazpoc, zgraznf, zgrazf
83      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zrum, zcodel, zargu, zval
84      CHARACTER (len=25) :: charout
85      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2
86      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof
87      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof, zstrn
88      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zw3d, zz2ligprod
89      !!---------------------------------------------------------------------
90      !
91      IF( ln_timing )   CALL timing_start('p4z_meso')
92      !
93      zgrazing(:,:,:) = 0._wp
94      zfezoo2 (:,:,:) = 0._wp
95      !
96      IF (ln_ligand) THEN
97         ALLOCATE( zz2ligprod(jpi,jpj,jpk) )
98         zz2ligprod(:,:,:) = 0._wp
99      ENDIF
100      !
101      ! Diurnal vertical migration of mesozooplankton
102      ! Computation of the migration depth
103      ! ---------------------------------------------
104      IF (ln_dvm_meso) CALL p4z_meso_depmig
105      !
106      DO jk = 1, jpkm1
107         DO jj = 1, jpj
108            DO ji = 1, jpi
109               zcompam   = MAX( ( trb(ji,jj,jk,jpmes) - 1.e-9 ), 0.e0 )
110               zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam
111
112               !  linear mortality of mesozooplankton
113               !  A michaelis menten modulation term is used to avoid extinction of
114               !  mesozooplankton at very low food concentration. Mortality is
115 
116               !  enhanced in low O2 waters
117               !  -----------------------------------------------------------------
118               zrespz    = resrat2 * zfact * ( trb(ji,jj,jk,jpmes) / ( xkmort + trb(ji,jj,jk,jpmes) )  &
119               &           + 3. * nitrfac(ji,jj,jk) )
120
121               !  Zooplankton quadratic mortality. A square function has been selected with
122               !  to mimic predation and disease (density dependent mortality). It also tends
123               !  to stabilise the model
124               !  -------------------------------------------------------------------------
125               ztortz    = mzrat2 * 1.e6 * zfact * trb(ji,jj,jk,jpmes)  * (1. - nitrfac(ji,jj,jk) )
126
127               !   Computation of the abundance of the preys
128               !   A threshold can be specified in the namelist
129               !   --------------------------------------------
130               zcompadi  = MAX( ( trb(ji,jj,jk,jpdia) - xthresh2dia ), 0.e0 )
131               zcompaz   = MAX( ( trb(ji,jj,jk,jpzoo) - xthresh2zoo ), 0.e0 )
132               zcompapoc = MAX( ( trb(ji,jj,jk,jppoc) - xthresh2poc ), 0.e0 )
133               ! Size effect of nanophytoplankton on grazing : the smaller it is, the less prone
134               ! it is to predation by mesozooplankton. We use a quota dependant parameterization
135               ! as a low quota indicates oligotrophic conditions which are charatcerized by
136               ! small cells
137               ! -------------------------------------------------------------------------------
138               zcompaph  = MAX( ( trb(ji,jj,jk,jpphy) - xthresh2phy ), 0.e0 ) &
139                  &      * MIN(1., MAX( 0., ( quotan(ji,jj,jk) - 0.2) / 0.3 ) )
140
141               ! Mesozooplankton grazing
142               ! The total amount of food is the sum of all preys accessible to mesozooplankton
143               ! multiplied by their food preference
144               ! A threshold can be specified in the namelist (xthresh2). However, when food
145               ! concentration is close to this threshold, it is decreased to avoid the
146               ! accumulation of food in the mesozoopelagic domain
147               ! -------------------------------------------------------------------------------
148               zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc 
149               zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) )
150               zdenom    = zfoodlim / ( xkgraz2 + zfoodlim )
151               zdenom2   = zdenom / ( zfood + rtrn )
152               zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jpmes) * (1. - nitrfac(ji,jj,jk)) 
153
154               ! The grazing pressure on each prey is computed assuming passive switching. This
155               ! is equivalent to assuming that mesozooplankton have an opportunistic feeding
156               ! behaviour.
157               ! -----------------------------------------------------------------------------
158               zgrazd    = zgraze2  * xpref2d  * zcompadi  * zdenom2 
159               zgrazz    = zgraze2  * xpref2z  * zcompaz   * zdenom2 
160               zgrazn    = zgraze2  * xpref2n  * zcompaph  * zdenom2 
161               zgrazpoc  = zgraze2  * xpref2c  * zcompapoc * zdenom2 
162
163               zgraznf   = zgrazn   * trb(ji,jj,jk,jpnfe) / ( trb(ji,jj,jk,jpphy) + rtrn)
164               zgrazf    = zgrazd   * trb(ji,jj,jk,jpdfe) / ( trb(ji,jj,jk,jpdia) + rtrn)
165               zgrazpof  = zgrazpoc * trb(ji,jj,jk,jpsfe) / ( trb(ji,jj,jk,jppoc) + rtrn)
166
167               !  Mesozooplankton flux feeding on GOC and POC. The feeding pressure
168               ! is proportional to the flux
169               !  ------------------------------------------------------------------
170               zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      &
171               &           * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jpgoc) * trb(ji,jj,jk,jpmes) &
172               &           * (1. - nitrfac(ji,jj,jk))
173               zgrazfffg = zgrazffeg * trb(ji,jj,jk,jpbfe) / (trb(ji,jj,jk,jpgoc) + rtrn)
174               zgrazffep = grazflux  * xstep *  wsbio3(ji,jj,jk)     &
175               &           * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jpmes) &
176               &           * (1. - nitrfac(ji,jj,jk))
177               zgrazfffp = zgrazffep * trb(ji,jj,jk,jpsfe) / (trb(ji,jj,jk,jppoc) + rtrn)
178               
179               zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg
180               ! Compute the proportion of filter feeders. It is assumed steady state.
181               ! --------------------------------------------------------------------- 
182               zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc)
183
184               ! Compute fractionation of aggregates. It is assumed that
185               ! diatoms based aggregates are more prone to fractionation
186               ! since they are more porous (marine snow instead of fecal pellets)
187               ! -----------------------------------------------------------------
188               zratio    = trb(ji,jj,jk,jpgsi) / ( trb(ji,jj,jk,jpgoc) + rtrn )
189               zratio2   = zratio * zratio
190               zfrac     = zproport * grazflux  * xstep * wsbio4(ji,jj,jk)      &
191               &          * trb(ji,jj,jk,jpgoc) * trb(ji,jj,jk,jpmes)          &
192               &          * ( 0.2 + 3.8 * zratio2 / ( 1.**2 + zratio2 ) )
193               zfracfe   = zfrac * trb(ji,jj,jk,jpbfe) / (trb(ji,jj,jk,jpgoc) + rtrn)
194
195               ! Flux feeding is multiplied by the fractional biomass of flux feeders
196               zgrazffep = zproport * zgrazffep
197               zgrazffeg = zproport * zgrazffeg
198               zgrazfffp = zproport * zgrazfffp
199               zgrazfffg = zproport * zgrazfffg
200               zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg
201               zgraztotn = zgrazd * quotad(ji,jj,jk) + zgrazz + zgrazn * quotan(ji,jj,jk)   &
202               &   + zgrazpoc + zgrazffep + zgrazffeg
203               zgraztotf = zgrazf + zgraznf + zgrazz * ferat3 + zgrazpof + zgrazfffp + zgrazfffg
204
205               ! Total grazing ( grazing by microzoo is already computed in p4zmicro )
206               zgrazing(ji,jj,jk) = zgraztotc
207
208               ! Mesozooplankton efficiency.
209               ! We adopt a formulation proposed by Mitra et al. (2007)
210               ! The gross growth efficiency is controled by the most limiting nutrient.
211               ! Growth is also further decreased when the food quality is poor. This is currently
212               ! hard coded : it can be decreased by up to 50% (zepsherq)
213               ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and
214               ! Fulton, 2012)
215               ! -----------------------------------------------------------------------------------
216               zgrasrat  =  ( zgraztotf + rtrn )/ ( zgraztotc + rtrn )
217               zgrasratn =  ( zgraztotn + rtrn )/ ( zgraztotc + rtrn )
218               zepshert  = MIN( 1., zgrasratn, zgrasrat / ferat3)
219               zbeta     = MAX(0., (epsher2 - epsher2min) )
220               zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 
221               zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 )
222               zepsherv  = zepsherf * zepshert * zepsherq
223               !
224               ! Impact of grazing on the prognostic variables
225               ! ---------------------------------------------
226               zmortz = ztortz + zrespz
227               ! Mortality induced by the upper trophic levels, ztortz, is allocated
228               ! according to a infinite chain of predators (ANderson et al., 2013)
229               zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz + zrespz
230               tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) - zmortz + zepsherv * zgraztotc
231               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazd
232               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zgrazz
233               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgrazn
234               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgrazn * trb(ji,jj,jk,jpnch) / ( trb(ji,jj,jk,jpphy) + rtrn )
235               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazd * trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpdia) + rtrn )
236               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazd * trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
237               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazd * trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
238               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgraznf
239               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazf
240               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfrac
241               prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfrac
242               conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep
243               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg - zfrac
244               consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfrac
245               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe
246               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg - zfracfe
247               ! Calcite remineralization due to zooplankton activity
248               ! part2 of the ingested calcite is dissolving in the acidic gut
249               zfracal = trb(ji,jj,jk,jpcal) / (trb(ji,jj,jk,jppoc) + trb(ji,jj,jk,jpgoc) + rtrn )
250               zgrazcal = (zgrazffeg + zgrazpoc) * (1. - part2) * zfracal
251               ! calcite production by zooplankton activity
252               zprcaca = xfracal(ji,jj,jk) * zgrazn
253               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
254               !
255               zprcaca = part2 * zprcaca
256               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrazcal - zprcaca
257               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * ( zgrazcal + zprcaca )
258               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) - zgrazcal + zprcaca
259 
260               ! Computation of total excretion and egestion by mesozoo.
261               ! ---------------------------------------------------------
262               zgrarem(ji,jj,jk) = zgraztotc * ( 1. - zepsherv - unass2 ) &
263               &         + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz
264               zgraref(ji,jj,jk) = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasrat - ferat3 * zepsherv )    &
265               &         + ferat3 * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz )
266               zgrapoc(ji,jj,jk) = zgraztotc * unass2 + zmortzgoc
267               zgrapof(ji,jj,jk) = zgraztotf * unass2 + ferat3 * zmortzgoc
268            END DO
269         END DO
270      END DO
271
272      ! Computation of the effect of DVM by mesozooplankton
273      ! This part is only activated if ln_dvm_meso is set to true
274      ! The parameterization has been published in Gorgues et al. (2019).
275      ! -----------------------------------------------------------------
276      IF (ln_dvm_meso) THEN
277         ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) )
278         ALLOCATE( zstrn(jpi,jpj) )
279         zgramigrem(:,:) = 0.0    ;   zgramigref(:,:) = 0.0
280         zgramigpoc(:,:)  = 0.0   ;   zgramigpof(:,:) = 0.0
281
282         ! compute the day length depending on latitude and the day
283         zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp )
284         zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  )
285
286         ! day length in hours
287         zstrn(:,:) = 0.
288         DO jj = 1, jpj
289            DO ji = 1, jpi
290               zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad )
291               zargu = MAX( -1., MIN(  1., zargu ) )
292               zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. )
293               zstrn(ji,jj) = MIN(0.75, MAX( 0.25, zstrn(ji,jj) / 24.) )
294            END DO
295         END DO
296
297        ! Compute the amount of materials that will go into vertical migration
298        ! This fraction is sumed over the euphotic zone and is removed from
299        ! the fluxes driven by mesozooplankton in the euphotic zone.
300        ! --------------------------------------------------------------------
301         DO jk = 1, jpk
302            DO jj = 1, jpj
303               DO ji = 1, jpi
304                  zmigreltime = (1. - zstrn(ji,jj))
305                  IF ( gdept_n(ji,jj,jk) <= heup(ji,jj) ) THEN
306                     zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * (1. - zmigreltime )    &
307                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
308                     zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * (1. - zmigreltime )   &
309                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
310                     zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * (1. - zmigreltime )   &
311                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
312                     zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * (1. - zmigreltime )   &
313                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
314
315                     zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
316                     zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
317                     zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
318                     zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
319                  ENDIF
320               END DO
321            END DO
322         END DO
323     
324         ! The inorganic and organic fluxes induced by migrating organisms are added at the
325         ! the migration depth (corresponding indice is set by kmig)
326         ! --------------------------------------------------------------------------------
327         DO jj = 1, jpj
328            DO ji = 1, jpi
329               IF (tmask(ji,jj,1) == 1.) THEN
330                  jkt = kmig(ji,jj)
331                  zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) / e3t_n(ji,jj,jkt) 
332                  zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) / e3t_n(ji,jj,jkt)
333                  zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) / e3t_n(ji,jj,jkt)
334                  zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) / e3t_n(ji,jj,jkt)
335               ENDIF
336            END DO
337         END DO
338         !
339         ! Deallocate temporary variables
340         ! ------------------------------
341         DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof )
342         DEALLOCATE( zstrn )
343
344      ! End of the ln_dvm_meso part
345      ENDIF
346
347      DO jk = 1, jpk
348         DO jj = 1, jpj
349            DO ji = 1, jpi
350               !   Update the arrays TRA which contain the biological sources and sinks
351               !   This only concerns the variables which are affected by DVM (inorganic
352               !   nutrients, DOC agands, and particulate organic carbon).
353               zgrarsig  = zgrarem(ji,jj,jk) * sigma2
354               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig
355               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig
356               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem(ji,jj,jk) - zgrarsig
357               !
358               IF( ln_ligand ) THEN
359                  tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + (zgrarem(ji,jj,jk) - zgrarsig) * ldocz
360                  zz2ligprod(ji,jj,jk) = (zgrarem(ji,jj,jk) - zgrarsig) * ldocz
361               ENDIF
362               !
363               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig
364               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref(ji,jj,jk)
365               zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk)
366               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarsig
367               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgrarsig             
368               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zgrapoc(ji,jj,jk)
369               prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk)   + zgrapoc(ji,jj,jk)
370               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zgrapof(ji,jj,jk)
371            END DO
372         END DO
373      END DO
374      !
375      ! Write the output
376      IF( lk_iomput .AND. knt == nrdttrc ) THEN
377         ALLOCATE( zw3d(jpi,jpj,jpk) )
378         IF( iom_use( "GRAZ2" ) ) THEN
379            zw3d(:,:,:) = zgrazing(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:)  !   Total grazing of phyto by zooplankton
380            CALL iom_put( "GRAZ2", zw3d )
381         ENDIF
382         IF( iom_use( "PCAL" ) ) THEN
383            zw3d(:,:,:) = prodcal(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:)   !  Calcite production
384            CALL iom_put( "PCAL", zw3d ) 
385         ENDIF
386         IF( iom_use( "FEZOO2" ) ) THEN
387            zw3d(:,:,:) = zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)   !
388            CALL iom_put( "FEZOO2", zw3d )
389         ENDIF
390         IF( iom_use( "LPRODZ2" ) .AND. ln_ligand )  THEN
391            zw3d(:,:,:) = zz2ligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)
392            CALL iom_put( "LPRODZ2"  , zw3d )
393         ENDIF
394         DEALLOCATE( zw3d )
395      ENDIF
396      !
397      IF (ln_ligand)  DEALLOCATE( zz2ligprod )
398      !
399      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
400        WRITE(charout, FMT="('meso')")
401        CALL prt_ctl_trc_info(charout)
402        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
403      ENDIF
404      !
405      IF( ln_timing )   CALL timing_stop('p4z_meso')
406      !
407   END SUBROUTINE p4z_meso
408
409
410   SUBROUTINE p4z_meso_init
411      !!----------------------------------------------------------------------
412      !!                  ***  ROUTINE p4z_meso_init  ***
413      !!
414      !! ** Purpose :   Initialization of mesozooplankton parameters
415      !!
416      !! ** Method  :   Read the namp4zmes namelist and check the parameters
417      !!      called at the first timestep (nittrc000)
418      !!
419      !! ** input   :   Namelist nampismes
420      !!----------------------------------------------------------------------
421      INTEGER ::   ios   ! Local integer
422      !
423      NAMELIST/namp4zmes/ part2, grazrat2, resrat2, mzrat2, xpref2n, xpref2d, xpref2z,   &
424         &                xpref2c, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
425         &                xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux, ln_dvm_meso,  &
426         &                xfracmig
427      !!----------------------------------------------------------------------
428      !
429      IF(lwp) THEN
430         WRITE(numout,*) 
431         WRITE(numout,*) 'p4z_meso_init : Initialization of mesozooplankton parameters'
432         WRITE(numout,*) '~~~~~~~~~~~~~'
433      ENDIF
434      !
435      REWIND( numnatp_ref )              ! Namelist namp4zmes in reference namelist : Pisces mesozooplankton
436      READ  ( numnatp_ref, namp4zmes, IOSTAT = ios, ERR = 901)
437901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zmes in reference namelist' )
438      REWIND( numnatp_cfg )              ! Namelist namp4zmes in configuration namelist : Pisces mesozooplankton
439      READ  ( numnatp_cfg, namp4zmes, IOSTAT = ios, ERR = 902 )
440902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zmes in configuration namelist' )
441      IF(lwm) WRITE( numonp, namp4zmes )
442      !
443      IF(lwp) THEN                         ! control print
444         WRITE(numout,*) '   Namelist : namp4zmes'
445         WRITE(numout,*) '      part of calcite not dissolved in mesozoo guts  part2        =', part2
446         WRITE(numout,*) '      mesozoo preference for phyto                   xpref2n      =', xpref2n
447         WRITE(numout,*) '      mesozoo preference for diatoms                 xpref2d      =', xpref2d
448         WRITE(numout,*) '      mesozoo preference for zoo                     xpref2z      =', xpref2z
449         WRITE(numout,*) '      mesozoo preference for poc                     xpref2c      =', xpref2c
450         WRITE(numout,*) '      microzoo feeding threshold  for mesozoo        xthresh2zoo  =', xthresh2zoo
451         WRITE(numout,*) '      diatoms feeding threshold  for mesozoo         xthresh2dia  =', xthresh2dia
452         WRITE(numout,*) '      nanophyto feeding threshold for mesozoo        xthresh2phy  =', xthresh2phy
453         WRITE(numout,*) '      poc feeding threshold for mesozoo              xthresh2poc  =', xthresh2poc
454         WRITE(numout,*) '      feeding threshold for mesozooplankton          xthresh2     =', xthresh2
455         WRITE(numout,*) '      exsudation rate of mesozooplankton             resrat2      =', resrat2
456         WRITE(numout,*) '      mesozooplankton mortality rate                 mzrat2       =', mzrat2
457         WRITE(numout,*) '      maximal mesozoo grazing rate                   grazrat2     =', grazrat2
458         WRITE(numout,*) '      mesozoo flux feeding rate                      grazflux     =', grazflux
459         WRITE(numout,*) '      non assimilated fraction of P by mesozoo       unass2       =', unass2
460         WRITE(numout,*) '      Efficiency of Mesozoo growth                   epsher2      =', epsher2
461         WRITE(numout,*) '      Minimum Efficiency of Mesozoo growth           epsher2min   =', epsher2min
462         WRITE(numout,*) '      Fraction of mesozoo excretion as DOM           sigma2       =', sigma2
463         WRITE(numout,*) '      half sturation constant for grazing 2          xkgraz2      =', xkgraz2
464         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso
465         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig
466      ENDIF
467      !
468   END SUBROUTINE p4z_meso_init
469
470   SUBROUTINE p4z_meso_depmig 
471      !!----------------------------------------------------------------------
472      !!                  ***  ROUTINE p4z_meso_depmig  ***
473      !!
474      !! ** Purpose :   Computation the migration depth of mesozooplankton
475      !!
476      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen
477      !!      temperature and chlorophylle following the parameterization
478      !!      proposed by Bianchi et al. (2013)
479      !!----------------------------------------------------------------------
480      INTEGER  :: ji, jj, jk
481      !
482      REAL(wp) :: totchl
483      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy
484
485      !!---------------------------------------------------------------------
486      !
487      IF( ln_timing == 1 )  CALL timing_start('p4z_meso_zdepmig')
488      !
489      oxymoy(:,:)  = 0.
490      tempmoy(:,:) = 0.
491      zdepmoy(:,:) = 0.
492      depmig (:,:) = 5.
493      kmig   (:,:) = 1
494      !
495      ! Compute the averaged values of oxygen, temperature over the domain
496      ! 150m to 500 m depth.
497      ! ------------------------------------------------------------------
498      DO jk =1, jpk
499         DO jj = 1, jpj
500            DO ji = 1, jpi
501               IF (tmask(ji,jj,jk) == 1.) THEN
502                  IF (gdept_n(ji,jj,jk) >= 150. .AND. gdept_n(ji,jj,jk) <= 500.) THEN
503                     oxymoy(ji,jj) = oxymoy(ji,jj) + trb(ji,jj,jk,jpoxy)*e3t_n(ji,jj,jk)*1E6
504                     tempmoy(ji,jj) = tempmoy(ji,jj) + tsn(ji,jj,jk,jp_tem)*e3t_n(ji,jj,jk)
505                     zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t_n(ji,jj,jk)
506                  ENDIF
507               ENDIF
508            END DO
509         END DO
510      END DO
511
512      ! Compute the difference between surface values and the mean values in the mesopelagic
513      ! domain
514      ! ------------------------------------------------------------------------------------
515      DO jj = 1, jpj
516         DO ji = 1, jpi
517            oxymoy(ji,jj) = trb(ji,jj,1,jpoxy)*1E6 - oxymoy(ji,jj) / (zdepmoy(ji,jj) + rtrn)
518            tempmoy(ji,jj) = tsn(ji,jj,1,jp_tem)-tempmoy(ji,jj) / (zdepmoy(ji,jj) + rtrn)
519         END DO
520      END DO
521      !
522      ! Computation of the migration depth based on the parameterization of
523      ! Bianchi et al. (2013)
524      ! -------------------------------------------------------------------
525      DO jj = 1, jpj
526         DO ji = 1, jpi
527            IF (tmask(ji,jj,1) == 1.) THEN
528               totchl = (trb(ji,jj,1,jpnch)+trb(ji,jj,1,jpdch))*1E6
529               depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(totchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj)
530            ENDIF
531         END DO
532      END DO
533      !
534      ! Computation of the corresponding jk indice
535      ! ------------------------------------------
536      DO jk = 1, jpk-1
537         DO jj = 1, jpj
538            DO ji = 1, jpi
539               IF (depmig(ji,jj) .GE. gdepw_n(ji,jj,jk) .AND. depmig(ji,jj) .LT. gdepw_n(ji,jj,jk+1) ) THEN
540                  kmig(ji,jj) = jk
541               ENDIF
542            END DO
543         END DO
544      END DO
545      !
546      ! Correction of the migration depth and indice based on O2 levels
547      ! If O2 is too low, imposing a migration depth at this low O2 levels
548      ! would lead to negative O2 concentrations (respiration while O2 is close
549      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so
550      ! that it falls above the OMZ
551      ! -----------------------------------------------------------------------
552      DO ji =1, jpi
553         DO jj = 1, jpj
554            IF (trb(ji,jj,kmig(ji,jj),jpoxy) < 5E-6) THEN
555               DO jk = kmig(ji,jj),1,-1
556                  IF (trb(ji,jj,jk,jpoxy) >= 5E-6 .AND. trb(ji,jj,jk+1,jpoxy)  < 5E-6) THEN
557                     kmig(ji,jj) = jk
558                     depmig(ji,jj) = gdept_n(ji,jj,jk)
559                  ENDIF
560               END DO
561            ENDIF
562         END DO
563      END DO
564      !
565      IF( ln_timing )   CALL timing_stop('p4z_meso_depmig')
566      !
567   END SUBROUTINE p4z_meso_depmig
568
569   INTEGER FUNCTION p4z_meso_alloc()
570      !!----------------------------------------------------------------------
571      !!                     ***  ROUTINE p4z_meso_alloc  ***
572      !!----------------------------------------------------------------------
573      !
574      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p4z_meso_alloc  )
575      !
576      IF( p4z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_meso_alloc : failed to allocate arrays.' )
577      !
578   END FUNCTION p4z_meso_alloc
579
580   !!======================================================================
581END MODULE p4zmeso
Note: See TracBrowser for help on using the repository browser.