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.
p4zlim.F90 in trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z – NEMO

source: trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zlim.F90 @ 4624

Last change on this file since 4624 was 4624, checked in by acc, 10 years ago

#1305. Fix slow start-up problems on some systems by introducing and using lwm logical to restrict output of merged namelists to the first (or only) processor. lwm is true only on the first processor regardless of ln_ctl. Small changes to all flavours of nemogcm.F90 are also required to write namctl and namcfg after the call to mynode which now opens output.namelist.dyn and writes nammpp.

File size: 15.0 KB
Line 
1MODULE p4zlim
2   !!======================================================================
3   !!                         ***  MODULE p4zlim  ***
4   !! TOP :   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-04  (O. Aumont, C. Ethe) Limitation for iron modelled in quota
9   !!----------------------------------------------------------------------
10#if defined key_pisces
11   !!----------------------------------------------------------------------
12   !!   'key_pisces'                                       PISCES bio-model
13   !!----------------------------------------------------------------------
14   !!   p4z_lim        :   Compute the nutrients limitation terms
15   !!   p4z_lim_init   :   Read the namelist
16   !!----------------------------------------------------------------------
17   USE oce_trc         ! Shared ocean-passive tracers variables
18   USE trc             ! Tracers defined
19   USE sms_pisces      ! PISCES variables
20   USE p4zopt          ! Optical
21   USE iom             !  I/O manager
22
23   IMPLICIT NONE
24   PRIVATE
25
26   PUBLIC p4z_lim   
27   PUBLIC p4z_lim_init   
28
29   !! * Shared module variables
30   REAL(wp), PUBLIC ::  concnno3    !:  NO3, PO4 half saturation   
31   REAL(wp), PUBLIC ::  concdno3    !:  Phosphate half saturation for diatoms 
32   REAL(wp), PUBLIC ::  concnnh4    !:  NH4 half saturation for phyto 
33   REAL(wp), PUBLIC ::  concdnh4    !:  NH4 half saturation for diatoms
34   REAL(wp), PUBLIC ::  concnfer    !:  Iron half saturation for nanophyto
35   REAL(wp), PUBLIC ::  concdfer    !:  Iron half saturation for diatoms 
36   REAL(wp), PUBLIC ::  concbno3    !:  NO3 half saturation  for bacteria
37   REAL(wp), PUBLIC ::  concbnh4    !:  NH4 half saturation for bacteria
38   REAL(wp), PUBLIC ::  xsizedia    !:  Minimum size criteria for diatoms
39   REAL(wp), PUBLIC ::  xsizephy    !:  Minimum size criteria for nanophyto
40   REAL(wp), PUBLIC ::  xsizern     !:  Size ratio for nanophytoplankton
41   REAL(wp), PUBLIC ::  xsizerd     !:  Size ratio for diatoms
42   REAL(wp), PUBLIC ::  xksi1       !:  half saturation constant for Si uptake
43   REAL(wp), PUBLIC ::  xksi2       !:  half saturation constant for Si/C
44   REAL(wp), PUBLIC ::  xkdoc       !:  2nd half-sat. of DOC remineralization 
45   REAL(wp), PUBLIC ::  concbfe     !:  Fe half saturation for bacteria
46   REAL(wp), PUBLIC ::  qnfelim     !:  optimal Fe quota for nanophyto
47   REAL(wp), PUBLIC ::  qdfelim     !:  optimal Fe quota for diatoms
48   REAL(wp), PUBLIC ::  caco3r      !:  mean rainratio
49
50   ! Coefficient for iron limitation
51   REAL(wp) ::  xcoef1   = 0.0016  / 55.85 
52   REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5
53   REAL(wp) ::  xcoef3   = 1.15E-4 * 14. / 55.85 / 7.625 * 0.5 
54   !!* Substitution
55#  include "top_substitute.h90"
56   !!----------------------------------------------------------------------
57   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
58   !! $Id: p4zlim.F90 3160 2011-11-20 14:27:18Z cetlod $
59   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
60   !!----------------------------------------------------------------------
61
62CONTAINS
63
64   SUBROUTINE p4z_lim( kt, jnt )
65      !!---------------------------------------------------------------------
66      !!                     ***  ROUTINE p4z_lim  ***
67      !!
68      !! ** Purpose :   Compute the co-limitations by the various nutrients
69      !!              for the various phytoplankton species
70      !!
71      !! ** Method  : - ???
72      !!---------------------------------------------------------------------
73      !
74      INTEGER, INTENT(in)  :: kt, jnt
75      !
76      INTEGER  ::   ji, jj, jk
77      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim
78      REAL(wp) ::   zconcd, zconcd2, zconcn, zconcn2
79      REAL(wp) ::   z1_trndia, z1_trnphy, ztem1, ztem2, zetot1, zetot2
80      REAL(wp) ::   zdenom, zratio, zironmin
81      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4   
82      !!---------------------------------------------------------------------
83      !
84      IF( nn_timing == 1 )  CALL timing_start('p4z_lim')
85      !
86      DO jk = 1, jpkm1
87         DO jj = 1, jpj
88            DO ji = 1, jpi
89               
90               ! Tuning of the iron concentration to a minimum level that is set to the detection limit
91               !-------------------------------------
92               zno3    = trn(ji,jj,jk,jpno3) / 40.e-6
93               zferlim = MAX( 3e-11 * zno3 * zno3, 5e-12 )
94               zferlim = MIN( zferlim, 7e-11 )
95               trn(ji,jj,jk,jpfer) = MAX( trn(ji,jj,jk,jpfer), zferlim )
96
97               ! Computation of a variable Ks for iron on diatoms taking into account
98               ! that increasing biomass is made of generally bigger cells
99               !------------------------------------------------
100               zconcd   = MAX( 0.e0 , trn(ji,jj,jk,jpdia) - xsizedia )
101               zconcd2  = trn(ji,jj,jk,jpdia) - zconcd
102               zconcn   = MAX( 0.e0 , trn(ji,jj,jk,jpphy) - xsizephy )
103               zconcn2  = trn(ji,jj,jk,jpphy) - zconcn
104               z1_trnphy   = 1. / ( trn(ji,jj,jk,jpphy) + rtrn )
105               z1_trndia   = 1. / ( trn(ji,jj,jk,jpdia) + rtrn )
106
107               concdfe(ji,jj,jk) = MAX( concdfer, ( zconcd2 * concdfer + concdfer * xsizerd * zconcd ) * z1_trndia )
108               zconc1d           = MAX( concdno3, ( zconcd2 * concdno3 + concdno3 * xsizerd * zconcd ) * z1_trndia )
109               zconc1dnh4        = MAX( concdnh4, ( zconcd2 * concdnh4 + concdnh4 * xsizerd * zconcd ) * z1_trndia )
110
111               concnfe(ji,jj,jk) = MAX( concnfer, ( zconcn2 * concnfer + concnfer * xsizern * zconcn ) * z1_trnphy )
112               zconc0n           = MAX( concnno3, ( zconcn2 * concnno3 + concnno3 * xsizern * zconcn ) * z1_trnphy )
113               zconc0nnh4        = MAX( concnnh4, ( zconcn2 * concnnh4 + concnnh4 * xsizern * zconcn ) * z1_trnphy )
114
115               ! Michaelis-Menten Limitation term for nutrients Small bacteria
116               ! -------------------------------------------------------------
117               zdenom = 1. /  ( concbno3 * concbnh4 + concbnh4 * trn(ji,jj,jk,jpno3) + concbno3 * trn(ji,jj,jk,jpnh4) )
118               xnanono3(ji,jj,jk) = trn(ji,jj,jk,jpno3) * concbnh4 * zdenom
119               xnanonh4(ji,jj,jk) = trn(ji,jj,jk,jpnh4) * concbno3 * zdenom
120               !
121               zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk)
122               zlim2    = trn(ji,jj,jk,jppo4) / ( trn(ji,jj,jk,jppo4) + concbnh4 )
123               zlim3    = trn(ji,jj,jk,jpfer) / ( concbfe + trn(ji,jj,jk,jpfer) )
124               zlim4    = trn(ji,jj,jk,jpdoc) / ( xkdoc   + trn(ji,jj,jk,jpdoc) )
125               xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 )
126               xlimbac (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) * zlim4
127
128               ! Michaelis-Menten Limitation term for nutrients Small flagellates
129               ! -----------------------------------------------
130               zdenom = 1. /  ( zconc0n * zconc0nnh4 + zconc0nnh4 * trn(ji,jj,jk,jpno3) + zconc0n * trn(ji,jj,jk,jpnh4) )
131               xnanono3(ji,jj,jk) = trn(ji,jj,jk,jpno3) * zconc0nnh4 * zdenom
132               xnanonh4(ji,jj,jk) = trn(ji,jj,jk,jpnh4) * zconc0n    * zdenom
133               !
134               zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk)
135               zlim2    = trn(ji,jj,jk,jppo4) / ( trn(ji,jj,jk,jppo4) + zconc0nnh4 )
136               zratio   = trn(ji,jj,jk,jpnfe) * z1_trnphy 
137               zironmin = xcoef1 * trn(ji,jj,jk,jpnch) * z1_trnphy + xcoef2 * zlim1 + xcoef3 * xnanono3(ji,jj,jk)
138               zlim3    = MAX( 0.,( zratio - zironmin ) / qnfelim )
139               xnanopo4(ji,jj,jk) = zlim2
140               xlimnfe (ji,jj,jk) = MIN( 1., zlim3 )
141               xlimphy (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 )
142               !
143               !   Michaelis-Menten Limitation term for nutrients Diatoms
144               !   ----------------------------------------------
145               zdenom   = 1. / ( zconc1d * zconc1dnh4 + zconc1dnh4 * trn(ji,jj,jk,jpno3) + zconc1d * trn(ji,jj,jk,jpnh4) )
146               xdiatno3(ji,jj,jk) = trn(ji,jj,jk,jpno3) * zconc1dnh4 * zdenom
147               xdiatnh4(ji,jj,jk) = trn(ji,jj,jk,jpnh4) * zconc1d    * zdenom
148               !
149               zlim1    = xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk)
150               zlim2    = trn(ji,jj,jk,jppo4) / ( trn(ji,jj,jk,jppo4) + zconc1dnh4  )
151               zlim3    = trn(ji,jj,jk,jpsil) / ( trn(ji,jj,jk,jpsil) + xksi(ji,jj) )
152               zratio   = trn(ji,jj,jk,jpdfe) * z1_trndia
153               zironmin = xcoef1 * trn(ji,jj,jk,jpdch) * z1_trndia + xcoef2 * zlim1 + xcoef3 * xdiatno3(ji,jj,jk)
154               zlim4    = MAX( 0., ( zratio - zironmin ) / qdfelim )
155               xdiatpo4(ji,jj,jk) = zlim2
156               xlimdfe (ji,jj,jk) = MIN( 1., zlim4 )
157               xlimdia (ji,jj,jk) = MIN( zlim1, zlim2, zlim3, zlim4 )
158               xlimsi  (ji,jj,jk) = MIN( zlim1, zlim2, zlim4 )
159           END DO
160         END DO
161      END DO
162
163      ! Compute the fraction of nanophytoplankton that is made of calcifiers
164      ! --------------------------------------------------------------------
165      DO jk = 1, jpkm1
166         DO jj = 1, jpj
167            DO ji = 1, jpi
168               zlim1 =  ( trn(ji,jj,jk,jpno3) * concnnh4 + trn(ji,jj,jk,jpnh4) * concnno3 )    &
169                  &   / ( concnno3 * concnnh4 + concnnh4 * trn(ji,jj,jk,jpno3) + concnno3 * trn(ji,jj,jk,jpnh4) ) 
170               zlim2  = trn(ji,jj,jk,jppo4) / ( trn(ji,jj,jk,jppo4) + concnnh4 )
171               zlim3  = trn(ji,jj,jk,jpfer) / ( trn(ji,jj,jk,jpfer) +  5.E-11   )
172               ztem1  = MAX( 0., tsn(ji,jj,jk,jp_tem) )
173               ztem2  = tsn(ji,jj,jk,jp_tem) - 10.
174               zetot1 = MAX( 0., etot(ji,jj,jk) - 1.) / ( 4. + etot(ji,jj,jk) ) 
175               zetot2 = 30. / ( 30. + etot(ji,jj,jk) ) 
176
177               xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )                  &
178                  &                       * ztem1 / ( 0.1 + ztem1 )                     &
179                  &                       * MAX( 1., trn(ji,jj,jk,jpphy) * 1.e6 / 2. )  &
180                  &                       * zetot1 * zetot2               &
181                  &                       * ( 1. + EXP(-ztem2 * ztem2 / 25. ) )         &
182                  &                       * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) )
183               xfracal(ji,jj,jk) = MIN( 0.8 , xfracal(ji,jj,jk) )
184               xfracal(ji,jj,jk) = MAX( 0.02, xfracal(ji,jj,jk) )
185            END DO
186         END DO
187      END DO
188      !
189      IF( ln_diatrc .AND. lk_iomput .AND. jnt == nrdttrc ) THEN        ! save output diagnostics
190        !
191        CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) )  ! euphotic layer deptht
192        CALL iom_put( "LNnut"  , xlimphy(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
193        CALL iom_put( "LDnut"  , xlimdia(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
194        CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
195        CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
196        !
197      ENDIF
198
199      !
200      IF( nn_timing == 1 )  CALL timing_stop('p4z_lim')
201      !
202   END SUBROUTINE p4z_lim
203
204   SUBROUTINE p4z_lim_init
205
206      !!----------------------------------------------------------------------
207      !!                  ***  ROUTINE p4z_lim_init  ***
208      !!
209      !! ** Purpose :   Initialization of nutrient limitation parameters
210      !!
211      !! ** Method  :   Read the nampislim namelist and check the parameters
212      !!      called at the first timestep (nittrc000)
213      !!
214      !! ** input   :   Namelist nampislim
215      !!
216      !!----------------------------------------------------------------------
217
218      NAMELIST/nampislim/ concnno3, concdno3, concnnh4, concdnh4, concnfer, concdfer, concbfe,   &
219         &                concbno3, concbnh4, xsizedia, xsizephy, xsizern, xsizerd,          & 
220         &                xksi1, xksi2, xkdoc, qnfelim, qdfelim, caco3r
221      INTEGER :: ios                 ! Local integer output status for namelist read
222
223      REWIND( numnatp_ref )              ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters
224      READ  ( numnatp_ref, nampislim, IOSTAT = ios, ERR = 901)
225901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in reference namelist', lwp )
226
227      REWIND( numnatp_cfg )              ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters
228      READ  ( numnatp_cfg, nampislim, IOSTAT = ios, ERR = 902 )
229902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in configuration namelist', lwp )
230      IF(lwm) WRITE ( numonp, nampislim )
231
232      IF(lwp) THEN                         ! control print
233         WRITE(numout,*) ' '
234         WRITE(numout,*) ' Namelist parameters for nutrient limitations, nampislim'
235         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
236         WRITE(numout,*) '    mean rainratio                           caco3r    = ', caco3r
237         WRITE(numout,*) '    NO3 half saturation of nanophyto         concnno3  = ', concnno3
238         WRITE(numout,*) '    NO3 half saturation of diatoms           concdno3  = ', concdno3
239         WRITE(numout,*) '    NH4 half saturation for phyto            concnnh4  = ', concnnh4
240         WRITE(numout,*) '    NH4 half saturation for diatoms          concdnh4  = ', concdnh4
241         WRITE(numout,*) '    half saturation constant for Si uptake   xksi1     = ', xksi1
242         WRITE(numout,*) '    half saturation constant for Si/C        xksi2     = ', xksi2
243         WRITE(numout,*) '    half-sat. of DOC remineralization        xkdoc     = ', xkdoc
244         WRITE(numout,*) '    Iron half saturation for nanophyto       concnfer  = ', concnfer
245         WRITE(numout,*) '    Iron half saturation for diatoms         concdfer  = ', concdfer
246         WRITE(numout,*) '    size ratio for nanophytoplankton         xsizern   = ', xsizern
247         WRITE(numout,*) '    size ratio for diatoms                   xsizerd   = ', xsizerd
248         WRITE(numout,*) '    NO3 half saturation of bacteria          concbno3  = ', concbno3
249         WRITE(numout,*) '    NH4 half saturation for bacteria         concbnh4  = ', concbnh4
250         WRITE(numout,*) '    Minimum size criteria for diatoms        xsizedia  = ', xsizedia
251         WRITE(numout,*) '    Minimum size criteria for nanophyto      xsizephy  = ', xsizephy
252         WRITE(numout,*) '    Fe half saturation for bacteria          concbfe   = ', concbfe
253         WRITE(numout,*) '    optimal Fe quota for nano.               qnfelim   = ', qnfelim
254         WRITE(numout,*) '    Optimal Fe quota for diatoms             qdfelim   = ', qdfelim
255      ENDIF
256
257   END SUBROUTINE p4z_lim_init
258
259#else
260   !!======================================================================
261   !!  Dummy module :                                   No PISCES bio-model
262   !!======================================================================
263CONTAINS
264   SUBROUTINE p4z_lim                   ! Empty routine
265   END SUBROUTINE p4z_lim
266#endif 
267
268   !!======================================================================
269END MODULE  p4zlim
Note: See TracBrowser for help on using the repository browser.