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

Last change on this file since 12537 was 12537, checked in by aumont, 4 years ago

Comments in routines have been revised and significantly augmented

  • Property svn:keywords set to Id
File size: 29.7 KB
RevLine 
[3443]1MODULE p4zprod
2   !!======================================================================
3   !!                         ***  MODULE p4zprod  ***
[12537]4   !! TOP :  Growth Rate of the two phytoplankton groups of PISCES
[3443]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   !!----------------------------------------------------------------------
[9169]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
[3443]13   !!----------------------------------------------------------------------
[9169]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
[10227]17   USE p4zlim          ! Co-limitations of differents nutrients
[9169]18   USE prtctl_trc      ! print control for debugging
19   USE iom             ! I/O manager
[3443]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
[12537]26   PUBLIC   p4z_prod_alloc   ! called in trcini_pisces.F90
[3443]27
[9169]28   REAL(wp), PUBLIC ::   pislopen     !:
29   REAL(wp), PUBLIC ::   pisloped     !:
30   REAL(wp), PUBLIC ::   xadap        !:
31   REAL(wp), PUBLIC ::   excretn      !:
32   REAL(wp), PUBLIC ::   excretd      !:
33   REAL(wp), PUBLIC ::   bresp        !:
34   REAL(wp), PUBLIC ::   chlcnm       !:
35   REAL(wp), PUBLIC ::   chlcdm       !:
36   REAL(wp), PUBLIC ::   chlcmin      !:
37   REAL(wp), PUBLIC ::   fecnm        !:
38   REAL(wp), PUBLIC ::   fecdm        !:
39   REAL(wp), PUBLIC ::   grosip       !:
[3443]40
41   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotan   !: proxy of N quota in Nanophyto
[12537]42   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotad   !: proxy of N quota in diatoms
[3443]43   
[9169]44   REAL(wp) ::   r1_rday    ! 1 / rday
45   REAL(wp) ::   texcretn   ! 1 - excretn
46   REAL(wp) ::   texcretd   ! 1 - excretd       
[3443]47
48   !!----------------------------------------------------------------------
[10067]49   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
[10069]50   !! $Id$
[10068]51   !! Software governed by the CeCILL license (see ./LICENSE)
[3443]52   !!----------------------------------------------------------------------
53CONTAINS
54
[5385]55   SUBROUTINE p4z_prod( kt , knt )
[3443]56      !!---------------------------------------------------------------------
57      !!                     ***  ROUTINE p4z_prod  ***
58      !!
[12537]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
[3443]63      !!---------------------------------------------------------------------
[9169]64      INTEGER, INTENT(in) ::   kt, knt   !
[3443]65      !
66      INTEGER  ::   ji, jj, jk
[3446]67      REAL(wp) ::   zsilfac, znanotot, zdiattot, zconctemp, zconctemp2
[7646]68      REAL(wp) ::   zratio, zmax, zsilim, ztn, zadap, zlim, zsilfac2, zsiborn
69      REAL(wp) ::   zprod, zproreg, zproreg2, zprochln, zprochld
70      REAL(wp) ::   zmaxday, zdocprod, zpislopen, zpisloped
71      REAL(wp) ::   zmxltst, zmxlday
72      REAL(wp) ::   zrum, zcodel, zargu, zval, zfeup, chlcnm_n, chlcdm_n
[4996]73      REAL(wp) ::   zfact
[3443]74      CHARACTER (len=25) :: charout
[9125]75      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zw2d
76      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
77      REAL(wp), DIMENSION(jpi,jpj    ) :: zstrn, zmixnano, zmixdiat
[10362]78      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprmaxn,zprmaxd
[9125]79      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadd, zysopt 
[12496]80      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdia, zprbio, zprchld, zprchln   
[9125]81      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcad, zprofed, zprofen
82      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewd
83      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl
[10362]84      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpligprod1, zpligprod2
[3443]85      !!---------------------------------------------------------------------
86      !
[9124]87      IF( ln_timing )   CALL timing_start('p4z_prod')
[3443]88      !
89      !  Allocate temporary workspace
90      !
[7753]91      zprorcan(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp ; zprofed (:,:,:) = 0._wp
92      zprofen (:,:,:) = 0._wp ; zysopt  (:,:,:) = 0._wp
93      zpronewn(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp ; zprdia  (:,:,:) = 0._wp
[12496]94      zprbio  (:,:,:) = 0._wp ; zprchld (:,:,:) = 0._wp ; zprchln (:,:,:) = 0._wp 
[7753]95      zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp 
96
[12537]97      ! Computation of the maximimum production
98      ! Parameters are taken from Bissinger et al. (2008)
[10362]99      zprmaxn(:,:,:) = 0.8_wp * r1_rday * tgfunc(:,:,:)
100      zprmaxd(:,:,:) = zprmaxn(:,:,:)
[7753]101
[3443]102      ! compute the day length depending on latitude and the day
103      zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp )
104      zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  )
105
106      ! day length in hours
[7753]107      zstrn(:,:) = 0.
[3443]108      DO jj = 1, jpj
109         DO ji = 1, jpi
110            zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad )
111            zargu = MAX( -1., MIN(  1., zargu ) )
112            zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. )
113         END DO
114      END DO
115
[7646]116      ! Impact of the day duration and light intermittency on phytoplankton growth
[12537]117      ! Intermittency is supposed to have a similar effect on production as
118      ! day length. The correcting factor is zmxl_fac. zmxl_chl is the fractional
119      ! day length and is used to compute the mean PAR during daytime.
120      ! Formulation for the impact of day length on PP is from Thompson (1999)
121      ! -------------------------------------------------------------------------
[5385]122      DO jk = 1, jpkm1
123         DO jj = 1 ,jpj
124            DO ji = 1, jpi
125               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
126                  zval = MAX( 1., zstrn(ji,jj) )
[12496]127                  IF( gdepw_n(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
[7646]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.5 * zval / ( 12. + zval )
[5385]132               ENDIF
[3443]133            END DO
134         END DO
[5385]135      END DO
[3443]136
[10362]137      zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:)
138      zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:)
[7646]139
[7753]140      WHERE( zstrn(:,:) < 1.e0 ) zstrn(:,:) = 24.
[3443]141
[7646]142      ! Computation of the P-I slope for nanos and diatoms
[12537]143      ! The formulation proposed by Geider et al. (1997) has been modified
144      ! to exclude the effect of nutrient limitation and temperature in the PI
145      ! curve following Vichi et al. (2007)
146      ! -----------------------------------------------------------------------
[7646]147      DO jk = 1, jpkm1
148         DO jj = 1, jpj
149            DO ji = 1, jpi
150               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
151                  ztn         = MAX( 0., tsn(ji,jj,jk,jp_tem) - 15. )
152                  zadap       = xadap * ztn / ( 2.+ ztn )
153                  zconctemp   = MAX( 0.e0 , trb(ji,jj,jk,jpdia) - xsizedia )
154                  zconctemp2  = trb(ji,jj,jk,jpdia) - zconctemp
155                  !
[12537]156                  ! The initial slope of the PI curve can be increased for nano
157                  ! to account for photadaptation, for instance in the DCM
[7646]158                  zpislopeadn(ji,jj,jk) = pislopen * ( 1.+ zadap  * EXP( -0.25 * enano(ji,jj,jk) ) )  &
159                  &                   * trb(ji,jj,jk,jpnch) /( trb(ji,jj,jk,jpphy) * 12. + rtrn)
160                  !
161                  zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( trb(ji,jj,jk,jpdia) + rtrn )   &
162                  &                   * trb(ji,jj,jk,jpdch) /( trb(ji,jj,jk,jpdia) * 12. + rtrn)
163               ENDIF
164            END DO
165         END DO
166      END DO
167
[10401]168      DO jk = 1, jpkm1
169         DO jj = 1, jpj
170            DO ji = 1, jpi
171               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
172                   ! Computation of production function for Carbon
173                   !  ---------------------------------------------
174                   zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
175                   &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
176                   zpisloped = zpislopeadd(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) &
177                   &            * zmxl_fac(ji,jj,jk) * rday + rtrn)
178                   zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) )  )
179                   zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) )  )
180                   !  Computation of production function for Chlorophyll
181                   !--------------------------------------------------
182                   zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
183                   zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn )
[12496]184                   zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) )
185                   zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) )
[10401]186               ENDIF
[3443]187            END DO
188         END DO
[10401]189      END DO
[3443]190
191      !  Computation of a proxy of the N/C ratio
[12537]192      !  Steady state is assumed
[3443]193      !  ---------------------------------------
194      DO jk = 1, jpkm1
195         DO jj = 1, jpj
196            DO ji = 1, jpi
[4529]197                zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) )   &
[10362]198                &      * zprmaxn(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
[4529]199                quotan(ji,jj,jk) = MIN( 1., 0.2 + 0.8 * zval )
200                zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) )   &
[10362]201                &      * zprmaxd(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
[4529]202                quotad(ji,jj,jk) = MIN( 1., 0.2 + 0.8 * zval )
[3443]203            END DO
204         END DO
205      END DO
206
207
208      DO jk = 1, jpkm1
209         DO jj = 1, jpj
210            DO ji = 1, jpi
211
[5385]212                IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
[12537]213                   ! Si/C of diatoms
214                   ! ------------------------
215                   ! Si/C increases with iron stress and silicate availability (zsilfac)
216                   ! Si/C is arbitrariliy increased for very high Si concentrations
217                   ! to mimic the very high ratios observed in the Southern Ocean (zsilfac2)
218                   ! -----------------------------------------------------------------------
[5385]219                  zlim  = trb(ji,jj,jk,jpsil) / ( trb(ji,jj,jk,jpsil) + xksi1 )
[10362]220                  zsilim = MIN( zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ), xlimsi(ji,jj,jk) )
[3443]221                  zsilfac = 4.4 * EXP( -4.23 * zsilim ) * MAX( 0.e0, MIN( 1., 2.2 * ( zlim - 0.5 ) )  ) + 1.e0
[5385]222                  zsiborn = trb(ji,jj,jk,jpsil) * trb(ji,jj,jk,jpsil) * trb(ji,jj,jk,jpsil)
[3446]223                  IF (gphit(ji,jj) < -30 ) THEN
224                    zsilfac2 = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
225                  ELSE
226                    zsilfac2 = 1. +      zsiborn / ( zsiborn + xksi2**3 )
227                  ENDIF
228                  zysopt(ji,jj,jk) = grosip * zlim * zsilfac * zsilfac2
[3443]229              ENDIF
230            END DO
231         END DO
232      END DO
233
[12537]234      ! Sea-ice effect on production
235      ! No production is assumed below sea ice
236      ! --------------------------------------
[3443]237      DO jk = 1, jpkm1
238         DO jj = 1, jpj
239            DO ji = 1, jpi
[6945]240               zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
241               zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
[3443]242            END DO
243         END DO
244      END DO
245
[12537]246      ! Computation of the various production  and nutrient uptake terms
247      ! ---------------------------------------------------------------
[3443]248      DO jk = 1, jpkm1
249         DO jj = 1, jpj
250            DO ji = 1, jpi
[5385]251               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
[12537]252                  !  production term of nanophyto. (C)
[7646]253                  zprorcan(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * trb(ji,jj,jk,jpphy) * rfact2
[12537]254
255                  !  New production (uptake of NO3)
[7646]256                  zpronewn(ji,jj,jk)  = zprorcan(ji,jj,jk)* xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
[3443]257                  !
[7646]258                  zratio = trb(ji,jj,jk,jpnfe) / ( trb(ji,jj,jk,jpphy) * fecnm + rtrn )
[12537]259
260                  !  Iron uptake rates of nanophytoplankton. Upregulation 
261                  !  is parameterized at low iron concentrations. Typical
262                  !  formulation used in quota formulations. Uptake is downregulated
263                  !  when the quota is close to the maximum quota
[3443]264                  zmax   = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) ) 
[10362]265                  zprofen(ji,jj,jk) = fecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  &
[3443]266                  &             * ( 4. - 4.5 * xlimnfe(ji,jj,jk) / ( xlimnfe(ji,jj,jk) + 0.5 ) )    &
[3446]267                  &             * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concnfe(ji,jj,jk) )  &
[5385]268                  &             * zmax * trb(ji,jj,jk,jpphy) * rfact2
[12537]269                  !  production terms of diatoms (C)
[5385]270                  zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * trb(ji,jj,jk,jpdia) * rfact2
[12537]271
272                  ! New production (uptake of NO3)
[3443]273                  zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
[12537]274
275                  !  Iron uptake rates of nanophytoplankton. Upregulation 
276                  !  is parameterized at low iron concentrations. Typical
277                  !  formulation used in quota formulations. Uptake is downregulated
278                  !  when the quota is close to the maximum quota
[7646]279                  zratio = trb(ji,jj,jk,jpdfe) / ( trb(ji,jj,jk,jpdia) * fecdm + rtrn )
[3443]280                  zmax   = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) ) 
[10362]281                  zprofed(ji,jj,jk) = fecdm * zprmaxd(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) )  &
[3443]282                  &             * ( 4. - 4.5 * xlimdfe(ji,jj,jk) / ( xlimdfe(ji,jj,jk) + 0.5 ) )    &
[3446]283                  &             * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concdfe(ji,jj,jk) )  &
[5385]284                  &             * zmax * trb(ji,jj,jk,jpdia) * rfact2
[3443]285               ENDIF
286            END DO
287         END DO
288      END DO
289
[7646]290      ! Computation of the chlorophyll production terms
[12537]291      ! The parameterization is taken from Geider et al. (1997)
292      ! -------------------------------------------------------
[6945]293      DO jk = 1, jpkm1
294         DO jj = 1, jpj
295            DO ji = 1, jpi
296               IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
[12537]297                  !  production term for nanophyto. ( chlorophyll )
[10362]298                  znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
[12496]299                  zprod    = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk)
[7646]300                  zprochln = chlcmin * 12. * zprorcan (ji,jj,jk)
[12537]301                  ! The maximum reachable Chl quota is modulated by temperature
302                  ! following Geider (1987)
[7646]303                  chlcnm_n   = MIN ( chlcnm, ( chlcnm / (1. - 1.14 / 43.4 *tsn(ji,jj,jk,jp_tem))) * (1. - 1.14 / 43.4 * 20.))
304                  zprochln = zprochln + (chlcnm_n-chlcmin) * 12. * zprod / &
305                                        & (  zpislopeadn(ji,jj,jk) * znanotot +rtrn)
[12537]306                  !  production terms of diatoms ( chlorophyll )
[10362]307                  zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn )
[12496]308                  zprod    = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk)
[7646]309                  zprochld = chlcmin * 12. * zprorcad(ji,jj,jk)
[12537]310                  ! The maximum reachable Chl quota is modulated by temperature
311                  ! following Geider (1987)
[7646]312                  chlcdm_n   = MIN ( chlcdm, ( chlcdm / (1. - 1.14 / 43.4 * tsn(ji,jj,jk,jp_tem))) * (1. - 1.14 / 43.4 * 20.))
313                  zprochld = zprochld + (chlcdm_n-chlcmin) * 12. * zprod / &
314                                        & ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn )
315                  !   Update the arrays TRA which contain the Chla sources and sinks
316                  tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) + zprochln * texcretn
317                  tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) + zprochld * texcretd
[6945]318               ENDIF
[3443]319            END DO
320         END DO
[6945]321      END DO
[3443]322
323      !   Update the arrays TRA which contain the biological sources and sinks
324      DO jk = 1, jpkm1
325         DO jj = 1, jpj
326           DO ji =1 ,jpi
[7646]327              IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
328                 zproreg  = zprorcan(ji,jj,jk) - zpronewn(ji,jj,jk)
329                 zproreg2 = zprorcad(ji,jj,jk) - zpronewd(ji,jj,jk)
330                 zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
331                 tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) - zprorcan(ji,jj,jk) - zprorcad(ji,jj,jk)
332                 tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) - zpronewn(ji,jj,jk) - zpronewd(ji,jj,jk)
333                 tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zproreg - zproreg2
334                 tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zprorcan(ji,jj,jk) * texcretn
335                 tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) + zprofen(ji,jj,jk) * texcretn
336                 tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) + zprorcad(ji,jj,jk) * texcretd
337                 tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) + zprofed(ji,jj,jk) * texcretd
338                 tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) + zprorcad(ji,jj,jk) * zysopt(ji,jj,jk) * texcretd
339                 tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zdocprod
340                 tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) + o2ut * ( zproreg + zproreg2) &
341                 &                   + ( o2ut + o2nit ) * ( zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) )
342                 !
343                 zfeup = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
344                 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zfeup
345                 tra(ji,jj,jk,jpsil) = tra(ji,jj,jk,jpsil) - texcretd * zprorcad(ji,jj,jk) * zysopt(ji,jj,jk)
346                 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprorcan(ji,jj,jk) - zprorcad(ji,jj,jk)
347                 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * ( zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) ) &
348                 &                                         - rno3 * ( zproreg + zproreg2 )
349              ENDIF
350           END DO
[3443]351        END DO
352     END DO
[7646]353     !
[12537]354     ! Production and uptake of ligands by phytoplankton. This part is activated
355     ! when ln_ligand is set to .true. in the namelist. Ligand uptake is small
356     ! and based on the FeL model by Morel et al. (2008) and on the study of
357     ! Shaked and Lis (2012)
358     ! -------------------------------------------------------------------------
[7646]359     IF( ln_ligand ) THEN
[10873]360         zpligprod1(:,:,:) = 0._wp    ;    zpligprod2(:,:,:) = 0._wp
[7646]361         DO jk = 1, jpkm1
362            DO jj = 1, jpj
363              DO ji =1 ,jpi
364                 IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
365                    zdocprod = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
366                    zfeup    = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
[12496]367                    tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + zdocprod * ldocp    &
[12537]368                    &       - zfeup * plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) + 2.E3 * (1.0 - plig(ji,jj,jk) ) ) * lthet
[10362]369                    zpligprod1(ji,jj,jk) = zdocprod * ldocp
[12537]370                    zpligprod2(ji,jj,jk) = zfeup * plig(ji,jj,jk) / ( rtrn + plig(ji,jj,jk) &
371                    &                      + 2.E3 * (1.0 - plig(ji,jj,jk) ) ) * lthet
[7646]372                 ENDIF
373              END DO
374           END DO
375        END DO
376     ENDIF
[3443]377
378
[4996]379    ! Total primary production per year
[5385]380    IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc )  )  &
[10425]381         & tpp = glob_sum( 'p4zprod', ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) )
[4996]382
383    IF( lk_iomput ) THEN
[5385]384       IF( knt == nrdttrc ) THEN
[9125]385          ALLOCATE( zw2d(jpi,jpj), zw3d(jpi,jpj,jpk) )
[4996]386          zfact = 1.e+3 * rfact2r  !  conversion from mol/l/kt to  mol/m3/s
387          !
[7646]388          IF( iom_use( "PPPHYN" ) .OR. iom_use( "PPPHYD" ) )  THEN
[7753]389              zw3d(:,:,:) = zprorcan(:,:,:) * zfact * tmask(:,:,:)  ! primary production by nanophyto
390              CALL iom_put( "PPPHYN"  , zw3d )
391              !
392              zw3d(:,:,:) = zprorcad(:,:,:) * zfact * tmask(:,:,:)  ! primary production by diatomes
393              CALL iom_put( "PPPHYD"  , zw3d )
[4996]394          ENDIF
395          IF( iom_use( "PPNEWN" ) .OR. iom_use( "PPNEWD" ) )  THEN
[7753]396              zw3d(:,:,:) = zpronewn(:,:,:) * zfact * tmask(:,:,:)  ! new primary production by nanophyto
397              CALL iom_put( "PPNEWN"  , zw3d )
[4996]398              !
[7753]399              zw3d(:,:,:) = zpronewd(:,:,:) * zfact * tmask(:,:,:)  ! new primary production by diatomes
400              CALL iom_put( "PPNEWD"  , zw3d )
[4996]401          ENDIF
402          IF( iom_use( "PBSi" ) )  THEN
[7753]403              zw3d(:,:,:) = zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:) ! biogenic silica production
404              CALL iom_put( "PBSi"  , zw3d )
[4996]405          ENDIF
406          IF( iom_use( "PFeN" ) .OR. iom_use( "PFeD" ) )  THEN
[7753]407              zw3d(:,:,:) = zprofen(:,:,:) * zfact * tmask(:,:,:)  ! biogenic iron production by nanophyto
408              CALL iom_put( "PFeN"  , zw3d )
409              !
410              zw3d(:,:,:) = zprofed(:,:,:) * zfact * tmask(:,:,:)  ! biogenic iron production by  diatomes
411              CALL iom_put( "PFeD"  , zw3d )
[4996]412          ENDIF
[10362]413          IF( iom_use( "LPRODP" ) )  THEN
[12537]414              zw3d(:,:,:) = zpligprod1(:,:,:) * 1e9 * zfact * tmask(:,:,:)  ! Ligand production by phytoplankton
[10362]415              CALL iom_put( "LPRODP"  , zw3d )
416          ENDIF
417          IF( iom_use( "LDETP" ) )  THEN
[12537]418              zw3d(:,:,:) = zpligprod2(:,:,:) * 1e9 * zfact * tmask(:,:,:)  ! Uptake of ligands by phytoplankton
[10362]419              CALL iom_put( "LDETP"  , zw3d )
420          ENDIF
[4996]421          IF( iom_use( "Mumax" ) )  THEN
[10362]422              zw3d(:,:,:) = zprmaxn(:,:,:) * tmask(:,:,:)   ! Maximum growth rate
[7753]423              CALL iom_put( "Mumax"  , zw3d )
[4996]424          ENDIF
425          IF( iom_use( "MuN" ) .OR. iom_use( "MuD" ) )  THEN
[7753]426              zw3d(:,:,:) = zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:)  ! Realized growth rate for nanophyto
427              CALL iom_put( "MuN"  , zw3d )
428              !
429              zw3d(:,:,:) =  zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:)  ! Realized growth rate for diatoms
430              CALL iom_put( "MuD"  , zw3d )
[4996]431          ENDIF
432          IF( iom_use( "LNlight" ) .OR. iom_use( "LDlight" ) )  THEN
[12537]433              zw3d(:,:,:) = zprbio (:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:) ! light limitation term of nanophytoplankton
[7753]434              CALL iom_put( "LNlight"  , zw3d )
435              !
[12537]436              zw3d(:,:,:) = zprdia (:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:)  ! light limitation term of diatoms
[7753]437              CALL iom_put( "LDlight"  , zw3d )
[4996]438          ENDIF
439          IF( iom_use( "TPP" ) )  THEN
[7753]440              zw3d(:,:,:) = ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:)  ! total primary production
441              CALL iom_put( "TPP"  , zw3d )
[4996]442          ENDIF
443          IF( iom_use( "TPNEW" ) )  THEN
[7753]444              zw3d(:,:,:) = ( zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:)  ! total new production
445              CALL iom_put( "TPNEW"  , zw3d )
[4996]446          ENDIF
447          IF( iom_use( "TPBFE" ) )  THEN
[7753]448              zw3d(:,:,:) = ( zprofen(:,:,:) + zprofed(:,:,:) ) * zfact * tmask(:,:,:)  ! total biogenic iron production
449              CALL iom_put( "TPBFE"  , zw3d )
[4996]450          ENDIF
[7646]451          IF( iom_use( "INTPPPHYN" ) .OR. iom_use( "INTPPPHYD" ) ) THEN 
[7753]452             zw2d(:,:) = 0.
[4996]453             DO jk = 1, jpkm1
[7753]454               zw2d(:,:) = zw2d(:,:) + zprorcan(:,:,jk) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk)  ! vert. integrated  primary produc. by nano
[4996]455             ENDDO
[7646]456             CALL iom_put( "INTPPPHYN" , zw2d )
[4996]457             !
[7753]458             zw2d(:,:) = 0.
[4996]459             DO jk = 1, jpkm1
[7753]460                zw2d(:,:) = zw2d(:,:) + zprorcad(:,:,jk) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated  primary produc. by diatom
[4996]461             ENDDO
[7646]462             CALL iom_put( "INTPPPHYD" , zw2d )
[4996]463          ENDIF
464          IF( iom_use( "INTPP" ) ) THEN   
[7753]465             zw2d(:,:) = 0.
[4996]466             DO jk = 1, jpkm1
[7753]467                zw2d(:,:) = zw2d(:,:) + ( zprorcan(:,:,jk) + zprorcad(:,:,jk) ) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk) ! vert. integrated pp
[4996]468             ENDDO
469             CALL iom_put( "INTPP" , zw2d )
470          ENDIF
471          IF( iom_use( "INTPNEW" ) ) THEN   
[7753]472             zw2d(:,:) = 0.
[4996]473             DO jk = 1, jpkm1
[7753]474                zw2d(:,:) = zw2d(:,:) + ( zpronewn(:,:,jk) + zpronewd(:,:,jk) ) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk)  ! vert. integrated new prod
[4996]475             ENDDO
476             CALL iom_put( "INTPNEW" , zw2d )
477          ENDIF
478          IF( iom_use( "INTPBFE" ) ) THEN           !   total biogenic iron production  ( vertically integrated )
[7753]479             zw2d(:,:) = 0.
[4996]480             DO jk = 1, jpkm1
[7753]481                zw2d(:,:) = zw2d(:,:) + ( zprofen(:,:,jk) + zprofed(:,:,jk) ) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk) ! vert integr. bfe prod
[4996]482             ENDDO
483            CALL iom_put( "INTPBFE" , zw2d )
484          ENDIF
485          IF( iom_use( "INTPBSI" ) ) THEN           !   total biogenic silica production  ( vertically integrated )
[7753]486             zw2d(:,:) = 0.
[4996]487             DO jk = 1, jpkm1
[7753]488                zw2d(:,:) = zw2d(:,:) + zprorcad(:,:,jk) * zysopt(:,:,jk) * e3t_n(:,:,jk) * zfact * tmask(:,:,jk)  ! vert integr. bsi prod
[4996]489             ENDDO
490             CALL iom_put( "INTPBSI" , zw2d )
491          ENDIF
492          IF( iom_use( "tintpp" ) )  CALL iom_put( "tintpp" , tpp * zfact )  !  global total integrated primary production molC/s
493          !
[9125]494          DEALLOCATE( zw2d, zw3d )
[4996]495       ENDIF
496     ENDIF
[3443]497
[4996]498     IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
[3443]499         WRITE(charout, FMT="('prod')")
500         CALL prt_ctl_trc_info(charout)
501         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
[4996]502     ENDIF
[9169]503      !
504      IF( ln_timing )  CALL timing_stop('p4z_prod')
505      !
[3443]506   END SUBROUTINE p4z_prod
507
508
509   SUBROUTINE p4z_prod_init
510      !!----------------------------------------------------------------------
511      !!                  ***  ROUTINE p4z_prod_init  ***
512      !!
513      !! ** Purpose :   Initialization of phytoplankton production parameters
514      !!
[12537]515      !! ** Method  :   Read the namp4zprod namelist and check the parameters
[3443]516      !!      called at the first timestep (nittrc000)
517      !!
[12537]518      !! ** input   :   Namelist namp4zprod
[3443]519      !!----------------------------------------------------------------------
[9169]520      INTEGER ::   ios   ! Local integer
[3443]521      !
[10401]522      NAMELIST/namp4zprod/ pislopen, pisloped, xadap, bresp, excretn, excretd,  &
[3443]523         &                 chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip
524      !!----------------------------------------------------------------------
[9169]525      !
526      IF(lwp) THEN                         ! control print
527         WRITE(numout,*)
528         WRITE(numout,*) 'p4z_prod_init : phytoplankton growth'
529         WRITE(numout,*) '~~~~~~~~~~~~~'
530      ENDIF
531      !
[12537]532      REWIND( numnatp_ref )              ! Namelist namp4zprod in reference namelist : Pisces phytoplankton production
[7646]533      READ  ( numnatp_ref, namp4zprod, IOSTAT = ios, ERR = 901)
[11536]534901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namp4zprod in reference namelist' )
[12537]535      REWIND( numnatp_cfg )              ! Namelist namp4zprod in configuration namelist : Pisces phytoplankton production
[7646]536      READ  ( numnatp_cfg, namp4zprod, IOSTAT = ios, ERR = 902 )
[11536]537902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namp4zprod in configuration namelist' )
[9169]538      IF(lwm) WRITE( numonp, namp4zprod )
[4147]539
[3443]540      IF(lwp) THEN                         ! control print
[9169]541         WRITE(numout,*) '   Namelist : namp4zprod'
542         WRITE(numout,*) '      mean Si/C ratio                           grosip       =', grosip
543         WRITE(numout,*) '      P-I slope                                 pislopen     =', pislopen
544         WRITE(numout,*) '      Acclimation factor to low light           xadap        =', xadap
545         WRITE(numout,*) '      excretion ratio of nanophytoplankton      excretn      =', excretn
546         WRITE(numout,*) '      excretion ratio of diatoms                excretd      =', excretd
[10401]547         WRITE(numout,*) '      basal respiration in phytoplankton        bresp        =', bresp
548         WRITE(numout,*) '      Maximum Chl/C in phytoplankton            chlcmin      =', chlcmin
[9169]549         WRITE(numout,*) '      P-I slope  for diatoms                    pisloped     =', pisloped
550         WRITE(numout,*) '      Minimum Chl/C in nanophytoplankton        chlcnm       =', chlcnm
551         WRITE(numout,*) '      Minimum Chl/C in diatoms                  chlcdm       =', chlcdm
552         WRITE(numout,*) '      Maximum Fe/C in nanophytoplankton         fecnm        =', fecnm
553         WRITE(numout,*) '      Minimum Fe/C in diatoms                   fecdm        =', fecdm
[3443]554      ENDIF
555      !
556      r1_rday   = 1._wp / rday 
[7646]557      texcretn  = 1._wp - excretn
558      texcretd  = 1._wp - excretd
[3443]559      tpp       = 0._wp
560      !
561   END SUBROUTINE p4z_prod_init
562
563
564   INTEGER FUNCTION p4z_prod_alloc()
565      !!----------------------------------------------------------------------
566      !!                     ***  ROUTINE p4z_prod_alloc  ***
567      !!----------------------------------------------------------------------
[10362]568      ALLOCATE( quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc )
[3443]569      !
[10425]570      IF( p4z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_prod_alloc : failed to allocate arrays.' )
[3443]571      !
572   END FUNCTION p4z_prod_alloc
[9124]573
[3443]574   !!======================================================================
[5656]575END MODULE p4zprod
Note: See TracBrowser for help on using the repository browser.