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.
p5zmeso.F90 in NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z – NEMO

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

Last change on this file since 14276 was 14276, checked in by aumont, 3 years ago

numerous updates to PISCES, PISCES-QUOTA and the sediment module

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