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

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

source: NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final/src/TOP/PISCES/P4Z/p5zmeso.F90 @ 14219

Last change on this file since 14219 was 14219, checked in by mcastril, 4 years ago

Add Mixed Precision support by Oriol Tintó

  • Property svn:keywords set to Id
File size: 25.5 KB
Line 
1MODULE p5zmeso
2   !!======================================================================
3   !!                         ***  MODULE p5zmeso  ***
4   !! TOP :   PISCES Compute the sources/sinks for mesozooplankton
5   !!======================================================================
6   !! History :   1.0  !  2002     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.4  !  2011-06  (O. Aumont, C. Ethe) Quota model for iron
9   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
10   !!----------------------------------------------------------------------
11   !!   p5z_meso       :   Compute the sources/sinks for mesozooplankton
12   !!   p5z_meso_init  :   Initialization of the parameters for mesozooplankton
13   !!----------------------------------------------------------------------
14   USE oce_trc         !  shared variables between ocean and passive tracers
15   USE trc             !  passive tracers common variables
16   USE sms_pisces      !  PISCES Source Minus Sink variables
17   USE prtctl          !  print control for debugging
18   USE iom             !  I/O manager
19
20   IMPLICIT NONE
21   PRIVATE
22
23   PUBLIC   p5z_meso              ! called in p5zbio.F90
24   PUBLIC   p5z_meso_init         ! called in trcsms_pisces.F90
25
26   !! * Shared module variables
27   REAL(wp), PUBLIC ::  part2        !: part of calcite not dissolved in mesozoo guts
28   REAL(wp), PUBLIC ::  xpref2c      !: mesozoo preference for POC
29   REAL(wp), PUBLIC ::  xpref2n      !: mesozoo preference for nanophyto
30   REAL(wp), PUBLIC ::  xpref2z      !: mesozoo preference for zooplankton
31   REAL(wp), PUBLIC ::  xpref2d      !: mesozoo preference for Diatoms
32   REAL(wp), PUBLIC ::  xpref2m      !: mesozoo preference for mesozoo
33   REAL(wp), PUBLIC ::  xthresh2zoo  !: zoo feeding threshold for mesozooplankton
34   REAL(wp), PUBLIC ::  xthresh2dia  !: diatoms feeding threshold for mesozooplankton
35   REAL(wp), PUBLIC ::  xthresh2phy  !: nanophyto feeding threshold for mesozooplankton
36   REAL(wp), PUBLIC ::  xthresh2poc  !: poc feeding threshold for mesozooplankton
37   REAL(wp), PUBLIC ::  xthresh2mes  !: mesozoo 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      !: Half-saturation constant of assimilation
43   REAL(wp), PUBLIC ::  unass2c      !: Non-assimilated fraction of food
44   REAL(wp), PUBLIC ::  unass2n      !: Non-assimilated fraction of food
45   REAL(wp), PUBLIC ::  unass2p      !: Non-assimilated fraction of food
46   REAL(wp), PUBLIC ::  epsher2      !: Growth efficiency of mesozoo
47   REAL(wp), PUBLIC ::  epsher2min   !: Minimum growth efficiency of mesozoo
48   REAL(wp), PUBLIC ::  ssigma2      !: Fraction excreted as semi-labile DOM
49   REAL(wp), PUBLIC ::  srespir2     !: Active respiration
50   REAL(wp), PUBLIC ::  grazflux     !: mesozoo flux feeding rate
51   LOGICAL,  PUBLIC ::  bmetexc2     !: Use of excess carbon for respiration
52
53   !! * Substitutions
54#  include "do_loop_substitute.h90"
55#  include "single_precision_substitute.h90"
56   !!----------------------------------------------------------------------
57   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
58   !! $Id$
59   !! Software governed by the CeCILL license (see ./LICENSE)
60   !!----------------------------------------------------------------------
61
62CONTAINS
63
64   SUBROUTINE p5z_meso( kt, knt, Kbb, Krhs )
65      !!---------------------------------------------------------------------
66      !!                     ***  ROUTINE p5z_meso  ***
67      !!
68      !! ** Purpose :   Compute the sources/sinks for mesozooplankton
69      !!
70      !! ** Method  : - ???
71      !!---------------------------------------------------------------------
72      INTEGER, INTENT(in) ::   kt, knt    ! ocean time step
73      INTEGER, INTENT(in)  ::  Kbb, Krhs  ! time level indices
74      INTEGER  :: ji, jj, jk
75      REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam, zcompames
76      REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport
77      REAL(wp) :: zmortzgoc, zfracc, zfracn, zfracp, zfracfe, zratio, zratio2
78      REAL(wp) :: zepsherf, zepshert, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi
79      REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf
80      REAL(wp) :: zgradoc, zgradon, zgradop, zgratmp, zgradoct, zgradont, zgrareft, zgradopt
81      REAL(wp) :: zgrapoc, zgrapon, zgrapop, zgrapof, zprcaca, zmortz
82      REAL(wp) :: zexcess, zgrarem, zgraren, zgrarep, zgraref
83      REAL(wp) :: zbeta, zrespz, ztortz, zgrasratp, zgrasratn, zgrasratf
84      REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot
85      REAL(wp) :: zgrazdc, zgrazz, zgrazm, zgrazpof, zgrazcal, zfracal
86      REAL(wp) :: zgraznc, zgrazpoc, zgrazpon, zgrazpop, zgraznf, zgrazdf
87      REAL(wp) :: zgraznp, zgraznn, zgrazdn, zgrazdp
88      REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg
89      REAL(wp) :: zgrazffnp, zgrazffng, zgrazffpp, zgrazffpg
90      CHARACTER (len=25) :: charout
91      REAL(wp) :: zrfact2, zmetexcess
92      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2,  zz2ligprod
93
94      !!---------------------------------------------------------------------
95      !
96      IF( ln_timing )   CALL timing_start('p5z_meso')
97      !
98      zmetexcess = 0.0
99      IF ( bmetexc2 ) zmetexcess = 1.0
100
101      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
102         zcompam   = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - 1.e-9 ), 0.e0 )
103         zfact     = xstep * tgfunc2(ji,jj,jk) * zcompam
104
105         !   Michaelis-Menten mortality rates of mesozooplankton
106         !   ---------------------------------------------------
107         zrespz   = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) )  &
108         &          + 3. * nitrfac(ji,jj,jk) )
109
110         !   Zooplankton mortality. A square function has been selected with
111         !   no real reason except that it seems to be more stable and may mimic predation
112         !   ---------------------------------------------------------------
113         ztortz   = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk))
114
115         !   Computation of the abundance of the preys
116         !   A threshold can be specified in the namelist
117         !   --------------------------------------------
118         zcompadi  = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthresh2dia ), 0.e0 )
119         zcompaz   = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthresh2zoo ), 0.e0 )
120         zcompaph  = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthresh2phy ), 0.e0 )
121         zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthresh2poc ), 0.e0 )
122         zcompames = MAX( ( tr(ji,jj,jk,jpmes,Kbb) - xthresh2mes ), 0.e0 )
123
124         !   Mesozooplankton grazing
125         !   ------------------------
126         zfood     = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc   &
127         &           + xpref2m * zcompames 
128         zfoodlim  = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) )
129         zdenom    = zfoodlim / ( xkgraz2 + zfoodlim )
130         zgraze2   = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk)) 
131
132         !   An active switching parameterization is used here.
133         !   We don't use the KTW parameterization proposed by
134         !   Vallina et al. because it tends to produce to steady biomass
135         !   composition and the variance of Chl is too low as it grazes
136         !   too strongly on winning organisms. Thus, instead of a square
137         !   a 1.5 power value is used which decreases the pressure on the
138         !   most abundant species
139         !   ------------------------------------------------------------ 
140         ztmp1 = xpref2n * zcompaph**1.5
141         ztmp2 = xpref2m * zcompames**1.5
142         ztmp3 = xpref2c * zcompapoc**1.5
143         ztmp4 = xpref2d * zcompadi**1.5
144         ztmp5 = xpref2z * zcompaz**1.5
145         ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + ztmp5 + rtrn
146         ztmp1 = ztmp1 / ztmptot
147         ztmp2 = ztmp2 / ztmptot
148         ztmp3 = ztmp3 / ztmptot
149         ztmp4 = ztmp4 / ztmptot
150         ztmp5 = ztmp5 / ztmptot
151
152         !   Mesozooplankton regular grazing on the different preys
153         !   ------------------------------------------------------
154         zgrazdc   = zgraze2 * ztmp4 * zdenom
155         zgrazdn   = zgrazdc * tr(ji,jj,jk,jpndi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn)
156         zgrazdp   = zgrazdc * tr(ji,jj,jk,jppdi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn)
157         zgrazdf   = zgrazdc * tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn)
158         zgrazz    = zgraze2 * ztmp5 * zdenom
159         zgrazm    = zgraze2 * ztmp2 * zdenom
160         zgraznc   = zgraze2 * ztmp1 * zdenom
161         zgraznn   = zgraznc * tr(ji,jj,jk,jpnph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn)
162         zgraznp   = zgraznc * tr(ji,jj,jk,jppph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn)
163         zgraznf   = zgraznc * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn)
164         zgrazpoc  = zgraze2 * ztmp3 * zdenom
165         zgrazpon  = zgrazpoc * tr(ji,jj,jk,jppon,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn)
166         zgrazpop  = zgrazpoc * tr(ji,jj,jk,jppop,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn)
167         zgrazpof  = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn)
168
169         !   Mesozooplankton flux feeding on GOC
170         !   ----------------------------------
171         zgrazffeg = grazflux  * xstep * wsbio4(ji,jj,jk)      &
172         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)  &
173         &           * (1. - nitrfac(ji,jj,jk))
174         zgrazfffg = zgrazffeg * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
175         zgrazffng = zgrazffeg * tr(ji,jj,jk,jpgon,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
176         zgrazffpg = zgrazffeg * tr(ji,jj,jk,jpgop,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
177         zgrazffep = grazflux  * xstep *  wsbio3(ji,jj,jk)     &
178         &           * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jppoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)   &
179         &           * (1. - nitrfac(ji,jj,jk))
180         zgrazfffp = zgrazffep * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn)
181         zgrazffnp = zgrazffep * tr(ji,jj,jk,jppon,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn)
182         zgrazffpp = zgrazffep * tr(ji,jj,jk,jppop,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn)
183         !
184         zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg
185
186         !   Compute the proportion of filter feeders
187         !   ---------------------------------------- 
188         zproport  = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc)
189
190         !   Compute fractionation of aggregates. It is assumed that
191         !   diatoms based aggregates are more prone to fractionation
192         !   since they are more porous (marine snow instead of fecal pellets)
193         !   ----------------------------------------------------------------
194         zratio    = tr(ji,jj,jk,jpgsi,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn )
195         zratio2   = zratio * zratio
196         zfracc    = zproport * grazflux  * xstep * wsbio4(ji,jj,jk)      &
197         &          * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb)          &
198         &          * ( 0.2 + 3.8 * zratio2 / ( 1.**2 + zratio2 ) )
199         zfracfe   = zfracc * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
200         zfracn    = zfracc * tr(ji,jj,jk,jpgon,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
201         zfracp    = zfracc * tr(ji,jj,jk,jpgop,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn)
202
203         zgrazffep = zproport * zgrazffep   ;   zgrazffeg = zproport * zgrazffeg
204         zgrazfffp = zproport * zgrazfffp   ;   zgrazfffg = zproport * zgrazfffg
205         zgrazffnp = zproport * zgrazffnp   ;   zgrazffng = zproport * zgrazffng
206         zgrazffpp = zproport * zgrazffpp   ;   zgrazffpg = zproport * zgrazffpg
207
208         zgraztotc  = zgrazdc + zgrazz + zgraznc + zgrazm + zgrazpoc + zgrazffep + zgrazffeg
209         zgraztotf  = zgrazdf + zgraznf + ( zgrazz + zgrazm ) * ferat3 + zgrazpof &
210         &            + zgrazfffp + zgrazfffg
211         zgraztotn  = zgrazdn + (zgrazm + zgrazz) * no3rat3 + zgraznn + zgrazpon  &
212         &            + zgrazffnp + zgrazffng
213         zgraztotp  = zgrazdp + (zgrazz + zgrazm) * po4rat3 + zgraznp + zgrazpop  &
214         &            + zgrazffpp + zgrazffpg
215
216
217         ! Total grazing ( grazing by microzoo is already computed in p5zmicro )
218         zgrazing(ji,jj,jk) = zgraztotc
219
220         !   Stoichiometruc ratios of the food ingested by zooplanton
221         !   --------------------------------------------------------
222         zgrasratf  =  (zgraztotf + rtrn) / ( zgraztotc + rtrn )
223         zgrasratn  =  (zgraztotn + rtrn) / ( zgraztotc + rtrn )
224         zgrasratp  =  (zgraztotp + rtrn) / ( zgraztotc + rtrn )
225
226         !   Growth efficiency is made a function of the quality
227         !   and the quantity of the preys
228         !   ---------------------------------------------------
229         zepshert  = MIN( 1., zgrasratn/ no3rat3, zgrasratp/ po4rat3, zgrasratf / ferat3)
230         zbeta     = MAX(0., (epsher2 - epsher2min) )
231         zepsherf  = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta )
232         zepsherv  = zepsherf * zepshert
233
234         !   Respiration of mesozooplankton
235         !   Excess carbon in the food is used preferentially
236         !   ----------------  ------------------------------
237         zexcess  = zgraztotc * zepsherf * (1.0 - zepshert) * zmetexcess 
238         zbasresb = MAX(0., zrespz - zexcess)
239         zbasresi = zexcess + MIN(0., zrespz - zexcess)
240         zrespirc = srespir2 * zepsherv * zgraztotc + zbasresb
241
242         !   When excess carbon is used, the other elements in excess
243         !   are also used proportionally to their abundance
244         !   --------------------------------------------------------
245         zexcess  = ( zgrasratn/ no3rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
246         zbasresn = zbasresi * zexcess * zgrasratn
247         zexcess  = ( zgrasratp/ po4rat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
248         zbasresp = zbasresi * zexcess * zgrasratp
249         zexcess  = ( zgrasratf/ ferat3 - zepshert ) / ( 1.0 - zepshert + rtrn)
250         zbasresf = zbasresi * zexcess * zgrasratf
251
252         !   Voiding of the excessive elements as organic matter
253         !   --------------------------------------------------------
254         zgradoct = (1. - unass2c - zepsherv) * zgraztotc - zbasresi
255         zgradont = (1. - unass2n) * zgraztotn - zepsherv * no3rat3 * zgraztotc - zbasresn
256         zgradopt = (1. - unass2p) * zgraztotp - zepsherv * po4rat3 * zgraztotc - zbasresp
257         zgrareft = (1. - unass2c) * zgraztotf - zepsherv * ferat3 * zgraztotc - zbasresf
258         ztmp1   = ( 1. - epsher2 - unass2c ) /( 1. - 0.8 * epsher2 ) * ztortz
259         zgradoc = (zgradoct + ztmp1) * ssigma2
260         zgradon = (zgradont + no3rat3 * ztmp1) * ssigma2
261         zgradop = (zgradopt + po4rat3 * ztmp1) * ssigma2
262         zgratmp = 0.2 * epsher2 /( 1. - 0.8 * epsher2 ) * ztortz
263
264         !  Since only semilabile DOM is represented in PISCES
265         !  part of DOM is in fact labile and is then released
266         !  as dissolved inorganic compounds (ssigma2)
267         !  --------------------------------------------------
268         zgrarem = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2)
269         zgraren = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2)
270         zgrarep = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2)
271         zgraref = zgrareft + ferat3 * ( ztmp1 + zgratmp )
272
273         !   Defecation as a result of non assimilated products
274         !   --------------------------------------------------
275         zgrapoc  = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz
276         zgrapon  = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz
277         zgrapop  = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz
278         zgrapof  = zgraztotf * unass2c + ferat3  * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz
279
280         !  Addition of respiration to the release of inorganic nutrients
281         !  -------------------------------------------------------------
282         zgrarem = zgrarem + zbasresi + zrespirc
283         zgraren = zgraren + zbasresn + zrespirc * no3rat3
284         zgrarep = zgrarep + zbasresp + zrespirc * po4rat3
285         zgraref = zgraref + zbasresf + zrespirc * ferat3
286
287         !   Update the arrays TRA which contain the biological sources and
288         !   sinks
289         !   --------------------------------------------------------------
290         tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarep 
291         tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgraren
292         tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgradoc
293         !
294         IF( ln_ligand ) THEN
295            tr(ji,jj,jk,jplgw,Krhs)  = tr(ji,jj,jk,jplgw,Krhs) + zgradoc * ldocz
296            zz2ligprod(ji,jj,jk) = zgradoc * ldocz
297         ENDIF
298         !
299         tr(ji,jj,jk,jpdon,Krhs) = tr(ji,jj,jk,jpdon,Krhs) + zgradon
300         tr(ji,jj,jk,jpdop,Krhs) = tr(ji,jj,jk,jpdop,Krhs) + zgradop
301         tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem
302         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref
303         zfezoo2(ji,jj,jk)   = zgraref
304         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem
305         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgraren
306         tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) + zepsherv * zgraztotc - zrespirc   &
307         &                     - ztortz - zgrazm
308         tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc
309         tr(ji,jj,jk,jpndi,Krhs) = tr(ji,jj,jk,jpndi,Krhs) - zgrazdn
310         tr(ji,jj,jk,jppdi,Krhs) = tr(ji,jj,jk,jppdi,Krhs) - zgrazdp
311         tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf
312         tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zgrazz
313         tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc
314         tr(ji,jj,jk,jpnph,Krhs) = tr(ji,jj,jk,jpnph,Krhs) - zgraznn
315         tr(ji,jj,jk,jppph,Krhs) = tr(ji,jj,jk,jppph,Krhs) - zgraznp
316         tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf
317         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 )
318         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 )
319         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 )
320         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 )
321
322         tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zgrazpoc - zgrazffep + zfracc
323         prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfracc
324         conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep
325         tr(ji,jj,jk,jppon,Krhs) = tr(ji,jj,jk,jppon,Krhs) - zgrazpon - zgrazffnp + zfracn
326         tr(ji,jj,jk,jppop,Krhs) = tr(ji,jj,jk,jppop,Krhs) - zgrazpop - zgrazffpp + zfracp
327         tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg + zgrapoc - zfracc
328         prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zgrapoc
329         consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfracc
330         tr(ji,jj,jk,jpgon,Krhs) = tr(ji,jj,jk,jpgon,Krhs) - zgrazffng + zgrapon - zfracn
331         tr(ji,jj,jk,jpgop,Krhs) = tr(ji,jj,jk,jpgop,Krhs) - zgrazffpg + zgrapop - zfracp
332         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zgrazpof - zgrazfffp + zfracfe
333         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg + zgrapof - zfracfe
334         zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn )
335         zgrazcal = zgrazffeg * (1. - part2) * zfracal
336
337         !  calcite production
338         !  ------------------
339         zprcaca = xfracal(ji,jj,jk) * zgraznc
340         prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca  ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo)
341         zprcaca = part2 * zprcaca
342         tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrazcal - zprcaca
343         tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * ( zgrazcal - zprcaca )
344         tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca
345      END_3D
346      !
347      IF( lk_iomput .AND. knt == nrdttrc ) THEN
348        CALL iom_put( "PCAL"  , prodcal(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) )  !  Calcite production
349        IF( iom_use("GRAZ2") ) THEN  !   Total grazing of phyto by zooplankton
350           zgrazing(:,:,jpk) = 0._wp ;  CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3  * rfact2r * tmask(:,:,:) ) 
351         ENDIF
352         IF( iom_use("FEZOO2") ) THEN 
353           zfezoo2 (:,:,jpk) = 0._wp ; CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) )
354         ENDIF
355         IF( ln_ligand ) THEN
356            zz2ligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ2", zz2ligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:)  )
357         ENDIF
358      ENDIF
359      !
360      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
361        WRITE(charout, FMT="('meso')")
362        CALL prt_ctl_info( charout, cdcomp = 'top' )
363        CALL prt_ctl(tab4d_1=CASTWP(tr(:,:,:,:,Krhs)), mask1=tmask, clinfo=ctrcnm)
364      ENDIF
365      !
366      IF( ln_timing )   CALL timing_stop('p5z_meso')
367      !
368   END SUBROUTINE p5z_meso
369
370
371   SUBROUTINE p5z_meso_init
372      !!----------------------------------------------------------------------
373      !!                  ***  ROUTINE p5z_meso_init  ***
374      !!
375      !! ** Purpose :   Initialization of mesozooplankton parameters
376      !!
377      !! ** Method  :   Read the nampismes namelist and check the parameters
378      !!      called at the first timestep (nittrc000)
379      !!
380      !! ** input   :   Namelist nampismes
381      !!
382      !!----------------------------------------------------------------------
383      INTEGER :: ios                 ! Local integer output status for namelist read
384      !!
385      NAMELIST/namp5zmes/part2, bmetexc2, grazrat2, resrat2, mzrat2, xpref2c, xpref2n, xpref2z, &
386         &                xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, &
387         &                xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, &
388         &                unass2n, unass2p, srespir2, grazflux
389      !!----------------------------------------------------------------------
390      !
391      READ  ( numnatp_ref, namp5zmes, IOSTAT = ios, ERR = 901)
392901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampismes in reference namelist' )
393      !
394      READ  ( numnatp_cfg, namp5zmes, IOSTAT = ios, ERR = 902 )
395902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampismes in configuration namelist' )
396      IF(lwm) WRITE ( numonp, namp5zmes )
397      !
398      IF(lwp) THEN                         ! control print
399         WRITE(numout,*) ' ' 
400         WRITE(numout,*) ' Namelist parameters for mesozooplankton, namp5zmes'
401         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
402         WRITE(numout,*) '    part of calcite not dissolved in mesozoo guts  part2       = ', part2
403         WRITE(numout,*) '    mesozoo preference for nano.                   xpref2n     = ', xpref2n
404         WRITE(numout,*) '    mesozoo preference for diatoms                 xpref2d     = ', xpref2d
405         WRITE(numout,*) '    mesozoo preference for zoo                     xpref2z     = ', xpref2z
406         WRITE(numout,*) '    mesozoo preference for mesozoo                 xpref2m     = ', xpref2m
407         WRITE(numout,*) '    mesozoo preference for poc                     xpref2c     = ', xpref2c
408         WRITE(numout,*) '    microzoo feeding threshold  for mesozoo        xthresh2zoo = ', xthresh2zoo
409         WRITE(numout,*) '    diatoms feeding threshold  for mesozoo         xthresh2dia = ', xthresh2dia
410         WRITE(numout,*) '    nanophyto feeding threshold for mesozoo        xthresh2phy = ', xthresh2phy
411         WRITE(numout,*) '    poc feeding threshold for mesozoo              xthresh2poc = ', xthresh2poc
412         WRITE(numout,*) '    mesozoo feeding threshold for mesozoo          xthresh2mes = ', xthresh2mes
413         WRITE(numout,*) '    feeding threshold for mesozooplankton          xthresh2    = ', xthresh2
414         WRITE(numout,*) '    exsudation rate of mesozooplankton             resrat2     = ', resrat2
415         WRITE(numout,*) '    mesozooplankton mortality rate                 mzrat2      = ', mzrat2
416         WRITE(numout,*) '    maximal mesozoo grazing rate                   grazrat2    = ', grazrat2
417         WRITE(numout,*) '    mesozoo flux feeding rate                      grazflux    = ', grazflux
418         WRITE(numout,*) '    C egested fraction of food by mesozoo          unass2c     = ', unass2c
419         WRITE(numout,*) '    N egested fraction of food by mesozoo          unass2n     = ', unass2n
420         WRITE(numout,*) '    P egested fraction of food by mesozoo          unass2p     = ', unass2p
421         WRITE(numout,*) '    Efficicency of Mesozoo growth                  epsher2     = ', epsher2
422         WRITE(numout,*) '    Minimum Efficiency of Mesozoo growth           epsher2min  =', epsher2min
423         WRITE(numout,*) '    Fraction excreted as semi-labile DOM           ssigma2     = ', ssigma2
424         WRITE(numout,*) '    Active respiration                             srespir2    = ', srespir2
425         WRITE(numout,*) '    half sturation constant for grazing 2          xkgraz2     = ', xkgraz2
426         WRITE(numout,*) '    Use excess carbon for respiration              bmetexc2    = ', bmetexc2
427      ENDIF
428      !
429   END SUBROUTINE p5z_meso_init
430
431   !!======================================================================
432END MODULE p5zmeso
Note: See TracBrowser for help on using the repository browser.