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 branches/2012/dev_r3438_LOCEAN15_PISLOB/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: branches/2012/dev_r3438_LOCEAN15_PISLOB/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zprod.F90 @ 3475

Last change on this file since 3475 was 3475, checked in by cetlod, 12 years ago

branch:2012/dev_r3438_LOCEAN15_PISLOB last updates from PISCES, hopefully... see ticket #972

File size: 27.0 KB
Line 
1MODULE p4zprod
2   !!======================================================================
3   !!                         ***  MODULE p4zprod  ***
4   !! TOP :  Growth Rate of the two phytoplanktons groups
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#if defined key_pisces
11   !!----------------------------------------------------------------------
12   !!   'key_pisces'                                       PISCES bio-model
13   !!----------------------------------------------------------------------
14   !!   p4z_prod       :   Compute the growth Rate of the two phytoplanktons groups
15   !!   p4z_prod_init  :   Initialization of the parameters for growth
16   !!   p4z_prod_alloc :   Allocate variables for growth
17   !!----------------------------------------------------------------------
18   USE oce_trc         !  shared variables between ocean and passive tracers
19   USE trc             !  passive tracers common variables
20   USE sms_pisces      !  PISCES Source Minus Sink variables
21   USE p4zopt          !  optical model
22   USE p4zlim          !  Co-limitations of differents nutrients
23   USE prtctl_trc      !  print control for debugging
24   USE iom             !  I/O manager
25
26   IMPLICIT NONE
27   PRIVATE
28
29   PUBLIC   p4z_prod         ! called in p4zbio.F90
30   PUBLIC   p4z_prod_init    ! called in trcsms_pisces.F90
31   PUBLIC   p4z_prod_alloc
32
33   !! * Shared module variables
34   LOGICAL , PUBLIC ::  ln_newprod = .FALSE.
35   REAL(wp), PUBLIC ::  pislope    = 3.0_wp            !:
36   REAL(wp), PUBLIC ::  pislope2   = 3.0_wp            !:
37   REAL(wp), PUBLIC ::  excret     = 10.e-5_wp         !:
38   REAL(wp), PUBLIC ::  excret2    = 0.05_wp           !:
39   REAL(wp), PUBLIC ::  bresp      = 0.00333_wp        !:
40   REAL(wp), PUBLIC ::  chlcnm     = 0.033_wp          !:
41   REAL(wp), PUBLIC ::  chlcdm     = 0.05_wp           !:
42   REAL(wp), PUBLIC ::  chlcmin    = 0.00333_wp        !:
43   REAL(wp), PUBLIC ::  fecnm      = 10.E-6_wp         !:
44   REAL(wp), PUBLIC ::  fecdm      = 15.E-6_wp         !:
45   REAL(wp), PUBLIC ::  grosip     = 0.151_wp          !:
46
47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   prmax    !: optimal production = f(temperature)
48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotan   !: proxy of N quota in Nanophyto
49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   quotad   !: proxy of N quota in diatomee
50   
51   REAL(wp) :: r1_rday                !: 1 / rday
52   REAL(wp) :: texcret                !: 1 - excret
53   REAL(wp) :: texcret2               !: 1 - excret2       
54   REAL(wp) :: tpp                    !: Total primary production
55
56
57   !!* Substitution
58#  include "top_substitute.h90"
59   !!----------------------------------------------------------------------
60   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
61   !! $Id: p4zprod.F90 3160 2011-11-20 14:27:18Z cetlod $
62   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
63   !!----------------------------------------------------------------------
64CONTAINS
65
66   SUBROUTINE p4z_prod( kt , jnt )
67      !!---------------------------------------------------------------------
68      !!                     ***  ROUTINE p4z_prod  ***
69      !!
70      !! ** Purpose :   Compute the phytoplankton production depending on
71      !!              light, temperature and nutrient availability
72      !!
73      !! ** Method  : - ???
74      !!---------------------------------------------------------------------
75      !
76      INTEGER, INTENT(in) :: kt, jnt
77      !
78      INTEGER  ::   ji, jj, jk
79      REAL(wp) ::   zsilfac, znanotot, zdiattot, zconctemp, zconctemp2
80      REAL(wp) ::   zratio, zmax, zsilim, ztn, zadap
81      REAL(wp) ::   zlim, zsilfac2, zsiborn, zprod, zproreg, zproreg2
82      REAL(wp) ::   zmxltst, zmxlday, zmaxday
83      REAL(wp) ::   zpislopen  , zpislope2n
84      REAL(wp) ::   zrum, zcodel, zargu, zval
85      REAL(wp) ::   zrfact2
86      CHARACTER (len=25) :: charout
87      REAL(wp), POINTER, DIMENSION(:,:  ) :: zmixnano, zmixdiat, zstrn
88      REAL(wp), POINTER, DIMENSION(:,:,:) :: zpislopead, zpislopead2, zprdia, zprbio, zprdch, zprnch, zysopt   
89      REAL(wp), POINTER, DIMENSION(:,:,:) :: zprorca, zprorcad, zprofed, zprofen, zprochln, zprochld, zpronew, zpronewd
90      !!---------------------------------------------------------------------
91      !
92      IF( nn_timing == 1 )  CALL timing_start('p4z_prod')
93      !
94      !  Allocate temporary workspace
95      CALL wrk_alloc( jpi, jpj,      zmixnano, zmixdiat, zstrn                                                  )
96      CALL wrk_alloc( jpi, jpj, jpk, zpislopead, zpislopead2, zprdia, zprbio, zprdch, zprnch, zysopt            ) 
97      CALL wrk_alloc( jpi, jpj, jpk, zprorca, zprorcad, zprofed, zprofen, zprochln, zprochld, zpronew, zpronewd )
98      !
99      zprorca (:,:,:) = 0._wp
100      zprorcad(:,:,:) = 0._wp
101      zprofed (:,:,:) = 0._wp
102      zprofen (:,:,:) = 0._wp
103      zprochln(:,:,:) = 0._wp
104      zprochld(:,:,:) = 0._wp
105      zpronew (:,:,:) = 0._wp
106      zpronewd(:,:,:) = 0._wp
107      zprdia  (:,:,:) = 0._wp
108      zprbio  (:,:,:) = 0._wp
109      zprdch  (:,:,:) = 0._wp
110      zprnch  (:,:,:) = 0._wp
111      zysopt  (:,:,:) = 0._wp
112
113      ! Computation of the optimal production
114      prmax(:,:,:) = 0.6_wp * r1_rday * tgfunc(:,:,:) 
115      IF( lk_degrad )  prmax(:,:,:) = prmax(:,:,:) * facvol(:,:,:) 
116
117      ! compute the day length depending on latitude and the day
118      zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp )
119      zcodel = ASIN(  SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp )  )
120
121      ! day length in hours
122      zstrn(:,:) = 0.
123      DO jj = 1, jpj
124         DO ji = 1, jpi
125            zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad )
126            zargu = MAX( -1., MIN(  1., zargu ) )
127            zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. )
128         END DO
129      END DO
130
131      IF( ln_newprod ) THEN
132         ! Impact of the day duration on phytoplankton growth
133         DO jk = 1, jpkm1
134            DO jj = 1 ,jpj
135               DO ji = 1, jpi
136                  IF( etot(ji,jj,jk) > 1.E-3 ) THEN
137                     zval = MAX( 1., zstrn(ji,jj) )
138                     zval = 1.5 * zval / ( 12. + zval )
139                     zprbio(ji,jj,jk) = prmax(ji,jj,jk) * zval
140                     zprdia(ji,jj,jk) = zprbio(ji,jj,jk)
141                  ENDIF
142               END DO
143            END DO
144         END DO
145      ENDIF
146
147      ! Maximum light intensity
148      WHERE( zstrn(:,:) < 1.e0 ) zstrn(:,:) = 24.
149      zstrn(:,:) = 24. / zstrn(:,:)
150
151      IF( ln_newprod ) THEN
152!CDIR NOVERRCHK
153         DO jk = 1, jpkm1
154!CDIR NOVERRCHK
155            DO jj = 1, jpj
156!CDIR NOVERRCHK
157               DO ji = 1, jpi
158                  ! Computation of the P-I slope for nanos and diatoms
159                  IF( etot(ji,jj,jk) > 1.E-3 ) THEN
160                      ztn         = MAX( 0., tsn(ji,jj,jk,jp_tem) - 15. )
161                      zadap       = ztn / ( 2.+ ztn )
162                      zconctemp   = MAX( 0.e0 , trn(ji,jj,jk,jpdia) - xsizedia )
163                      zconctemp2  = trn(ji,jj,jk,jpdia) - zconctemp
164                      znanotot    = enano(ji,jj,jk) * zstrn(ji,jj)
165                      zdiattot    = ediat(ji,jj,jk) * zstrn(ji,jj)
166                      !
167                      zpislopead (ji,jj,jk) = pislope * ( 1.+ zadap  * EXP( -znanotot ) )  &
168                         &                   * trn(ji,jj,jk,jpnch) /( trn(ji,jj,jk,jpphy) * 12. + rtrn)
169                      !
170                      zpislopead2(ji,jj,jk) = (pislope * zconctemp2 + pislope2 * zconctemp) / ( trn(ji,jj,jk,jpdia) + rtrn )   &
171                         &                   * trn(ji,jj,jk,jpdch) /( trn(ji,jj,jk,jpdia) * 12. + rtrn)
172
173                      ! Computation of production function for Carbon
174                      !  ---------------------------------------------
175                      zpislopen  = zpislopead (ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) * rday + rtrn)
176                      zpislope2n = zpislopead2(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) * rday + rtrn)
177                      zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen  * znanotot )  )
178                      zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpislope2n * zdiattot )  )
179
180                      !  Computation of production function for Chlorophyll
181                      !--------------------------------------------------
182                      zmaxday  = 1._wp / ( prmax(ji,jj,jk) * rday + rtrn )
183                      zprnch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislopead (ji,jj,jk) * zmaxday * znanotot ) )
184                      zprdch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislopead2(ji,jj,jk) * zmaxday * zdiattot ) )
185                  ENDIF
186               END DO
187            END DO
188         END DO
189      ELSE
190!CDIR NOVERRCHK
191         DO jk = 1, jpkm1
192!CDIR NOVERRCHK
193            DO jj = 1, jpj
194!CDIR NOVERRCHK
195               DO ji = 1, jpi
196
197                  ! Computation of the P-I slope for nanos and diatoms
198                  IF( etot(ji,jj,jk) > 1.E-3 ) THEN
199                      ztn         = MAX( 0., tsn(ji,jj,jk,jp_tem) - 15. )
200                      zadap       = ztn / ( 2.+ ztn )
201                      zconctemp   = MAX( 0.e0 , trn(ji,jj,jk,jpdia) - xsizedia )
202                      zconctemp2  = trn(ji,jj,jk,jpdia) - zconctemp
203                      !
204                      zpislopead (ji,jj,jk) = pislope  * ( 1.+ zadap  * EXP( enano(ji,jj,jk) ) )
205                      zpislopead2(ji,jj,jk) = (pislope * zconctemp2 + pislope2 * zconctemp)  / ( trn(ji,jj,jk,jpdia) + rtrn )
206
207                      zpislopen =  zpislopead(ji,jj,jk) * trn(ji,jj,jk,jpnch)                &
208                        &          / ( trn(ji,jj,jk,jpphy) * 12.                  + rtrn )   &
209                        &          / ( prmax(ji,jj,jk) * rday * xlimphy(ji,jj,jk) + rtrn )
210
211                      zpislope2n = zpislopead2(ji,jj,jk) * trn(ji,jj,jk,jpdch)                &
212                        &          / ( trn(ji,jj,jk,jpdia) * 12.                  + rtrn )   &
213                        &          / ( prmax(ji,jj,jk) * rday * xlimdia(ji,jj,jk) + rtrn )
214
215                      ! Computation of production function for Carbon
216                      !  ---------------------------------------------
217                      zprbio(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislopen  * enano(ji,jj,jk) ) )
218                      zprdia(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislope2n * ediat(ji,jj,jk) ) )
219
220                      !  Computation of production function for Chlorophyll
221                      !--------------------------------------------------
222                      zprnch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislopen  * enano(ji,jj,jk) * zstrn(ji,jj) ) )
223                      zprdch(ji,jj,jk) = prmax(ji,jj,jk) * ( 1.- EXP( -zpislope2n * ediat(ji,jj,jk) * zstrn(ji,jj) ) )
224                  ENDIF
225               END DO
226            END DO
227         END DO
228      ENDIF
229
230      !  Computation of a proxy of the N/C ratio
231      !  ---------------------------------------
232!CDIR NOVERRCHK
233      DO jk = 1, jpkm1
234!CDIR NOVERRCHK
235         DO jj = 1, jpj
236!CDIR NOVERRCHK
237            DO ji = 1, jpi
238                zval = ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) * prmax(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
239                quotan(ji,jj,jk) = MIN( 1., 0.5 + 0.5 * zval )
240                zval = ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) * prmax(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
241                quotad(ji,jj,jk) = MIN( 1., 0.5 + 0.5 * zval )
242            END DO
243         END DO
244      END DO
245
246
247      DO jk = 1, jpkm1
248         DO jj = 1, jpj
249            DO ji = 1, jpi
250
251                IF( etot(ji,jj,jk) > 1.E-3 ) THEN
252                   !    Si/C of diatoms
253                   !    ------------------------
254                   !    Si/C increases with iron stress and silicate availability
255                   !    Si/C is arbitrariliy increased for very high Si concentrations
256                   !    to mimic the very high ratios observed in the Southern Ocean (silpot2)
257                  zlim  = trn(ji,jj,jk,jpsil) / ( trn(ji,jj,jk,jpsil) + xksi1 )
258                  zsilim = MIN( zprdia(ji,jj,jk) / ( prmax(ji,jj,jk) + rtrn ), xlimsi(ji,jj,jk) )
259                  zsilfac = 4.4 * EXP( -4.23 * zsilim ) * MAX( 0.e0, MIN( 1., 2.2 * ( zlim - 0.5 ) )  ) + 1.e0
260                  zsiborn = trn(ji,jj,jk,jpsil) * trn(ji,jj,jk,jpsil) * trn(ji,jj,jk,jpsil)
261                  IF (gphit(ji,jj) < -30 ) THEN
262                    zsilfac2 = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
263                  ELSE
264                    zsilfac2 = 1. +      zsiborn / ( zsiborn + xksi2**3 )
265                  ENDIF
266                  zysopt(ji,jj,jk) = grosip * zlim * zsilfac * zsilfac2
267              ENDIF
268            END DO
269         END DO
270      END DO
271
272      !  Computation of the limitation term due to a mixed layer deeper than the euphotic depth
273      DO jj = 1, jpj
274         DO ji = 1, jpi
275            zmxltst = MAX( 0.e0, hmld(ji,jj) - heup(ji,jj) )
276            zmxlday = zmxltst * zmxltst * r1_rday
277            zmixnano(ji,jj) = 1. - zmxlday / ( 3. + zmxlday )
278            zmixdiat(ji,jj) = 1. - zmxlday / ( 4. + zmxlday )
279         END DO
280      END DO
281 
282      !  Mixed-layer effect on production                                                                               
283      DO jk = 1, jpkm1
284         DO jj = 1, jpj
285            DO ji = 1, jpi
286               IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
287                  zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * zmixnano(ji,jj)
288                  zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * zmixdiat(ji,jj)
289               ENDIF
290            END DO
291         END DO
292      END DO
293
294      ! Computation of the various production terms
295!CDIR NOVERRCHK
296      DO jk = 1, jpkm1
297!CDIR NOVERRCHK
298         DO jj = 1, jpj
299!CDIR NOVERRCHK
300            DO ji = 1, jpi
301               IF( etot(ji,jj,jk) > 1.E-3 ) THEN
302                  !  production terms for nanophyto.
303                  zprorca(ji,jj,jk) = zprbio(ji,jj,jk)  * xlimphy(ji,jj,jk) * trn(ji,jj,jk,jpphy) * rfact2
304                  zpronew(ji,jj,jk) = zprorca(ji,jj,jk) * xnanono3(ji,jj,jk) / ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) + rtrn )
305                  !
306                  zratio = trn(ji,jj,jk,jpnfe) / ( trn(ji,jj,jk,jpphy) + rtrn )
307                  zratio = zratio / fecnm 
308                  zmax   = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) ) 
309                  zprofen(ji,jj,jk) = fecnm * prmax(ji,jj,jk)  &
310                  &             * ( 4. - 4.5 * xlimnfe(ji,jj,jk) / ( xlimnfe(ji,jj,jk) + 0.5 ) )    &
311                  &             * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concnfe(ji,jj,jk) )  &
312                  &             * zmax * trn(ji,jj,jk,jpphy) * rfact2
313                  !  production terms for diatomees
314                  zprorcad(ji,jj,jk) = zprdia(ji,jj,jk) * xlimdia(ji,jj,jk) * trn(ji,jj,jk,jpdia) * rfact2
315                  zpronewd(ji,jj,jk) = zprorcad(ji,jj,jk) * xdiatno3(ji,jj,jk) / ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) + rtrn )
316                  !
317                  zratio = trn(ji,jj,jk,jpdfe) / ( trn(ji,jj,jk,jpdia) + rtrn )
318                  zratio = zratio / fecdm 
319                  zmax   = MAX( 0., ( 1. - zratio ) / ABS( 1.05 - zratio ) ) 
320                  zprofed(ji,jj,jk) = fecdm * prmax(ji,jj,jk)  &
321                  &             * ( 4. - 4.5 * xlimdfe(ji,jj,jk) / ( xlimdfe(ji,jj,jk) + 0.5 ) )    &
322                  &             * biron(ji,jj,jk) / ( biron(ji,jj,jk) + concdfe(ji,jj,jk) )  &
323                  &             * zmax * trn(ji,jj,jk,jpdia) * rfact2
324               ENDIF
325            END DO
326         END DO
327      END DO
328
329      IF( ln_newprod ) THEN
330!CDIR NOVERRCHK
331         DO jk = 1, jpkm1
332!CDIR NOVERRCHK
333            DO jj = 1, jpj
334!CDIR NOVERRCHK
335               DO ji = 1, jpi
336                  IF( fsdepw(ji,jj,jk+1) <= hmld(ji,jj) ) THEN
337                     zprnch(ji,jj,jk) = zprnch(ji,jj,jk) * zmixnano(ji,jj)
338                     zprdch(ji,jj,jk) = zprdch(ji,jj,jk) * zmixdiat(ji,jj)
339                  ENDIF
340                  IF( etot(ji,jj,jk) > 1.E-3 ) THEN
341                     !  production terms for nanophyto. ( chlorophyll )
342                     znanotot = enano(ji,jj,jk) * zstrn(ji,jj)
343                     zprod    = rday * zprorca(ji,jj,jk) * zprnch(ji,jj,jk) * xlimphy(ji,jj,jk)
344                     zprochln(ji,jj,jk) = chlcmin * 12. * zprorca (ji,jj,jk)
345                     zprochln(ji,jj,jk) = zprochln(ji,jj,jk) + (chlcnm-chlcmin) * 12. * zprod / (  zpislopead(ji,jj,jk) * znanotot +rtrn)
346                     !  production terms for diatomees ( chlorophyll )
347                     zdiattot = ediat(ji,jj,jk) * zstrn(ji,jj)
348                     zprod = rday * zprorcad(ji,jj,jk) * zprdch(ji,jj,jk) * xlimdia(ji,jj,jk)
349                     zprochld(ji,jj,jk) = chlcmin * 12. * zprorcad(ji,jj,jk)
350                     zprochld(ji,jj,jk) = zprochld(ji,jj,jk) + (chlcdm-chlcmin) * 12. * zprod / ( zpislopead2(ji,jj,jk) * zdiattot +rtrn )
351                  ENDIF
352               END DO
353            END DO
354         END DO
355      ELSE
356!CDIR NOVERRCHK
357         DO jk = 1, jpkm1
358!CDIR NOVERRCHK
359            DO jj = 1, jpj
360!CDIR NOVERRCHK
361               DO ji = 1, jpi
362                  IF( etot(ji,jj,jk) > 1.E-3 ) THEN
363                     !  production terms for nanophyto. ( chlorophyll )
364                     znanotot = enano(ji,jj,jk) * zstrn(ji,jj)
365                     zprod = rday * zprorca(ji,jj,jk) * zprnch(ji,jj,jk) * trn(ji,jj,jk,jpphy) * xlimphy(ji,jj,jk)
366                     zprochln(ji,jj,jk) = chlcmin * 12. * zprorca (ji,jj,jk)
367                     zprochln(ji,jj,jk) = zprochln(ji,jj,jk) + (chlcnm-chlcmin) * 144. * zprod            &
368                     &                    / ( zpislopead(ji,jj,jk) * trn(ji,jj,jk,jpnch) * znanotot +rtrn )
369                     !  production terms for diatomees ( chlorophyll )
370                     zdiattot = ediat(ji,jj,jk) * zstrn(ji,jj)
371                     zprod = rday * zprorcad(ji,jj,jk) * zprdch(ji,jj,jk) * trn(ji,jj,jk,jpdia) * xlimdia(ji,jj,jk)
372                     zprochld(ji,jj,jk) = chlcmin * 12. * zprorcad(ji,jj,jk)
373                     zprochld(ji,jj,jk) = zprochld(ji,jj,jk) + (chlcdm-chlcmin) * 144. * zprod             &
374                     &                    / ( zpislopead2(ji,jj,jk) * trn(ji,jj,jk,jpdch) * zdiattot +rtrn )
375                  ENDIF
376               END DO
377            END DO
378         END DO
379      ENDIF
380
381      !   Update the arrays TRA which contain the biological sources and sinks
382      DO jk = 1, jpkm1
383         DO jj = 1, jpj
384           DO ji =1 ,jpi
385              zproreg  = zprorca(ji,jj,jk) - zpronew(ji,jj,jk)
386              zproreg2 = zprorcad(ji,jj,jk) - zpronewd(ji,jj,jk)
387              tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) - zprorca(ji,jj,jk) - zprorcad(ji,jj,jk)
388              tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) - zpronew(ji,jj,jk) - zpronewd(ji,jj,jk)
389              tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zproreg - zproreg2
390              tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zprorca(ji,jj,jk) * texcret
391              tra(ji,jj,jk,jpnch) = tra(ji,jj,jk,jpnch) + zprochln(ji,jj,jk) * texcret
392              tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) + zprofen(ji,jj,jk) * texcret
393              tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) + zprorcad(ji,jj,jk) * texcret2
394              tra(ji,jj,jk,jpdch) = tra(ji,jj,jk,jpdch) + zprochld(ji,jj,jk) * texcret2
395              tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) + zprofed(ji,jj,jk) * texcret2
396              tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) + zprorcad(ji,jj,jk) * zysopt(ji,jj,jk) * texcret2
397              tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + excret2 * zprorcad(ji,jj,jk) + excret * zprorca(ji,jj,jk)
398              tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) + o2ut * ( zproreg + zproreg2) &
399                 &                + ( o2ut + o2nit ) * ( zpronew(ji,jj,jk) + zpronewd(ji,jj,jk) )
400              tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - texcret * zprofen(ji,jj,jk) - texcret2 * zprofed(ji,jj,jk)
401              tra(ji,jj,jk,jpsil) = tra(ji,jj,jk,jpsil) - texcret2 * zprorcad(ji,jj,jk) * zysopt(ji,jj,jk)
402              tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) - zprorca(ji,jj,jk) - zprorcad(ji,jj,jk)
403              tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * ( zpronew(ji,jj,jk) + zpronewd(ji,jj,jk) ) &
404                 &                                      - rno3 * ( zproreg + zproreg2 )
405          END DO
406        END DO
407     END DO
408
409     ! Total primary production per year
410     tpp = tpp + glob_sum( ( zprorca(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) )
411
412     IF( kt == nitend .AND. jnt == nrdttrc ) THEN
413        IF (lwp) THEN
414           WRITE(numout,*) 'Total PP (Gtc) :'
415           WRITE(numout,*) '-------------------- : ',tpp * 12. / 1.E12
416           WRITE(numout,*) 
417        ENDIF
418      ENDIF
419
420     IF( ln_diatrc ) THEN
421         !
422         zrfact2 = 1.e3 * rfact2r  ! conversion from mol/L/timestep into mol/m3/s
423         IF( lk_iomput ) THEN
424           IF( jnt == nrdttrc ) THEN
425              CALL iom_put( "PPPHY"  , zprorca (:,:,:) * zrfact2 * tmask(:,:,:) )  ! primary production by nanophyto
426              CALL iom_put( "PPPHY2" , zprorcad(:,:,:) * zrfact2 * tmask(:,:,:) )  ! primary production by diatom
427              CALL iom_put( "PPNEWN" , zpronew (:,:,:) * zrfact2 * tmask(:,:,:) )  ! new primary production by nanophyto
428              CALL iom_put( "PPNEWD" , zpronewd(:,:,:) * zrfact2 * tmask(:,:,:) )  ! new primary production by diatom
429              CALL iom_put( "PBSi"   , zprorcad(:,:,:) * zrfact2 * tmask(:,:,:) * zysopt(:,:,:) ) ! biogenic silica production
430              CALL iom_put( "PFeD"   , zprofed (:,:,:) * zrfact2 * tmask(:,:,:) )  ! biogenic iron production by diatom
431              CALL iom_put( "PFeN"   , zprofen (:,:,:) * zrfact2 * tmask(:,:,:) )  ! biogenic iron production by nanophyto
432              CALL iom_put( "Mumax"  , prmax(:,:,:) * tmask(:,:,:) )  ! Maximum growth rate
433              CALL iom_put( "MuN"    , zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:) )  ! Realized growth rate for nanophyto
434              CALL iom_put( "MuD"    , zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:) )  ! Realized growth rate for diatoms
435              CALL iom_put( "LNlight", zprbio (:,:,:) / (prmax(:,:,:) + rtrn) * tmask(:,:,:) )  ! light limitation term
436              CALL iom_put( "LDlight", zprdia (:,:,:) / (prmax(:,:,:) + rtrn) * tmask(:,:,:) )  ! light limitation term
437           ENDIF
438         ELSE
439              trc3d(:,:,:,jp_pcs0_3d + 4)  = zprorca (:,:,:) * zrfact2 * tmask(:,:,:)
440              trc3d(:,:,:,jp_pcs0_3d + 5)  = zprorcad(:,:,:) * zrfact2 * tmask(:,:,:)
441              trc3d(:,:,:,jp_pcs0_3d + 6)  = zpronew (:,:,:) * zrfact2 * tmask(:,:,:)
442              trc3d(:,:,:,jp_pcs0_3d + 7)  = zpronewd(:,:,:) * zrfact2 * tmask(:,:,:)
443              trc3d(:,:,:,jp_pcs0_3d + 8)  = zprorcad(:,:,:) * zrfact2 * tmask(:,:,:) * zysopt(:,:,:)
444              trc3d(:,:,:,jp_pcs0_3d + 9)  = zprofed (:,:,:) * zrfact2 * tmask(:,:,:)
445#  if ! defined key_kriest
446              trc3d(:,:,:,jp_pcs0_3d + 10) = zprofen (:,:,:) * zrfact2 * tmask(:,:,:)
447#  endif
448         ENDIF
449         !
450      ENDIF
451
452      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
453         WRITE(charout, FMT="('prod')")
454         CALL prt_ctl_trc_info(charout)
455         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
456      ENDIF
457      !
458      CALL wrk_dealloc( jpi, jpj,      zmixnano, zmixdiat, zstrn                                                  )
459      CALL wrk_dealloc( jpi, jpj, jpk, zpislopead, zpislopead2, zprdia, zprbio, zprdch, zprnch, zysopt            ) 
460      CALL wrk_dealloc( jpi, jpj, jpk, zprorca, zprorcad, zprofed, zprofen, zprochln, zprochld, zpronew, zpronewd )
461      !
462      IF( nn_timing == 1 )  CALL timing_stop('p4z_prod')
463      !
464   END SUBROUTINE p4z_prod
465
466
467   SUBROUTINE p4z_prod_init
468      !!----------------------------------------------------------------------
469      !!                  ***  ROUTINE p4z_prod_init  ***
470      !!
471      !! ** Purpose :   Initialization of phytoplankton production parameters
472      !!
473      !! ** Method  :   Read the nampisprod namelist and check the parameters
474      !!      called at the first timestep (nittrc000)
475      !!
476      !! ** input   :   Namelist nampisprod
477      !!----------------------------------------------------------------------
478      !
479      NAMELIST/nampisprod/ pislope, pislope2, ln_newprod, bresp, excret, excret2,  &
480         &                 chlcnm, chlcdm, chlcmin, fecnm, fecdm, grosip
481      !!----------------------------------------------------------------------
482
483      REWIND( numnatp )                     ! read numnatp
484      READ  ( numnatp, nampisprod )
485
486      IF(lwp) THEN                         ! control print
487         WRITE(numout,*) ' '
488         WRITE(numout,*) ' Namelist parameters for phytoplankton growth, nampisprod'
489         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
490         WRITE(numout,*) '    Enable new parame. of production (T/F)   ln_newprod   =', ln_newprod
491         WRITE(numout,*) '    mean Si/C ratio                           grosip       =', grosip
492         WRITE(numout,*) '    P-I slope                                 pislope      =', pislope
493         WRITE(numout,*) '    excretion ratio of nanophytoplankton      excret       =', excret
494         WRITE(numout,*) '    excretion ratio of diatoms                excret2      =', excret2
495         IF( ln_newprod )  THEN
496            WRITE(numout,*) '    basal respiration in phytoplankton        bresp        =', bresp
497            WRITE(numout,*) '    Maximum Chl/C in phytoplankton            chlcmin      =', chlcmin
498         ENDIF
499         WRITE(numout,*) '    P-I slope  for diatoms                    pislope2     =', pislope2
500         WRITE(numout,*) '    Minimum Chl/C in nanophytoplankton        chlcnm       =', chlcnm
501         WRITE(numout,*) '    Minimum Chl/C in diatoms                  chlcdm       =', chlcdm
502         WRITE(numout,*) '    Maximum Fe/C in nanophytoplankton         fecnm        =', fecnm
503         WRITE(numout,*) '    Minimum Fe/C in diatoms                   fecdm        =', fecdm
504      ENDIF
505      !
506      r1_rday   = 1._wp / rday 
507      texcret   = 1._wp - excret
508      texcret2  = 1._wp - excret2
509      tpp       = 0._wp
510      !
511   END SUBROUTINE p4z_prod_init
512
513
514   INTEGER FUNCTION p4z_prod_alloc()
515      !!----------------------------------------------------------------------
516      !!                     ***  ROUTINE p4z_prod_alloc  ***
517      !!----------------------------------------------------------------------
518      ALLOCATE( prmax(jpi,jpj,jpk), quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc )
519      !
520      IF( p4z_prod_alloc /= 0 ) CALL ctl_warn('p4z_prod_alloc : failed to allocate arrays.')
521      !
522   END FUNCTION p4z_prod_alloc
523
524#else
525   !!======================================================================
526   !!  Dummy module :                                   No PISCES bio-model
527   !!======================================================================
528CONTAINS
529   SUBROUTINE p4z_prod                    ! Empty routine
530   END SUBROUTINE p4z_prod
531#endif 
532
533   !!======================================================================
534END MODULE  p4zprod
Note: See TracBrowser for help on using the repository browser.