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

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

Comments in routines have been revised and significantly augmented

  • Property svn:keywords set to Id
File size: 43.5 KB
Line 
1MODULE p5zmeso
2   !!======================================================================
3   !!                         ***  MODULE p5zmeso  ***
4   !! TOP :   PISCES-QUOTA 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   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
10   !!----------------------------------------------------------------------
11   !!   p5z_meso       : Compute the sources/sinks for mesozooplankton
12   !!   p5z_meso_init  : Initialization of the parameters for mesozooplankton
13   !!   p5z_meso_alloc : Allocate variables for mesozooplankton
14   !!----------------------------------------------------------------------
15   USE oce_trc         !  shared variables between ocean and passive tracers
16   USE trc             !  passive tracers common variables
17   USE sms_pisces      !  PISCES Source Minus Sink variables
18   USE prtctl_trc      !  print control for debugging
19   USE iom             !  I/O manager
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   p5z_meso              ! called in p5zbio.F90
25   PUBLIC   p5z_meso_init         ! called in trcsms_pisces.F90
26   PUBLIC   p5z_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 ::  xpref2c      !: mesozoo preference for POC
31   REAL(wp), PUBLIC ::  xpref2n      !: mesozoo preference for nanophyto
32   REAL(wp), PUBLIC ::  xpref2z      !: mesozoo preference for zooplankton
33   REAL(wp), PUBLIC ::  xpref2d      !: mesozoo preference for Diatoms
34   REAL(wp), PUBLIC ::  xpref2m      !: mesozoo preference for mesozoo
35   REAL(wp), PUBLIC ::  xthresh2zoo  !: zoo feeding threshold for mesozooplankton
36   REAL(wp), PUBLIC ::  xthresh2dia  !: diatoms feeding threshold for mesozooplankton
37   REAL(wp), PUBLIC ::  xthresh2phy  !: nanophyto feeding threshold for mesozooplankton
38   REAL(wp), PUBLIC ::  xthresh2poc  !: poc feeding threshold for mesozooplankton
39   REAL(wp), PUBLIC ::  xthresh2mes  !: mesozoo feeding threshold for mesozooplankton
40   REAL(wp), PUBLIC ::  xthresh2     !: feeding threshold for mesozooplankton
41   REAL(wp), PUBLIC ::  resrat2      !: exsudation rate of mesozooplankton
42   REAL(wp), PUBLIC ::  mzrat2       !: microzooplankton mortality rate
43   REAL(wp), PUBLIC ::  grazrat2     !: maximal mesozoo grazing rate
44   REAL(wp), PUBLIC ::  xkgraz2      !: Half-saturation constant of assimilation
45   REAL(wp), PUBLIC ::  unass2c      !: Non-assimilated fraction of food
46   REAL(wp), PUBLIC ::  unass2n      !: Non-assimilated fraction of food
47   REAL(wp), PUBLIC ::  unass2p      !: Non-assimilated fraction of food
48   REAL(wp), PUBLIC ::  epsher2      !: Growth efficiency of mesozoo
49   REAL(wp), PUBLIC ::  epsher2min   !: Minimum growth efficiency of mesozoo
50   REAL(wp), PUBLIC ::  ssigma2      !: Fraction excreted as semi-labile DOM
51   REAL(wp), PUBLIC ::  srespir2     !: Active respiration
52   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate
53   REAL(wp), PUBLIC ::  xfracmig     !: Fractional biomass of meso that performs DVM
54   LOGICAL,  PUBLIC ::  bmetexc2     !: Use of excess carbon for respiration
55   LOGICAL , PUBLIC ::  ln_dvm_meso  !: Boolean to activate DVM of mesozooplankton
56   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig  !: DVM of mesozooplankton : migration depth
57   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig    !: Vertical indice of the the migration depth
58
59   !!----------------------------------------------------------------------
60   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
61   !! $Id$
62   !! Software governed by the CeCILL license (see ./LICENSE)
63   !!----------------------------------------------------------------------
64
65CONTAINS
66
67   SUBROUTINE p5z_meso( kt, knt )
68      !!---------------------------------------------------------------------
69      !!                     ***  ROUTINE p5z_meso  ***
70      !!
71      !! ** Purpose :   Compute the sources/sinks for mesozooplankton
72      !!                This includes ingestion and assimilation, flux feeding
73      !!                and mortality. We use an active prey switching 
74      !!                parameterization Morozov and Petrovskii (2013).
75      !!                All living compartments and mesozooplankton
76      !!                are potential preys of mesozooplankton as well as small
77      !!                sinking particles
78      !!
79      !!---------------------------------------------------------------------
80      INTEGER, INTENT(in) ::   kt, knt ! ocean time step
81      !
82      INTEGER  :: ji, jj, jk, jkt
83      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam, zcompames
84      REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport
85      REAL(wp) :: zmortzgoc, zfracc, zfracn, zfracp, zfracfe, zratio, zratio2
86      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi
87      REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf
88      REAL(wp) :: zgratmp, zgradoct, zgradont, zgrareft, zgradopt
89      REAL(wp) :: zprcaca, zmortz, zexcess
90      REAL(wp) :: zbeta, zrespz, ztortz, zgrasratp, zgrasratn, zgrasratf
91      REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot
92      REAL(wp) :: zgrazdc, zgrazz, zgrazm, zgrazpof, zgrazcal, zfracal
93      REAL(wp) :: zgraznc, zgrazpoc, zgrazpon, zgrazpop, zgraznf, zgrazdf
94      REAL(wp) :: zgraznp, zgraznn, zgrazdn, zgrazdp
95      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg
96      REAL(wp) :: zgrazffnp, zgrazffng, zgrazffpp, zgrazffpg
97      REAL(wp) :: zmigreltime, zrum, zcodel, zargu, zval
98      CHARACTER (len=25) :: charout
99      REAL(wp) :: zrfact2, zmetexcess, zsigma, zdiffdn
100      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2
101      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof
102      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarep, zgraren, zgrapon, zgrapop
103      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgradoc, zgradon, zgradop
104      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof, zstrn
105      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrep, zgramigren, zgramigpop, zgramigpon
106      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigdoc, zgramigdop, zgramigdon
107      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zw3d, zz2ligprod
108
109      !!---------------------------------------------------------------------
110      !
111      IF( ln_timing )   CALL timing_start('p5z_meso')
112      !
113      zgrazing(:,:,:) = 0._wp
114      zfezoo2 (:,:,:) = 0._wp
115      !
116      IF (ln_ligand) THEN
117         ALLOCATE( zz2ligprod(jpi,jpj,jpk) )
118         zz2ligprod(:,:,:) = 0._wp
119      ENDIF
120
121      !
122      ! Diurnal vertical migration of mesozooplankton
123      ! Computation of the migration depth
124      ! ---------------------------------------------
125      IF (ln_dvm_meso) CALL p5z_meso_depmig
126
127      ! Use of excess carbon for metabolism
128      zmetexcess = 0.0
129      IF ( bmetexc2 ) zmetexcess = 1.0
130
131      DO jk = 1, jpkm1
132         DO jj = 1, jpj
133            DO ji = 1, jpi
134               zcompam   = MAX( ( trb(ji,jj,jk,jpmes) - 1.e-9 ), 0.e0 )
135               zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam
136
137               !  linear mortality of mesozooplankton
138               !  A michaelis menten modulation term is used to avoid extinction of
139               !  mesozooplankton at very low food concentrations
140               !  -----------------------------------------------------------------
141               zrespz   = resrat2 * zfact * ( trb(ji,jj,jk,jpmes) / ( xkmort + trb(ji,jj,jk,jpmes) )  &
142               &          + 3. * nitrfac(ji,jj,jk) )
143
144               !  Zooplankton quadratic mortality. A square function has been selected with
145               !  to mimic predation and disease (density dependent mortality). It also tends
146               !  to stabilise the model
147               !  -------------------------------------------------------------------------
148               ztortz   = mzrat2 * 1.e6 * zfact * trb(ji,jj,jk,jpmes) * (1. - nitrfac(ji,jj,jk))
149
150               !   Computation of the abundance of the preys
151               !   A threshold can be specified in the namelist
152               !   --------------------------------------------
153               zcompadi  = MAX( ( trb(ji,jj,jk,jpdia) - xthresh2dia ), 0.e0 )
154               zcompaz   = MAX( ( trb(ji,jj,jk,jpzoo) - xthresh2zoo ), 0.e0 )
155               zcompaph  = MAX( ( trb(ji,jj,jk,jpphy) - xthresh2phy ), 0.e0 )
156               zcompapoc = MAX( ( trb(ji,jj,jk,jppoc) - xthresh2poc ), 0.e0 )
157               zcompames = MAX( ( trb(ji,jj,jk,jpmes) - xthresh2mes ), 0.e0 )
158
159               !   Mesozooplankton grazing
160               ! The total amount of food is the sum of all preys accessible to mesozooplankton
161               ! multiplied by their food preference
162               ! A threshold can be specified in the namelist (xthresh2). However, when food
163               ! concentration is close to this threshold, it is decreased to avoid the
164               ! accumulation of food in the mesozoopelagic domain
165               ! -------------------------------------------------------------------------------
166               zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc   &
167               &           + xpref2m * zcompames 
168               zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) )
169               zdenom    = zfoodlim / ( xkgraz2 + zfoodlim )
170               zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jpmes) * (1. - nitrfac(ji,jj,jk)) 
171
172               ! An active switching parameterization is used here.
173               ! We don't use the KTW parameterization proposed by
174               ! Vallina et al. because it tends to produce too steady biomass
175               ! composition and the variance of Chl is too low as it grazes
176               ! too strongly on winning organisms. We use a generalized
177               ! switching parameterization proposed by Morozov and
178               ! Petrovskii (2013)
179               ! ------------------------------------------------------------ 
180               ! The width of the selection window is increased when preys
181               ! have low abundance, .i.e. zooplankton become less specific
182               ! to avoid starvation.
183               ! ----------------------------------------------------------
184               zsigma = 1.0 - zdenom**2/(0.05**2+zdenom**2)
185               zsigma = 0.5 + 1.0 * zsigma
186               ! Nanophytoplankton and diatoms are the only preys considered
187               ! to be close enough to have potential interference
188               ! -----------------------------------------------------------
189               zdiffdn = exp( -ABS(log(3.0 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 )
190               ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi )
191               ztmp2 = xpref2m * zcompames**2
192               ztmp3 = xpref2c * zcompapoc**2
193               ztmp4 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph )
194               ztmp5 = xpref2z * zcompaz**2
195               ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn
196               ztmp1 = ztmp1 / ztmptot
197               ztmp2 = ztmp2 / ztmptot
198               ztmp3 = ztmp3 / ztmptot
199               ztmp4 = ztmp4 / ztmptot
200               ztmp5 = ztmp5 / ztmptot
201
202               !   Mesozooplankton regular grazing on the different preys
203               !   ------------------------------------------------------
204               zgrazdc   = zgraze2 * ztmp4 * zdenom
205               zgrazdn   = zgrazdc * trb(ji,jj,jk,jpndi) / ( trb(ji,jj,jk,jpdia) + rtrn)
206               zgrazdp   = zgrazdc * trb(ji,jj,jk,jppdi) / ( trb(ji,jj,jk,jpdia) + rtrn)
207               zgrazdf   = zgrazdc * trb(ji,jj,jk,jpdfe) / ( trb(ji,jj,jk,jpdia) + rtrn)
208               zgrazz    = zgraze2 * ztmp5 * zdenom
209               zgrazm    = zgraze2 * ztmp2 * zdenom
210               zgraznc   = zgraze2 * ztmp1 * zdenom
211               zgraznn   = zgraznc * trb(ji,jj,jk,jpnph) / ( trb(ji,jj,jk,jpphy) + rtrn)
212               zgraznp   = zgraznc * trb(ji,jj,jk,jppph) / ( trb(ji,jj,jk,jpphy) + rtrn)
213               zgraznf   = zgraznc * trb(ji,jj,jk,jpnfe) / ( trb(ji,jj,jk,jpphy) + rtrn)
214               zgrazpoc  = zgraze2 * ztmp3 * zdenom
215               zgrazpon  = zgrazpoc * trb(ji,jj,jk,jppon) / ( trb(ji,jj,jk,jppoc) + rtrn)
216               zgrazpop  = zgrazpoc * trb(ji,jj,jk,jppop) / ( trb(ji,jj,jk,jppoc) + rtrn)
217               zgrazpof  = zgrazpoc * trb(ji,jj,jk,jpsfe) / ( trb(ji,jj,jk,jppoc) + rtrn)
218
219               !  Mesozooplankton flux feeding on GOC and POC. The feeding pressure
220               ! is proportional to the flux
221               !  ------------------------------------------------------------------
222               zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      &
223               &           * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jpgoc) * trb(ji,jj,jk,jpmes)  &
224               &           * (1. - nitrfac(ji,jj,jk))
225               zgrazfffg = zgrazffeg * trb(ji,jj,jk,jpbfe) / (trb(ji,jj,jk,jpgoc) + rtrn)
226               zgrazffng = zgrazffeg * trb(ji,jj,jk,jpgon) / (trb(ji,jj,jk,jpgoc) + rtrn)
227               zgrazffpg = zgrazffeg * trb(ji,jj,jk,jpgop) / (trb(ji,jj,jk,jpgoc) + rtrn)
228               zgrazffep = grazflux  * xstep *  wsbio3(ji,jj,jk)     &
229               &           * tgfunc2(ji,jj,jk) * trb(ji,jj,jk,jppoc) * trb(ji,jj,jk,jpmes)   &
230               &           * (1. - nitrfac(ji,jj,jk))
231               zgrazfffp = zgrazffep * trb(ji,jj,jk,jpsfe) / (trb(ji,jj,jk,jppoc) + rtrn)
232               zgrazffnp = zgrazffep * trb(ji,jj,jk,jppon) / (trb(ji,jj,jk,jppoc) + rtrn)
233               zgrazffpp = zgrazffep * trb(ji,jj,jk,jppop) / (trb(ji,jj,jk,jppoc) + rtrn)
234               !
235               zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg
236
237               ! Compute the proportion of filter feeders. It is assumed steady state.
238               ! --------------------------------------------------------------------- 
239               zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc)
240
241               !   Compute fractionation of aggregates. It is assumed that
242               !   diatoms based aggregates are more prone to fractionation
243               !   since they are more porous (marine snow instead of fecal pellets)
244               !   ----------------------------------------------------------------
245               zratio    = trb(ji,jj,jk,jpgsi) / ( trb(ji,jj,jk,jpgoc) + rtrn )
246               zratio2   = zratio * zratio
247               zfracc    = zproport * grazflux  * xstep * wsbio4(ji,jj,jk)      &
248               &          * trb(ji,jj,jk,jpgoc) * trb(ji,jj,jk,jpmes)          &
249               &          * ( 0.2 + 3.8 * zratio2 / ( 1.**2 + zratio2 ) )
250               zfracfe   = zfracc * trb(ji,jj,jk,jpbfe) / (trb(ji,jj,jk,jpgoc) + rtrn)
251               zfracn    = zfracc * trb(ji,jj,jk,jpgon) / (trb(ji,jj,jk,jpgoc) + rtrn)
252               zfracp    = zfracc * trb(ji,jj,jk,jpgop) / (trb(ji,jj,jk,jpgoc) + rtrn)
253
254               ! Flux feeding is multiplied by the fractional biomass of flux feeders
255               zgrazffep = zproport * zgrazffep   ;   zgrazffeg = zproport * zgrazffeg
256               zgrazfffp = zproport * zgrazfffp   ;   zgrazfffg = zproport * zgrazfffg
257               zgrazffnp = zproport * zgrazffnp   ;   zgrazffng = zproport * zgrazffng
258               zgrazffpp = zproport * zgrazffpp   ;   zgrazffpg = zproport * zgrazffpg
259
260               zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg
261               zgraztotf  = zgrazdf + zgraznf + ( zgrazz + zgrazm ) * ferat3 + zgrazpof &
262               &            + zgrazfffp + zgrazfffg
263               zgraztotn  = zgrazdn + (zgrazm + zgrazz) * no3rat3 + zgraznn + zgrazpon  &
264               &            + zgrazffnp + zgrazffng
265               zgraztotp  = zgrazdp + (zgrazz + zgrazm) * po4rat3 + zgraznp + zgrazpop  &
266               &            + zgrazffpp + zgrazffpg
267
268               ! Total grazing ( grazing by microzoo is already computed in p5zmicro )
269               zgrazing(ji,jj,jk) = zgraztotc
270
271               !   Stoichiometruc ratios of the food ingested by zooplanton
272               !   --------------------------------------------------------
273               zgrasratf  =  (zgraztotf + rtrn) / ( zgraztotc + rtrn )
274               zgrasratn  =  (zgraztotn + rtrn) / ( zgraztotc + rtrn )
275               zgrasratp  =  (zgraztotp + rtrn) / ( zgraztotc + rtrn )
276
277               ! Mesozooplankton efficiency.
278               ! We adopt a formulation proposed by Mitra et al. (2007)
279               ! The gross growth efficiency is controled by the most limiting nutrient.
280               ! Growth is also further decreased when the food quality is poor. This is currently
281               ! hard coded : it can be decreased by up to 50% (zepsherq)
282               ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and
283               ! Fulton, 2012)
284               ! -----------------------------------------------------------------------------------
285               zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / ferat3)
286               zbeta     = MAX(0., (epsher2 - epsher2min) )
287               zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta )
288               zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 )
289               zepsherv  = zepsherf * zepshert * zepsherq
290               !   Respiration of mesozooplankton
291               !   Excess carbon in the food is used preferentially
292               !   when bmetexc2 is set to .true.
293               !   -----------------------------------------------
294               zexcess  = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess 
295               zbasresb = MAX(0., zrespz - zexcess)
296               zbasresi = zexcess + MIN(0., zrespz - zexcess)
297               zrespirc = srespir2 * zepsherv * zgraztotc + zbasresb
298
299               !   When excess carbon is used, the other elements in excess
300               !   are also used proportionally to their abundance
301               !   --------------------------------------------------------
302               zexcess  = ( zgrasratn/ no3rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
303               zbasresn = zbasresi * zexcess * zgrasratn
304               zexcess  = ( zgrasratp/ po4rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
305               zbasresp = zbasresi * zexcess * zgrasratp
306               zexcess  = ( zgrasratf/ ferat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
307               zbasresf = zbasresi * zexcess * zgrasratf
308
309               !   Voiding of the excessive elements as organic matter
310               !   --------------------------------------------------------
311               zgradoct = (1. - unass2c - zepsherv) * zgraztotc - zbasresi
312               zgradont = (1. - unass2n) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn
313               zgradopt = (1. - unass2p) * zgraztotp - zepsherv * po4rat3 * zgraztotc - zbasresp
314               zgrareft = (1. - unass2c) * zgraztotf - zepsherv * ferat3 * zgraztotc - zbasresf
315               ztmp1   = ( 1. - epsher2 - unass2c ) /( 1. - 0.8 * epsher2 ) * ztortz
316               zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * ssigma2
317               zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * ssigma2
318               zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * ssigma2
319               zgratmp = 0.2 * epsher2 /( 1. - 0.8 * epsher2 ) * ztortz
320
321               !  Since only semilabile DOM is represented in PISCES
322               !  part of DOM is in fact labile and is then released
323               !  as dissolved inorganic compounds (ssigma2)
324               !  --------------------------------------------------
325               zgrarem(ji,jj,jk) = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2)
326               zgraren(ji,jj,jk) = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2)
327               zgrarep(ji,jj,jk) = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2)
328               zgraref(ji,jj,jk) = zgrareft + ferat3 * ( ztmp1 + zgratmp )
329
330               !   Defecation as a result of non assimilated products
331               !   --------------------------------------------------
332               zgrapoc(ji,jj,jk)  = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz
333               zgrapon(ji,jj,jk)  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz
334               zgrapop(ji,jj,jk)  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz
335               zgrapof(ji,jj,jk)  = zgraztotf * unass2c + ferat3  * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz
336
337               !  Addition of respiration to the release of inorganic nutrients
338               !  -------------------------------------------------------------
339               zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) + zbasresi + zrespirc
340               zgraren(ji,jj,jk) = zgraren(ji,jj,jk) + zbasresn + zrespirc * no3rat3
341               zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) + zbasresp + zrespirc * po4rat3
342               zgraref(ji,jj,jk) = zgraref(ji,jj,jk) + zbasresf + zrespirc * ferat3
343
344               !   Update the arrays TRA which contain the biological sources and
345               !   sinks
346               !   --------------------------------------------------------------
347               tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) + zepsherv * zgraztotc - zrespirc   &
348               &                     - ztortz - zgrazm
349               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazdc
350               tra(ji,jj,jk,jpndi) = tra(ji,jj,jk,jpndi) - zgrazdn
351               tra(ji,jj,jk,jppdi) = tra(ji,jj,jk,jppdi) - zgrazdp
352               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazdf
353               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zgrazz
354               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgraznc
355               tra(ji,jj,jk,jpnph) = tra(ji,jj,jk,jpnph) - zgraznn
356               tra(ji,jj,jk,jppph) = tra(ji,jj,jk,jppph) - zgraznp
357               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgraznf
358               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgraznc * trb(ji,jj,jk,jpnch) / ( trb(ji,jj,jk,jpphy) + rtrn )
359               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazdc * trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpdia) + rtrn )
360               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazdc * trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
361               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazdc * trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
362
363               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfracc
364               prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + zfracc
365               conspoc(ji,jj,jk)   = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep
366               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) - zgrazpon - zgrazffnp + zfracn
367               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) - zgrazpop - zgrazffpp + zfracp
368               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg - zfracc
369               consgoc(ji,jj,jk)   = consgoc(ji,jj,jk) - zgrazffeg - zfracc
370               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) - zgrazffng - zfracn
371               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) - zgrazffpg - zfracp
372               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe
373               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg - zfracfe
374               zfracal = trb(ji,jj,jk,jpcal) / ( trb(ji,jj,jk,jpgoc) + rtrn )
375               zgrazcal = zgrazffeg * (1. - part2) * zfracal
376               ! Calcite production
377               ! Calcite remineralization due to zooplankton activity
378               ! part2 of the ingested calcite is dissolving in the acidic gut
379               ! -------------------------------------------------------------
380               zprcaca = xfracal(ji,jj,jk) * zgraznc
381               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
382               zprcaca = part2 * zprcaca
383               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrazcal - zprcaca
384               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * ( zgrazcal - zprcaca )
385               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) - zgrazcal + zprcaca
386            END DO
387         END DO
388      END DO
389
390      ! Computation of the effect of DVM by mesozooplankton
391      ! This part is only activated if ln_dvm_meso is set to true
392      ! The parameterization has been published in Gorgues et al. (2019).
393      ! -----------------------------------------------------------------
394      IF (ln_dvm_meso) THEN
395         ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) )
396         ALLOCATE( zgramigrep(jpi,jpj), zgramigren(jpi,jpj), zgramigpop(jpi,jpj), zgramigpon(jpi,jpj) )
397         ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj) )
398         ALLOCATE( zstrn(jpi,jpj) )
399         zgramigrem(:,:)  = 0.0   ;   zgramigref(:,:) = 0.0
400         zgramigrep(:,:)  = 0.0   ;   zgramigren(:,:) = 0.0
401         zgramigpoc(:,:)  = 0.0   ;   zgramigpof(:,:) = 0.0
402         zgramigpop(:,:)  = 0.0   ;   zgramigpon(:,:) = 0.0
403         zgramigdoc(:,:)  = 0.0   ;   zgramigdon(:,:) = 0.0
404         zgramigdop(:,:)  = 0.0   
405
406         ! compute the day length depending on latitude and the day
407         zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp )
408         zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  )
409
410         ! day length in hours
411         zstrn(:,:) = 0.
412         DO jj = 1, jpj
413            DO ji = 1, jpi
414               zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad )
415               zargu = MAX( -1., MIN(  1., zargu ) )
416               zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. )
417               zstrn(ji,jj) = MIN(0.75, MAX( 0.25, zstrn(ji,jj) / 24.) )
418            END DO
419         END DO
420
421
422        ! Compute the amount of materials that will go into vertical migration
423        ! This fraction is sumed over the euphotic zone and is removed from
424        ! the fluxes driven by mesozooplankton in the euphotic zone.
425        ! --------------------------------------------------------------------
426         DO jk = 1, jpk
427            DO jj = 1, jpj
428               DO ji = 1, jpi
429                  zmigreltime = (1. - zstrn(ji,jj))
430                  IF ( gdept_n(ji,jj,jk) <= heup(ji,jj) ) THEN
431                     zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * (1. - zmigreltime )    &
432                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
433                     zgramigrep(ji,jj) = zgramigrep(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime )    &
434                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
435                     zgramigrep(ji,jj) = zgramigren(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime )    &
436                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
437                     zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * (1. - zmigreltime )   &
438                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
439                     zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * (1. - zmigreltime )   &
440                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
441                     zgramigpop(ji,jj) = zgramigpop(ji,jj) + xfracmig * zgrapop(ji,jj,jk) * (1. - zmigreltime )   &
442                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
443                     zgramigpon(ji,jj) = zgramigpon(ji,jj) + xfracmig * zgrapon(ji,jj,jk) * (1. - zmigreltime )   &
444                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
445                     zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * (1. - zmigreltime )   &
446                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
447                     zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * (1. - zmigreltime )   &
448                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
449                     zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * (1. - zmigreltime )   &
450                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
451                     zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * (1. - zmigreltime )   &
452                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
453
454                     zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
455                     zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
456                     zgraren(ji,jj,jk) = zgraren(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
457                     zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
458                     zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
459                     zgrapop(ji,jj,jk) = zgrapop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
460                     zgrapon(ji,jj,jk) = zgrapon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
461                     zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
462                     zgradoc(ji,jj,jk) = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
463                     zgradop(ji,jj,jk) = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
464                     zgradon(ji,jj,jk) = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
465                  ENDIF
466               END DO
467            END DO
468         END DO
469
470         ! The inorganic and organic fluxes induced by migrating organisms are added at the
471         ! the migration depth (corresponding indice is set by kmig)
472         ! --------------------------------------------------------------------------------
473         DO jj = 1, jpj
474            DO ji = 1, jpi
475               IF (tmask(ji,jj,1) == 1.) THEN
476                  jkt = kmig(ji,jj)
477                  zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) / e3t_n(ji,jj,jkt)
478                  zgrarep(ji,jj,jkt) = zgrarep(ji,jj,jkt) + zgramigrep(ji,jj) / e3t_n(ji,jj,jkt)
479                  zgraren(ji,jj,jkt) = zgraren(ji,jj,jkt) + zgramigren(ji,jj) / e3t_n(ji,jj,jkt)
480                  zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) / e3t_n(ji,jj,jkt)
481                  zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) / e3t_n(ji,jj,jkt)
482                  zgrapop(ji,jj,jkt) = zgrapop(ji,jj,jkt) + zgramigpop(ji,jj) / e3t_n(ji,jj,jkt)
483                  zgrapon(ji,jj,jkt) = zgrapon(ji,jj,jkt) + zgramigpon(ji,jj) / e3t_n(ji,jj,jkt)
484                  zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) / e3t_n(ji,jj,jkt)
485                  zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) / e3t_n(ji,jj,jkt)
486                  zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) / e3t_n(ji,jj,jkt)
487                  zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) / e3t_n(ji,jj,jkt)
488               ENDIF
489            END DO
490         END DO
491         !
492         ! Deallocate temporary variables
493         ! ------------------------------
494         DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof )
495         DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon )
496         DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop )
497         DEALLOCATE( zstrn )
498      ! End of the ln_dvm_meso part
499      ENDIF
500
501      !   Update the arrays TRA which contain the biological sources and sinks
502      !   This only concerns the variables which are affected by DVM (inorganic
503      !   nutrients, DOC agands, and particulate organic carbon).
504      !   ---------------------------------------------------------------------
505      DO jk = 1, jpk
506         DO jj = 1, jpj
507            DO ji = 1, jpi
508               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarep(ji,jj,jk) 
509               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgraren(ji,jj,jk)
510               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgradoc(ji,jj,jk)
511               !
512               IF( ln_ligand ) THEN
513                  tra(ji,jj,jk,jplgw)  = tra(ji,jj,jk,jplgw) + zgradoc(ji,jj,jk) * ldocz
514                  zz2ligprod(ji,jj,jk) = zgradoc(ji,jj,jk) * ldocz
515               ENDIF
516               !
517               tra(ji,jj,jk,jpdon) = tra(ji,jj,jk,jpdon) + zgradon(ji,jj,jk)
518               tra(ji,jj,jk,jpdop) = tra(ji,jj,jk,jpdop) + zgradop(ji,jj,jk)
519               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarem(ji,jj,jk)
520               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref(ji,jj,jk)
521               zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk)
522               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarem(ji,jj,jk)
523               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgraren(ji,jj,jk)
524               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zgrapoc(ji,jj,jk)
525               prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk)
526               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) + zgrapon(ji,jj,jk)
527               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) + zgrapop(ji,jj,jk)
528               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zgrapof(ji,jj,jk)
529            END DO
530         END DO
531      END DO
532      !
533      IF( lk_iomput .AND. knt == nrdttrc ) THEN
534         ALLOCATE( zw3d(jpi,jpj,jpk) )
535         IF( iom_use( "GRAZ2" ) ) THEN
536            zw3d(:,:,:) = zgrazing(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:)  !   Total grazing of phyto by zooplankton
537            CALL iom_put( "GRAZ2", zw3d )
538         ENDIF
539         IF( iom_use( "PCAL" ) ) THEN
540            zw3d(:,:,:) = prodcal(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:)   !  Calcite production
541            CALL iom_put( "PCAL", zw3d )
542         ENDIF
543         IF( iom_use( "FEZOO2" ) ) THEN
544            zw3d(:,:,:) = zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)   !
545            CALL iom_put( "FEZOO2", zw3d )
546         ENDIF
547         IF( iom_use( "LPRODZ2" ) .AND. ln_ligand )  THEN
548            zw3d(:,:,:) = zz2ligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)
549            CALL iom_put( "LPRODZ2"  , zw3d )
550         ENDIF
551         DEALLOCATE( zw3d )
552      ENDIF
553      !
554      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
555        WRITE(charout, FMT="('meso')")
556        CALL prt_ctl_trc_info(charout)
557        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
558      ENDIF
559      !
560      IF( ln_timing )   CALL timing_stop('p5z_meso')
561      !
562   END SUBROUTINE p5z_meso
563
564
565   SUBROUTINE p5z_meso_init
566      !!----------------------------------------------------------------------
567      !!                  ***  ROUTINE p5z_meso_init  ***
568      !!
569      !! ** Purpose :   Initialization of mesozooplankton parameters
570      !!
571      !! ** Method  :   Read the namp5zmes namelist and check the parameters
572      !!      called at the first timestep (nittrc000)
573      !!
574      !! ** input   :   Namelist namp5zmes
575      !!
576      !!----------------------------------------------------------------------
577      INTEGER :: ios    ! Local integer output status for namelist read
578      !!
579      NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, mzrat2, xpref2c, xpref2n, xpref2z, &
580         &                xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
581         &                xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, &
582         &                unass2n, unass2p, srespir2, grazflux, ln_dvm_meso, xfracmig
583      !!----------------------------------------------------------------------
584      !
585      REWIND( numnatp_ref )              ! Namelist namp5zmes in reference namelist : Pisces mesozooplankton
586      READ  ( numnatp_ref, namp5zmes, IOSTAT = ios, ERR = 901)
587901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zmes in reference namelist' )
588      !
589      REWIND( numnatp_cfg )              ! Namelist namp5zmes in configuration namelist : Pisces mesozooplankton
590      READ  ( numnatp_cfg, namp5zmes, IOSTAT = ios, ERR = 902 )
591902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zmes in configuration namelist' )
592      IF(lwm) WRITE ( numonp, namp5zmes )
593      !
594      IF(lwp) THEN                         ! control print
595         WRITE(numout,*) ' ' 
596         WRITE(numout,*) ' Namelist parameters for mesozooplankton, namp5zmes'
597         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
598         WRITE(numout,*) '    part of calcite not dissolved in mesozoo guts  part2       = ', part2
599         WRITE(numout,*) '    mesozoo preference for nano.                   xpref2n     = ', xpref2n
600         WRITE(numout,*) '    mesozoo preference for diatoms                 xpref2d     = ', xpref2d
601         WRITE(numout,*) '    mesozoo preference for zoo                     xpref2z     = ', xpref2z
602         WRITE(numout,*) '    mesozoo preference for mesozoo                 xpref2m     = ', xpref2m
603         WRITE(numout,*) '    mesozoo preference for poc                     xpref2c     = ', xpref2c
604         WRITE(numout,*) '    microzoo feeding threshold  for mesozoo        xthresh2zoo = ', xthresh2zoo
605         WRITE(numout,*) '    diatoms feeding threshold  for mesozoo         xthresh2dia = ', xthresh2dia
606         WRITE(numout,*) '    nanophyto feeding threshold for mesozoo        xthresh2phy = ', xthresh2phy
607         WRITE(numout,*) '    poc feeding threshold for mesozoo              xthresh2poc = ', xthresh2poc
608         WRITE(numout,*) '    mesozoo feeding threshold for mesozoo          xthresh2mes = ', xthresh2mes
609         WRITE(numout,*) '    feeding threshold for mesozooplankton          xthresh2    = ', xthresh2
610         WRITE(numout,*) '    exsudation rate of mesozooplankton             resrat2     = ', resrat2
611         WRITE(numout,*) '    mesozooplankton mortality rate                 mzrat2      = ', mzrat2
612         WRITE(numout,*) '    maximal mesozoo grazing rate                   grazrat2    = ', grazrat2
613         WRITE(numout,*) '    mesozoo flux feeding rate                      grazflux    = ', grazflux
614         WRITE(numout,*) '    C egested fraction of food by mesozoo          unass2c     = ', unass2c
615         WRITE(numout,*) '    N egested fraction of food by mesozoo          unass2n     = ', unass2n
616         WRITE(numout,*) '    P egested fraction of food by mesozoo          unass2p     = ', unass2p
617         WRITE(numout,*) '    Efficicency of Mesozoo growth                  epsher2     = ', epsher2
618         WRITE(numout,*) '    Minimum Efficiency of Mesozoo growth           epsher2min  =', epsher2min
619         WRITE(numout,*) '    Fraction excreted as semi-labile DOM           ssigma2     = ', ssigma2
620         WRITE(numout,*) '    Active respiration                             srespir2    = ', srespir2
621         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2     = ', xkgraz2
622         WRITE(numout,*) '    Use excess carbon for respiration              bmetexc2    = ', bmetexc2
623         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso
624         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig
625      ENDIF
626      !
627   END SUBROUTINE p5z_meso_init
628
629   SUBROUTINE p5z_meso_depmig
630      !!----------------------------------------------------------------------
631      !!                  ***  ROUTINE p5z_meso_depmig  ***
632      !!
633      !! ** Purpose :   Computation the migration depth of mesozooplankton
634      !!
635      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen
636      !!      temperature and chlorophylle following the parameterization
637      !!      proposed by Bianchi et al. (2013)
638      !!
639      !! ** input   :   
640      !!----------------------------------------------------------------------
641      INTEGER  :: ji, jj, jk
642      !
643      REAL(wp) :: totchl
644      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy
645
646      !!---------------------------------------------------------------------
647      !
648      IF( ln_timing == 1 )  CALL timing_start('p5z_meso_zdepmig')
649      !
650      oxymoy(:,:)  = 0.
651      tempmoy(:,:) = 0.
652      zdepmoy(:,:) = 0.
653      depmig (:,:) = 5.
654      kmig   (:,:) = 1
655      !
656      ! Compute the averaged values of oxygen, temperature over the domain
657      ! 150m to 500 m depth.
658      !
659      DO jk =1, jpk
660         DO jj = 1, jpj
661            DO ji = 1, jpi
662               IF (tmask(ji,jj,jk) == 1.) THEN
663                  IF (gdept_n(ji,jj,jk) >= 150. .AND. gdept_n(ji,jj,jk) <= 500.) THEN
664                     oxymoy(ji,jj)  = oxymoy(ji,jj)  + trb(ji,jj,jk,jpoxy)*e3t_n(ji,jj,jk)*1E6
665                     tempmoy(ji,jj) = tempmoy(ji,jj) + tsn(ji,jj,jk,jp_tem)*e3t_n(ji,jj,jk)
666                     zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t_n(ji,jj,jk)
667                  ENDIF
668               ENDIF
669            END DO
670         END DO
671      END DO
672
673      ! Compute the difference between surface values and the mean values in the mesopelagic
674      ! domain
675      ! ------------------------------------------------------------------------------------
676      DO jj = 1, jpj
677         DO ji = 1, jpi
678            oxymoy(ji,jj) = trb(ji,jj,1,jpoxy)*1E6 - oxymoy(ji,jj) / (zdepmoy(ji,jj) + rtrn)
679            tempmoy(ji,jj) = tsn(ji,jj,1,jp_tem)-tempmoy(ji,jj) / (zdepmoy(ji,jj) + rtrn)
680         END DO
681      END DO
682
683      ! Computation of the migration depth based on the parameterization of
684      ! Bianchi et al. (2013)
685      ! -------------------------------------------------------------------
686      DO jj = 1, jpj
687         DO ji = 1, jpi
688            IF (tmask(ji,jj,1) == 1.) THEN
689               totchl = (trb(ji,jj,1,jppch)+trb(ji,jj,1,jpnch)+trb(ji,jj,1,jpdch))*1E6
690               depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(totchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj)
691            ENDIF
692         END DO
693      END DO
694      !
695      ! Computation of the corresponding jk indice
696      ! ------------------------------------------
697      DO jk = 1, jpk-1
698         DO jj = 1, jpj
699            DO ji = 1, jpi
700               IF (depmig(ji,jj) .GE. gdepw_n(ji,jj,jk) .AND. depmig(ji,jj) .LT. gdepw_n(ji,jj,jk+1) ) THEN
701                  kmig(ji,jj) = jk
702               ENDIF
703            END DO
704         END DO
705      END DO
706      !
707      ! Correction of the migration depth and indice based on O2 levels
708      ! If O2 is too low, imposing a migration depth at this low O2 levels
709      ! would lead to negative O2 concentrations (respiration while O2 is close
710      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so
711      ! that it falls above the OMZ
712      ! -----------------------------------------------------------------------
713      DO ji =1, jpi
714         DO jj = 1, jpj
715            IF (trb(ji,jj,kmig(ji,jj),jpoxy) < 5E-6) THEN
716               DO jk = kmig(ji,jj),1,-1
717                  IF (trb(ji,jj,jk,jpoxy) >= 5E-6 .AND. trb(ji,jj,jk+1,jpoxy)  < 5E-6) THEN
718                     kmig(ji,jj) = jk
719                     depmig(ji,jj) = gdept_n(ji,jj,jk)
720                  ENDIF
721               END DO
722            ENDIF
723         END DO
724      END DO
725      !
726      IF( ln_timing )   CALL timing_stop('p5z_meso_depmig')
727      !
728   END SUBROUTINE p5z_meso_depmig
729
730   INTEGER FUNCTION p5z_meso_alloc()
731      !!----------------------------------------------------------------------
732      !!                     ***  ROUTINE p5z_meso_alloc  ***
733      !!----------------------------------------------------------------------
734      !
735      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc  )
736      !
737      IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' )
738      !
739   END FUNCTION p5z_meso_alloc
740
741   !!======================================================================
742END MODULE p5zmeso
Note: See TracBrowser for help on using the repository browser.