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/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p5zmeso.F90 @ 14786

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

Various bug fixes in PISCES

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