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/2019/dev_r11943_MERGE_2019/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11943_MERGE_2019/src/TOP/PISCES/P4Z/p5zmeso.F90 @ 12340

Last change on this file since 12340 was 12340, checked in by acc, 4 years ago

Branch 2019/dev_r11943_MERGE_2019. This commit introduces basic do loop macro
substitution to the 2019 option 1, merge branch. These changes have been SETTE
tested. The only addition is the do_loop_substitute.h90 file in the OCE directory but
the macros defined therein are used throughout the code to replace identifiable, 2D-
and 3D- nested loop opening and closing statements with single-line alternatives. Code
indents are also adjusted accordingly.

The following explanation is taken from comments in the new header file:

This header file contains preprocessor definitions and macros used in the do-loop
substitutions introduced between version 4.0 and 4.2. The primary aim of these macros
is to assist in future applications of tiling to improve performance. This is expected
to be achieved by alternative versions of these macros in selected locations. The
initial introduction of these macros simply replaces all identifiable nested 2D- and
3D-loops with single line statements (and adjusts indenting accordingly). Do loops
are identifiable if they comform to either:

DO jk = ....

DO jj = .... DO jj = ...

DO ji = .... DO ji = ...
. OR .
. .

END DO END DO

END DO END DO

END DO

and white-space variants thereof.

Additionally, only loops with recognised jj and ji loops limits are treated; these are:
Lower limits of 1, 2 or fs_2
Upper limits of jpi, jpim1 or fs_jpim1 (for ji) or jpj, jpjm1 or fs_jpjm1 (for jj)

The macro naming convention takes the form: DO_2D_BT_LR where:

B is the Bottom offset from the PE's inner domain;
T is the Top offset from the PE's inner domain;
L is the Left offset from the PE's inner domain;
R is the Right offset from the PE's inner domain

So, given an inner domain of 2,jpim1 and 2,jpjm1, a typical example would replace:

DO jj = 2, jpj

DO ji = 1, jpim1
.
.

END DO

END DO

with:

DO_2D_01_10
.
.
END_2D

similar conventions apply to the 3D loops macros. jk loop limits are retained
through macro arguments and are not restricted. This includes the possibility of
strides for which an extra set of DO_3DS macros are defined.

In the example definition below the inner PE domain is defined by start indices of
(kIs, kJs) and end indices of (kIe, KJe)

#define DO_2D_00_00 DO jj = kJs, kJe ; DO ji = kIs, kIe
#define END_2D END DO ; END DO

TO DO:


Only conventional nested loops have been identified and replaced by this step. There are constructs such as:

DO jk = 2, jpkm1

z2d(:,:) = z2d(:,:) + e3w(:,:,jk,Kmm) * z3d(:,:,jk) * wmask(:,:,jk)

END DO

which may need to be considered.

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