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

Last change on this file since 14385 was 14385, checked in by cetlod, 3 years ago

dev_r11708_aumont_PISCES_QUOTA : merge with the trunk

  • Property svn:keywords set to Id
File size: 40.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   !!----------------------------------------------------------------------
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  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc)
245
246         !   Compute fractionation of aggregates. It is assumed that
247         !   diatoms based aggregates are more prone to fractionation
248         !   since they are more porous (marine snow instead of fecal pellets)
249         !   ----------------------------------------------------------------
250         zratio    = tr(ji,jj,jk,jpgsi,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn )
251         zratio2   = zratio * zratio
252         zfracc    = zproport * grazflux  * xstep * wsbio4(ji,jj,jk)      &
253         &          * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)          &
254         &          * ( 0.2 + 3.8 * zratio2 / ( 1.**2 + zratio2 ) )
255         zfracfe   = zfracc * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
256         zfracn    = zfracc * tr(ji,jj,jk,jpgon,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
257         zfracp    = zfracc * tr(ji,jj,jk,jpgop,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
258
259         ! Flux feeding is multiplied by the fractional biomass of flux feeders
260         zgrazffep = zproport * zgrazffep   ;   zgrazffeg = zproport * zgrazffeg
261         zgrazfffp = zproport * zgrazfffp   ;   zgrazfffg = zproport * zgrazfffg
262         zgrazffnp = zproport * zgrazffnp   ;   zgrazffng = zproport * zgrazffng
263         zgrazffpp = zproport * zgrazffpp   ;   zgrazffpg = zproport * zgrazffpg
264
265         zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg
266         zgraztotf  = zgrazdf + zgraznf + zgrazz * feratz + zgrazm * feratm + zgrazpof &
267         &            + zgrazfffp + zgrazfffg
268         zgraztotn  = zgrazdn + (zgrazm + zgrazz) * no3rat3 + zgraznn + zgrazpon  &
269         &            + zgrazffnp + zgrazffng
270         zgraztotp  = zgrazdp + (zgrazz + zgrazm) * po4rat3 + zgraznp + zgrazpop  &
271         &            + zgrazffpp + zgrazffpg
272
273         ! Total grazing ( grazing by microzoo is already computed in p5zmicro )
274         zgrazing(ji,jj,jk) = zgraztotc
275
276         !   Stoichiometruc ratios of the food ingested by zooplanton
277         !   --------------------------------------------------------
278         zgrasratf  =  (zgraztotf + rtrn) / ( zgraztotc + rtrn )
279         zgrasratn  =  (zgraztotn + rtrn) / ( zgraztotc + rtrn )
280         zgrasratp  =  (zgraztotp + rtrn) / ( zgraztotc + rtrn )
281
282         ! Mesozooplankton efficiency.
283         ! We adopt a formulation proposed by Mitra et al. (2007)
284         ! The gross growth efficiency is controled by the most limiting nutrient.
285         ! Growth is also further decreased when the food quality is poor. This is currently
286         ! hard coded : it can be decreased by up to 50% (zepsherq)
287         ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and
288         ! Fulton, 2012)
289         ! -----------------------------------------------------------------------------------
290         zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / feratm)
291         zbeta     = MAX(0., (epsher2 - epsher2min) )
292         zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta )
293         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 )
294         zepsherv  = zepsherf * zepshert * zepsherq
295
296         !   Respiration of mesozooplankton
297         !   Excess carbon in the food is used preferentially
298         !   when bmetexc2 is set to .true.
299         !   -----------------------------------------------
300         zexcess  = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess 
301         zbasresb = MAX(0., zrespz - zexcess)
302         zbasresi = zexcess + MIN(0., zrespz - zexcess)
303         zrespirc = srespir2 * zepsherv * zgraztotc + zbasresb
304
305         !   When excess carbon is used, the other elements in excess
306         !   are also used proportionally to their abundance
307         !   --------------------------------------------------------
308         zexcess  = ( zgrasratn/ no3rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
309         zbasresn = zbasresi * zexcess * zgrasratn
310         zexcess  = ( zgrasratp/ po4rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
311         zbasresp = zbasresi * zexcess * zgrasratp
312         zexcess  = ( zgrasratf/ feratm - zepshert ) / ( 1.0 - zepshert + rtrn)
313         zbasresf = zbasresi * zexcess * zgrasratf
314
315         !   Voiding of the excessive elements as organic matter
316         !   --------------------------------------------------------
317         zgradoct = (1. - unass2c - zepsherv) * zgraztotc - zbasresi
318         zgradont = (1. - unass2n) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn
319         zgradopt = (1. - unass2p) * zgraztotp - zepsherv * po4rat3 * zgraztotc - zbasresp
320         zgrareft = (1. - unass2c) * zgraztotf - zepsherv * feratm * zgraztotc - zbasresf
321         ztmp1    = (1. - epsher2 - unass2c) /( 1. - epsher2 ) * ztortz
322
323         zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * ssigma2
324         zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * ssigma2
325         zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * ssigma2
326
327
328         !  Since only semilabile DOM is represented in PISCES
329         !  part of DOM is in fact labile and is then released
330         !  as dissolved inorganic compounds (ssigma2)
331         !  --------------------------------------------------
332         zgrarem(ji,jj,jk) = ( zgradoct + ztmp1 ) * (1.0 - ssigma2)
333         zgraren(ji,jj,jk) = ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2)
334         zgrarep(ji,jj,jk) = ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2)
335         zgraref(ji,jj,jk) = zgrareft + feratm * ztmp1
336
337         !   Defecation as a result of non assimilated products
338         !   --------------------------------------------------
339         zgrapoc(ji,jj,jk)  = zgraztotc * unass2c + unass2c / ( 1. - epsher2 ) * ztortz
340         zgrapon(ji,jj,jk)  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - epsher2 ) * ztortz
341         zgrapop(ji,jj,jk)  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - epsher2 ) * ztortz
342         zgrapof(ji,jj,jk)  = zgraztotf * unass2c + feratm  * unass2c / ( 1. - epsher2 ) * ztortz
343
344         !  Addition of respiration to the release of inorganic nutrients
345         !  -------------------------------------------------------------
346         zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) + zbasresi + zrespirc
347         zgraren(ji,jj,jk) = zgraren(ji,jj,jk) + zbasresn + zrespirc * no3rat3
348         zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) + zbasresp + zrespirc * po4rat3
349         zgraref(ji,jj,jk) = zgraref(ji,jj,jk) + zbasresf + zrespirc * feratm
350         
351
352         !   Update the arrays TRA which contain the biological sources and
353         !   sinks
354         !   --------------------------------------------------------------
355         tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) + zepsherv * zgraztotc - zrespirc   &
356         &                     - ztortz - zgrazm
357         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc
358         tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) - zgrazdn
359         tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) - zgrazdp
360         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf
361         tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zgrazz
362         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc
363         tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) - zgraznn
364         tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) - zgraznp
365         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf
366         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 )
367         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 )
368         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 )
369         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 )
370
371         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - 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         tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zgrazpon - zgrazffnp + zfracn
375         tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) - zgrazpop - zgrazffpp + zfracp
376         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg - zfracc
377         consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfracc
378         tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zgrazffng - zfracn
379         tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zgrazffpg - zfracp
380         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zgrazpof - zgrazfffp + zfracfe
381         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg - zfracfe
382         zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn )
383         zgrazcal = zgrazffeg * (1. - part2) * zfracal
384
385         ! Calcite production
386         ! Calcite remineralization due to zooplankton activity
387         ! part2 of the ingested calcite is dissolving in the acidic gut
388         ! -------------------------------------------------------------
389         zprcaca = xfracal(ji,jj,jk) * zgraznc
390         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
391         zprcaca = part2 * zprcaca
392         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrazcal - zprcaca
393         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * ( zgrazcal - zprcaca )
394         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca
395      END_3D
396
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          zgramigrem(:,:)  = 0.0   ;   zgramigref(:,:) = 0.0
407          zgramigrep(:,:)  = 0.0   ;   zgramigren(:,:) = 0.0
408          zgramigpoc(:,:)  = 0.0   ;   zgramigpof(:,:) = 0.0
409          zgramigpop(:,:)  = 0.0   ;   zgramigpon(:,:) = 0.0
410          zgramigdoc(:,:)  = 0.0   ;   zgramigdon(:,:) = 0.0
411          zgramigdop(:,:)  = 0.0   
412                 
413          ! Compute the amount of materials that will go into vertical migration
414          ! This fraction is sumed over the euphotic zone and is removed from
415          ! the fluxes driven by mesozooplankton in the euphotic zone.
416          ! --------------------------------------------------------------------
417          DO_3D( 1, 1, 1, 1, 1, jpkm1 )       
418             zmigreltime = (1. - strn(ji,jj))
419             IF( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN
420                zmigthick  = e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * ( 1. - zmigreltime ) 
421                zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * zmigthick 
422                zgramigrep(ji,jj) = zgramigrep(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * zmigthick
423                zgramigren(ji,jj) = zgramigren(ji,jj) + xfracmig * zgraren(ji,jj,jk) * zmigthick
424                zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * zmigthick
425                zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * zmigthick
426                zgramigpop(ji,jj) = zgramigpop(ji,jj) + xfracmig * zgrapop(ji,jj,jk) * zmigthick
427                zgramigpon(ji,jj) = zgramigpon(ji,jj) + xfracmig * zgrapon(ji,jj,jk) * zmigthick
428                zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * zmigthick
429                zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * zmigthick
430                zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * zmigthick
431                zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * zmigthick
432
433                zgrarem(ji,jj,jk)  = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
434                zgrarep(ji,jj,jk)  = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
435                zgraren(ji,jj,jk)  = zgraren(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
436                zgraref(ji,jj,jk)  = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
437                zgrapoc(ji,jj,jk)  = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
438                zgrapop(ji,jj,jk)  = zgrapop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
439                zgrapon(ji,jj,jk)  = zgrapon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
440                zgrapof(ji,jj,jk)  = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
441                zgradoc(ji,jj,jk)  = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
442                zgradop(ji,jj,jk)  = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
443                zgradon(ji,jj,jk)  = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
444             ENDIF
445          END_3D
446
447          ! The inorganic and organic fluxes induced by migrating organisms are added at the
448          ! the migration depth (corresponding indice is set by kmig)
449          ! --------------------------------------------------------------------------------
450          DO_2D( 1, 1, 1, 1 )
451             IF( tmask(ji,jj,1) == 1. ) THEN
452                 jkt = kmig(ji,jj)
453                 zdep = 1. / e3t(ji,jj,jkt,Kmm)
454                 zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) * zdep 
455                 zgrarep(ji,jj,jkt) = zgrarep(ji,jj,jkt) + zgramigrep(ji,jj) * zdep 
456                 zgraren(ji,jj,jkt) = zgraren(ji,jj,jkt) + zgramigren(ji,jj) * zdep 
457                 zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) * zdep 
458                 zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) * zdep 
459                 zgrapop(ji,jj,jkt) = zgrapop(ji,jj,jkt) + zgramigpop(ji,jj) * zdep 
460                 zgrapon(ji,jj,jkt) = zgrapon(ji,jj,jkt) + zgramigpon(ji,jj) * zdep 
461                 zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) * zdep 
462                 zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) * zdep
463                 zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) * zdep 
464                 zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) * zdep 
465              ENDIF
466          END_2D
467                   !
468          ! Deallocate temporary variables
469          ! ------------------------------
470          DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof )
471          DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon )
472          DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop )
473         ! End of the ln_dvm_meso part
474      ENDIF
475
476        !   Update the arrays TRA which contain the biological sources and sinks
477        !   This only concerns the variables which are affected by DVM (inorganic
478        !   nutrients, DOC agands, and particulate organic carbon).
479        !   ---------------------------------------------------------------------
480      DO_3D( 1, 1, 1, 1, 1, jpkm1 )       
481         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarep(ji,jj,jk) 
482         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgraren(ji,jj,jk)
483         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgradoc(ji,jj,jk)
484         !
485         IF( ln_ligand ) &
486           &  tr(ji,jj,jk,jplgw,Krhs)  = tr(ji,jj,jk,jplgw,Krhs) + zgradoc(ji,jj,jk) * ldocz
487         !
488         tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zgradon(ji,jj,jk)
489         tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop(ji,jj,jk)
490         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk)
491         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk)
492         zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk)
493         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk)
494         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgraren(ji,jj,jk)                     
495         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk)
496         prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk)
497         tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) + zgrapon(ji,jj,jk)
498         tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) + zgrapop(ji,jj,jk)
499         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk)
500      END_3D
501      !
502      IF( lk_iomput .AND. knt == nrdttrc ) THEN
503         CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production
504         CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo
505         CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
506         IF( ln_ligand ) &
507           & CALL iom_put( "LPRODZ2", zgradoc(:,:,:) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  )
508      ENDIF
509      !
510      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
511        WRITE(charout, FMT="('meso')")
512        CALL prt_ctl_info( charout, cdcomp = 'top' )
513        CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
514      ENDIF
515      !
516      IF( ln_timing )   CALL timing_stop('p5z_meso')
517      !
518   END SUBROUTINE p5z_meso
519
520
521   SUBROUTINE p5z_meso_init
522      !!----------------------------------------------------------------------
523      !!                  ***  ROUTINE p5z_meso_init  ***
524      !!
525      !! ** Purpose :   Initialization of mesozooplankton parameters
526      !!
527      !! ** Method  :   Read the namp5zmes namelist and check the parameters
528      !!      called at the first timestep (nittrc000)
529      !!
530      !! ** input   :   Namelist namp5zmes
531      !!
532      !!----------------------------------------------------------------------
533      INTEGER :: ios    ! Local integer output status for namelist read
534      !!
535      NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, mzrat2, xpref2c, xpref2n, xpref2z, &
536         &                xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
537         &                xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, &
538         &                unass2n, unass2p, srespir2, xsigma2, xsigma2del, grazflux, ln_dvm_meso, xfracmig
539      !!----------------------------------------------------------------------
540      !
541      READ  ( numnatp_ref, namp5zmes, IOSTAT = ios, ERR = 901)
542901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zmes in reference namelist' )
543      !
544      READ  ( numnatp_cfg, namp5zmes, IOSTAT = ios, ERR = 902 )
545902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zmes in configuration namelist' )
546      IF(lwm) WRITE ( numonp, namp5zmes )
547      !
548      IF(lwp) THEN                         ! control print
549         WRITE(numout,*) ' ' 
550         WRITE(numout,*) ' Namelist parameters for mesozooplankton, namp5zmes'
551         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
552         WRITE(numout,*) '    part of calcite not dissolved in mesozoo guts  part2       = ', part2
553         WRITE(numout,*) '    mesozoo preference for nano.                   xpref2n     = ', xpref2n
554         WRITE(numout,*) '    mesozoo preference for diatoms                 xpref2d     = ', xpref2d
555         WRITE(numout,*) '    mesozoo preference for zoo                     xpref2z     = ', xpref2z
556         WRITE(numout,*) '    mesozoo preference for mesozoo                 xpref2m     = ', xpref2m
557         WRITE(numout,*) '    mesozoo preference for poc                     xpref2c     = ', xpref2c
558         WRITE(numout,*) '    microzoo feeding threshold  for mesozoo        xthresh2zoo = ', xthresh2zoo
559         WRITE(numout,*) '    diatoms feeding threshold  for mesozoo         xthresh2dia = ', xthresh2dia
560         WRITE(numout,*) '    nanophyto feeding threshold for mesozoo        xthresh2phy = ', xthresh2phy
561         WRITE(numout,*) '    poc feeding threshold for mesozoo              xthresh2poc = ', xthresh2poc
562         WRITE(numout,*) '    mesozoo feeding threshold for mesozoo          xthresh2mes = ', xthresh2mes
563         WRITE(numout,*) '    feeding threshold for mesozooplankton          xthresh2    = ', xthresh2
564         WRITE(numout,*) '    exsudation rate of mesozooplankton             resrat2     = ', resrat2
565         WRITE(numout,*) '    mesozooplankton mortality rate                 mzrat2      = ', mzrat2
566         WRITE(numout,*) '    maximal mesozoo grazing rate                   grazrat2    = ', grazrat2
567         WRITE(numout,*) '    mesozoo flux feeding rate                      grazflux    = ', grazflux
568         WRITE(numout,*) '    C egested fraction of food by mesozoo          unass2c     = ', unass2c
569         WRITE(numout,*) '    N egested fraction of food by mesozoo          unass2n     = ', unass2n
570         WRITE(numout,*) '    P egested fraction of food by mesozoo          unass2p     = ', unass2p
571         WRITE(numout,*) '    Efficicency of Mesozoo growth                  epsher2     = ', epsher2
572         WRITE(numout,*) '    Minimum Efficiency of Mesozoo growth           epsher2min  =', epsher2min
573         WRITE(numout,*) '    Fraction excreted as semi-labile DOM           ssigma2     = ', ssigma2
574         WRITE(numout,*) '    Active respiration                             srespir2    = ', srespir2
575         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2     = ', xkgraz2
576         WRITE(numout,*) '    Use excess carbon for respiration              bmetexc2    = ', bmetexc2
577         WRITE(numout,*) '      Width of the grazing window                     xsigma2     =', xsigma2
578         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigma2del  =', xsigma2del
579         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso
580         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig
581      ENDIF
582      !
583   END SUBROUTINE p5z_meso_init
584
585   SUBROUTINE p5z_meso_depmig( Kbb, Kmm )
586      !!----------------------------------------------------------------------
587      !!                  ***  ROUTINE p4z_meso_depmig  ***
588      !!
589      !! ** Purpose :   Computation the migration depth of mesozooplankton
590      !!
591      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen
592      !!      temperature and chlorophylle following the parameterization
593      !!      proposed by Bianchi et al. (2013)
594      !!----------------------------------------------------------------------
595      INTEGER, INTENT(in)  ::  Kbb, kmm ! time level indices
596      !
597      INTEGER  :: ji, jj, jk
598      !
599      REAL(wp) :: ztotchl, z1dep
600      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy
601
602      !!---------------------------------------------------------------------
603      !
604      IF( ln_timing == 1 )  CALL timing_start('p5z_meso_zdepmig')
605      !
606      oxymoy(:,:)  = 0.
607      tempmoy(:,:) = 0.
608      zdepmoy(:,:) = 0.
609      depmig (:,:) = 5.
610      kmig   (:,:) = 1
611      !
612
613      ! Compute the averaged values of oxygen, temperature over the domain
614      ! 150m to 500 m depth.
615      ! ------------------------------------------------------------------
616      DO_3D( 1, 1, 1, 1, 1, jpk )
617         IF( tmask(ji,jj,jk) == 1.) THEN
618            IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN
619               oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm)
620               tempmoy(ji,jj) = tempmoy(ji,jj) + ts(ji,jj,jk,jp_tem,kmm)      * e3t(ji,jj,jk,kmm)
621               zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm)
622            ENDIF
623         ENDIF
624      END_3D
625
626      ! Compute the difference between surface values and the mean values in the mesopelagic
627      ! domain
628      ! ------------------------------------------------------------------------------------
629      DO_2D( 1, 1, 1, 1 )
630         z1dep = 1. / ( zdepmoy(ji,jj) + rtrn )
631         oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep
632         tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep
633      END_2D
634      !
635      ! Computation of the migration depth based on the parameterization of
636      ! Bianchi et al. (2013)
637      ! -------------------------------------------------------------------
638      DO_2D( 1, 1, 1, 1 )
639         IF( tmask(ji,jj,1) == 1. ) THEN
640            ztotchl = ( tr(ji,jj,1,jppch,Kbb) + tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6
641            depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj)
642         ENDIF
643      END_2D
644
645            ! Computation of the corresponding jk indice
646      ! ------------------------------------------
647      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
648         IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN
649             kmig(ji,jj) = jk
650          ENDIF
651      END_3D
652      !
653      ! Correction of the migration depth and indice based on O2 levels
654      ! If O2 is too low, imposing a migration depth at this low O2 levels
655      ! would lead to negative O2 concentrations (respiration while O2 is close
656      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so
657      ! that it falls above the OMZ
658      ! -----------------------------------------------------------------------
659      DO_2D( 1, 1, 1, 1 )
660         IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN
661            DO jk = kmig(ji,jj),1,-1
662               IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN
663                  kmig(ji,jj) = jk
664                  depmig(ji,jj) = gdept(ji,jj,jk,Kmm)
665               ENDIF
666            END DO
667         ENDIF
668      END_2D
669      !
670      IF( ln_timing )   CALL timing_stop('p5z_meso_depmig')
671      !
672   END SUBROUTINE p5z_meso_depmig
673
674   INTEGER FUNCTION p5z_meso_alloc()
675      !!----------------------------------------------------------------------
676      !!                     ***  ROUTINE p5z_meso_alloc  ***
677      !!----------------------------------------------------------------------
678      !
679      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc  )
680      !
681      IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' )
682      !
683   END FUNCTION p5z_meso_alloc
684
685   !!======================================================================
686END MODULE p5zmeso
Note: See TracBrowser for help on using the repository browser.