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 @ 14385

Last change on this file since 14385 was 14385, checked in by cetlod, 4 years ago

dev_r11708_aumont_PISCES_QUOTA : merge with the trunk

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