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

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

initialization of local arrays to 0

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