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

source: NEMO/trunk/src/TOP/PISCES/P4Z/p4zmeso.F90 @ 15459

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

Various bug fixes and more comments in PISCES routines ; sette test OK in debug mode, nn_hls=1/2, with tiling ; run.stat unchanged ; of course tracer.stat different

  • Property svn:keywords set to Id
File size: 32.8 KB
Line 
1MODULE p4zmeso
2   !!======================================================================
3   !!                         ***  MODULE p4zmeso  ***
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   !!----------------------------------------------------------------------
10   !!   p4z_meso        : Compute the sources/sinks for mesozooplankton
11   !!   p4z_meso_init   : Initialization of the parameters for mesozooplankton
12   !!   p4z_meso_alloc  : Allocate variables 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 p4zprod         ! production
18   USE prtctl          ! print control for debugging
19   USE iom             ! I/O manager
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   p4z_meso              ! called in p4zbio.F90
25   PUBLIC   p4z_meso_init         ! called in trcsms_pisces.F90
26   PUBLIC   p4z_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 ::  xpref2d      !: mesozoo preference for diatoms
31   REAL(wp), PUBLIC ::  xpref2n      !: mesozoo preference for nanophyto
32   REAL(wp), PUBLIC ::  xpref2z      !: mesozoo preference for microzooplankton
33   REAL(wp), PUBLIC ::  xpref2c      !: mesozoo preference for POC
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 ::  xthresh2     !: feeding threshold for mesozooplankton
39   REAL(wp), PUBLIC ::  resrat2      !: exsudation rate of mesozooplankton
40   REAL(wp), PUBLIC ::  mzrat2       !: microzooplankton mortality rate
41   REAL(wp), PUBLIC ::  grazrat2     !: maximal mesozoo grazing rate
42   REAL(wp), PUBLIC ::  xkgraz2      !: non assimilated fraction of P by mesozoo
43   REAL(wp), PUBLIC ::  unass2       !: Efficicency of mesozoo growth
44   REAL(wp), PUBLIC ::  sigma2       !: Fraction of mesozoo excretion as DOM
45   REAL(wp), PUBLIC ::  epsher2      !: growth efficiency
46   REAL(wp), PUBLIC ::  epsher2min   !: minimum growth efficiency at high food for grazing 2
47   REAL(wp), PUBLIC ::  xsigma2      !: Width of the predation window
48   REAL(wp), PUBLIC ::  xsigma2del   !: Maximum width of the predation window at low food density
49   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate
50   REAL(wp), PUBLIC ::  xfracmig     !: Fractional biomass of meso that performs DVM
51   LOGICAL , PUBLIC ::  ln_dvm_meso  !: Boolean to activate DVM of mesozooplankton
52   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig  !: DVM of mesozooplankton : migration depth
53   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig    !: Vertical indice of the the migration depth
54
55   !! * Substitutions
56#  include "do_loop_substitute.h90"
57#  include "domzgr_substitute.h90"
58   !!----------------------------------------------------------------------
59   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
60   !! $Id$
61   !! Software governed by the CeCILL license (see ./LICENSE)
62   !!----------------------------------------------------------------------
63CONTAINS
64
65   SUBROUTINE p4z_meso( kt, knt, Kbb, Kmm, Krhs )
66      !!---------------------------------------------------------------------
67      !!                     ***  ROUTINE p4z_meso  ***
68      !!
69      !! ** Purpose :   Compute the sources/sinks for mesozooplankton
70      !!                This includes ingestion and assimilation, flux feeding
71      !!                and mortality. We use a passive prey switching 
72      !!                parameterization.
73      !!                All living compartments smaller than mesozooplankton
74      !!                are potential preys of mesozooplankton as well as small
75      !!                sinking particles
76      !!
77      !! ** Method  : - ???
78      !!---------------------------------------------------------------------
79      INTEGER, INTENT(in) ::   kt, knt   ! ocean time step and ???
80      INTEGER, INTENT(in)  ::  Kbb, kmm, Krhs ! time level indices
81      !
82      INTEGER  :: ji, jj, jk, jkt
83      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam
84      REAL(wp) :: zgraze2 , zdenom, zdenom2, zfact   , zfood, zfoodlim, zproport, zbeta
85      REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2, zfracal, zgrazcal
86      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgraztotc, zgraztotn, zgraztotf
87      REAL(wp) :: zmigreltime, zprcaca, zmortz, zgrasratf, zgrasratn
88      REAL(wp) :: zrespz, ztortz, zgrazdc, zgrazz, zgrazpof, zgraznc, zgrazpoc, zgraznf, zgrazdf
89      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zrum, zcodel, zargu, zval, zdep
90      REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmptot, zmigthick 
91      CHARACTER (len=25) :: charout
92      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2
93      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof, zgrabsi
94      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigrem, zgramigref, zgramigpoc, zgramigpof
95      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zgramigbsi
96      !!---------------------------------------------------------------------
97      !
98      IF( ln_timing )   CALL timing_start('p4z_meso')
99      !
100      zgrazing(:,:,:) = 0._wp   ;  zgrapoc(:,:,:) = 0._wp
101      zfezoo2 (:,:,:) = 0._wp   ;  zgrarem(:,:,:) = 0._wp
102      zgraref (:,:,:) = 0._wp   ;  zgrapof(:,:,:) = 0._wp
103      zgrabsi (:,:,:) = 0._wp
104      !
105      !
106      ! Diurnal vertical migration of mesozooplankton
107      ! Computation of the migration depth
108      ! ---------------------------------------------
109      IF (ln_dvm_meso) CALL p4z_meso_depmig( Kbb, Kmm )
110      !
111      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
112         zcompam   = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - 1.e-9 ), 0.e0 )
113         zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam
114
115         
116         !  linear mortality of mesozooplankton
117         !  A michaelis menten modulation term is used to avoid extinction of
118         !  mesozooplankton at very low food concentration. Mortality is
119
120         !  enhanced in low O2 waters
121         !  -----------------------------------------------------------------
122         zrespz    = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) )  &
123         &           + 3. * nitrfac(ji,jj,jk) )
124
125         ! Zooplankton quadratic mortality. A square function has been selected with
126         !  to mimic predation and disease (density dependent mortality). It also tends
127         !  to stabilise the model
128         !  -------------------------------------------------------------------------
129         ztortz    = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb)  * (1. - nitrfac(ji,jj,jk) )
130         !
131 
132         !   Computation of the abundance of the preys
133         !   A threshold can be specified in the namelist
134         !   --------------------------------------------
135         zcompadi  = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthresh2dia ), 0.e0 )
136         zcompaz   = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthresh2zoo ), 0.e0 )
137         zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthresh2poc ), 0.e0 )
138
139         ! Size effect of nanophytoplankton on grazing : the smaller it is, the less prone
140         ! it is to predation by mesozooplankton. We use a quota dependant parameterization
141         ! as a low quota indicates oligotrophic conditions which are charatcerized by
142         ! small cells
143         ! -------------------------------------------------------------------------------
144         zcompaph  = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthresh2phy ), 0.e0 )
145
146         ! Mesozooplankton grazing
147         ! The total amount of food is the sum of all preys accessible to mesozooplankton
148         ! multiplied by their food preference
149         ! A threshold can be specified in the namelist (xthresh2). However, when food
150         ! concentration is close to this threshold, it is decreased to avoid the
151         ! accumulation of food in the mesozoopelagic domain
152         ! -------------------------------------------------------------------------------
153         zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc 
154         zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) )
155         zdenom    = zfoodlim / ( xkgraz2 + zfoodlim )
156         zdenom2   = zdenom / ( zfood + rtrn )
157         zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk)) 
158
159
160         ! An active switching parameterization is used here.
161         ! We don't use the KTW parameterization proposed by
162         ! Vallina et al. because it tends to produce too steady biomass
163         ! composition and the variance of Chl is too low as it grazes
164         ! too strongly on winning organisms. We use a generalized
165         ! switching parameterization proposed by Morozov and
166         ! Petrovskii (2013)
167         ! ------------------------------------------------------------ 
168         ! The width of the selection window is increased when preys
169         ! have low abundance, .i.e. zooplankton become less specific
170         ! to avoid starvation.
171         ! ----------------------------------------------------------
172         zsigma = 1.0 - zdenom**2/(0.05**2+zdenom**2)
173         zsigma = xsigma2 + xsigma2del * zsigma
174         ! Nanophytoplankton and diatoms are the only preys considered
175         ! to be close enough to have potential interference
176         ! -----------------------------------------------------------
177         zdiffdn = exp( -ABS(log(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 )
178         ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / ( 1.0 + zdiffdn )
179         ztmp2 = xpref2c * zcompapoc**2
180         ztmp3 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / ( 1.0 + zdiffdn )
181         ztmp4 = xpref2z * zcompaz**2
182         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + rtrn
183         ztmp1 = ztmp1 / ztmptot
184         ztmp2 = ztmp2 / ztmptot
185         ztmp3 = ztmp3 / ztmptot
186         ztmp4 = ztmp4 / ztmptot
187
188         !   Mesozooplankton regular grazing on the different preys
189         !   ------------------------------------------------------
190         zgrazdc   = zgraze2  * ztmp3 * zdenom  ! diatoms
191         zgraznc   = zgraze2  * ztmp1 * zdenom  ! nanophytoplankton
192         zgrazpoc  = zgraze2  * ztmp2 * zdenom  ! small POC
193         zgrazz    = zgraze2  * ztmp4 * zdenom  ! microzooplankton
194
195         ! Ingestion rates of the Fe content of the different preys
196         zgraznf   = zgraznc  * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn)
197         zgrazdf   = zgrazdc  * tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn)
198         zgrazpof  = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn)
199
200         !  Mesozooplankton flux feeding on GOC and POC. The feeding pressure
201         ! is proportional to the flux
202         !  ------------------------------------------------------------------
203         zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      &
204         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb) &
205         &           * (1. - nitrfac(ji,jj,jk))
206         zgrazfffg = zgrazffeg * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
207         zgrazffep = grazflux  * xstep *  wsbio3(ji,jj,jk)     &
208         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb) &
209         &           * (1. - nitrfac(ji,jj,jk))
210         zgrazfffp = zgrazffep * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn)
211         !
212         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg
213         ! Compute the proportion of filter feeders. It is assumed steady state.
214         ! --------------------------------------------------------------------- 
215         zproport  = 0._wp
216         IF( gdepw(ji,jj,jk+1,Kmm) > MAX(hmld(ji,jj), heup_01(ji,jj) ) ) THEN
217            zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc)
218         ENDIF
219
220         ! Compute fractionation of aggregates. It is assumed that
221         ! diatoms based aggregates are more prone to fractionation
222         ! since they are more porous (marine snow instead of fecal pellets)
223         ! -----------------------------------------------------------------
224
225         ! Compute fractionation of aggregates. It is assumed that
226         ! diatoms based aggregates are more prone to fractionation
227         ! since they are more porous (marine snow instead of fecal pellets)
228         zratio    = tr(ji,jj,jk,jpgsi,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn )
229         zratio2   = zratio * zratio
230         zfrac     = zproport * grazflux  * xstep * wsbio4(ji,jj,jk)      &
231         &          * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)          &
232         &          * ( 0.4 + 3.6 * zratio2 / ( 1.**2 + zratio2 ) )
233         zfracfe   = zfrac * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
234
235         ! Flux feeding is multiplied by the fractional biomass of flux feeders
236         zgrazffep = zproport * zgrazffep
237         zgrazffeg = zproport * zgrazffeg
238         zgrazfffp = zproport * zgrazfffp
239         zgrazfffg = zproport * zgrazfffg
240         zgrazdc   = (1.0 - zproport) * zgrazdc
241         zgraznc   = (1.0 - zproport) * zgraznc
242         zgrazz    = (1.0 - zproport) * zgrazz
243         zgrazpoc  = (1.0 - zproport) * zgrazpoc
244         zgrazdf   = (1.0 - zproport) * zgrazdf
245         zgraznf   = (1.0 - zproport) * zgraznf
246         zgrazpof  = (1.0 - zproport) * zgrazpof
247
248
249         ! Total ingestion rates in C, N, Fe
250         zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg
251         zgraztotn = zgrazdc * quotad(ji,jj,jk) + zgrazz + zgraznc * quotan(ji,jj,jk)   &
252         &   + zgrazpoc + zgrazffep + zgrazffeg
253         zgraztotf = zgrazdf + zgraznf + zgrazz * feratz + zgrazpof + zgrazfffp + zgrazfffg
254
255         ! Total grazing ( grazing by microzoo is already computed in p4zmicro )
256         zgrazing(ji,jj,jk) = zgraztotc
257
258         ! Mesozooplankton efficiency.
259         ! We adopt a formulation proposed by Mitra et al. (2007)
260         ! The gross growth efficiency is controled by the most limiting nutrient.
261         ! Growth is also further decreased when the food quality is poor. This is currently
262         ! hard coded : it can be decreased by up to 50% (zepsherq)
263         ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and
264         ! Fulton, 2012)
265         ! -----------------------------------------------------------------------------------
266
267         zgrasratf =  ( zgraztotf + rtrn )/ ( zgraztotc + rtrn )
268         zgrasratn =  ( zgraztotn + rtrn )/ ( zgraztotc + rtrn )
269         zepshert  = MIN( 1., zgrasratn, zgrasratf / feratm)
270         zbeta     = MAX(0., (epsher2 - epsher2min) )
271         ! Food quantity deprivation of GGE
272         zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 
273         ! Food quality deprivation of GGE
274         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 )
275         ! Actual GGE
276         zepsherv  = zepsherf * zepshert * zepsherq
277         !
278         ! Impact of grazing on the prognostic variables
279         ! ---------------------------------------------
280         zmortz = ztortz + zrespz
281         ! Mortality induced by the upper trophic levels, ztortz, is allocated
282         ! according to a infinite chain of predators (ANderson et al., 2013)
283         zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz + zrespz
284
285         tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) - zmortz + zepsherv * zgraztotc 
286         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc
287         tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zgrazz
288         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc
289         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 )
290         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 )
291         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 )
292         zgrabsi(ji,jj,jk)       = zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn )
293         !
294         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf
295         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf
296         !
297         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zgrazpoc - zgrazffep + zfrac
298         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfrac
299         conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep
300         !
301         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg - zfrac
302         consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfrac
303         !
304         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zgrazpof - zgrazfffp + zfracfe
305         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg - zfracfe
306
307         ! Calcite remineralization due to zooplankton activity
308         ! part2 of the ingested calcite is not dissolving in the
309         ! acidic gut
310         ! ------------------------------------------------------
311         zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn )
312         zgrazcal = zgrazffeg * (1. - part2) * zfracal
313         ! calcite production by zooplankton activity
314         zprcaca = xfracal(ji,jj,jk) * zgraznc
315         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
316         !
317         zprcaca = part2 * zprcaca
318         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrazcal - zprcaca
319         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * ( zgrazcal - zprcaca )
320         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca
321
322         ! Computation of total excretion and egestion by mesozoo.
323         ! ---------------------------------------------------------
324         zgrarem(ji,jj,jk) = zgraztotc * ( 1. - zepsherv - unass2 ) &
325                 &         + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz
326         zgraref(ji,jj,jk) = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasratf - feratm * zepsherv )    &
327                 &         + feratm * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz )
328         zgrapoc(ji,jj,jk) = zgraztotc * unass2 + zmortzgoc
329         zgrapof(ji,jj,jk) = zgraztotf * unass2 + feratm * zmortzgoc
330         !
331      END_3D
332
333      ! Computation of the effect of DVM by mesozooplankton
334      ! This part is only activated if ln_dvm_meso is set to true
335      ! The parameterization has been published in Gorgues et al. (2019).
336      ! -----------------------------------------------------------------
337      IF (ln_dvm_meso) THEN
338         ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) )
339         ALLOCATE( zgramigbsi(jpi,jpj) )
340         zgramigrem(:,:) = 0.0    ;   zgramigref(:,:) = 0.0
341         zgramigpoc(:,:) = 0.0    ;   zgramigpof(:,:) = 0.0
342         zgramigbsi(:,:) = 0.0
343
344        ! Compute the amount of materials that will go into vertical migration
345        ! This fraction is sumed over the euphotic zone and is removed from
346        ! the fluxes driven by mesozooplankton in the euphotic zone.
347        ! --------------------------------------------------------------------
348        DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk)
349            zmigreltime = (1. - strn(ji,jj))
350            zmigthick   = (1. - zmigreltime ) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk)
351            IF ( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN
352               zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * zmigthick 
353               zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * zmigthick 
354               zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * zmigthick 
355               zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * zmigthick 
356               zgramigbsi(ji,jj) = zgramigbsi(ji,jj) + xfracmig * zgrabsi(ji,jj,jk) * zmigthick 
357
358               zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
359               zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
360               zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
361               zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
362               zgrabsi(ji,jj,jk) = zgrabsi(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime )
363            ENDIF
364         END_3D
365     
366         ! The inorganic and organic fluxes induced by migrating organisms are added at the
367         ! the migration depth (corresponding indice is set by kmig)
368         ! --------------------------------------------------------------------------------
369         DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
370            IF( tmask(ji,jj,1) == 1.) THEN
371               jkt = kmig(ji,jj)
372               zdep = 1. / e3t(ji,jj,jkt,Kmm)
373               zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) * zdep 
374               zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) * zdep
375               zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) * zdep
376               zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) * zdep
377               zgrabsi(ji,jj,jkt) = zgrabsi(ji,jj,jkt) + zgramigbsi(ji,jj) * zdep
378            ENDIF
379         END_2D
380         !
381         ! Deallocate temporary variables
382         ! ------------------------------
383         DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof, zgramigbsi )
384      ! End of the ln_dvm_meso part
385      ENDIF
386
387      !   Update the arrays TRA which contain the biological sources and sinks
388      !   This only concerns the variables which are affected by DVM (inorganic
389      !   nutrients, DOC agands, and particulate organic carbon).
390      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk)
391         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarem(ji,jj,jk) * sigma2
392         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarem(ji,jj,jk) * sigma2
393         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 )
394         !
395         IF( ln_ligand ) & 
396          &  tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz
397         !
398         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) * sigma2
399         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk)
400         zfezoo2(ji,jj,jk)   = zgraref(ji,jj,jk)
401         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) * sigma2
402         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarem(ji,jj,jk) * sigma2             
403         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk)
404         prodgoc(ji,jj,jk)   = prodgoc(ji,jj,jk)   + zgrapoc(ji,jj,jk)
405         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk)
406         tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrabsi(ji,jj,jk)
407      END_3D
408      !
409      ! Write the output
410      IF( lk_iomput .AND. knt == nrdttrc ) THEN
411        CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production
412        CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo
413        CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
414        IF( ln_ligand ) &
415         & CALL iom_put( "LPRODZ2", zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  )
416      ENDIF
417      !
418      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
419        WRITE(charout, FMT="('meso')")
420        CALL prt_ctl_info( charout, cdcomp = 'top' )
421        CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
422      ENDIF
423      !
424      IF( ln_timing )   CALL timing_stop('p4z_meso')
425      !
426   END SUBROUTINE p4z_meso
427
428
429   SUBROUTINE p4z_meso_init
430      !!----------------------------------------------------------------------
431      !!                  ***  ROUTINE p4z_meso_init  ***
432      !!
433      !! ** Purpose :   Initialization of mesozooplankton parameters
434      !!
435      !! ** Method  :   Read the namp4zmes namelist and check the parameters
436      !!      called at the first timestep (nittrc000)
437      !!
438      !! ** input   :   Namelist nampismes
439      !!----------------------------------------------------------------------
440      INTEGER ::   ios   ! Local integer
441      !
442      NAMELIST/namp4zmes/ part2, grazrat2, resrat2, mzrat2, xpref2n, xpref2d, xpref2z,   &
443         &                xpref2c, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
444         &                xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux, ln_dvm_meso,  &
445         &                xsigma2, xsigma2del, xfracmig
446      !!----------------------------------------------------------------------
447      !
448      IF(lwp) THEN
449         WRITE(numout,*) 
450         WRITE(numout,*) 'p4z_meso_init : Initialization of mesozooplankton parameters'
451         WRITE(numout,*) '~~~~~~~~~~~~~'
452      ENDIF
453      !
454      READ  ( numnatp_ref, namp4zmes, IOSTAT = ios, ERR = 901)
455901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zmes in reference namelist' )
456
457      READ  ( numnatp_cfg, namp4zmes, IOSTAT = ios, ERR = 902 )
458902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zmes in configuration namelist' )
459      IF(lwm) WRITE( numonp, namp4zmes )
460      !
461      IF(lwp) THEN                         ! control print
462         WRITE(numout,*) '   Namelist : namp4zmes'
463         WRITE(numout,*) '      part of calcite not dissolved in mesozoo guts  part2        =', part2
464         WRITE(numout,*) '      mesozoo preference for phyto                   xpref2n      =', xpref2n
465         WRITE(numout,*) '      mesozoo preference for diatoms                 xpref2d      =', xpref2d
466         WRITE(numout,*) '      mesozoo preference for zoo                     xpref2z      =', xpref2z
467         WRITE(numout,*) '      mesozoo preference for poc                     xpref2c      =', xpref2c
468         WRITE(numout,*) '      microzoo feeding threshold  for mesozoo        xthresh2zoo  =', xthresh2zoo
469         WRITE(numout,*) '      diatoms feeding threshold  for mesozoo         xthresh2dia  =', xthresh2dia
470         WRITE(numout,*) '      nanophyto feeding threshold for mesozoo        xthresh2phy  =', xthresh2phy
471         WRITE(numout,*) '      poc feeding threshold for mesozoo              xthresh2poc  =', xthresh2poc
472         WRITE(numout,*) '      feeding threshold for mesozooplankton          xthresh2     =', xthresh2
473         WRITE(numout,*) '      exsudation rate of mesozooplankton             resrat2      =', resrat2
474         WRITE(numout,*) '      mesozooplankton mortality rate                 mzrat2       =', mzrat2
475         WRITE(numout,*) '      maximal mesozoo grazing rate                   grazrat2     =', grazrat2
476         WRITE(numout,*) '      mesozoo flux feeding rate                      grazflux     =', grazflux
477         WRITE(numout,*) '      non assimilated fraction of P by mesozoo       unass2       =', unass2
478         WRITE(numout,*) '      Efficiency of Mesozoo growth                   epsher2      =', epsher2
479         WRITE(numout,*) '      Minimum Efficiency of Mesozoo growth           epsher2min   =', epsher2min
480         WRITE(numout,*) '      Fraction of mesozoo excretion as DOM           sigma2       =', sigma2
481         WRITE(numout,*) '      half sturation constant for grazing 2          xkgraz2      =', xkgraz2
482         WRITE(numout,*) '      Width of the grazing window                     xsigma2     =', xsigma2
483         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigma2del  =', xsigma2del
484         WRITE(numout,*) '      Diurnal vertical migration of mesozoo.         ln_dvm_meso  =', ln_dvm_meso
485         WRITE(numout,*) '      Fractional biomass of meso  that performs DVM  xfracmig     =', xfracmig
486      ENDIF
487      !
488   END SUBROUTINE p4z_meso_init
489
490   SUBROUTINE p4z_meso_depmig( Kbb, Kmm )
491      !!----------------------------------------------------------------------
492      !!                  ***  ROUTINE p4z_meso_depmig  ***
493      !!
494      !! ** Purpose :   Computation the migration depth of mesozooplankton
495      !!
496      !! ** Method  :   Computes the DVM depth of mesozooplankton from oxygen
497      !!      temperature and chlorophylle following the parameterization
498      !!      proposed by Bianchi et al. (2013)
499      !!----------------------------------------------------------------------
500      INTEGER, INTENT(in)  ::  Kbb, kmm ! time level indices
501      !
502      INTEGER  :: ji, jj, jk
503      !
504      REAL(wp) :: ztotchl, z1dep
505      REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy
506
507      !!---------------------------------------------------------------------
508      !
509      IF( ln_timing == 1 )  CALL timing_start('p4z_meso_zdepmig')
510      !
511      oxymoy(:,:)  = 0.
512      tempmoy(:,:) = 0.
513      zdepmoy(:,:) = 0.
514      depmig (:,:) = 5.
515      kmig   (:,:) = 1
516      !
517      ! Compute the averaged values of oxygen, temperature over the domain
518      ! 150m to 500 m depth.
519      ! ------------------------------------------------------------------
520      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk)
521         IF( tmask(ji,jj,jk) == 1.) THEN
522            IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN
523               oxymoy(ji,jj)  = oxymoy(ji,jj)  + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm)
524               tempmoy(ji,jj) = tempmoy(ji,jj) + ts(ji,jj,jk,jp_tem,kmm)      * e3t(ji,jj,jk,kmm)
525               zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm)
526            ENDIF
527         ENDIF
528      END_3D
529
530      ! Compute the difference between surface values and the mean values in the mesopelagic
531      ! domain
532      ! ------------------------------------------------------------------------------------
533      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
534         z1dep = 1. / ( zdepmoy(ji,jj) + rtrn )
535         oxymoy(ji,jj)  = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj)  * z1dep
536         tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm)      - tempmoy(ji,jj) * z1dep
537      END_2D
538      !
539      ! Computation of the migration depth based on the parameterization of
540      ! Bianchi et al. (2013)
541      ! -------------------------------------------------------------------
542      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
543         IF( tmask(ji,jj,1) == 1. ) THEN
544            ztotchl = ( tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6
545            depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj)
546         ENDIF
547      END_2D
548      !
549      ! Computation of the corresponding jk indice
550      ! ------------------------------------------
551      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
552         IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN
553             kmig(ji,jj) = jk
554          ENDIF
555      END_3D
556      !
557      ! Correction of the migration depth and indice based on O2 levels
558      ! If O2 is too low, imposing a migration depth at this low O2 levels
559      ! would lead to negative O2 concentrations (respiration while O2 is close
560      ! to 0. Thus, to avoid that problem, the migration depth is adjusted so
561      ! that it falls above the OMZ
562      ! -----------------------------------------------------------------------
563      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
564         IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN
565            DO jk = kmig(ji,jj),1,-1
566               IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb)  < 5E-6) THEN
567                  kmig(ji,jj) = jk
568                  depmig(ji,jj) = gdept(ji,jj,jk,Kmm)
569               ENDIF
570            END DO
571         ENDIF
572      END_2D
573      !
574      IF( ln_timing )   CALL timing_stop('p4z_meso_depmig')
575      !
576   END SUBROUTINE p4z_meso_depmig
577
578   INTEGER FUNCTION p4z_meso_alloc()
579      !!----------------------------------------------------------------------
580      !!                     ***  ROUTINE p4z_meso_alloc  ***
581      !!----------------------------------------------------------------------
582      !
583      ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p4z_meso_alloc  )
584      !
585      IF( p4z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_meso_alloc : failed to allocate arrays.' )
586      !
587   END FUNCTION p4z_meso_alloc
588
589   !!======================================================================
590END MODULE p4zmeso
Note: See TracBrowser for help on using the repository browser.