New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
p5zmeso.F90 in NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z – NEMO

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

Last change on this file since 12524 was 12524, checked in by aumont, 5 years ago

DVM of mesozooplankton + slight changes on prognostic ligands

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