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 @ 13234

Last change on this file since 13234 was 13234, checked in by aumont, 4 years ago

slight change in the namelist PISCES

  • Property svn:keywords set to Id
File size: 44.3 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) :: zgratmp, 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, zstrn
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**2/(0.05**2+zdenom**2)
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 + zgrazm ) * ferat3 + 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 / ferat3)
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/ ferat3 - 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 * ferat3 * zgraztotc - zbasresf
323               ztmp1   = ( 1. - epsher2 - unass2c ) /( 1. - 0.8 * 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               zgratmp = 0.2 * epsher2 /( 1. - 0.8 * epsher2 ) * ztortz
328
329               !  Since only semilabile DOM is represented in PISCES
330               !  part of DOM is in fact labile and is then released
331               !  as dissolved inorganic compounds (ssigma2)
332               !  --------------------------------------------------
333               zgrarem(ji,jj,jk) = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2)
334               zgraren(ji,jj,jk) = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2)
335               zgrarep(ji,jj,jk) = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2)
336               zgraref(ji,jj,jk) = zgrareft + ferat3 * ( ztmp1 + zgratmp )
337
338               !   Defecation as a result of non assimilated products
339               !   --------------------------------------------------
340               zgrapoc(ji,jj,jk)  = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz
341               zgrapon(ji,jj,jk)  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz
342               zgrapop(ji,jj,jk)  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz
343               zgrapof(ji,jj,jk)  = zgraztotf * unass2c + ferat3  * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz
344
345               !  Addition of respiration to the release of inorganic nutrients
346               !  -------------------------------------------------------------
347               zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) + zbasresi + zrespirc
348               zgraren(ji,jj,jk) = zgraren(ji,jj,jk) + zbasresn + zrespirc * no3rat3
349               zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) + zbasresp + zrespirc * po4rat3
350               zgraref(ji,jj,jk) = zgraref(ji,jj,jk) + zbasresf + zrespirc * ferat3
351
352               !   Update the arrays TRA which contain the biological sources and
353               !   sinks
354               !   --------------------------------------------------------------
355               tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) + zepsherv * zgraztotc - zrespirc   &
356               &                     - ztortz - zgrazm
357               tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazdc
358               tra(ji,jj,jk,jpndi) = tra(ji,jj,jk,jpndi) - zgrazdn
359               tra(ji,jj,jk,jppdi) = tra(ji,jj,jk,jppdi) - zgrazdp
360               tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazdf
361               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zgrazz
362               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) - zgraznc
363               tra(ji,jj,jk,jpnph) = tra(ji,jj,jk,jpnph) - zgraznn
364               tra(ji,jj,jk,jppph) = tra(ji,jj,jk,jppph) - zgraznp
365               tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgraznf
366               tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) - zgraznc * trb(ji,jj,jk,jpnch) / ( trb(ji,jj,jk,jpphy) + rtrn )
367               tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) - zgrazdc * trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpdia) + rtrn )
368               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zgrazdc * trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
369               tra(ji,jj,jk,jpgsi) = tra(ji,jj,jk,jpgsi) + zgrazdc * trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn )
370
371               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfracc
372               prodpoc(ji,jj,jk)   = prodpoc(ji,jj,jk) + zfracc
373               conspoc(ji,jj,jk)   = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep
374               tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) - zgrazpon - zgrazffnp + zfracn
375               tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) - zgrazpop - zgrazffpp + zfracp
376               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg - zfracc
377               consgoc(ji,jj,jk)   = consgoc(ji,jj,jk) - zgrazffeg - zfracc
378               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) - zgrazffng - zfracn
379               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) - zgrazffpg - zfracp
380               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe
381               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg - zfracfe
382               zfracal = trb(ji,jj,jk,jpcal) / ( trb(ji,jj,jk,jpgoc) + rtrn )
383               zgrazcal = zgrazffeg * (1. - part2) * zfracal
384               ! Calcite production
385               ! Calcite remineralization due to zooplankton activity
386               ! part2 of the ingested calcite is dissolving in the acidic gut
387               ! -------------------------------------------------------------
388               zprcaca = xfracal(ji,jj,jk) * zgraznc
389               prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
390               zprcaca = part2 * zprcaca
391               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrazcal - zprcaca
392               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * ( zgrazcal - zprcaca )
393               tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) - zgrazcal + zprcaca
394            END DO
395         END DO
396      END DO
397
398      ! Computation of the effect of DVM by mesozooplankton
399      ! This part is only activated if ln_dvm_meso is set to true
400      ! The parameterization has been published in Gorgues et al. (2019).
401      ! -----------------------------------------------------------------
402      IF (ln_dvm_meso) THEN
403         ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) )
404         ALLOCATE( zgramigrep(jpi,jpj), zgramigren(jpi,jpj), zgramigpop(jpi,jpj), zgramigpon(jpi,jpj) )
405         ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj) )
406         ALLOCATE( zstrn(jpi,jpj) )
407         zgramigrem(:,:)  = 0.0   ;   zgramigref(:,:) = 0.0
408         zgramigrep(:,:)  = 0.0   ;   zgramigren(:,:) = 0.0
409         zgramigpoc(:,:)  = 0.0   ;   zgramigpof(:,:) = 0.0
410         zgramigpop(:,:)  = 0.0   ;   zgramigpon(:,:) = 0.0
411         zgramigdoc(:,:)  = 0.0   ;   zgramigdon(:,:) = 0.0
412         zgramigdop(:,:)  = 0.0   
413
414         ! compute the day length depending on latitude and the day
415         zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp )
416         zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  )
417
418         ! day length in hours
419         zstrn(:,:) = 0.
420         DO jj = 1, jpj
421            DO ji = 1, jpi
422               zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad )
423               zargu = MAX( -1., MIN(  1., zargu ) )
424               zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. )
425               zstrn(ji,jj) = MIN(0.75, MAX( 0.25, zstrn(ji,jj) / 24.) )
426            END DO
427         END DO
428
429
430        ! Compute the amount of materials that will go into vertical migration
431        ! This fraction is sumed over the euphotic zone and is removed from
432        ! the fluxes driven by mesozooplankton in the euphotic zone.
433        ! --------------------------------------------------------------------
434         DO jk = 1, jpk
435            DO jj = 1, jpj
436               DO ji = 1, jpi
437                  zmigreltime = (1. - zstrn(ji,jj))
438                  IF ( gdept_n(ji,jj,jk) <= heup(ji,jj) ) THEN
439                     zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * (1. - zmigreltime )    &
440                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
441                     zgramigrep(ji,jj) = zgramigrep(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime )    &
442                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
443                     zgramigrep(ji,jj) = zgramigren(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime )    &
444                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
445                     zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * (1. - zmigreltime )   &
446                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
447                     zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * (1. - zmigreltime )   &
448                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
449                     zgramigpop(ji,jj) = zgramigpop(ji,jj) + xfracmig * zgrapop(ji,jj,jk) * (1. - zmigreltime )   &
450                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
451                     zgramigpon(ji,jj) = zgramigpon(ji,jj) + xfracmig * zgrapon(ji,jj,jk) * (1. - zmigreltime )   &
452                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
453                     zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * (1. - zmigreltime )   &
454                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
455                     zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * (1. - zmigreltime )   &
456                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
457                     zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * (1. - zmigreltime )   &
458                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
459                     zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * (1. - zmigreltime )   &
460                     &                   * e3t_n(ji,jj,jk) * tmask(ji,jj,jk)
461
462                     zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
463                     zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
464                     zgraren(ji,jj,jk) = zgraren(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
465                     zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
466                     zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
467                     zgrapop(ji,jj,jk) = zgrapop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
468                     zgrapon(ji,jj,jk) = zgrapon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
469                     zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
470                     zgradoc(ji,jj,jk) = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
471                     zgradop(ji,jj,jk) = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
472                     zgradon(ji,jj,jk) = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
473                  ENDIF
474               END DO
475            END DO
476         END DO
477
478         ! The inorganic and organic fluxes induced by migrating organisms are added at the
479         ! the migration depth (corresponding indice is set by kmig)
480         ! --------------------------------------------------------------------------------
481         DO jj = 1, jpj
482            DO ji = 1, jpi
483               IF (tmask(ji,jj,1) == 1.) THEN
484                  jkt = kmig(ji,jj)
485                  zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) / e3t_n(ji,jj,jkt)
486                  zgrarep(ji,jj,jkt) = zgrarep(ji,jj,jkt) + zgramigrep(ji,jj) / e3t_n(ji,jj,jkt)
487                  zgraren(ji,jj,jkt) = zgraren(ji,jj,jkt) + zgramigren(ji,jj) / e3t_n(ji,jj,jkt)
488                  zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) / e3t_n(ji,jj,jkt)
489                  zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) / e3t_n(ji,jj,jkt)
490                  zgrapop(ji,jj,jkt) = zgrapop(ji,jj,jkt) + zgramigpop(ji,jj) / e3t_n(ji,jj,jkt)
491                  zgrapon(ji,jj,jkt) = zgrapon(ji,jj,jkt) + zgramigpon(ji,jj) / e3t_n(ji,jj,jkt)
492                  zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) / e3t_n(ji,jj,jkt)
493                  zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) / e3t_n(ji,jj,jkt)
494                  zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) / e3t_n(ji,jj,jkt)
495                  zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) / e3t_n(ji,jj,jkt)
496               ENDIF
497            END DO
498         END DO
499         !
500         ! Deallocate temporary variables
501         ! ------------------------------
502         DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof )
503         DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon )
504         DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop )
505         DEALLOCATE( zstrn )
506      ! End of the ln_dvm_meso part
507      ENDIF
508
509      !   Update the arrays TRA which contain the biological sources and sinks
510      !   This only concerns the variables which are affected by DVM (inorganic
511      !   nutrients, DOC agands, and particulate organic carbon).
512      !   ---------------------------------------------------------------------
513      DO jk = 1, jpk
514         DO jj = 1, jpj
515            DO ji = 1, jpi
516               tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarep(ji,jj,jk) 
517               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgraren(ji,jj,jk)
518               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgradoc(ji,jj,jk)
519               !
520               IF( ln_ligand ) THEN
521                  tra(ji,jj,jk,jplgw)  = tra(ji,jj,jk,jplgw) + zgradoc(ji,jj,jk) * ldocz
522                  zz2ligprod(ji,jj,jk) = zgradoc(ji,jj,jk) * ldocz
523               ENDIF
524               !
525               tra(ji,jj,jk,jpdon) = tra(ji,jj,jk,jpdon) + zgradon(ji,jj,jk)
526               tra(ji,jj,jk,jpdop) = tra(ji,jj,jk,jpdop) + zgradop(ji,jj,jk)
527               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarem(ji,jj,jk)
528               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref(ji,jj,jk)
529               zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk)
530               tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarem(ji,jj,jk)
531               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgraren(ji,jj,jk)
532               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zgrapoc(ji,jj,jk)
533               prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk)
534               tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) + zgrapon(ji,jj,jk)
535               tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) + zgrapop(ji,jj,jk)
536               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zgrapof(ji,jj,jk)
537            END DO
538         END DO
539      END DO
540      !
541      IF( lk_iomput .AND. knt == nrdttrc ) THEN
542         ALLOCATE( zw3d(jpi,jpj,jpk) )
543         IF( iom_use( "GRAZ2" ) ) THEN
544            zw3d(:,:,:) = zgrazing(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:)  !   Total grazing of phyto by zooplankton
545            CALL iom_put( "GRAZ2", zw3d )
546         ENDIF
547         IF( iom_use( "PCAL" ) ) THEN
548            zw3d(:,:,:) = prodcal(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:)   !  Calcite production
549            CALL iom_put( "PCAL", zw3d )
550         ENDIF
551         IF( iom_use( "FEZOO2" ) ) THEN
552            zw3d(:,:,:) = zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)   !
553            CALL iom_put( "FEZOO2", zw3d )
554         ENDIF
555         IF( iom_use( "LPRODZ2" ) .AND. ln_ligand )  THEN
556            zw3d(:,:,:) = zz2ligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)
557            CALL iom_put( "LPRODZ2"  , zw3d )
558         ENDIF
559         DEALLOCATE( zw3d )
560      ENDIF
561      !
562      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
563        WRITE(charout, FMT="('meso')")
564        CALL prt_ctl_trc_info(charout)
565        CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
566      ENDIF
567      !
568      IF( ln_timing )   CALL timing_stop('p5z_meso')
569      !
570   END SUBROUTINE p5z_meso
571
572
573   SUBROUTINE p5z_meso_init
574      !!----------------------------------------------------------------------
575      !!                  ***  ROUTINE p5z_meso_init  ***
576      !!
577      !! ** Purpose :   Initialization of mesozooplankton parameters
578      !!
579      !! ** Method  :   Read the namp5zmes namelist and check the parameters
580      !!      called at the first timestep (nittrc000)
581      !!
582      !! ** input   :   Namelist namp5zmes
583      !!
584      !!----------------------------------------------------------------------
585      INTEGER :: ios    ! Local integer output status for namelist read
586      !!
587      NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, mzrat2, xpref2c, xpref2n, xpref2z, &
588         &                xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
589         &                xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, &
590         &                unass2n, unass2p, srespir2, xsigma2, xsigma2del, grazflux, ln_dvm_meso, xfracmig
591      !!----------------------------------------------------------------------
592      !
593      REWIND( numnatp_ref )              ! Namelist namp5zmes in reference namelist : Pisces mesozooplankton
594      READ  ( numnatp_ref, namp5zmes, IOSTAT = ios, ERR = 901)
595901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zmes in reference namelist' )
596      !
597      REWIND( numnatp_cfg )              ! Namelist namp5zmes in configuration namelist : Pisces mesozooplankton
598      READ  ( numnatp_cfg, namp5zmes, IOSTAT = ios, ERR = 902 )
599902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zmes in configuration namelist' )
600      IF(lwm) WRITE ( numonp, namp5zmes )
601      !
602      IF(lwp) THEN                         ! control print
603         WRITE(numout,*) ' ' 
604         WRITE(numout,*) ' Namelist parameters for mesozooplankton, namp5zmes'
605         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
606         WRITE(numout,*) '    part of calcite not dissolved in mesozoo guts  part2       = ', part2
607         WRITE(numout,*) '    mesozoo preference for nano.                   xpref2n     = ', xpref2n
608         WRITE(numout,*) '    mesozoo preference for diatoms                 xpref2d     = ', xpref2d
609         WRITE(numout,*) '    mesozoo preference for zoo                     xpref2z     = ', xpref2z
610         WRITE(numout,*) '    mesozoo preference for mesozoo                 xpref2m     = ', xpref2m
611         WRITE(numout,*) '    mesozoo preference for poc                     xpref2c     = ', xpref2c
612         WRITE(numout,*) '    microzoo feeding threshold  for mesozoo        xthresh2zoo = ', xthresh2zoo
613         WRITE(numout,*) '    diatoms feeding threshold  for mesozoo         xthresh2dia = ', xthresh2dia
614         WRITE(numout,*) '    nanophyto feeding threshold for mesozoo        xthresh2phy = ', xthresh2phy
615         WRITE(numout,*) '    poc feeding threshold for mesozoo              xthresh2poc = ', xthresh2poc
616         WRITE(numout,*) '    mesozoo feeding threshold for mesozoo          xthresh2mes = ', xthresh2mes
617         WRITE(numout,*) '    feeding threshold for mesozooplankton          xthresh2    = ', xthresh2
618         WRITE(numout,*) '    exsudation rate of mesozooplankton             resrat2     = ', resrat2
619         WRITE(numout,*) '    mesozooplankton mortality rate                 mzrat2      = ', mzrat2
620         WRITE(numout,*) '    maximal mesozoo grazing rate                   grazrat2    = ', grazrat2
621         WRITE(numout,*) '    mesozoo flux feeding rate                      grazflux    = ', grazflux
622         WRITE(numout,*) '    C egested fraction of food by mesozoo          unass2c     = ', unass2c
623         WRITE(numout,*) '    N egested fraction of food by mesozoo          unass2n     = ', unass2n
624         WRITE(numout,*) '    P egested fraction of food by mesozoo          unass2p     = ', unass2p
625         WRITE(numout,*) '    Efficicency of Mesozoo growth                  epsher2     = ', epsher2
626         WRITE(numout,*) '    Minimum Efficiency of Mesozoo growth           epsher2min  =', epsher2min
627         WRITE(numout,*) '    Fraction excreted as semi-labile DOM           ssigma2     = ', ssigma2
628         WRITE(numout,*) '    Active respiration                             srespir2    = ', srespir2
629         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2     = ', xkgraz2
630         WRITE(numout,*) '    Use excess carbon for respiration              bmetexc2    = ', bmetexc2
631         WRITE(numout,*) '      Width of the grazing window                     xsigma2     =', xsigma2
632         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigma2del  =', xsigma2del
633         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso
634         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig
635      ENDIF
636      !
637   END SUBROUTINE p5z_meso_init
638
639   SUBROUTINE p5z_meso_depmig
640      !!----------------------------------------------------------------------
641      !!                  ***  ROUTINE p5z_meso_depmig  ***
642      !!
643      !! ** Purpose :   Computation the migration depth of mesozooplankton
644      !!
645      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen
646      !!      temperature and chlorophylle following the parameterization
647      !!      proposed by Bianchi et al. (2013)
648      !!
649      !! ** input   :   
650      !!----------------------------------------------------------------------
651      INTEGER  :: ji, jj, jk
652      !
653      REAL(wp) :: totchl
654      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy
655
656      !!---------------------------------------------------------------------
657      !
658      IF( ln_timing == 1 )  CALL timing_start('p5z_meso_zdepmig')
659      !
660      oxymoy(:,:)  = 0.
661      tempmoy(:,:) = 0.
662      zdepmoy(:,:) = 0.
663      depmig (:,:) = 5.
664      kmig   (:,:) = 1
665      !
666      ! Compute the averaged values of oxygen, temperature over the domain
667      ! 150m to 500 m depth.
668      !
669      DO jk =1, jpk
670         DO jj = 1, jpj
671            DO ji = 1, jpi
672               IF (tmask(ji,jj,jk) == 1.) THEN
673                  IF (gdept_n(ji,jj,jk) >= 150. .AND. gdept_n(ji,jj,jk) <= 500.) THEN
674                     oxymoy(ji,jj)  = oxymoy(ji,jj)  + trb(ji,jj,jk,jpoxy)*e3t_n(ji,jj,jk)*1E6
675                     tempmoy(ji,jj) = tempmoy(ji,jj) + tsn(ji,jj,jk,jp_tem)*e3t_n(ji,jj,jk)
676                     zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t_n(ji,jj,jk)
677                  ENDIF
678               ENDIF
679            END DO
680         END DO
681      END DO
682
683      ! Compute the difference between surface values and the mean values in the mesopelagic
684      ! domain
685      ! ------------------------------------------------------------------------------------
686      DO jj = 1, jpj
687         DO ji = 1, jpi
688            oxymoy(ji,jj) = trb(ji,jj,1,jpoxy)*1E6 - oxymoy(ji,jj) / (zdepmoy(ji,jj) + rtrn)
689            tempmoy(ji,jj) = tsn(ji,jj,1,jp_tem)-tempmoy(ji,jj) / (zdepmoy(ji,jj) + rtrn)
690         END DO
691      END DO
692
693      ! Computation of the migration depth based on the parameterization of
694      ! Bianchi et al. (2013)
695      ! -------------------------------------------------------------------
696      DO jj = 1, jpj
697         DO ji = 1, jpi
698            IF (tmask(ji,jj,1) == 1.) THEN
699               totchl = (trb(ji,jj,1,jppch)+trb(ji,jj,1,jpnch)+trb(ji,jj,1,jpdch))*1E6
700               depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(totchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj)
701            ENDIF
702         END DO
703      END DO
704      !
705      ! Computation of the corresponding jk indice
706      ! ------------------------------------------
707      DO jk = 1, jpk-1
708         DO jj = 1, jpj
709            DO ji = 1, jpi
710               IF (depmig(ji,jj) .GE. gdepw_n(ji,jj,jk) .AND. depmig(ji,jj) .LT. gdepw_n(ji,jj,jk+1) ) THEN
711                  kmig(ji,jj) = jk
712               ENDIF
713            END DO
714         END DO
715      END DO
716      !
717      ! Correction of the migration depth and indice based on O2 levels
718      ! If O2 is too low, imposing a migration depth at this low O2 levels
719      ! would lead to negative O2 concentrations (respiration while O2 is close
720      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so
721      ! that it falls above the OMZ
722      ! -----------------------------------------------------------------------
723      DO ji =1, jpi
724         DO jj = 1, jpj
725            IF (trb(ji,jj,kmig(ji,jj),jpoxy) < 5E-6) THEN
726               DO jk = kmig(ji,jj),1,-1
727                  IF (trb(ji,jj,jk,jpoxy) >= 5E-6 .AND. trb(ji,jj,jk+1,jpoxy)  < 5E-6) THEN
728                     kmig(ji,jj) = jk
729                     depmig(ji,jj) = gdept_n(ji,jj,jk)
730                  ENDIF
731               END DO
732            ENDIF
733         END DO
734      END DO
735      !
736      IF( ln_timing )   CALL timing_stop('p5z_meso_depmig')
737      !
738   END SUBROUTINE p5z_meso_depmig
739
740   INTEGER FUNCTION p5z_meso_alloc()
741      !!----------------------------------------------------------------------
742      !!                     ***  ROUTINE p5z_meso_alloc  ***
743      !!----------------------------------------------------------------------
744      !
745      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc  )
746      !
747      IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' )
748      !
749   END FUNCTION p5z_meso_alloc
750
751   !!======================================================================
752END MODULE p5zmeso
Note: See TracBrowser for help on using the repository browser.