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

Last change on this file since 12538 was 12538, checked in by aumont, 11 months ago

initialization of local arrays to 0

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