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

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/TOP/PISCES/P4Z/p4zlim.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 5 years ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

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