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

source: NEMO/trunk/src/TOP/PISCES/P4Z/p5zmeso.F90 @ 15482

Last change on this file since 15482 was 15482, checked in by cetlod, 8 months ago

Minor bugfix

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