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

source: NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p4zprod.F90 @ 14276

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

numerous updates to PISCES, PISCES-QUOTA and the sediment module

  • Property svn:keywords set to Id
File size: 32.3 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_trc      ! 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   !!----------------------------------------------------------------------
49   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
50   !! $Id$
51   !! Software governed by the CeCILL license (see ./LICENSE)
52   !!----------------------------------------------------------------------
53CONTAINS
54
55   SUBROUTINE p4z_prod( kt , knt )
56      !!---------------------------------------------------------------------
57      !!                     ***  ROUTINE p4z_prod  ***
58      !!
59      !! ** Purpose :   Computes phytoplankton production depending on
60      !!                light, temperature and nutrient availability
61      !!                Computes also the uptake of Iron and Si as well
62      !!                as the chlorophyll content of the cells
63      !!                PISCES relies on a mixed Monod-Quota formalism
64      !!---------------------------------------------------------------------
65      INTEGER, INTENT(in) ::   kt, knt   !
66      !
67      INTEGER  ::   ji, jj, jk
68      REAL(wp) ::   zsilfac, znanotot, zdiattot, zconctemp, zconctemp2
69      REAL(wp) ::   zratio, zmax, zsilim, ztn, zadap, zlim, zsiborn
70      REAL(wp) ::   zprod, zproreg, zproreg2, zprochln, zprochld
71      REAL(wp) ::   zdocprod, zpislopen, zpisloped, zfact
72      REAL(wp) ::   zratiosi, zmaxsi, zlimfac, zsizetmp, zfecnm, zfecdm
73      REAL(wp) ::   zrum, zcodel, zargu, zval, zfeup
74      CHARACTER (len=25) :: charout
75      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zw2d
76      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
77      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprmaxn,zprmaxd
78      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadd, zysopt 
79      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdia, zprbio, zprchld, zprchln   
80      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcad, zprofed, zprofen
81      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewd
82      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl
83      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpligprod1, zpligprod2
84      !!---------------------------------------------------------------------
85      !
86      IF( ln_timing )   CALL timing_start('p4z_prod')
87      !
88      !  Allocate temporary workspace
89      !
90      zprorcan(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp ; zprofed (:,:,:) = 0._wp
91      zprofen (:,:,:) = 0._wp ; zysopt  (:,:,:) = 0._wp
92      zpronewn(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp ; zprdia  (:,:,:) = 0._wp
93      zprbio  (:,:,:) = 0._wp ; zprchld (:,:,:) = 0._wp ; zprchln (:,:,:) = 0._wp 
94      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp 
95      consfe3 (:,:,:) = 0._wp
96
97      ! Computation of the maximimum production. Based on a Q10 description
98      ! of the thermal dependency
99      ! Parameters are taken from Bissinger et al. (2008)
100      zprmaxn(:,:,:) = 0.8_wp * r1_rday * tgfunc(:,:,:)
101      zprmaxd(:,:,:) = zprmaxn(:,:,:)
102
103      ! Impact of the day duration and light intermittency on phytoplankton growth
104      ! Intermittency is supposed to have a similar effect on production as
105      ! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac.
106      ! zmxl_chl is the fractional day length and is used to compute the mean
107      ! PAR during daytime. The effect of mixing is computed using the
108      ! absolute light level definition of the euphotic zone
109      ! -------------------------------------------------------------------------
110      DO jk = 1, jpkm1
111         DO jj = 1 ,jpj
112            DO ji = 1, jpi
113               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
114                  zval = MAX( 1., strn(ji,jj) )
115                  IF( gdepw_n(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
116                     zval = 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 DO
122         END DO
123      END DO
124
125      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:)
126      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:)
127
128      ! Computation of the P-I slope for nanos and diatoms
129      ! The formulation proposed by Geider et al. (1997) has been modified
130      ! to exclude the effect of nutrient limitation and temperature in the PI
131      ! curve following Vichi et al. (2007)
132      ! -----------------------------------------------------------------------
133      DO jk = 1, jpkm1
134         DO jj = 1, jpj
135            DO ji = 1, jpi
136               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
137                  ztn         = MAX( 0., tsn(ji,jj,jk,jp_tem) - 15. )
138                  zadap       = xadap * ztn / ( 2.+ ztn )
139                  zconctemp   = MAX( 0.e0 , trb(ji,jj,jk,jpdia) - xsizedia )
140                  zconctemp2  = trb(ji,jj,jk,jpdia) - 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                  &                   * trb(ji,jj,jk,jpnch) /( trb(ji,jj,jk,jpphy) * 12. + rtrn)
150
151                  ! Diatoms
152                  zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( trb(ji,jj,jk,jpdia) + rtrn )   &
153                  &                   * trb(ji,jj,jk,jpdch) /( trb(ji,jj,jk,jpdia) * 12. + rtrn)
154               ENDIF
155            END DO
156         END DO
157      END DO
158
159      DO jk = 1, jpkm1
160         DO jj = 1, jpj
161            DO ji = 1, jpi
162               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
163                   ! Computation of production function for Carbon
164                   ! Actual light levels are used here
165                   ! ----------------------------------------------
166                   zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
167                   &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
168                   zpisloped = zpislopeadd(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
169                   &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
170                   zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  )
171                   zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  )
172
173                   !  Computation of production function for Chlorophyll
174                   !  Mean light level in the mixed layer (when appropriate)
175                   !  is used here (acclimation is in general slower than
176                   !  the characteristic time scales of vertical mixing)
177                   !  ------------------------------------------------------
178                   zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
179                   zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
180                   zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) )
181                   zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) )
182               ENDIF
183            END DO
184         END DO
185      END DO
186
187      !  Computation of a proxy of the N/C quota from nutrient limitation
188      !  and light limitation. Steady state is assumed to allow the computation
189      !  ----------------------------------------------------------------------
190      DO jk = 1, jpkm1
191         DO jj = 1, jpj
192            DO ji = 1, jpi
193                zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) )   &
194                &      * zprmaxn(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
195                quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
196                zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) )   &
197                &      * zprmaxd(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
198                quotad(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
199            END DO
200         END DO
201      END DO
202
203
204      DO jk = 1, jpkm1
205         DO jj = 1, jpj
206            DO ji = 1, jpi
207
208               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
209
210                   ! Si/C of diatoms
211                   ! ------------------------
212                   ! Si/C increases with iron stress and silicate availability
213                   ! Si/C is arbitrariliy increased for very high Si concentrations
214                   ! to mimic the very high ratios observed in the Southern Ocean (zsilfac)
215                   ! A parameterization derived from Flynn (2003) is used for the control
216                   ! when Si is not limiting which is similar to the parameterisation
217                   ! proposed by Gurney and Davidson (1999).
218                   ! -----------------------------------------------------------------------
219                 zlim  = trb(ji,jj,jk,jpsil) / ( trb(ji,jj,jk,jpsil) + xksi1 )
220                 zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
221                 zsiborn = trb(ji,jj,1,jpsil)**3
222                 IF (gphit(ji,jj) < -30.0 ) THEN
223                   zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
224                 ELSE
225                   zsilfac = 1. +      zsiborn / ( zsiborn + xksi2**3 )
226                 ENDIF
227                 zratiosi = 1.0 - trb(ji,jj,jk,jpdsi) / ( trb(ji,jj,jk,jpdia) + rtrn ) / ( zsilfac * grosip * 3.0 + rtrn )
228                 zratiosi = MAX(0., MIN(1.0, zratiosi) )
229                 zmaxsi  = (1.0 + 0.1**4) * zratiosi**4 / ( zratiosi**4 + 0.1**4 )
230                 IF ( xlimsi(ji,jj,jk) /= xlimdia(ji,jj,jk) ) THEN
231                    zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zmaxsi
232                 ELSE
233                    zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi
234                 ENDIF
235              ENDIF
236            END DO
237         END DO
238      END DO
239
240      ! Sea-ice effect on production
241      ! No production is assumed below sea ice
242      ! --------------------------------------
243      DO jk = 1, jpkm1
244         DO jj = 1, jpj
245            DO ji = 1, jpi
246               zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
247               zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
248            END DO
249         END DO
250      END DO
251
252      ! Computation of the various production  and nutrient uptake terms
253      ! ---------------------------------------------------------------
254      DO jk = 1, jpkm1
255         DO jj = 1, jpj
256            DO ji = 1, jpi
257               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
258                  !  production term of nanophyto. (C)
259                  zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * trb(ji,jj,jk,jpphy) * rfact2
260
261                  !  New production (uptake of NO3)
262                  zpronewn(ji,jj,jk)  = zprorcan(ji,jj,jk)* xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
263
264                  ! Size computation
265                  ! Size is made a function of the limitation of of phytoplankton growth
266                  ! Strongly limited cells are supposed to be smaller. sizena is the
267                  ! size at time step t+1 and is thus updated at the end of the
268                  ! current time step
269                  ! --------------------------------------------------------------------
270                  zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn )
271                  zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
272                  sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) )
273
274                  ! Iron uptake rates of nanophytoplankton. Upregulation is 
275                  ! not parameterized at low iron concentrations as observations
276                  ! do not suggest it for accimated cells. Uptake is
277                  ! downregulated when the quota is close to the maximum quota
278                  zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) )
279                  zratio = 1.0 - MIN(1.0,trb(ji,jj,jk,jpnfe) / ( trb(ji,jj,jk,jpphy) * zfecnm + rtrn ) )
280                  zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
281                  zprofen(ji,jj,jk) = zfecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  &
282                  &          * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk)  &
283                  &          + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) )   &
284                  &          * xnanofer(ji,jj,jk) * zmax * trb(ji,jj,jk,jpphy) * rfact2
285                  ! production terms of diatoms (C)
286                  zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * trb(ji,jj,jk,jpdia) * rfact2
287
288                  ! New production (uptake of NO3)
289                  zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
290
291                  ! Size computation
292                  ! Size is made a function of the limitation of of phytoplankton growth
293                  ! Strongly limited cells are supposed to be smaller. sizeda is
294                  ! size at time step t+1 and is thus updated at the end of the
295                  ! current time step.
296                  ! --------------------------------------------------------------------
297                  zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn )
298                  zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
299                  sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) )
300
301                  ! Iron uptake rates of diatoms. Upregulation is 
302                  ! not parameterized at low iron concentrations as observations
303                  ! do not suggest it for accimated cells. Uptake is
304                  ! downregulated when the quota is close to the maximum quota
305                  zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) )
306                  zratio = 1.0 - MIN(1.0, trb(ji,jj,jk,jpdfe) / ( trb(ji,jj,jk,jpdia) * zfecdm + rtrn ) )
307                  zmax   = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) 
308                  zprofed(ji,jj,jk) = zfecdm * zprmaxd(ji,jj,jk) * (1.0 - fr_i(ji,jj) )  &
309                  &          * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk)  &
310                  &          + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) )   &
311                  &          * xdiatfer(ji,jj,jk) * zmax * trb(ji,jj,jk,jpdia) * rfact2
312               ENDIF
313            END DO
314         END DO
315      END DO
316
317      ! Computation of the chlorophyll production terms
318      ! The parameterization is taken from Geider et al. (1997)
319      ! -------------------------------------------------------
320      DO jk = 1, jpkm1
321         DO jj = 1, jpj
322            DO ji = 1, jpi
323               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
324                  !  production term for nanophyto. ( chlorophyll )
325                  znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
326                  zprod    = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk)
327                  zprochln = chlcmin * 12. * zprorcan (ji,jj,jk)
328                  zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / &
329                                        & (  zpislopeadn(ji,jj,jk) * znanotot +rtrn)
330
331                  ! production terms of diatoms ( chlorophyll )
332                  zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
333                  zprod    = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk)
334                  zprochld = chlcmin * 12. * zprorcad(ji,jj,jk)
335                  zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / &
336                                        & ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn )
337
338                  ! Update the arrays TRA which contain the Chla sources and sinks
339                  tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) + zprochln * texcretn
340                  tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) + zprochld * texcretd
341               ENDIF
342            END DO
343         END DO
344      END DO
345
346      !   Update the arrays TRA which contain the biological sources and sinks
347      DO jk = 1, jpkm1
348         DO jj = 1, jpj
349           DO ji =1 ,jpi
350              IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
351                 zproreg  = zprorcan(ji,jj,jk) - zpronewn(ji,jj,jk)
352                 zproreg2 = zprorcad(ji,jj,jk) - zpronewd(ji,jj,jk)
353                 zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
354                 tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) - zprorcan(ji,jj,jk) - zprorcad(ji,jj,jk)
355                 tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) - zpronewn(ji,jj,jk) - zpronewd(ji,jj,jk)
356                 tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zproreg - zproreg2
357                 tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zprorcan(ji,jj,jk) * texcretn
358                 tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) + zprofen(ji,jj,jk) * texcretn
359                 tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) + zprorcad(ji,jj,jk) * texcretd
360                 tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) + zprofed(ji,jj,jk) * texcretd
361                 tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) + zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk)   &
362                 &                   * rfact2 * trb(ji,jj,jk,jpdia)
363                 tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zdocprod
364                 tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) + o2ut * ( zproreg + zproreg2) &
365                 &                   + ( o2ut + o2nit ) * ( zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) )
366                 !
367                 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - ( texcretn * zprofen(ji,jj,jk)    &
368                 &                   + texcretd * zprofed(ji,jj,jk) )
369                 consfe3(ji,jj,jk) = ( texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) )     &
370                 &                    * 75.0 / ( rtrn + ( plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * trb(ji,jj,jk,jpfer) ) / rfact2
371                 tra(ji,jj,jk,jpsil) = tra(ji,jj,jk,jpsil) - zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk)   &
372                 &                   * rfact2 * trb(ji,jj,jk,jpdia)
373                 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprorcan(ji,jj,jk) - zprorcad(ji,jj,jk)
374                 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * ( zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) ) &
375                 &                                         - rno3 * ( zproreg + zproreg2 )
376              ENDIF
377           END DO
378        END DO
379     END DO
380
381     ! Production and uptake of ligands by phytoplankton. This part is activated
382     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small
383     ! and based on the FeL model by Morel et al. (2008) and on the study of
384     ! Shaked et al. (2020)
385     ! -------------------------------------------------------------------------
386     IF( ln_ligand ) THEN
387         zpligprod1(:,:,:) = 0._wp    ;    zpligprod2(:,:,:) = 0._wp
388         DO jk = 1, jpkm1
389            DO jj = 1, jpj
390              DO ji =1 ,jpi
391                 IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
392                    zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
393                    zfeup    = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
394                    tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + zdocprod * ldocp    &
395                    &       - zfeup * plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet
396                    zpligprod1(ji,jj,jk) = zdocprod * ldocp
397                    zpligprod2(ji,jj,jk) = zfeup * plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) &
398                    &                      + 75.0 * (1.0 - plig(ji,jj,jk) ) ) * lthet
399                 ENDIF
400              END DO
401           END DO
402        END DO
403     ENDIF
404
405
406    ! Output of the diagnostics
407    ! Total primary production per year
408    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  &
409         & tpp = glob_sum( 'p4zprod', ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) )
410
411    IF( lk_iomput ) THEN
412       IF( knt == nrdttrc ) THEN
413          ALLOCATE( zw2d(jpi,jpj), zw3d(jpi,jpj,jpk) )
414          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
415          !
416          IF( iom_use( "PPPHYN" ) .OR. iom_use( "PPPHYD" ) )  THEN
417              zw3d(:,:,:) = zprorcan(:,:,:) * zfact * tmask(:,:,:)  ! primary production by nanophyto
418              CALL iom_put( "PPPHYN"  , zw3d )
419              !
420              zw3d(:,:,:) = zprorcad(:,:,:) * zfact * tmask(:,:,:)  ! primary production by diatomes
421              CALL iom_put( "PPPHYD"  , zw3d )
422          ENDIF
423          IF( iom_use( "PPNEWN" ) .OR. iom_use( "PPNEWD" ) )  THEN
424              zw3d(:,:,:) = zpronewn(:,:,:) * zfact * tmask(:,:,:)  ! new primary production by nanophyto
425              CALL iom_put( "PPNEWN"  , zw3d )
426              !
427              zw3d(:,:,:) = zpronewd(:,:,:) * zfact * tmask(:,:,:)  ! new primary production by diatoms
428              CALL iom_put( "PPNEWD"  , zw3d )
429          ENDIF
430          IF( iom_use( "PBSi" ) )  THEN
431              zw3d(:,:,:) = zprmaxd(:,:,:) * 1.E3 * tmask(:,:,:) * zysopt(:,:,:) * trb(:,:,:,jpdia) ! biogenic silica production
432              CALL iom_put( "PBSi"  , zw3d )
433          ENDIF
434          IF( iom_use( "PFeN" ) .OR. iom_use( "PFeD" ) )  THEN
435              zw3d(:,:,:) = zprofen(:,:,:) * zfact * tmask(:,:,:)  ! biogenic iron production by nanophyto
436              CALL iom_put( "PFeN"  , zw3d )
437              !
438              zw3d(:,:,:) = zprofed(:,:,:) * zfact * tmask(:,:,:)  ! biogenic iron production by  diatoms
439              CALL iom_put( "PFeD"  , zw3d )
440          ENDIF
441          IF( iom_use( "LPRODP" ) )  THEN
442              zw3d(:,:,:) = zpligprod1(:,:,:) * 1e9 * zfact * tmask(:,:,:)  ! Ligand production by phytoplankton
443              CALL iom_put( "LPRODP"  , zw3d )
444          ENDIF
445          IF( iom_use( "LDETP" ) )  THEN
446              zw3d(:,:,:) = zpligprod2(:,:,:) * 1e9 * zfact * tmask(:,:,:)  ! Uptake of ligands by phytoplankton
447              CALL iom_put( "LDETP"  , zw3d )
448          ENDIF
449          IF( iom_use( "Mumax" ) )  THEN
450              zw3d(:,:,:) = zprmaxn(:,:,:) * tmask(:,:,:)   ! Maximum growth rate
451              CALL iom_put( "Mumax"  , zw3d )
452          ENDIF
453          IF( iom_use( "MuN" ) .OR. iom_use( "MuD" ) )  THEN
454              zw3d(:,:,:) = zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:)  ! Realized growth rate for nanophyto
455              CALL iom_put( "MuN"  , zw3d )
456              !
457              zw3d(:,:,:) =  zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:)  ! Realized growth rate for diatoms
458              CALL iom_put( "MuD"  , zw3d )
459          ENDIF
460          IF( iom_use( "LNlight" ) .OR. iom_use( "LDlight" ) )  THEN
461              zw3d(:,:,:) = zprbio (:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:) ! light limitation term of nanophytoplankton
462              CALL iom_put( "LNlight"  , zw3d )
463              !
464              zw3d(:,:,:) = zprdia (:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:)  ! light limitation term of diatoms
465              CALL iom_put( "LDlight"  , zw3d )
466          ENDIF
467          IF( iom_use( "TPP" ) )  THEN
468              zw3d(:,:,:) = ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  ! total primary production
469              CALL iom_put( "TPP"  , zw3d )
470          ENDIF
471          IF( iom_use( "TPNEW" ) )  THEN
472              zw3d(:,:,:) = ( zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ! total new production
473              CALL iom_put( "TPNEW"  , zw3d )
474          ENDIF
475          IF( iom_use( "TPBFE" ) )  THEN
476              zw3d(:,:,:) = ( zprofen(:,:,:) + zprofed(:,:,:) ) * zfact * tmask(:,:,:)  ! total biogenic iron production
477              CALL iom_put( "TPBFE"  , zw3d )
478          ENDIF
479          IF( iom_use( "INTPPPHYN" ) .OR. iom_use( "INTPPPHYD" ) ) THEN 
480             zw2d(:,:) = 0.
481             DO jk = 1, jpkm1
482               zw2d(:,:) = zw2d(:,:) + zprorcan(:,:,jk) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk)  ! vert. integrated  primary produc. by nano
483             ENDDO
484             CALL iom_put( "INTPPPHYN" , zw2d )
485             !
486             zw2d(:,:) = 0.
487             DO jk = 1, jpkm1
488                zw2d(:,:) = zw2d(:,:) + zprorcad(:,:,jk) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated  primary produc. by diatom
489             ENDDO
490             CALL iom_put( "INTPPPHYD" , zw2d )
491          ENDIF
492          IF( iom_use( "INTPP" ) ) THEN   
493             zw2d(:,:) = 0.
494             DO jk = 1, jpkm1
495                zw2d(:,:) = zw2d(:,:) + ( zprorcan(:,:,jk) + zprorcad(:,:,jk) ) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated pp
496             ENDDO
497             CALL iom_put( "INTPP" , zw2d )
498          ENDIF
499          IF( iom_use( "INTPNEW" ) ) THEN   
500             zw2d(:,:) = 0.
501             DO jk = 1, jpkm1
502                zw2d(:,:) = zw2d(:,:) + ( zpronewn(:,:,jk) + zpronewd(:,:,jk) ) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk)  ! vert. integrated new prod
503             ENDDO
504             CALL iom_put( "INTPNEW" , zw2d )
505          ENDIF
506          IF( iom_use( "INTPBFE" ) ) THEN           !   total biogenic iron production  ( vertically integrated )
507             zw2d(:,:) = 0.
508             DO jk = 1, jpkm1
509                zw2d(:,:) = zw2d(:,:) + ( zprofen(:,:,jk) + zprofed(:,:,jk) ) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk) ! vert integr. bfe prod
510             ENDDO
511            CALL iom_put( "INTPBFE" , zw2d )
512          ENDIF
513          IF( iom_use( "INTPBSI" ) ) THEN           !   total biogenic silica production  ( vertically integrated )
514             zw2d(:,:) = 0.
515             DO jk = 1, jpkm1
516                zw2d(:,:) = zw2d(:,:) + zprorcad(:,:,jk) * zysopt(:,:,jk) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk)  ! vert integr. bsi prod
517             ENDDO
518             CALL iom_put( "INTPBSI" , zw2d )
519          ENDIF
520          IF( iom_use( "tintpp" ) )  CALL iom_put( "tintpp" , tpp * zfact )  !  global total integrated primary production molC/s
521          !
522          DEALLOCATE( zw2d, zw3d )
523       ENDIF
524     ENDIF
525
526     IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
527         WRITE(charout, FMT="('prod')")
528         CALL prt_ctl_trc_info(charout)
529         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
530     ENDIF
531      !
532      IF( ln_timing )  CALL timing_stop('p4z_prod')
533      !
534   END SUBROUTINE p4z_prod
535
536
537   SUBROUTINE p4z_prod_init
538      !!----------------------------------------------------------------------
539      !!                  ***  ROUTINE p4z_prod_init  ***
540      !!
541      !! ** Purpose :   Initialization of phytoplankton production parameters
542      !!
543      !! ** Method  :   Read the namp4zprod namelist and check the parameters
544      !!      called at the first timestep (nittrc000)
545      !!
546      !! ** input   :   Namelist namp4zprod
547      !!----------------------------------------------------------------------
548      INTEGER ::   ios   ! Local integer
549      !
550      ! Namelist block
551      NAMELIST/namp4zprod/ pislopen, pisloped, xadap, bresp, excretn, excretd,  &
552         &                 chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip
553      !!----------------------------------------------------------------------
554      !
555      IF(lwp) THEN                         ! control print
556         WRITE(numout,*)
557         WRITE(numout,*) 'p4z_prod_init : phytoplankton growth'
558         WRITE(numout,*) '~~~~~~~~~~~~~'
559      ENDIF
560      !
561      REWIND( numnatp_ref )              ! Namelist namp4zprod in reference namelist : Pisces phytoplankton production
562      READ  ( numnatp_ref, namp4zprod, IOSTAT = ios, ERR = 901)
563901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zprod in reference namelist' )
564      REWIND( numnatp_cfg )              ! Namelist namp4zprod in configuration namelist : Pisces phytoplankton production
565      READ  ( numnatp_cfg, namp4zprod, IOSTAT = ios, ERR = 902 )
566902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zprod in configuration namelist' )
567      IF(lwm) WRITE( numonp, namp4zprod )
568
569      IF(lwp) THEN                         ! control print
570         WRITE(numout,*) '   Namelist : namp4zprod'
571         WRITE(numout,*) '      mean Si/C ratio                           grosip       =', grosip
572         WRITE(numout,*) '      P-I slope                                 pislopen     =', pislopen
573         WRITE(numout,*) '      Acclimation factor to low light           xadap        =', xadap
574         WRITE(numout,*) '      excretion ratio of nanophytoplankton      excretn      =', excretn
575         WRITE(numout,*) '      excretion ratio of diatoms                excretd      =', excretd
576         WRITE(numout,*) '      basal respiration in phytoplankton        bresp        =', bresp
577         WRITE(numout,*) '      Maximum Chl/C in phytoplankton            chlcmin      =', chlcmin
578         WRITE(numout,*) '      P-I slope  for diatoms                    pisloped     =', pisloped
579         WRITE(numout,*) '      Minimum Chl/C in nanophytoplankton        chlcnm       =', chlcnm
580         WRITE(numout,*) '      Minimum Chl/C in diatoms                  chlcdm       =', chlcdm
581         WRITE(numout,*) '      Maximum Fe/C in nanophytoplankton         fecnm        =', fecnm
582         WRITE(numout,*) '      Minimum Fe/C in diatoms                   fecdm        =', fecdm
583      ENDIF
584      !
585      r1_rday   = 1._wp / rday 
586      texcretn  = 1._wp - excretn
587      texcretd  = 1._wp - excretd
588      tpp       = 0._wp
589      !
590   END SUBROUTINE p4z_prod_init
591
592
593   INTEGER FUNCTION p4z_prod_alloc()
594      !!----------------------------------------------------------------------
595      !!                     ***  ROUTINE p4z_prod_alloc  ***
596      !!----------------------------------------------------------------------
597      ALLOCATE( quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc )
598      !
599      IF( p4z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_prod_alloc : failed to allocate arrays.' )
600      !
601   END FUNCTION p4z_prod_alloc
602
603   !!======================================================================
604END MODULE p4zprod
Note: See TracBrowser for help on using the repository browser.