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

source: NEMO/branches/2018/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zlim.F90 @ 10115

Last change on this file since 10115 was 10115, checked in by cbricaud, 6 years ago

phase 3.6 coarsening branch with nemo_3.6_rev9192

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