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

source: NEMO/trunk/src/TOP/PISCES/P4Z/p5zmicro.F90

Last change on this file was 15459, checked in by cetlod, 2 years 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: 24.9 KB
RevLine 
[7162]1MODULE p5zmicro
2   !!======================================================================
3   !!                         ***  MODULE p5zmicro  ***
4   !! TOP :   PISCES Compute the sources/sinks for microzooplankton
5   !!======================================================================
6   !! History :   1.0  !  2004     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Quota model for iron
9   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
10   !!----------------------------------------------------------------------
11   !!   p5z_micro       :   Compute the sources/sinks for microzooplankton
12   !!   p5z_micro_init  :   Initialize and read the appropriate namelist
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
[15459]17   USE p4zlim          !  PISCES nutrient limitation term of PISCES std
[10227]18   USE p5zlim          !  Phytoplankton limitation terms
[7162]19   USE iom             !  I/O manager
[13286]20   USE prtctl          !  print control for debugging
[7162]21
22   IMPLICIT NONE
23   PRIVATE
24
25   PUBLIC   p5z_micro         ! called in p5zbio.F90
26   PUBLIC   p5z_micro_init    ! called in trcsms_pisces.F90
27
28   !! * Shared module variables
29   REAL(wp), PUBLIC ::  part        !: part of calcite not dissolved in microzoo guts
30   REAL(wp), PUBLIC ::  xprefc     !: microzoo preference for POC
31   REAL(wp), PUBLIC ::  xprefn     !: microzoo preference for nanophyto
32   REAL(wp), PUBLIC ::  xprefp     !: microzoo preference for picophyto
33   REAL(wp), PUBLIC ::  xprefd     !: microzoo preference for diatoms
34   REAL(wp), PUBLIC ::  xprefz     !: microzoo preference for microzoo
35   REAL(wp), PUBLIC ::  xthreshdia  !: diatoms feeding threshold for microzooplankton
36   REAL(wp), PUBLIC ::  xthreshpic  !: picophyto feeding threshold for microzooplankton
37   REAL(wp), PUBLIC ::  xthreshphy  !: nanophyto threshold for microzooplankton
38   REAL(wp), PUBLIC ::  xthreshzoo  !: microzoo threshold for microzooplankton
39   REAL(wp), PUBLIC ::  xthreshpoc  !: poc threshold for microzooplankton
40   REAL(wp), PUBLIC ::  xthresh     !: feeding threshold for microzooplankton
41   REAL(wp), PUBLIC ::  resrat      !: exsudation rate of microzooplankton
42   REAL(wp), PUBLIC ::  mzrat       !: microzooplankton mortality rate
43   REAL(wp), PUBLIC ::  grazrat     !: maximal microzoo grazing rate
[10362]44   REAL(wp), PUBLIC ::  xkgraz      !: Half-saturation constant of assimilation
45   REAL(wp), PUBLIC ::  unassc      !: Non-assimilated part of food
46   REAL(wp), PUBLIC ::  unassn      !: Non-assimilated part of food
47   REAL(wp), PUBLIC ::  unassp      !: Non-assimilated part of food
48   REAL(wp), PUBLIC ::  epsher      !: Growth efficiency for microzoo
49   REAL(wp), PUBLIC ::  epshermin   !: Minimum growth efficiency for microzoo
[7162]50   REAL(wp), PUBLIC ::  srespir     !: half sturation constant for grazing 1
51   REAL(wp), PUBLIC ::  ssigma      !: Fraction excreted as semi-labile DOM
[15459]52   REAL(wp), PUBLIC ::  xsigma      !: Width of the grazing window
53   REAL(wp), PUBLIC ::  xsigmadel   !: Maximum additional width of the grazing window at low food density
[7162]54   LOGICAL,  PUBLIC ::  bmetexc     !: Use of excess carbon for respiration
55
[12377]56   !! * Substitutions
57#  include "do_loop_substitute.h90"
[7162]58   !!----------------------------------------------------------------------
[10067]59   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
[10068]60   !! $Id$
61   !! Software governed by the CeCILL license (see ./LICENSE)
[7162]62   !!----------------------------------------------------------------------
63
64CONTAINS
65
[12377]66   SUBROUTINE p5z_micro( kt, knt, Kbb, Krhs )
[7162]67      !!---------------------------------------------------------------------
68      !!                     ***  ROUTINE p5z_micro  ***
69      !!
70      !! ** Purpose :   Compute the sources/sinks for microzooplankton
71      !!
72      !! ** Method  : - ???
73      !!---------------------------------------------------------------------
74      INTEGER, INTENT(in) ::  kt  ! ocean time step
75      INTEGER, INTENT(in) ::  knt 
[12377]76      INTEGER, INTENT(in) ::  Kbb, Krhs      ! time level indices
[7162]77      !
78      INTEGER  :: ji, jj, jk
79      REAL(wp) :: zcompadi, zcompaz , zcompaph, zcompapoc, zcompapon, zcompapop
80      REAL(wp) :: zcompapi, zgraze  , zdenom, zfact, zfood, zfoodlim
81      REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot
[15459]82      REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi
[7162]83      REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf
84      REAL(wp) :: zgradoc, zgradon, zgradop, zgraref, zgradoct, zgradont, zgradopt, zgrareft
85      REAL(wp) :: zexcess, zgraren, zgrarep, zgrarem
86      REAL(wp) :: zgrapoc, zgrapon, zgrapop, zgrapof, zprcaca, zmortz
87      REAL(wp) :: zrespz, ztortz, zgrasratf, zgrasratn, zgrasratp
88      REAL(wp) :: zgraznc, zgraznn, zgraznp, zgrazpoc, zgrazpon, zgrazpop, zgrazpof
89      REAL(wp) :: zgrazdc, zgrazdn, zgrazdp, zgrazdf, zgraznf, zgrazz
90      REAL(wp) :: zgrazpc, zgrazpn, zgrazpp, zgrazpf, zbeta, zrfact2, zmetexcess
[12276]91      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo, zzligprod
[15459]92      REAL(wp) :: zsigma, zdiffdn, zdiffpn, zdiffdp, zproport, zproport2
[7162]93      CHARACTER (len=25) :: charout
94      !!---------------------------------------------------------------------
95      !
[9124]96      IF( ln_timing )   CALL timing_start('p5z_micro')
[7162]97      !
[15459]98      ! Use of excess carbon for metabolism
[7162]99      zmetexcess = 0.0
100      IF ( bmetexc ) zmetexcess = 1.0
101      !
[15090]102      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
[12377]103         zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - 1.e-9 ), 0.e0 )
104         zfact   = xstep * tgfunc2(ji,jj,jk) * zcompaz
[15459]105         ! Proportion of nano and diatoms that are within the size range
106         ! accessible to microzooplankton.
107         zproport  = min(sized(ji,jj,jk),1.8)**(-0.48)*min(1.0, exp(-1.1 * MAX(0., ( sized(ji,jj,jk) - 1.8 ))**0.8 ))
108         zproport2 = sizen(ji,jj,jk)**(-0.48)
109         zproport2 = 1.0
110         !  linear mortality of mesozooplankton
111         !  A michaelis menten modulation term is used to avoid extinction of
112         !  microzooplankton at very low food concentrations. Mortality is
113         !  enhanced in low O2 waters
114         !  -----------------------------------------------------------------
[7162]115
[12377]116         !   Michaelis-Menten mortality rates of microzooplankton
117         !   -----------------------------------------------------
118         zrespz = resrat * zfact * ( tr(ji,jj,jk,jpzoo,Kbb) / ( xkmort + tr(ji,jj,jk,jpzoo,Kbb) )  &
119         &        + 3. * nitrfac(ji,jj,jk) )
[7162]120
[15459]121         !  Zooplankton quadratic mortality. A square function has been selected with
122         !  to mimic predation and disease (density dependent mortality). It also tends
123         !  to stabilise the model
124         !  -------------------------------------------------------------------------
[12377]125         ztortz = mzrat * 1.e6 * zfact * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk))
[7162]126
[12377]127         !   Computation of the abundance of the preys
128         !   A threshold can be specified in the namelist
[15459]129         !   Nanophyto and diatoms have a specific treatment with
130         !   teir preference decreasing with size.
131         !   --------------------------------------------------------
132         zcompadi  = zproport  * MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthreshdia ), 0.e0 )
133         zcompaph  = zproport2 * MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthreshphy ), 0.e0 )
[12377]134         zcompaz   = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthreshzoo ), 0.e0 )
135         zcompapi  = MAX( ( tr(ji,jj,jk,jppic,Kbb) - xthreshpic ), 0.e0 )
136         zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthreshpoc ), 0.e0 )
[15459]137               
138         ! Microzooplankton grazing
139         ! The total amount of food is the sum of all preys accessible to mesozooplankton
140         ! multiplied by their food preference
141         ! A threshold can be specified in the namelist (xthresh). However, when food
142         ! concentration is close to this threshold, it is decreased to avoid the
143         ! accumulation of food in the mesozoopelagic domain
144         ! -------------------------------------------------------------------------------
[12377]145         zfood     = xprefn * zcompaph + xprefc * zcompapoc + xprefd * zcompadi   &
146         &           + xprefz * zcompaz + xprefp * zcompapi
147         zfoodlim  = MAX( 0. , zfood - min(xthresh,0.5*zfood) )
148         zdenom    = zfoodlim / ( xkgraz + zfoodlim )
149         zgraze    = grazrat * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpzoo,Kbb) * (1. - nitrfac(ji,jj,jk)) 
[7162]150
[15459]151         ! An active switching parameterization is used here.
152         ! We don't use the KTW parameterization proposed by
153         ! Vallina et al. because it tends to produce too steady biomass
154         ! composition and the variance of Chl is too low as it grazes
155         ! too strongly on winning organisms. We use a generalized
156         ! switching parameterization proposed by Morozov and
157         ! Petrovskii (2013)
158         ! ------------------------------------------------------------ 
159         ! The width of the selection window is increased when preys
160         ! have low abundance, .i.e. zooplankton become less specific
161         ! to avoid starvation.
162         ! ----------------------------------------------------------
163         zsigma = 1.0 - zdenom**3/(0.1**3+zdenom**3)
164         zsigma = xsigma + xsigmadel * zsigma
165         zdiffpn = exp( -ABS(log(0.7 * sizep(ji,jj,jk) / (3.0 * sizen(ji,jj,jk) + rtrn )) )**2 / zsigma**2 )
166         zdiffdn = exp( -ABS(log(3.0 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2)
167         zdiffdp = exp( -ABS(log(0.7 * sizep(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2)
168         ztmp1 = xprefn * zcompaph * ( zcompaph + zdiffdn * zcompadi + zdiffpn * zcompapi ) / ( 1.0 + zdiffdn + zdiffpn )
169         ztmp2 = xprefp * zcompapi * ( zcompapi + zdiffpn * zcompaph + zdiffdp * zcompadi ) / ( 1.0 + zdiffpn + zdiffdp )
170         ztmp3 = xprefc * zcompapoc**2
171         ztmp4 = xprefd * zcompadi * ( zdiffdp * zcompapi + zdiffdn * zcompaph + zcompadi ) / ( 1.0 + zdiffdn + zdiffdp )
172         ztmp5 = xprefz * zcompaz**2
[12377]173         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn
174         ztmp1 = ztmp1 / ztmptot
175         ztmp2 = ztmp2 / ztmptot
176         ztmp3 = ztmp3 / ztmptot
177         ztmp4 = ztmp4 / ztmptot
178         ztmp5 = ztmp5 / ztmptot
[7162]179
[12377]180         !   Microzooplankton regular grazing on the different preys
181         !   -------------------------------------------------------
[15459]182               !   Nanophytoplankton
[12377]183         zgraznc   = zgraze  * ztmp1  * zdenom
184         zgraznn   = zgraznc * tr(ji,jj,jk,jpnph,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn)
185         zgraznp   = zgraznc * tr(ji,jj,jk,jppph,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn)
186         zgraznf   = zgraznc * tr(ji,jj,jk,jpnfe,Kbb) / (tr(ji,jj,jk,jpphy,Kbb) + rtrn)
[15459]187
188               ! Picophytoplankton
[12377]189         zgrazpc   = zgraze  * ztmp2  * zdenom
190         zgrazpn   = zgrazpc * tr(ji,jj,jk,jpnpi,Kbb) / (tr(ji,jj,jk,jppic,Kbb) + rtrn)
191         zgrazpp   = zgrazpc * tr(ji,jj,jk,jpppi,Kbb) / (tr(ji,jj,jk,jppic,Kbb) + rtrn)
192         zgrazpf   = zgrazpc * tr(ji,jj,jk,jppfe,Kbb) / (tr(ji,jj,jk,jppic,Kbb) + rtrn)
[15459]193
194               ! Microzooplankton
[12377]195         zgrazz    = zgraze  * ztmp5   * zdenom
[15459]196
197               ! small POC
[12377]198         zgrazpoc  = zgraze  * ztmp3   * zdenom
199         zgrazpon  = zgrazpoc * tr(ji,jj,jk,jppon,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn )
200         zgrazpop  = zgrazpoc * tr(ji,jj,jk,jppop,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn )
201         zgrazpof  = zgrazpoc* tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn)
[15459]202
203               ! Diatoms
[12377]204         zgrazdc   = zgraze  * ztmp4  * zdenom
205         zgrazdn   = zgrazdc * tr(ji,jj,jk,jpndi,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn)
206         zgrazdp   = zgrazdc * tr(ji,jj,jk,jppdi,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn)
207         zgrazdf   = zgrazdc * tr(ji,jj,jk,jpdfe,Kbb) / (tr(ji,jj,jk,jpdia,Kbb) + rtrn)
208         !
[15459]209               ! Total ingestion rates in C, P, Fe, N
[12377]210         zgraztotc = zgraznc + zgrazpoc + zgrazdc + zgrazz + zgrazpc
211         zgraztotn = zgraznn + zgrazpn + zgrazpon + zgrazdn + zgrazz * no3rat3
212         zgraztotp = zgraznp + zgrazpp + zgrazpop + zgrazdp + zgrazz * po4rat3
[15459]213         zgraztotf = zgraznf + zgrazpf + zgrazpof + zgrazdf + zgrazz * feratz
[12377]214         !
215         ! Grazing by microzooplankton
216         zgrazing(ji,jj,jk) = zgraztotc
[7162]217
[12377]218         !   Stoichiometruc ratios of the food ingested by zooplanton
219         !   --------------------------------------------------------
220         zgrasratf =  (zgraztotf + rtrn) / ( zgraztotc + rtrn )
221         zgrasratn =  (zgraztotn + rtrn) / ( zgraztotc + rtrn )
222         zgrasratp =  (zgraztotp + rtrn) / ( zgraztotc + rtrn )
[7162]223
[15459]224         ! Mesozooplankton efficiency.
225         ! We adopt a formulation proposed by Mitra et al. (2007)
226         ! The gross growth efficiency is controled by the most limiting nutrient.
227         ! Growth is also further decreased when the food quality is poor. This is currently
228         ! hard coded : it can be decreased by up to 50% (zepsherq)
229         ! GGE can also be decreased when food quantity is high, zepsherf (Montagnes and
230         ! Fulton, 2012)
231         ! -----------------------------------------------------------------------------------
232         zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / feratz)
[12377]233         zbeta     = MAX( 0., (epsher - epshermin) )
[15459]234         ! Food density deprivation of GGE
[12377]235         zepsherf  = epshermin + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta )
[15459]236         ! Food quality deprivation of GGE
237         zepsherq  = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 )
238         ! Actual GGE
239         zepsherv  = zepsherf * zepshert * zepsherq
[7162]240
[15459]241         ! Respiration of microzooplankton
242         ! Excess carbon in the food is used preferentially
243         ! when activated by zmetexcess
244         ! ------------------------------------------------
[12377]245         zexcess  = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess
246         zbasresb = MAX(0., zrespz - zexcess)
247         zbasresi = zexcess + MIN(0., zrespz - zexcess) 
248         zrespirc = srespir * zepsherv * zgraztotc + zbasresb
249         
[15459]250         ! When excess carbon is used, the other elements in excess
251         ! are also used proportionally to their abundance
252         ! --------------------------------------------------------
[12377]253         zexcess  = ( zgrasratn/ no3rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
254         zbasresn = zbasresi * zexcess * zgrasratn 
255         zexcess  = ( zgrasratp/ po4rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
256         zbasresp = zbasresi * zexcess * zgrasratp
[15459]257         zexcess  = ( zgrasratf/ feratz - zepshert ) / ( 1.0 - zepshert + rtrn)
[12377]258         zbasresf = zbasresi * zexcess * zgrasratf
[7162]259
[15459]260         ! Voiding of the excessive elements as DOM
261         ! ----------------------------------------
[12377]262         zgradoct   = (1. - unassc - zepsherv) * zgraztotc - zbasresi 
263         zgradont   = (1. - unassn) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn
264         zgradopt   = (1. - unassp) * zgraztotp - zepsherv * po4rat3 * zgraztotc - zbasresp
[15459]265         zgrareft   = (1. - unassc) * zgraztotf - zepsherv * feratz * zgraztotc - zbasresf
[7162]266
[15459]267         ! Since only semilabile DOM is represented in PISCES
268         ! part of DOM is in fact labile and is then released
269         ! as dissolved inorganic compounds (ssigma)
270         ! --------------------------------------------------
[12377]271         zgradoc =  zgradoct * ssigma
272         zgradon =  zgradont * ssigma
273         zgradop =  zgradopt * ssigma
274         zgrarem = (1.0 - ssigma) * zgradoct
275         zgraren = (1.0 - ssigma) * zgradont
276         zgrarep = (1.0 - ssigma) * zgradopt
277         zgraref = zgrareft
[7162]278
[15459]279         ! Defecation as a result of non assimilated products
280         ! --------------------------------------------------
[12377]281         zgrapoc   = zgraztotc * unassc
282         zgrapon   = zgraztotn * unassn
283         zgrapop   = zgraztotp * unassp
284         zgrapof   = zgraztotf * unassc
[7162]285
[15459]286         ! Addition of respiration to the release of inorganic nutrients
287         ! -------------------------------------------------------------
[12377]288         zgrarem = zgrarem + zbasresi + zrespirc
289         zgraren = zgraren + zbasresn + zrespirc * no3rat3
290         zgrarep = zgrarep + zbasresp + zrespirc * po4rat3
[15459]291         zgraref = zgraref + zbasresf + zrespirc * feratz
[7162]292
[12377]293         !   Update of the TRA arrays
294         !   ------------------------
295         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarep
296         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgraren
297         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgradoc
298         !
299         IF( ln_ligand ) THEN
300            tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zgradoc * ldocz
301            zzligprod(ji,jj,jk) = zgradoc * ldocz
302         ENDIF
303         !
304         tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zgradon
305         tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop
306         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem 
307         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref
308         zfezoo(ji,jj,jk)    = zgraref
309         tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) + zepsherv * zgraztotc - zrespirc - ztortz - zgrazz
310         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc
311         tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) - zgraznn
312         tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) - zgraznp
313         tr(ji,jj,jk,jppic,Krhs) = tr(ji,jj,jk,jppic,Krhs) - zgrazpc
314         tr(ji,jj,jk,jpnpi,Krhs) = tr(ji,jj,jk,jpnpi,Krhs) - zgrazpn
315         tr(ji,jj,jk,jpppi,Krhs) = tr(ji,jj,jk,jpppi,Krhs) - zgrazpp
316         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc
317         tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) - zgrazdn
318         tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) - zgrazdp
319         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)
320         tr(ji,jj,jk,jppch,Krhs) = tr(ji,jj,jk,jppch,Krhs) - zgrazpc * tr(ji,jj,jk,jppch,Kbb)/(tr(ji,jj,jk,jppic,Kbb)+rtrn)
321         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)
322         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)
323         tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrazdc * tr(ji,jj,jk,jpdsi,Kbb)/(tr(ji,jj,jk,jpdia,Kbb)+rtrn)
324         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf
325         tr(ji,jj,jk,jppfe,Krhs) = tr(ji,jj,jk,jppfe,Krhs) - zgrazpf
326         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf
327         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) + ztortz + zgrapoc - zgrazpoc 
328         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + ztortz + zgrapoc
329         conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc
330         tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) + no3rat3 * ztortz + zgrapon - zgrazpon
331         tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) + po4rat3 * ztortz + zgrapop - zgrazpop
[15459]332         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + feratz * ztortz  + zgrapof - zgrazpof
[12377]333         !
334         ! calcite production
335         zprcaca = xfracal(ji,jj,jk) * zgraznc
336         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
337         !
338         zprcaca = part * zprcaca
339         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem - zprcaca
[15459]340         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * zprcaca + rno3 * zgraren
[12377]341         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) + zprcaca
342      END_3D
[7162]343      !
[12276]344      IF( lk_iomput .AND. knt == nrdttrc ) THEN
[12377]345       IF( iom_use("GRAZ1") ) THEN  !   Total grazing of phyto by zooplankton
[12276]346           zgrazing(:,:,jpk) = 0._wp   ; CALL iom_put( "GRAZ1" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) 
[7162]347         ENDIF
[12276]348         IF( iom_use("FEZOO") ) THEN 
349           zfezoo (:,:,jpk) = 0._wp    ; CALL iom_put( "FEZOO" , zfezoo(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
350         ENDIF
351         IF( ln_ligand ) THEN
352            zzligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ", zzligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:))
353         ENDIF
[7162]354      ENDIF
355      !
[12377]356      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
[7162]357         WRITE(charout, FMT="('micro')")
[13286]358         CALL prt_ctl_info( charout, cdcomp = 'top' )
359         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
[7162]360      ENDIF
361      !
[9124]362      IF( ln_timing )   CALL timing_stop('p5z_micro')
[7162]363      !
364   END SUBROUTINE p5z_micro
365
366
367   SUBROUTINE p5z_micro_init
368      !!----------------------------------------------------------------------
369      !!                  ***  ROUTINE p5z_micro_init  ***
370      !!
371      !! ** Purpose :   Initialization of microzooplankton parameters
372      !!
[15459]373      !! ** Method  :   Read the namp5zzoo namelist and check the parameters
[7162]374      !!                called at the first timestep (nittrc000)
375      !!
[15459]376      !! ** input   :   Namelist namp5zzoo
[7162]377      !!
378      !!----------------------------------------------------------------------
[9124]379      INTEGER ::   ios   ! Local integer
380      !!
[7162]381      NAMELIST/namp5zzoo/ part, grazrat, bmetexc, resrat, mzrat, xprefc, xprefn, &
382         &                xprefp, xprefd, xprefz, xthreshdia, xthreshphy, &
383         &                xthreshpic, xthreshpoc, xthreshzoo, xthresh, xkgraz, &
[15459]384         &                epsher, epshermin, ssigma, srespir, unassc, unassn, unassp,   &
385         &                xsigma, xsigmadel   
[9124]386      !!----------------------------------------------------------------------
387      !
[7162]388      READ  ( numnatp_ref, namp5zzoo, IOSTAT = ios, ERR = 901)
[11536]389901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp5zzoo in reference namelist' )
[9124]390      !
[7162]391      READ  ( numnatp_cfg, namp5zzoo, IOSTAT = ios, ERR = 902 )
[11536]392902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namp5zzoo in configuration namelist' )
[7162]393      IF(lwm) WRITE ( numonp, namp5zzoo )
[9124]394      !
[7162]395      IF(lwp) THEN                         ! control print
396         WRITE(numout,*) ' '
397         WRITE(numout,*) ' Namelist parameters for microzooplankton, nampiszooq'
398         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
399         WRITE(numout,*) '    part of calcite not dissolved in microzoo guts  part        =', part
400         WRITE(numout,*) '    microzoo preference for POC                     xprefc     =', xprefc
401         WRITE(numout,*) '    microzoo preference for nano                    xprefn     =', xprefn
402         WRITE(numout,*) '    microzoo preference for pico                    xprefp     =', xprefp
403         WRITE(numout,*) '    microzoo preference for diatoms                 xprefd     =', xprefd
404         WRITE(numout,*) '    microzoo preference for microzoo                xprefz     =', xprefz
405         WRITE(numout,*) '    diatoms feeding threshold  for microzoo         xthreshdia  =', xthreshdia
406         WRITE(numout,*) '    nanophyto feeding threshold for microzoo        xthreshphy  =', xthreshphy
407         WRITE(numout,*) '    picophyto feeding threshold for microzoo        xthreshpic  =', xthreshpic
408         WRITE(numout,*) '    poc feeding threshold for microzoo              xthreshpoc  =', xthreshpoc
409         WRITE(numout,*) '    microzoo feeding threshold for microzoo         xthreshzoo  =', xthreshzoo
410         WRITE(numout,*) '    feeding threshold for microzooplankton          xthresh     =', xthresh
411         WRITE(numout,*) '    exsudation rate of microzooplankton             resrat      =', resrat
412         WRITE(numout,*) '    microzooplankton mortality rate                 mzrat       =', mzrat
413         WRITE(numout,*) '    maximal microzoo grazing rate                   grazrat     =', grazrat
414         WRITE(numout,*) '    C egested fraction of fodd by microzoo          unassc      =', unassc
415         WRITE(numout,*) '    N egested fraction of fodd by microzoo          unassn      =', unassn
416         WRITE(numout,*) '    P egested fraction of fodd by microzoo          unassp      =', unassp
417         WRITE(numout,*) '    Efficicency of microzoo growth                  epsher      =', epsher
[10362]418         WRITE(numout,*) '    Minimum Efficiency of Microzoo growth           epshermin   =', epshermin
[7162]419         WRITE(numout,*) '    Fraction excreted as semi-labile DOM            ssigma      =', ssigma
420         WRITE(numout,*) '    Active respiration                              srespir     =', srespir
421         WRITE(numout,*) '    half sturation constant for grazing 1           xkgraz      =', xkgraz
422         WRITE(numout,*) '    Use of excess carbon for respiration            bmetexc     =', bmetexc
[15459]423         WRITE(numout,*) '      Width of the grazing window                     xsigma      =', xsigma
424         WRITE(numout,*) '      Maximum additional width of the grazing window  xsigmadel   =', xsigmadel
[7162]425      ENDIF
[9124]426      !
[7162]427   END SUBROUTINE p5z_micro_init
428
429   !!======================================================================
[9788]430END MODULE p5zmicro
Note: See TracBrowser for help on using the repository browser.