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.
p4zprod.F90 in NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zprod.F90 @ 14786

Last change on this file since 14786 was 14786, checked in by aumont, 3 years ago

Various bug fixes in PISCES

  • Property svn:keywords set to Id
File size: 27.0 KB
Line 
1MODULE p4zprod
2   !!======================================================================
3   !!                         ***  MODULE p4zprod  ***
4   !! TOP :  Growth Rate of the two phytoplankton groups of PISCES
5   !!======================================================================
6   !! History :   1.0  !  2004     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!             3.4  !  2011-05  (O. Aumont, C. Ethe) New parameterization of light limitation
9   !!----------------------------------------------------------------------
10   !!   p4z_prod       : Compute the growth Rate of the two phytoplanktons groups
11   !!   p4z_prod_init  : Initialization of the parameters for growth
12   !!   p4z_prod_alloc : Allocate variables for growth
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 p4zlim          ! Co-limitations of differents nutrients
18   USE prtctl          ! print control for debugging
19   USE iom             ! I/O manager
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   p4z_prod         ! called in p4zbio.F90
25   PUBLIC   p4z_prod_init    ! called in trcsms_pisces.F90
26   PUBLIC   p4z_prod_alloc   ! called in trcini_pisces.F90
27
28   REAL(wp), PUBLIC ::   pislopen     !:  P-I slope of nanophytoplankton
29   REAL(wp), PUBLIC ::   pisloped     !:  P-I slope of diatoms
30   REAL(wp), PUBLIC ::   xadap        !:  Adaptation factor to low light
31   REAL(wp), PUBLIC ::   excretn      !:  Excretion ratio of nanophyto
32   REAL(wp), PUBLIC ::   excretd      !:  Excretion ratio of diatoms
33   REAL(wp), PUBLIC ::   bresp        !:  Basal respiration rate
34   REAL(wp), PUBLIC ::   chlcnm       !:  Maximum Chl/C ratio of nano
35   REAL(wp), PUBLIC ::   chlcdm       !:  Maximum Chl/C ratio of diatoms
36   REAL(wp), PUBLIC ::   chlcmin      !:  Minimum Chl/C ratio of phytoplankton
37   REAL(wp), PUBLIC ::   fecnm        !:  Maximum Fe/C ratio of nano
38   REAL(wp), PUBLIC ::   fecdm        !:  Maximum Fe/C ratio of diatoms
39   REAL(wp), PUBLIC ::   grosip       !:  Mean Si/C ratio of diatoms
40
41   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotan   !: proxy of N quota in Nanophyto
42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotad   !: proxy of N quota in diatoms
43   
44   REAL(wp) ::   r1_rday    ! 1 / rday
45   REAL(wp) ::   texcretn   ! 1 - excretn
46   REAL(wp) ::   texcretd   ! 1 - excretd       
47
48   !! * Substitutions
49#  include "do_loop_substitute.h90"
50#  include "domzgr_substitute.h90"
51   !!----------------------------------------------------------------------
52   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
53   !! $Id$
54   !! Software governed by the CeCILL license (see ./LICENSE)
55   !!----------------------------------------------------------------------
56CONTAINS
57
58   SUBROUTINE p4z_prod( kt , knt, Kbb, Kmm, Krhs )
59      !!---------------------------------------------------------------------
60      !!                     ***  ROUTINE p4z_prod  ***
61      !!
62      !! ** Purpose :   Computes phytoplankton production depending on
63      !!                light, temperature and nutrient availability
64      !!                Computes also the uptake of Iron and Si as well
65      !!                as the chlorophyll content of the cells
66      !!                PISCES relies on a mixed Monod-Quota formalism
67      !!---------------------------------------------------------------------
68      INTEGER, INTENT(in) ::   kt, knt   !
69      INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs  ! time level indices
70      !
71      INTEGER  ::   ji, jj, jk
72      REAL(wp) ::   zsilfac, znanotot, zdiattot, zconctemp, zconctemp2
73      REAL(wp) ::   zratio, zmax, zsilim, ztn, zadap, zlim, zsiborn
74      REAL(wp) ::   zpptot, zpnewtot, zpregtot, zprochln, zprochld
75      REAL(wp) ::   zproddoc, zprodsil, zprodfer, zprodlig
76      REAL(wp) ::   zpislopen, zpisloped, zfact
77      REAL(wp) ::   zratiosi, zmaxsi, zlimfac, zsizetmp, zfecnm, zfecdm
78      REAL(wp) ::   zprod, zval
79      CHARACTER (len=25) :: charout
80      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprmaxn,zprmaxd
81      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadd, zysopt 
82      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdia, zprbio, zprchld, zprchln   
83      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcad, zprofed, zprofen
84      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewd
85      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl
86      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zpligprod
87      !!---------------------------------------------------------------------
88      !
89      IF( ln_timing )   CALL timing_start('p4z_prod')
90      !
91      !  Allocate temporary workspace
92      !
93      zprorcan(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp ; zprofed(:,:,:) = 0._wp
94      zprofen (:,:,:) = 0._wp ; zysopt  (:,:,:) = 0._wp
95      zpronewn(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp ; zprdia(:,:,:) = 0._wp
96      zprbio  (:,:,:) = 0._wp ; zprchld (:,:,:) = 0._wp ; zprchln(:,:,:) = 0._wp 
97      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp 
98
99      ! Computation of the maximimum production. Based on a Q10 description
100      ! of the thermal dependency
101      ! Parameters are taken from Bissinger et al. (2008)
102      zprmaxn(:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:)
103      zprmaxd(:,:,:) = zprmaxn(:,:,:)
104
105      ! Intermittency is supposed to have a similar effect on production as
106      ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac.
107      ! zmxl_chl is the fractional day length and is used to compute the mean
108      ! PAR during daytime. The effect of mixing is computed using the
109      ! absolute light level definition of the euphotic zone
110      ! -------------------------------------------------------------------------
111      IF ( ln_p4z_dcyc ) THEN    ! Diurnal cycle in PISCES
112
113         DO_3D( 1, 1, 1, 1, 1, jpkm1 )
114            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
115               IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
116                  zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
117               ENDIF
118               zmxl_chl(ji,jj,jk) = zval / 24.
119               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
120            ENDIF
121         END_3D
122 
123      ELSE ! No diurnal cycle in PISCES
124
125         DO_3D( 1, 1, 1, 1, 1, jpkm1 )
126            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
127               zval = MAX( 1., strn(ji,jj) )
128               IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
129                  zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
130               ENDIF
131               zmxl_chl(ji,jj,jk) = zval / 24.
132               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
133            ENDIF
134         END_3D
135
136      ENDIF
137
138      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:)
139      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:)
140
141      ! The formulation proposed by Geider et al. (1997) has been modified
142      ! to exclude the effect of nutrient limitation and temperature in the PI
143      ! curve following Vichi et al. (2007)
144      ! -----------------------------------------------------------------------
145      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
146         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
147            ztn         = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. )
148            zadap       = xadap * ztn / ( 2.+ ztn )
149            zconctemp   = MAX( 0.e0 , tr(ji,jj,jk,jpdia,Kbb) - xsizedia )
150            zconctemp2  = tr(ji,jj,jk,jpdia,Kbb) - zconctemp
151            !
152            ! The initial slope of the PI curve can be increased for nano
153            ! to account for photadaptation, for instance in the DCM
154            ! This parameterization is adhoc and should be either
155            ! improved or removed in future versions of the model
156
157            ! Nanophytoplankton
158            zpislopeadn(ji,jj,jk) = pislopen * ( 1.+ zadap  * EXP( -0.25 * enano(ji,jj,jk) ) )  &
159            &                   * tr(ji,jj,jk,jpnch,Kbb) /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn)
160
161            ! Diatoms
162            zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn )   &
163            &                   * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn)
164         ENDIF
165      END_3D
166
167      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
168         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
169             ! Computation of production function for Carbon
170             ! Actual light levels are used here
171             ! ----------------------------------------------
172             zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
173             &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
174             zpisloped = zpislopeadd(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
175             &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
176             zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  )
177             zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  )
178
179             !  Computation of production function for Chlorophyll
180             !  Mean light level in the mixed layer (when appropriate)
181             !  is used here (acclimation is in general slower than
182             !  the characteristic time scales of vertical mixing)
183             !  ------------------------------------------------------
184             zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
185             zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
186             zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) )
187             zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) )
188         ENDIF
189      END_3D
190
191      !  Computation of a proxy of the N/C quota from nutrient limitation
192      !  and light limitation. Steady state is assumed to allow the computation
193      !  ----------------------------------------------------------------------
194      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
195          zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) )   &
196          &      * zprmaxn(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
197          quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
198          zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) )   &
199          &      * zprmaxd(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
200          quotad(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
201      END_3D
202
203
204      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
205
206          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
207             ! Si/C of diatoms
208             ! ------------------------
209             ! Si/C increases with iron stress and silicate availability
210             ! Si/C is arbitrariliy increased for very high Si concentrations
211             ! to mimic the very high ratios observed in the Southern Ocean (zsilfac)
212             ! A parameterization derived from Flynn (2003) is used for the control
213             ! when Si is not limiting which is similar to the parameterisation
214             ! proposed by Gurney and Davidson (1999).
215             ! -----------------------------------------------------------------------
216            zlim  = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 )
217            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
218            zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb)
219            IF (gphit(ji,jj) < -30 ) THEN
220              zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
221            ELSE
222              zsilfac = 1. +      zsiborn / ( zsiborn + xksi2**3 )
223            ENDIF
224            zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / ( zsilfac * grosip * 3.0 + rtrn )
225            zratiosi = MAX(0., MIN(1.0, zratiosi) )
226            zmaxsi  = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 )
227            IF( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN
228               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zmaxsi
229            ELSE
230               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi
231            ENDIF
232        ENDIF
233      END_3D
234
235      ! Sea-ice effect on production
236      ! No production is assumed below sea ice
237      ! --------------------------------------
238      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
239         zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
240         zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
241      END_3D
242
243      ! Computation of the various production  and nutrient uptake terms
244      ! ---------------------------------------------------------------
245      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
246         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
247            !  production terms for nanophyto. (C)
248            zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2
249
250            !  New production (uptake of NO3)
251            zpronewn(ji,jj,jk)  = zprorcan(ji,jj,jk)* xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
252            !
253            ! Size computation
254            ! Size is made a function of the limitation of of phytoplankton growth
255            ! Strongly limited cells are supposed to be smaller. sizena is the
256            ! size at time step t+1 and is thus updated at the end of the
257            ! current time step
258            ! --------------------------------------------------------------------
259            zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn )
260            zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
261            sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) )
262
263            ! Iron uptake rates of nanophytoplankton. Upregulation is 
264            ! not parameterized at low iron concentrations as observations
265            ! do not suggest it for accimated cells. Uptake is
266            ! downregulated when the quota is close to the maximum quota
267            zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) )
268            zratio = 1.0 - MIN(1.0,tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * zfecnm + rtrn ) )
269            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
270            zprofen(ji,jj,jk) = zfecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  &
271            &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk)  &
272            &          + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) )   &
273            &          * xnanofer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2
274            ! production terms of diatoms (C)
275            zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2
276
277            ! New production (uptake of NO3)
278            zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
279
280            ! Size computation
281            ! Size is made a function of the limitation of of phytoplankton growth
282            ! Strongly limited cells are supposed to be smaller. sizeda is
283            ! size at time step t+1 and is thus updated at the end of the
284            ! current time step.
285            ! --------------------------------------------------------------------
286            zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
287            zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
288            sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) )
289
290            ! Iron uptake rates of diatoms. Upregulation is 
291            ! not parameterized at low iron concentrations as observations
292            ! do not suggest it for accimated cells. Uptake is
293            ! downregulated when the quota is close to the maximum quota
294            zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) )
295            zratio = 1.0 - MIN(1.0, tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zfecdm + rtrn ) )
296            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
297            zprofed(ji,jj,jk) = zfecdm * zprmaxd(ji,jj,jk) * (1.0 - fr_i(ji,jj) )  &
298            &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk)  &
299            &          + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) )   &
300            &          * xdiatfer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2
301         ENDIF
302      END_3D
303
304      ! Computation of the chlorophyll production terms
305      ! The parameterization is taken from Geider et al. (1997)
306      ! -------------------------------------------------------
307      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
308         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
309            !  production terms for nanophyto. ( chlorophyll )
310            znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
311            zprod    = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk)
312            zprochln = chlcmin * 12. * zprorcan (ji,jj,jk)
313            zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / &
314                                  & (  zpislopeadn(ji,jj,jk) * znanotot +rtrn)
315
316            !  production terms for diatoms ( chlorophyll )
317            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
318            zprod    = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk)
319            zprochld = chlcmin * 12. * zprorcad(ji,jj,jk)
320            zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / &
321                                  & ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn )
322
323            !   Update the arrays TRA which contain the Chla sources and sinks
324            tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn
325            tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld * texcretd
326         ENDIF
327      END_3D
328
329      !   Update the arrays TRA which contain the biological sources and sinks
330      DO_3D( 1, 1, 1, 1, 1, jpkm1 )
331        IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
332           zpptot   = zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk)
333           zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk)
334           zpregtot = zpptot - zpnewtot
335           zprodsil  = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb)
336           zproddoc  = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
337           zprodfer  = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
338           !
339           tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot
340           tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot
341           tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot
342           tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) + zprorcan(ji,jj,jk) * texcretn
343           tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk)  * texcretn
344           tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) + zprorcad(ji,jj,jk) * texcretd
345           tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk)  * texcretd
346           tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprodsil
347           tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprodsil
348           tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc
349           tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot
350           !
351           tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer
352           consfe3(ji,jj,jk)   = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   &
353           &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2
354           !
355           tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot
356           tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot )
357        ENDIF
358      END_3D
359
360     ! Production and uptake of ligands by phytoplankton. This part is activated
361     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small
362     ! and based on the FeL model by Morel et al. (2008) and on the study of
363     ! Shaked et al. (2020)
364     ! -------------------------------------------------------------------------
365     IF( ln_ligand ) THEN
366         DO_3D( 1, 1, 1, 1, 1, jpkm1 )
367           IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
368              zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
369              zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
370              zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet
371              !
372              tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig
373           ENDIF
374         END_3D
375     ENDIF
376
377
378    ! Output of the diagnostics
379    ! Total primary production per year
380    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  &
381         & tpp = glob_sum( 'p4zprod', ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) )
382
383    IF( lk_iomput .AND.  knt == nrdttrc ) THEN
384       zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
385       !
386       CALL iom_put( "PPPHYN"  , zprorcan(:,:,:) * zfact * tmask(:,:,:) )  ! primary production by nanophyto
387       CALL iom_put( "PPPHYD"  , zprorcad(:,:,:) * zfact * tmask(:,:,:)   ) ! primary production by diatomes
388       CALL iom_put( "PPNEWN"  , zpronewn(:,:,:) * zfact * tmask(:,:,:)    ) ! new primary production by nanophyto
389       CALL iom_put( "PPNEWD"  , zpronewd(:,:,:) * zfact * tmask(:,:,:)   ) ! new primary production by diatomes
390       CALL iom_put( "PBSi"    , zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)  ) ! biogenic silica production
391       CALL iom_put( "PFeN"    , zprofen(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto
392       CALL iom_put( "PFeD"    , zprofed(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes
393       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN
394           ALLOCATE(  zpligprod(jpi,jpj,jpk) )
395           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:)
396           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) )
397           !
398           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) ) & 
399             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) )
400           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) )
401           DEALLOCATE(  zpligprod )
402       ENDIF
403       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate
404       CALL iom_put( "MuN"     , zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for nanophyto
405       CALL iom_put( "MuD"     , zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for diatoms
406       CALL iom_put( "LNlight" , zprbio (:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:)  )  ! light limitation term
407       CALL iom_put( "LDlight" , zprdia (:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:)   )
408       CALL iom_put( "TPP"     , ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total primary production
409       CALL iom_put( "TPNEW"   , ( zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ) ! total new production
410       CALL iom_put( "TPBFE"   , ( zprofen(:,:,:) + zprofed(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total biogenic iron production
411       CALL iom_put( "tintpp"  , tpp * zfact )  !  global total integrated primary production molC/s
412     ENDIF
413
414     IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
415         WRITE(charout, FMT="('prod')")
416         CALL prt_ctl_info( charout, cdcomp = 'top' )
417         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
418     ENDIF
419      !
420      IF( ln_timing )  CALL timing_stop('p4z_prod')
421      !
422   END SUBROUTINE p4z_prod
423
424
425   SUBROUTINE p4z_prod_init
426      !!----------------------------------------------------------------------
427      !!                  ***  ROUTINE p4z_prod_init  ***
428      !!
429      !! ** Purpose :   Initialization of phytoplankton production parameters
430      !!
431      !! ** Method  :   Read the namp4zprod namelist and check the parameters
432      !!      called at the first timestep (nittrc000)
433      !!
434      !! ** input   :   Namelist namp4zprod
435      !!----------------------------------------------------------------------
436      INTEGER ::   ios   ! Local integer
437      !
438      ! Namelist block
439      NAMELIST/namp4zprod/ pislopen, pisloped, xadap, bresp, excretn, excretd,  &
440         &                 chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip
441      !!----------------------------------------------------------------------
442      !
443      IF(lwp) THEN                         ! control print
444         WRITE(numout,*)
445         WRITE(numout,*) 'p4z_prod_init : phytoplankton growth'
446         WRITE(numout,*) '~~~~~~~~~~~~~'
447      ENDIF
448      !
449      READ  ( numnatp_ref, namp4zprod, IOSTAT = ios, ERR = 901)
450901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zprod in reference namelist' )
451
452      READ  ( numnatp_cfg, namp4zprod, IOSTAT = ios, ERR = 902 )
453902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zprod in configuration namelist' )
454      IF(lwm) WRITE( numonp, namp4zprod )
455
456      IF(lwp) THEN                         ! control print
457         WRITE(numout,*) '   Namelist : namp4zprod'
458         WRITE(numout,*) '      mean Si/C ratio                           grosip       =', grosip
459         WRITE(numout,*) '      P-I slope                                 pislopen     =', pislopen
460         WRITE(numout,*) '      Acclimation factor to low light           xadap        =', xadap
461         WRITE(numout,*) '      excretion ratio of nanophytoplankton      excretn      =', excretn
462         WRITE(numout,*) '      excretion ratio of diatoms                excretd      =', excretd
463         WRITE(numout,*) '      basal respiration in phytoplankton        bresp        =', bresp
464         WRITE(numout,*) '      Maximum Chl/C in phytoplankton            chlcmin      =', chlcmin
465         WRITE(numout,*) '      P-I slope  for diatoms                    pisloped     =', pisloped
466         WRITE(numout,*) '      Minimum Chl/C in nanophytoplankton        chlcnm       =', chlcnm
467         WRITE(numout,*) '      Minimum Chl/C in diatoms                  chlcdm       =', chlcdm
468         WRITE(numout,*) '      Maximum Fe/C in nanophytoplankton         fecnm        =', fecnm
469         WRITE(numout,*) '      Minimum Fe/C in diatoms                   fecdm        =', fecdm
470      ENDIF
471      !
472      r1_rday   = 1._wp / rday 
473      texcretn  = 1._wp - excretn
474      texcretd  = 1._wp - excretd
475      tpp       = 0._wp
476      !
477   END SUBROUTINE p4z_prod_init
478
479
480   INTEGER FUNCTION p4z_prod_alloc()
481      !!----------------------------------------------------------------------
482      !!                     ***  ROUTINE p4z_prod_alloc  ***
483      !!----------------------------------------------------------------------
484      ALLOCATE( quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc )
485      !
486      IF( p4z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_prod_alloc : failed to allocate arrays.' )
487      !
488   END FUNCTION p4z_prod_alloc
489
490   !!======================================================================
491END MODULE p4zprod
Note: See TracBrowser for help on using the repository browser.