source: NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p4zmeso.F90 @ 12759

Last change on this file since 12759 was 12759, checked in by aumont, 13 months ago

make parameterizations in PISCES-operationnal more similar to thos of PISCES-QUOTA (prey switching, optimal allocation, size, …)

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