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

source: NEMO/trunk/src/TOP/PISCES/P4Z/p4zprod.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: 27.2 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( nn_hls, nn_hls, nn_hls, nn_hls, 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         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
125            IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
126               zval = MAX( 1., strn(ji,jj) )
127               IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
128                  zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
129               ENDIF
130               zmxl_chl(ji,jj,jk) = zval / 24.
131               zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
132            ENDIF
133         END_3D
134
135      ENDIF
136
137      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:)
138      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:)
139
140      ! The formulation proposed by Geider et al. (1997) has been modified
141      ! to exclude the effect of nutrient limitation and temperature in the PI
142      ! curve following Vichi et al. (2007)
143      ! -----------------------------------------------------------------------
144      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
145         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
146            ztn         = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. )
147            zadap       = xadap * ztn / ( 2.+ ztn )
148            zconctemp   = MAX( 0.e0 , tr(ji,jj,jk,jpdia,Kbb) - xsizedia )
149            zconctemp2  = tr(ji,jj,jk,jpdia,Kbb) - zconctemp
150            !
151            ! The initial slope of the PI curve can be increased for nano
152            ! to account for photadaptation, for instance in the DCM
153            ! This parameterization is adhoc and should be either
154            ! improved or removed in future versions of the model
155
156            ! Nanophytoplankton
157            zpislopeadn(ji,jj,jk) = pislopen * ( 1.+ zadap  * EXP( -0.25 * enano(ji,jj,jk) ) )  &
158            &                   * tr(ji,jj,jk,jpnch,Kbb) /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn)
159
160            ! Diatoms
161            zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn )   &
162            &                   * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn)
163         ENDIF
164      END_3D
165
166      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
167         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
168             ! Computation of production function for Carbon
169             ! Actual light levels are used here
170             ! ----------------------------------------------
171             zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
172             &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
173             zpisloped = zpislopeadd(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
174             &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
175             zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  )
176             zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  )
177
178             !  Computation of production function for Chlorophyll
179             !  Mean light level in the mixed layer (when appropriate)
180             !  is used here (acclimation is in general slower than
181             !  the characteristic time scales of vertical mixing)
182             !  ------------------------------------------------------
183             zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
184             zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
185             zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) )
186             zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) )
187         ENDIF
188      END_3D
189
190      !  Computation of a proxy of the N/C quota from nutrient limitation
191      !  and light limitation. Steady state is assumed to allow the computation
192      !  ----------------------------------------------------------------------
193      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
194          zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) )   &
195          &      * zprmaxn(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
196          quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
197          zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) )   &
198          &      * zprmaxd(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
199          quotad(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
200      END_3D
201
202
203      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
204
205          IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
206             ! Si/C of diatoms
207             ! ------------------------
208             ! Si/C increases with iron stress and silicate availability
209             ! Si/C is arbitrariliy increased for very high Si concentrations
210             ! to mimic the very high ratios observed in the Southern Ocean (zsilfac)
211             ! A parameterization derived from Flynn (2003) is used for the control
212             ! when Si is not limiting which is similar to the parameterisation
213             ! proposed by Gurney and Davidson (1999).
214             ! -----------------------------------------------------------------------
215            zlim  = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 )
216            zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
217            zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb)
218            IF (gphit(ji,jj) < -30 ) THEN
219              zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
220            ELSE
221              zsilfac = 1. +      zsiborn / ( zsiborn + xksi2**3 )
222            ENDIF
223            zratiosi = 1.0 - tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) / ( zsilfac * grosip * 3.0 + rtrn )
224            zratiosi = MAX(0., MIN(1.0, zratiosi) )
225            zmaxsi  = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 )
226            IF( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN
227               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zmaxsi
228            ELSE
229               zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi
230            ENDIF
231        ENDIF
232      END_3D
233
234      ! Sea-ice effect on production
235      ! No production is assumed below sea ice
236      ! --------------------------------------
237      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
238         zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
239         zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
240      END_3D
241
242      ! Computation of the various production  and nutrient uptake terms
243      ! ---------------------------------------------------------------
244      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
245         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
246            !  production terms for nanophyto. (C)
247            zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2
248
249            !  New production (uptake of NO3)
250            zpronewn(ji,jj,jk)  = zprorcan(ji,jj,jk)* xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
251            !
252            ! Size computation
253            ! Size is made a function of the limitation of of phytoplankton growth
254            ! Strongly limited cells are supposed to be smaller. sizena is the
255            ! size at time step t+1 and is thus updated at the end of the
256            ! current time step
257            ! --------------------------------------------------------------------
258            zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn )
259            zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
260            sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) )
261
262            ! Iron uptake rates of nanophytoplankton. Upregulation is 
263            ! not parameterized at low iron concentrations as observations
264            ! do not suggest it for accimated cells. Uptake is
265            ! downregulated when the quota is close to the maximum quota
266            zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) )
267            zratio = 1.0 - MIN(1.0,tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * zfecnm + rtrn ) )
268            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
269            zprofen(ji,jj,jk) = zfecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  &
270            &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk)  &
271            &          + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) )   &
272            &          * xnanofer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2
273            ! production terms of diatoms (C)
274            zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * tr(ji,jj,jk,jpdia,Kbb) * rfact2
275
276            ! New production (uptake of NO3)
277            zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
278
279            ! Size computation
280            ! Size is made a function of the limitation of of phytoplankton growth
281            ! Strongly limited cells are supposed to be smaller. sizeda is
282            ! size at time step t+1 and is thus updated at the end of the
283            ! current time step.
284            ! --------------------------------------------------------------------
285            zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
286            zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
287            sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) )
288
289            ! Iron uptake rates of diatoms. Upregulation is 
290            ! not parameterized at low iron concentrations as observations
291            ! do not suggest it for accimated cells. Uptake is
292            ! downregulated when the quota is close to the maximum quota
293            zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) )
294            zratio = 1.0 - MIN(1.0, tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zfecdm + rtrn ) )
295            zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
296            zprofed(ji,jj,jk) = zfecdm * zprmaxd(ji,jj,jk) * (1.0 - fr_i(ji,jj) )  &
297            &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk)  &
298            &          + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) )   &
299            &          * xdiatfer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2
300         ENDIF
301      END_3D
302
303      ! Computation of the chlorophyll production terms
304      ! The parameterization is taken from Geider et al. (1997)
305      ! -------------------------------------------------------
306      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
307         IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
308            !  production terms for nanophyto. ( chlorophyll )
309            znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
310            zprod    = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk)
311            zprochln = chlcmin * 12. * zprorcan (ji,jj,jk)
312            zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / &
313                                  & (  zpislopeadn(ji,jj,jk) * znanotot +rtrn)
314
315            !  production terms for diatoms ( chlorophyll )
316            zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
317            zprod    = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk)
318            zprochld = chlcmin * 12. * zprorcad(ji,jj,jk)
319            zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / &
320                                  & ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn )
321
322            !   Update the arrays TRA which contain the Chla sources and sinks
323            tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn
324            tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld * texcretd
325         ENDIF
326      END_3D
327
328      !   Update the arrays TRA which contain the biological sources and sinks
329      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
330        IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
331           zpptot   = zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk)
332           zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk)
333           zpregtot = zpptot - zpnewtot
334           zprodsil  = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb)
335           zproddoc  = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
336           zprodfer  = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
337           !
338           tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) - zpptot
339           tr(ji,jj,jk,jpno3,Krhs) = tr(ji,jj,jk,jpno3,Krhs) - zpnewtot
340           tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) - zpregtot
341           tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) + zprorcan(ji,jj,jk) * texcretn
342           tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) + zprofen(ji,jj,jk)  * texcretn
343           tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) + zprorcad(ji,jj,jk) * texcretd
344           tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) + zprofed(ji,jj,jk)  * texcretd
345           tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) + zprodsil
346           tr(ji,jj,jk,jpsil,Krhs) = tr(ji,jj,jk,jpsil,Krhs) - zprodsil
347           tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zproddoc
348           tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) + o2ut * zpregtot + ( o2ut + o2nit ) * zpnewtot
349           !
350           tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zprodfer
351           consfe3(ji,jj,jk)   = zprodfer * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) )   &
352           &                   * tr(ji,jj,jk,jpfer,Kbb) ) / rfact2
353           !
354           tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot
355           tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot )
356        ENDIF
357      END_3D
358
359     ! Production and uptake of ligands by phytoplankton. This part is activated
360     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small
361     ! and based on the FeL model by Morel et al. (2008) and on the study of
362     ! Shaked et al. (2020)
363     ! -------------------------------------------------------------------------
364     IF( ln_ligand ) THEN
365         DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
366           IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
367              zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
368              zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
369              zprodlig = plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet
370              !
371              tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zproddoc * ldocp - zprodfer * zprodlig
372           ENDIF
373         END_3D
374     ENDIF
375
376
377    ! Output of the diagnostics
378    ! Total primary production per year
379    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  &
380         & tpp = glob_sum( 'p4zprod', ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) )
381
382    IF( lk_iomput .AND.  knt == nrdttrc ) THEN
383       zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
384       !
385       CALL iom_put( "PPPHYN"  , zprorcan(:,:,:) * zfact * tmask(:,:,:) )  ! primary production by nanophyto
386       CALL iom_put( "PPPHYD"  , zprorcad(:,:,:) * zfact * tmask(:,:,:)   ) ! primary production by diatomes
387       CALL iom_put( "PPNEWN"  , zpronewn(:,:,:) * zfact * tmask(:,:,:)    ) ! new primary production by nanophyto
388       CALL iom_put( "PPNEWD"  , zpronewd(:,:,:) * zfact * tmask(:,:,:)   ) ! new primary production by diatomes
389       CALL iom_put( "PBSi"    , zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:)  ) ! biogenic silica production
390       CALL iom_put( "PFeN"    , zprofen(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by nanophyto
391       CALL iom_put( "PFeD"    , zprofed(:,:,:)  * zfact * tmask(:,:,:)  ) ! biogenic iron production by  diatomes
392       IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN
393           ALLOCATE(  zpligprod(jpi,jpj,jpk) )
394           zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:)
395           CALL iom_put( "LPRODP"  , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) )
396           !
397           zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) ) & 
398             &                  * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) )
399           CALL iom_put( "LDETP"   , zpligprod(:,:,:)  * lthet * 1e9 * zfact * tmask(:,:,:) )
400           DEALLOCATE(  zpligprod )
401       ENDIF
402       CALL iom_put( "Mumax"   , zprmaxn(:,:,:) * tmask(:,:,:)  ) ! Maximum growth rate
403       CALL iom_put( "MuN"     , zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for nanophyto
404       CALL iom_put( "MuD"     , zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for diatoms
405       CALL iom_put( "LNlight" , zprbio (:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:)  )  ! light limitation term
406       CALL iom_put( "LDlight" , zprdia (:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:)   )
407       CALL iom_put( "TPP"     , ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total primary production
408       CALL iom_put( "TPNEW"   , ( zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ) ! total new production
409       CALL iom_put( "TPBFE"   , ( zprofen(:,:,:) + zprofed(:,:,:) ) * zfact * tmask(:,:,:)  )  ! total biogenic iron production
410       CALL iom_put( "tintpp"  , tpp * zfact )  !  global total integrated primary production molC/s
411     ENDIF
412
413     IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
414         WRITE(charout, FMT="('prod')")
415         CALL prt_ctl_info( charout, cdcomp = 'top' )
416         CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm)
417     ENDIF
418      !
419      IF( ln_timing )  CALL timing_stop('p4z_prod')
420      !
421   END SUBROUTINE p4z_prod
422
423
424   SUBROUTINE p4z_prod_init
425      !!----------------------------------------------------------------------
426      !!                  ***  ROUTINE p4z_prod_init  ***
427      !!
428      !! ** Purpose :   Initialization of phytoplankton production parameters
429      !!
430      !! ** Method  :   Read the namp4zprod namelist and check the parameters
431      !!      called at the first timestep (nittrc000)
432      !!
433      !! ** input   :   Namelist namp4zprod
434      !!----------------------------------------------------------------------
435      INTEGER ::   ios   ! Local integer
436      !
437      ! Namelist block
438      NAMELIST/namp4zprod/ pislopen, pisloped, xadap, bresp, excretn, excretd,  &
439         &                 chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip
440      !!----------------------------------------------------------------------
441      !
442      IF(lwp) THEN                         ! control print
443         WRITE(numout,*)
444         WRITE(numout,*) 'p4z_prod_init : phytoplankton growth'
445         WRITE(numout,*) '~~~~~~~~~~~~~'
446      ENDIF
447      !
448      READ  ( numnatp_ref, namp4zprod, IOSTAT = ios, ERR = 901)
449901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zprod in reference namelist' )
450
451      READ  ( numnatp_cfg, namp4zprod, IOSTAT = ios, ERR = 902 )
452902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zprod in configuration namelist' )
453      IF(lwm) WRITE( numonp, namp4zprod )
454
455      IF(lwp) THEN                         ! control print
456         WRITE(numout,*) '   Namelist : namp4zprod'
457         WRITE(numout,*) '      mean Si/C ratio                           grosip       =', grosip
458         WRITE(numout,*) '      P-I slope                                 pislopen     =', pislopen
459         WRITE(numout,*) '      Acclimation factor to low light           xadap        =', xadap
460         WRITE(numout,*) '      excretion ratio of nanophytoplankton      excretn      =', excretn
461         WRITE(numout,*) '      excretion ratio of diatoms                excretd      =', excretd
462         WRITE(numout,*) '      basal respiration in phytoplankton        bresp        =', bresp
463         WRITE(numout,*) '      Maximum Chl/C in phytoplankton            chlcmin      =', chlcmin
464         WRITE(numout,*) '      P-I slope  for diatoms                    pisloped     =', pisloped
465         WRITE(numout,*) '      Minimum Chl/C in nanophytoplankton        chlcnm       =', chlcnm
466         WRITE(numout,*) '      Minimum Chl/C in diatoms                  chlcdm       =', chlcdm
467         WRITE(numout,*) '      Maximum Fe/C in nanophytoplankton         fecnm        =', fecnm
468         WRITE(numout,*) '      Minimum Fe/C in diatoms                   fecdm        =', fecdm
469      ENDIF
470      !
471      r1_rday   = 1._wp / rday 
472      texcretn  = 1._wp - excretn
473      texcretd  = 1._wp - excretd
474      tpp       = 0._wp
475      !
476   END SUBROUTINE p4z_prod_init
477
478
479   INTEGER FUNCTION p4z_prod_alloc()
480      !!----------------------------------------------------------------------
481      !!                     ***  ROUTINE p4z_prod_alloc  ***
482      !!----------------------------------------------------------------------
483      ALLOCATE( quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc )
484      !
485      IF( p4z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_prod_alloc : failed to allocate arrays.' )
486      !
487   END FUNCTION p4z_prod_alloc
488
489   !!======================================================================
490END MODULE p4zprod
Note: See TracBrowser for help on using the repository browser.