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

source: branches/CNRS/dev_r8832_PISCO/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zlim.F90 @ 9450

Last change on this file since 9450 was 9450, checked in by aumont, 6 years ago

debug PISCES code

File size: 48.7 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 p5z_lim
23   PUBLIC p4z_lim_init   
24   PUBLIC p5z_lim_init
25   PUBLIC p4z_lim_alloc
26
27   !! * Shared module variables
28   REAL(wp), PUBLIC ::  concnno3    !:  NO3, PO4 half saturation   
29   REAL(wp), PUBLIC ::  concpno3    !:  NO3, PO4 half saturation   
30   REAL(wp), PUBLIC ::  concdno3    !:  Phosphate half saturation for diatoms 
31   REAL(wp), PUBLIC ::  concnnh4    !:  NH4 half saturation for phyto 
32   REAL(wp), PUBLIC ::  concpnh4    !:  NH4 half saturation for phyto 
33   REAL(wp), PUBLIC ::  concdnh4    !:  NH4 half saturation for diatoms
34   REAL(wp), PUBLIC ::  concnpo4    !:  NH4 half saturation for diatoms
35   REAL(wp), PUBLIC ::  concppo4    !:  NH4 half saturation for diatoms
36   REAL(wp), PUBLIC ::  concdpo4    !:  NH4 half saturation for diatoms
37   REAL(wp), PUBLIC ::  concnfer    !:  Iron half saturation for nanophyto
38   REAL(wp), PUBLIC ::  concpfer    !:  Iron half saturation for nanophyto
39   REAL(wp), PUBLIC ::  concdfer    !:  Iron half saturation for diatoms 
40   REAL(wp), PUBLIC ::  concbno3    !:  NO3 half saturation  for bacteria
41   REAL(wp), PUBLIC ::  concbnh4    !:  NH4 half saturation for bacteria
42   REAL(wp), PUBLIC ::  concbpo4    !:  PO4 half saturation for bacteria
43   REAL(wp), PUBLIC ::  xsizedia    !:  Minimum size criteria for diatoms
44   REAL(wp), PUBLIC ::  xsizepic    !:  Minimum size criteria for diatoms
45   REAL(wp), PUBLIC ::  xsizephy    !:  Minimum size criteria for nanophyto
46   REAL(wp), PUBLIC ::  xsizern     !:  Size ratio for nanophytoplankton
47   REAL(wp), PUBLIC ::  xsizerp     !:  Size ratio for nanophytoplankton
48   REAL(wp), PUBLIC ::  xsizerd     !:  Size ratio for diatoms
49   REAL(wp), PUBLIC ::  xksi1       !:  half saturation constant for Si uptake
50   REAL(wp), PUBLIC ::  xksi2       !:  half saturation constant for Si/C
51   REAL(wp), PUBLIC ::  xkdoc       !:  2nd half-sat. of DOC remineralization 
52   REAL(wp), PUBLIC ::  concbfe     !:  Fe half saturation for bacteria
53   REAL(wp), PUBLIC ::  oxymin      !:  half saturation constant for anoxia
54   REAL(wp), PUBLIC ::  qfnopt      !:  optimal Fe quota for nanophyto
55   REAL(wp), PUBLIC ::  qfpopt      !:  optimal Fe quota for nanophyto
56   REAL(wp), PUBLIC ::  qfdopt      !:  optimal Fe quota for diatoms
57   REAL(wp), PUBLIC ::  qnnmin      !:  optimal Fe quota for diatoms
58   REAL(wp), PUBLIC ::  qnnmax      !:  optimal Fe quota for diatoms
59   REAL(wp), PUBLIC ::  qpnmin      !:  optimal Fe quota for diatoms
60   REAL(wp), PUBLIC ::  qpnmax      !:  optimal Fe quota for diatoms
61   REAL(wp), PUBLIC ::  qnpmin      !:  optimal Fe quota for diatoms
62   REAL(wp), PUBLIC ::  qnpmax      !:  optimal Fe quota for diatoms
63   REAL(wp), PUBLIC ::  qppmin      !:  optimal Fe quota for diatoms
64   REAL(wp), PUBLIC ::  qppmax      !:  optimal Fe quota for diatoms
65   REAL(wp), PUBLIC ::  qndmin      !:  optimal Fe quota for diatoms
66   REAL(wp), PUBLIC ::  qndmax      !:  optimal Fe quota for diatoms
67   REAL(wp), PUBLIC ::  qpdmin      !:  optimal Fe quota for diatoms
68   REAL(wp), PUBLIC ::  qpdmax      !:  optimal Fe quota for diatoms
69   REAL(wp), PUBLIC ::  qfnmax      !:  optimal Fe quota for diatoms
70   REAL(wp), PUBLIC ::  qfpmax      !:  optimal Fe quota for diatoms
71   REAL(wp), PUBLIC ::  qfdmax      !:  optimal Fe quota for diatoms
72   REAL(wp), PUBLIC ::  qnfelim     !:  optimal Fe quota for nanophyto
73   REAL(wp), PUBLIC ::  qdfelim     !:  optimal Fe quota for diatoms
74   REAL(wp), PUBLIC ::  caco3r      !:  mean rainratio
75   REAL(wp), PUBLIC ::  zpsinh4
76   REAL(wp), PUBLIC ::  zpsino3
77   REAL(wp), PUBLIC ::  zpsiuptk
78
79   !!* Phytoplankton limitation terms
80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanono3   !: ???
81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicono3   !: ???
82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatno3   !: ???
83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanonh4   !: ???
84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpiconh4   !: ???
85   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatnh4   !: ???
86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanopo4   !: ???
87   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicopo4   !: ???
88   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatpo4   !: ???
89   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanodop   !: ???
90   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicodop   !: ???
91   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatdop   !: ???
92   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanofer   !: ???
93   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicofer   !: ???
94   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatfer   !: ???
95   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimphy    !: ???
96   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpic    !: ???
97   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdia    !: ???
98   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimnfe    !: ???
99   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpfe    !: ???
100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdfe    !: ???
101   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimsi     !: ???
102   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimsi2    !: ???
103   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbac    !: ??
104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimbacl   !: ??
105   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concdfe    !: ???
106   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   concnfe    !: ???
107   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvnuptk
108   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvpuptk
109   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvduptk
110
111   !!*  Allometric variations of the quotas
112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmin    !: ???
113   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmax    !: ???
114   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmin    !: ???
115   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmax    !: ???
116   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmin    !: ???
117   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmax    !: ???
118   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmin    !: ???
119   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmax    !: ???
120   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmin    !: ???
121   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmax    !: ???
122   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmin    !: ???
123   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmax    !: ?
124
125   ! Coefficient for iron limitation
126   REAL(wp) ::  xcoef1   = 0.00167  / 55.85 
127   REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5
128   REAL(wp) ::  xcoef3   = 1.15E-4 * 14. / 55.85 / 7.625 * 0.5 
129
130   !!----------------------------------------------------------------------
131   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
132   !! $Id: p4zlim.F90 3160 2011-11-20 14:27:18Z cetlod $
133   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
134   !!----------------------------------------------------------------------
135
136CONTAINS
137
138   SUBROUTINE p4z_lim( kt, knt )
139      !!---------------------------------------------------------------------
140      !!                     ***  ROUTINE p4z_lim  ***
141      !!
142      !! ** Purpose :   Compute the co-limitations by the various nutrients
143      !!              for the various phytoplankton species
144      !!
145      !! ** Method  : - ???
146      !!---------------------------------------------------------------------
147      !
148      INTEGER, INTENT(in)  :: kt, knt
149      !
150      INTEGER  ::   ji, jj, jk
151      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim
152      REAL(wp) ::   zconcd, zconcd2, zconcn, zconcn2
153      REAL(wp) ::   z1_trbdia, z1_trbphy, ztem1, ztem2, zetot1, zetot2
154      REAL(wp) ::   zdenom, zratio, zironmin
155      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4   
156      !!---------------------------------------------------------------------
157      !
158      IF( nn_timing == 1 )  CALL timing_start('p4z_lim')
159      !
160      DO jk = 1, jpkm1
161         DO jj = 1, jpj
162            DO ji = 1, jpi
163               
164               ! Tuning of the iron concentration to a minimum level that is set to the detection limit
165               !-------------------------------------
166               zno3    = trb(ji,jj,jk,jpno3) / 40.e-6
167               zferlim = MAX( 3e-11 * zno3 * zno3, 5e-12 )
168               zferlim = MIN( zferlim, 7e-11 )
169               trb(ji,jj,jk,jpfer) = MAX( trb(ji,jj,jk,jpfer), zferlim )
170
171               ! Computation of a variable Ks for iron on diatoms taking into account
172               ! that increasing biomass is made of generally bigger cells
173               !------------------------------------------------
174               zconcd   = MAX( 0.e0 , trb(ji,jj,jk,jpdia) - xsizedia )
175               zconcd2  = trb(ji,jj,jk,jpdia) - zconcd
176               zconcn   = MAX( 0.e0 , trb(ji,jj,jk,jpphy) - xsizephy )
177               zconcn2  = trb(ji,jj,jk,jpphy) - zconcn
178               z1_trbphy   = 1. / ( trb(ji,jj,jk,jpphy) + rtrn )
179               z1_trbdia   = 1. / ( trb(ji,jj,jk,jpdia) + rtrn )
180
181               concdfe(ji,jj,jk) = MAX( concdfer, ( zconcd2 * concdfer + concdfer * xsizerd * zconcd ) * z1_trbdia )
182               zconc1d           = MAX( concdno3, ( zconcd2 * concdno3 + concdno3 * xsizerd * zconcd ) * z1_trbdia )
183               zconc1dnh4        = MAX( concdnh4, ( zconcd2 * concdnh4 + concdnh4 * xsizerd * zconcd ) * z1_trbdia )
184
185               concnfe(ji,jj,jk) = MAX( concnfer, ( zconcn2 * concnfer + concnfer * xsizern * zconcn ) * z1_trbphy )
186               zconc0n           = MAX( concnno3, ( zconcn2 * concnno3 + concnno3 * xsizern * zconcn ) * z1_trbphy )
187               zconc0nnh4        = MAX( concnnh4, ( zconcn2 * concnnh4 + concnnh4 * xsizern * zconcn ) * z1_trbphy )
188
189               ! Michaelis-Menten Limitation term for nutrients Small bacteria
190               ! -------------------------------------------------------------
191               zdenom = 1. /  ( concbno3 * concbnh4 + concbnh4 * trb(ji,jj,jk,jpno3) + concbno3 * trb(ji,jj,jk,jpnh4) )
192               xnanono3(ji,jj,jk) = trb(ji,jj,jk,jpno3) * concbnh4 * zdenom
193               xnanonh4(ji,jj,jk) = trb(ji,jj,jk,jpnh4) * concbno3 * zdenom
194               !
195               zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk)
196               zlim2    = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concbnh4 )
197               zlim3    = trb(ji,jj,jk,jpfer) / ( concbfe + trb(ji,jj,jk,jpfer) )
198               zlim4    = trb(ji,jj,jk,jpdoc) / ( xkdoc   + trb(ji,jj,jk,jpdoc) )
199               xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 )
200               xlimbac (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) * zlim4
201
202               ! Michaelis-Menten Limitation term for nutrients Small flagellates
203               ! -----------------------------------------------
204               zdenom = 1. /  ( zconc0n * zconc0nnh4 + zconc0nnh4 * trb(ji,jj,jk,jpno3) + zconc0n * trb(ji,jj,jk,jpnh4) )
205               xnanono3(ji,jj,jk) = trb(ji,jj,jk,jpno3) * zconc0nnh4 * zdenom
206               xnanonh4(ji,jj,jk) = trb(ji,jj,jk,jpnh4) * zconc0n    * zdenom
207               !
208               zlim1    = xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk)
209               zlim2    = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zconc0nnh4 )
210               zratio   = trb(ji,jj,jk,jpnfe) * z1_trbphy 
211               zironmin = xcoef1 * trb(ji,jj,jk,jpnch) * z1_trbphy + xcoef2 * zlim1 + xcoef3 * xnanono3(ji,jj,jk)
212               zlim3    = MAX( 0.,( zratio - zironmin ) / qnfelim )
213               xnanopo4(ji,jj,jk) = zlim2
214               xlimnfe (ji,jj,jk) = MIN( 1., zlim3 )
215               xlimphy (ji,jj,jk) = MIN( zlim1, zlim2, zlim3 )
216               !
217               !   Michaelis-Menten Limitation term for nutrients Diatoms
218               !   ----------------------------------------------
219               zdenom   = 1. / ( zconc1d * zconc1dnh4 + zconc1dnh4 * trb(ji,jj,jk,jpno3) + zconc1d * trb(ji,jj,jk,jpnh4) )
220               xdiatno3(ji,jj,jk) = trb(ji,jj,jk,jpno3) * zconc1dnh4 * zdenom
221               xdiatnh4(ji,jj,jk) = trb(ji,jj,jk,jpnh4) * zconc1d    * zdenom
222               !
223               zlim1    = xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk)
224               zlim2    = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zconc1dnh4  )
225               zlim3    = trb(ji,jj,jk,jpsil) / ( trb(ji,jj,jk,jpsil) + xksi(ji,jj) )
226               zratio   = trb(ji,jj,jk,jpdfe) * z1_trbdia
227               zironmin = xcoef1 * trb(ji,jj,jk,jpdch) * z1_trbdia + xcoef2 * zlim1 + xcoef3 * xdiatno3(ji,jj,jk)
228               zlim4    = MAX( 0., ( zratio - zironmin ) / qdfelim )
229               xdiatpo4(ji,jj,jk) = zlim2
230               xlimdfe (ji,jj,jk) = MIN( 1., zlim4 )
231               xlimdia (ji,jj,jk) = MIN( zlim1, zlim2, zlim3, zlim4 )
232               xlimsi  (ji,jj,jk) = MIN( zlim1, zlim2, zlim4 )
233           END DO
234         END DO
235      END DO
236
237      ! Compute the fraction of nanophytoplankton that is made of calcifiers
238      ! --------------------------------------------------------------------
239      DO jk = 1, jpkm1
240         DO jj = 1, jpj
241            DO ji = 1, jpi
242               zlim1 =  ( trb(ji,jj,jk,jpno3) * concnnh4 + trb(ji,jj,jk,jpnh4) * concnno3 )    &
243                  &   / ( concnno3 * concnnh4 + concnnh4 * trb(ji,jj,jk,jpno3) + concnno3 * trb(ji,jj,jk,jpnh4) ) 
244               zlim2  = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concnnh4 )
245               zlim3  = trb(ji,jj,jk,jpfer) / ( trb(ji,jj,jk,jpfer) +  5.E-11   )
246               ztem1  = MAX( 0., tsn(ji,jj,jk,jp_tem) )
247               ztem2  = tsn(ji,jj,jk,jp_tem) - 10.
248               zetot1 = MAX( 0., etot_ndcy(ji,jj,jk) - 1.) / ( 4. + etot_ndcy(ji,jj,jk) ) 
249               zetot2 = 30. / ( 30. + etot_ndcy(ji,jj,jk) ) 
250
251               xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )                  &
252                  &                       * ztem1 / ( 0.1 + ztem1 )                     &
253                  &                       * MAX( 1., trb(ji,jj,jk,jpphy) * 1.e6 / 2. )  &
254                  &                       * zetot1 * zetot2               &
255                  &                       * ( 1. + EXP(-ztem2 * ztem2 / 25. ) )         &
256                  &                       * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) )
257               xfracal(ji,jj,jk) = MIN( 0.8 , xfracal(ji,jj,jk) )
258               xfracal(ji,jj,jk) = MAX( 0.02, xfracal(ji,jj,jk) )
259            END DO
260         END DO
261      END DO
262      !
263      DO jk = 1, jpkm1
264         DO jj = 1, jpj
265            DO ji = 1, jpi
266               ! denitrification factor computed from O2 levels
267               nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - trb(ji,jj,jk,jpoxy) )    &
268                  &                                / ( oxymin + trb(ji,jj,jk,jpoxy) )  )
269               nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) )
270               !
271               ! denitrification factor computed from NO3 levels
272               nitrfac2(ji,jj,jk) = MAX( 0.e0,       ( 1.E-6 - trb(ji,jj,jk,jpno3) )  &
273                  &                                / ( 1.E-6 + trb(ji,jj,jk,jpno3) ) )
274               nitrfac2(ji,jj,jk) = MIN( 1., nitrfac2(ji,jj,jk) )
275            END DO
276         END DO
277      END DO
278      !
279      IF( lk_iomput .AND. knt == nrdttrc ) THEN        ! save output diagnostics
280        IF( iom_use( "xfracal" ) ) CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) )  ! euphotic layer deptht
281        IF( iom_use( "LNnut"   ) ) CALL iom_put( "LNnut"  , xlimphy(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
282        IF( iom_use( "LDnut"   ) ) CALL iom_put( "LDnut"  , xlimdia(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
283        IF( iom_use( "LNFe"    ) ) CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
284        IF( iom_use( "LDFe"    ) ) CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
285      ENDIF
286      !
287      IF( nn_timing == 1 )  CALL timing_stop('p4z_lim')
288      !
289   END SUBROUTINE p4z_lim
290
291
292   SUBROUTINE p5z_lim( kt, knt )
293      !!---------------------------------------------------------------------
294      !!                     ***  ROUTINE p5z_lim  ***
295      !!
296      !! ** Purpose :   Compute the co-limitations by the various nutrients
297      !!              for the various phytoplankton species
298      !!
299      !! ** Method  : - ???
300      !!---------------------------------------------------------------------
301      !
302      INTEGER, INTENT(in)  :: kt, knt
303      !
304      INTEGER  ::   ji, jj, jk
305      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim
306      REAL(wp) ::   z1_trndia, z1_trnpic, z1_trnphy, ztem1, ztem2, zetot1
307      REAL(wp) ::   zratio, zration, zratiof, znutlim, zfalim
308      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4, zconc0npo4, zconc0dpo4
309      REAL(wp) ::   zconc0p, zconc0pnh4, zconc0ppo4, zconcpfe, zconcnfe, zconcdfe
310      REAL(wp) ::   fanano, fananop, fananof, fadiat, fadiatp, fadiatf
311      REAL(wp) ::   fapico, fapicop, fapicof
312      REAL(wp) ::   zrpho, zrass, zcoef, zfuptk, zratchl
313      REAL(wp) ::   zfvn, zfvp, zfvf, zsizen, zsizep, zsized, znanochl, zpicochl, zdiatchl
314      REAL(wp) ::   zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4
315      !!---------------------------------------------------------------------
316      !
317      !!---------------------------------------------------------------------
318      !
319      IF( nn_timing == 1 )  CALL timing_start('p5z_lim')
320      !
321      zratchl = 6.0
322      !
323      DO jk = 1, jpkm1
324         DO jj = 1, jpj
325            DO ji = 1, jpi
326               !
327               ! Tuning of the iron concentration to a minimum level that is set to the detection limit
328               !-------------------------------------
329               zno3    = trb(ji,jj,jk,jpno3) / 40.e-6
330               zferlim = MAX( 3e-11 * zno3 * zno3, 5e-12 )
331               zferlim = MIN( zferlim, 7e-11 )
332               trb(ji,jj,jk,jpfer) = MAX( trb(ji,jj,jk,jpfer), zferlim )
333
334               ! Computation of the mean relative size of each community
335               ! -------------------------------------------------------
336               z1_trnphy   = 1. / ( trb(ji,jj,jk,jpphy) + rtrn )
337               z1_trnpic   = 1. / ( trb(ji,jj,jk,jppic) + rtrn )
338               z1_trndia   = 1. / ( trb(ji,jj,jk,jpdia) + rtrn )
339               znanochl = trb(ji,jj,jk,jpnch) * z1_trnphy
340               zpicochl = trb(ji,jj,jk,jppch) * z1_trnpic
341               zdiatchl = trb(ji,jj,jk,jpdch) * z1_trndia
342
343               ! Computation of a variable Ks for iron on diatoms taking into account
344               ! that increasing biomass is made of generally bigger cells
345               !------------------------------------------------
346               zsized            = sized(ji,jj,jk)**0.81
347               zconcdfe          = concdfer * zsized
348               zconc1d           = concdno3 * zsized
349               zconc1dnh4        = concdnh4 * zsized
350               zconc0dpo4        = concdpo4 * zsized
351
352               zsizep            = 1.
353               zconcpfe          = concpfer * zsizep
354               zconc0p           = concpno3 * zsizep
355               zconc0pnh4        = concpnh4 * zsizep
356               zconc0ppo4        = concppo4 * zsizep
357
358               zsizen            = 1.
359               zconcnfe          = concnfer * zsizen
360               zconc0n           = concnno3 * zsizen
361               zconc0nnh4        = concnnh4 * zsizen
362               zconc0npo4        = concnpo4 * zsizen
363
364               ! Allometric variations of the minimum and maximum quotas
365               ! From Talmy et al. (2014) and Maranon et al. (2013)
366               ! -------------------------------------------------------
367               xqnnmin(ji,jj,jk) = qnnmin
368               xqnnmax(ji,jj,jk) = qnnmax
369               xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.27)
370               xqndmax(ji,jj,jk) = qndmax
371               xqnpmin(ji,jj,jk) = qnpmin
372               xqnpmax(ji,jj,jk) = qnpmax
373
374               ! Computation of the optimal allocation parameters
375               ! Based on the different papers by Pahlow et al., and Smith et al.
376               ! -----------------------------------------------------------------
377               znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc0nnh4,    &
378                 &         trb(ji,jj,jk,jpno3) / zconc0n)
379               fanano = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
380               znutlim = trb(ji,jj,jk,jppo4) / zconc0npo4
381               fananop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
382               znutlim = biron(ji,jj,jk) / zconcnfe
383               fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
384               znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc0pnh4,    &
385                 &         trb(ji,jj,jk,jpno3) / zconc0p)
386               fapico = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
387               znutlim = trb(ji,jj,jk,jppo4) / zconc0ppo4
388               fapicop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
389               znutlim = biron(ji,jj,jk) / zconcpfe
390               fapicof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
391               znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc1dnh4,    &
392                 &         trb(ji,jj,jk,jpno3) / zconc1d )
393               fadiat = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
394               znutlim = trb(ji,jj,jk,jppo4) / zconc0dpo4
395               fadiatp = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
396               znutlim = biron(ji,jj,jk) / zconcdfe
397               fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
398               !
399               ! Michaelis-Menten Limitation term for nutrients Small bacteria
400               ! -------------------------------------------------------------
401               zbactnh4 = trb(ji,jj,jk,jpnh4) / ( concbnh4 + trb(ji,jj,jk,jpnh4) )
402               zbactno3 = trb(ji,jj,jk,jpno3) / ( concbno3 + trb(ji,jj,jk,jpno3) ) * (1. - zbactnh4)
403               !
404               zlim1    = zbactno3 + zbactnh4
405               zlim2    = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concbpo4)
406               zlim3    = biron(ji,jj,jk) / ( concbfe + biron(ji,jj,jk) )
407               zlim4    = trb(ji,jj,jk,jpdoc) / ( xkdoc   + trb(ji,jj,jk,jpdoc) )
408               xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 )
409               xlimbac (ji,jj,jk) = xlimbacl(ji,jj,jk) * zlim4
410               !
411               ! Michaelis-Menten Limitation term for nutrients Small flagellates
412               ! -----------------------------------------------
413               zfalim = (1.-fanano) / fanano
414               xnanonh4(ji,jj,jk) = (1. - fanano) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc0nnh4 + trb(ji,jj,jk,jpnh4) )
415               xnanono3(ji,jj,jk) = (1. - fanano) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc0n + trb(ji,jj,jk,jpno3) )  &
416               &                    * (1. - xnanonh4(ji,jj,jk))
417               !
418               zfalim = (1.-fananop) / fananop
419               xnanopo4(ji,jj,jk) = (1. - fananop) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0npo4 )
420               xnanodop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc )   &
421               &                    * ( 1.0 - xnanopo4(ji,jj,jk) )
422               xnanodop(ji,jj,jk) = 0.
423               !
424               zfalim = (1.-fananof) / fananof
425               xnanofer(ji,jj,jk) = (1. - fananof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcnfe )
426               !
427               zratiof   = trb(ji,jj,jk,jpnfe) * z1_trnphy
428               zqfemn = xcoef1 * znanochl + xcoef2 + xcoef3 * xnanono3(ji,jj,jk)
429               !
430               zration = trb(ji,jj,jk,jpnph) * z1_trnphy
431               zration = MIN(xqnnmax(ji,jj,jk), MAX( 2. * xqnnmin(ji,jj,jk), zration ))
432               fvnuptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqnnmin(ji,jj,jk) / (zration + rtrn)  &
433               &                   * MAX(0., (1. - zratchl * znanochl / 12. ) )
434               !
435               zlim1    = max(0., (zration - 2. * xqnnmin(ji,jj,jk) )  &
436               &          / (xqnnmax(ji,jj,jk) - 2. * xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk)  &
437               &          / (zration + rtrn)
438               zlim3    = MAX( 0.,( zratiof - zqfemn ) / qfnopt )
439               xlimnfe(ji,jj,jk) = MIN( 1., zlim3 )
440               xlimphy(ji,jj,jk) = MIN( 1., zlim1, zlim3 )
441               !
442               ! Michaelis-Menten Limitation term for nutrients picophytoplankton
443               ! ----------------------------------------------------------------
444               zfalim = (1.-fapico) / fapico
445               xpiconh4(ji,jj,jk) = (1. - fapico) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc0pnh4 + trb(ji,jj,jk,jpnh4) )
446               xpicono3(ji,jj,jk) = (1. - fapico) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc0p + trb(ji,jj,jk,jpno3) )  &
447               &                    * (1. - xpiconh4(ji,jj,jk))
448               !
449               zfalim = (1.-fapicop) / fapicop
450               xpicopo4(ji,jj,jk) = (1. - fapicop) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0ppo4 )
451               xpicodop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc )   &
452               &                    * ( 1.0 - xpicopo4(ji,jj,jk) )
453               xpicodop(ji,jj,jk) = 0.
454               !
455               zfalim = (1.-fapicof) / fapicof
456               xpicofer(ji,jj,jk) = (1. - fapicof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcpfe )
457               !
458               zratiof   = trb(ji,jj,jk,jppfe) * z1_trnpic
459               zqfemp = xcoef1 * zpicochl + xcoef2 + xcoef3 * xpicono3(ji,jj,jk)
460               !
461               zration   = trb(ji,jj,jk,jpnpi) * z1_trnpic
462               zration = MIN(xqnpmax(ji,jj,jk), MAX( 2. * xqnpmin(ji,jj,jk), zration ))
463               fvpuptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqnpmin(ji,jj,jk) / (zration + rtrn)  &
464               &                   * MAX(0., (1. - zratchl * zpicochl / 12. ) )
465               !
466               zlim1    = max(0., (zration - 2. * xqnpmin(ji,jj,jk) )  &
467               &          / (xqnpmax(ji,jj,jk) - 2. * xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk)  &
468               &          / (zration + rtrn)
469               zlim3    = MAX( 0.,( zratiof - zqfemp ) / qfpopt )
470               xlimpfe(ji,jj,jk) = MIN( 1., zlim3 )
471               xlimpic(ji,jj,jk) = MIN( 1., zlim1, zlim3 )
472               !
473               !   Michaelis-Menten Limitation term for nutrients Diatoms
474               !   ------------------------------------------------------
475               zfalim = (1.-fadiat) / fadiat
476               xdiatnh4(ji,jj,jk) = (1. - fadiat) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc1dnh4 + trb(ji,jj,jk,jpnh4) )
477               xdiatno3(ji,jj,jk) = (1. - fadiat) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc1d + trb(ji,jj,jk,jpno3) )  &
478               &                    * (1. - xdiatnh4(ji,jj,jk))
479               !
480               zfalim = (1.-fadiatp) / fadiatp
481               xdiatpo4(ji,jj,jk) = (1. - fadiatp) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0dpo4 )
482               xdiatdop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc )  &
483               &                    * ( 1.0 - xdiatpo4(ji,jj,jk) )
484               xdiatdop(ji,jj,jk) = 0.
485               !
486               zfalim = (1.-fadiatf) / fadiatf
487               xdiatfer(ji,jj,jk) = (1. - fadiatf) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcdfe )
488               !
489               zratiof   = trb(ji,jj,jk,jpdfe) * z1_trndia
490               zqfemd = xcoef1 * zdiatchl + xcoef2 + xcoef3 * xdiatno3(ji,jj,jk)
491               !
492               zration   = trb(ji,jj,jk,jpndi) * z1_trndia
493               zration = MIN(xqndmax(ji,jj,jk), MAX( 2. * xqndmin(ji,jj,jk), zration ))
494               fvduptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqndmin(ji,jj,jk) / (zration + rtrn)   &
495               &                   * MAX(0., (1. - zratchl * zdiatchl / 12. ) )
496               !
497               zlim1    = max(0., (zration - 2. * xqndmin(ji,jj,jk) )    &
498               &          / (xqndmax(ji,jj,jk) - 2. * xqndmin(ji,jj,jk) ) )   &
499               &          * xqndmax(ji,jj,jk) / (zration + rtrn)
500               zlim3    = trb(ji,jj,jk,jpsil) / ( trb(ji,jj,jk,jpsil) + xksi(ji,jj) )
501               zlim4    = MAX( 0., ( zratiof - zqfemd ) / qfdopt )
502               xlimdfe(ji,jj,jk) = MIN( 1., zlim4 )
503               xlimdia(ji,jj,jk) = MIN( 1., zlim1, zlim3, zlim4 )
504               xlimsi(ji,jj,jk)  = MIN( 1., zlim3, zlim4 )
505               xlimsi2(ji,jj,jk)  = MIN( 1., zlim1, zlim4 )
506            END DO
507         END DO
508      END DO
509      !
510      ! Compute the phosphorus quota values. It is based on Litchmann et al., 2004 and Daines et al, 2013.
511      ! The relative contribution of three fonctional pools are computed: light harvesting apparatus,
512      ! nutrient uptake pool and assembly machinery. DNA is assumed to represent 1% of the dry mass of
513      ! phytoplankton (see Daines et al., 2013).
514      ! --------------------------------------------------------------------------------------------------
515      DO jk = 1, jpkm1
516         DO jj = 1, jpj
517            DO ji = 1, jpi
518               ! Size estimation of nanophytoplankton
519               ! ------------------------------------
520               zfvn = zpsiuptk / rno3 * fvnuptk(ji,jj,jk)
521               sizen(ji,jj,jk) = MAX(1., MIN(xsizern, 1.0 / ( MAX(rtrn, zfvn) ) ) )
522
523               ! N/P ratio of nanophytoplankton
524               ! ------------------------------
525               zfuptk = 0.23 * zfvn
526               zrpho = 2.24 * trb(ji,jj,jk,jpnch) / ( trb(ji,jj,jk,jpnph) * rno3 * 15. + rtrn )
527               zrass = 1. - 0.2 - zrpho - zfuptk
528               xqpnmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16. + 0.13
529               xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) * trb(ji,jj,jk,jpnph) / ( trb(ji,jj,jk,jpphy) + rtrn ) 
530               xqpnmin(ji,jj,jk) = qpnmin
531
532               ! Size estimation of picophytoplankton
533               ! ------------------------------------
534               zfvn = zpsiuptk / rno3  * fvpuptk(ji,jj,jk)
535               sizep(ji,jj,jk) = MAX(1., MIN(xsizerp, 1.0 / ( MAX(rtrn, zfvn) ) ) )
536
537               ! N/P ratio of picophytoplankton
538               ! ------------------------------
539               zfuptk = 0.35 * zfvn
540               zrpho = 2.24 * trb(ji,jj,jk,jppch) / ( trb(ji,jj,jk,jpnpi) * rno3 * 15. + rtrn )
541               zrass = 1. - 0.4 - zrpho - zfuptk
542               xqppmax(ji,jj,jk) =  (zrpho + zfuptk) * 0.0128 * 16. + zrass * 1./ 10.9 * 16. + 0.13
543               xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) * trb(ji,jj,jk,jpnpi) / ( trb(ji,jj,jk,jppic) + rtrn ) 
544               xqppmin(ji,jj,jk) = qppmin
545
546               ! Size estimation of diatoms
547               ! --------------------------
548               zfvn = zpsiuptk / rno3 * fvduptk(ji,jj,jk)
549               sized(ji,jj,jk) = MAX(1., MIN(xsizerd, 1.0 / ( MAX(rtrn, zfvn) ) ) )
550!               zcoef = trb(ji,jj,jk,jpdia) - MIN(xsizedia, trb(ji,jj,jk,jpdia) )
551!               sized(ji,jj,jk) = 1. + xsizerd * zcoef *1E6 / ( 1. + zcoef * 1E6 )
552
553               ! N/P ratio of diatoms
554               ! --------------------
555               zfuptk = 0.2 * zfvn
556               zrpho = 2.24 * trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpndi) * rno3 * 15. + rtrn )
557               zrass = 1. - 0.2 - zrpho - zfuptk
558               xqpdmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16. + 0.13
559               xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) * trb(ji,jj,jk,jpndi) / ( trb(ji,jj,jk,jpdia) + rtrn )
560               xqpdmin(ji,jj,jk) = qpdmin * sized(ji,jj,jk)**(-0.27)
561
562            END DO
563         END DO
564      END DO
565
566      ! Compute the fraction of nanophytoplankton that is made of calcifiers
567      ! --------------------------------------------------------------------
568      DO jk = 1, jpkm1
569         DO jj = 1, jpj
570            DO ji = 1, jpi
571               zlim1 =  trb(ji,jj,jk,jpnh4) / ( trb(ji,jj,jk,jpnh4) + concnnh4 ) + trb(ji,jj,jk,jpno3)    &
572               &        / ( trb(ji,jj,jk,jpno3) + concnno3 ) * ( 1.0 - trb(ji,jj,jk,jpnh4)   &
573               &        / ( trb(ji,jj,jk,jpnh4) + concnnh4 ) )
574               zlim2  = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concnpo4 )
575               zlim3  = trb(ji,jj,jk,jpfer) / ( trb(ji,jj,jk,jpfer) +  1.E-10 )
576               ztem1  = MAX( 0., tsn(ji,jj,jk,jp_tem) )
577               ztem2  = tsn(ji,jj,jk,jp_tem) - 10.
578               zetot1 = MAX( 0., etot(ji,jj,jk) - 1.) / ( 4. + etot(ji,jj,jk) ) * 20. / ( 20. + etot(ji,jj,jk) )
579
580!               xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )                  &
581               xfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk)                &
582               &                   * ztem1 / ( 1. + ztem1 ) * MAX( 1., trb(ji,jj,jk,jpphy)*1E6 )   &
583                  &                * ( 1. + EXP(-ztem2 * ztem2 / 25. ) )         &
584                  &                * zetot1 * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) )
585               xfracal(ji,jj,jk) = MAX( 0.02, MIN( 0.8 , xfracal(ji,jj,jk) ) )
586            END DO
587         END DO
588      END DO
589      !
590      DO jk = 1, jpkm1
591         DO jj = 1, jpj
592            DO ji = 1, jpi
593               ! denitrification factor computed from O2 levels
594               nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - trb(ji,jj,jk,jpoxy) )    &
595                  &                                / ( oxymin + trb(ji,jj,jk,jpoxy) )  )
596               nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) )
597            END DO
598         END DO
599      END DO
600      !
601      IF( lk_iomput .AND. knt == nrdttrc ) THEN        ! save output diagnostics
602        IF( iom_use( "xfracal" ) ) CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) )  ! euphotic layer deptht
603        IF( iom_use( "LNnut"   ) ) CALL iom_put( "LNnut"  , xlimphy(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
604        IF( iom_use( "LPnut"   ) ) CALL iom_put( "LPnut"  , xlimpic(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
605        IF( iom_use( "LDnut"   ) ) CALL iom_put( "LDnut"  , xlimdia(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
606        IF( iom_use( "LNFe"    ) ) CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
607        IF( iom_use( "LPFe"    ) ) CALL iom_put( "LPFe"   , xlimpfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
608        IF( iom_use( "LDFe"    ) ) CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
609        IF( iom_use( "SIZEN"   ) ) CALL iom_put( "SIZEN"  , sizen(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
610        IF( iom_use( "SIZEP"   ) ) CALL iom_put( "SIZEP"  , sizep(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
611        IF( iom_use( "SIZED"   ) ) CALL iom_put( "SIZED"  , sized(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
612      ENDIF
613      !
614      IF( nn_timing == 1 )  CALL timing_stop('p5z_lim')
615      !
616   END SUBROUTINE p5z_lim
617
618   SUBROUTINE p4z_lim_init
619
620      !!----------------------------------------------------------------------
621      !!                  ***  ROUTINE p4z_lim_init  ***
622      !!
623      !! ** Purpose :   Initialization of nutrient limitation parameters
624      !!
625      !! ** Method  :   Read the nampislim namelist and check the parameters
626      !!      called at the first timestep (nittrc000)
627      !!
628      !! ** input   :   Namelist nampislim
629      !!
630      !!----------------------------------------------------------------------
631
632      NAMELIST/namp4zlim/ concnno3, concdno3, concnnh4, concdnh4, concnfer, concdfer, concbfe,   &
633         &                concbno3, concbnh4, xsizedia, xsizephy, xsizern, xsizerd,          & 
634         &                xksi1, xksi2, xkdoc, qnfelim, qdfelim, caco3r, oxymin
635      INTEGER :: ios                 ! Local integer output status for namelist read
636
637      REWIND( numnatp_ref )              ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters
638      READ  ( numnatp_ref, namp4zlim, IOSTAT = ios, ERR = 901)
639901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp4zlim in reference namelist', lwp )
640
641      REWIND( numnatp_cfg )              ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters
642      READ  ( numnatp_cfg, namp4zlim, IOSTAT = ios, ERR = 902 )
643902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp4zlim in configuration namelist', lwp )
644      IF(lwm) WRITE ( numonp, namp4zlim )
645
646      IF(lwp) THEN                         ! control print
647         WRITE(numout,*) ' '
648         WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp4zlim'
649         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
650         WRITE(numout,*) '    mean rainratio                           caco3r    = ', caco3r
651         WRITE(numout,*) '    NO3 half saturation of nanophyto         concnno3  = ', concnno3
652         WRITE(numout,*) '    NO3 half saturation of diatoms           concdno3  = ', concdno3
653         WRITE(numout,*) '    NH4 half saturation for phyto            concnnh4  = ', concnnh4
654         WRITE(numout,*) '    NH4 half saturation for diatoms          concdnh4  = ', concdnh4
655         WRITE(numout,*) '    half saturation constant for Si uptake   xksi1     = ', xksi1
656         WRITE(numout,*) '    half saturation constant for Si/C        xksi2     = ', xksi2
657         WRITE(numout,*) '    half-sat. of DOC remineralization        xkdoc     = ', xkdoc
658         WRITE(numout,*) '    Iron half saturation for nanophyto       concnfer  = ', concnfer
659         WRITE(numout,*) '    Iron half saturation for diatoms         concdfer  = ', concdfer
660         WRITE(numout,*) '    size ratio for nanophytoplankton         xsizern   = ', xsizern
661         WRITE(numout,*) '    size ratio for diatoms                   xsizerd   = ', xsizerd
662         WRITE(numout,*) '    NO3 half saturation of bacteria          concbno3  = ', concbno3
663         WRITE(numout,*) '    NH4 half saturation for bacteria         concbnh4  = ', concbnh4
664         WRITE(numout,*) '    Minimum size criteria for diatoms        xsizedia  = ', xsizedia
665         WRITE(numout,*) '    Minimum size criteria for nanophyto      xsizephy  = ', xsizephy
666         WRITE(numout,*) '    Fe half saturation for bacteria          concbfe   = ', concbfe
667         WRITE(numout,*) '    halk saturation constant for anoxia       oxymin   =' , oxymin
668         WRITE(numout,*) '    optimal Fe quota for nano.               qnfelim   = ', qnfelim
669         WRITE(numout,*) '    Optimal Fe quota for diatoms             qdfelim   = ', qdfelim
670      ENDIF
671      !
672      nitrfac (:,:,:) = 0._wp
673      !
674   END SUBROUTINE p4z_lim_init
675
676   SUBROUTINE p5z_lim_init
677
678      !!----------------------------------------------------------------------
679      !!                  ***  ROUTINE p5z_lim_init  ***
680      !!
681      !! ** Purpose :   Initialization of nutrient limitation parameters
682      !!
683      !! ** Method  :   Read the nampislim and nampisquota namelists and check
684      !!      the parameters called at the first timestep (nittrc000)
685      !!
686      !! ** input   :   Namelist nampislim
687      !!
688      !!----------------------------------------------------------------------
689
690      NAMELIST/namp5zlim/ concnno3, concpno3, concdno3, concnnh4, concpnh4, concdnh4,  &
691         &                concnfer, concpfer, concdfer, concbfe, concnpo4, concppo4,   &
692         &                concdpo4, concbno3, concbnh4, concbpo4, xsizedia, xsizepic,  &
693         &                xsizephy, xsizern, xsizerp, xsizerd, xksi1, xksi2, xkdoc,    &
694         &                caco3r, oxymin
695
696      NAMELIST/namp5zquota/ qnnmin, qnnmax, qpnmin, qpnmax, qnpmin, qnpmax, qppmin,      &
697         &                  qppmax, qndmin, qndmax, qpdmin, qpdmax, qfnmax, qfpmax, qfdmax,  &
698         &                  qfnopt, qfpopt, qfdopt
699
700
701      INTEGER :: ios                 ! Local integer output status for namelist read
702
703      REWIND( numnatp_ref )              ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters
704      READ  ( numnatp_ref, namp5zlim, IOSTAT = ios, ERR = 901)
705901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in reference namelist', lwp )
706
707      REWIND( numnatp_cfg )              ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters
708      READ  ( numnatp_cfg, namp5zlim, IOSTAT = ios, ERR = 902 )
709902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in configuration namelist', lwp )
710      IF(lwm) WRITE ( numonp, namp5zlim )
711
712      IF(lwp) THEN                         ! control print
713         WRITE(numout,*) ' '
714         WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zlim'
715         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
716         WRITE(numout,*) '    mean rainratio                           caco3r    = ', caco3r
717         WRITE(numout,*) '    NO3 half saturation of nanophyto         concnno3  = ', concnno3
718         WRITE(numout,*) '    NO3 half saturation of picophyto         concpno3  = ', concpno3
719         WRITE(numout,*) '    NO3 half saturation of diatoms           concdno3  = ', concdno3
720         WRITE(numout,*) '    NH4 half saturation for phyto            concnnh4  = ', concnnh4
721         WRITE(numout,*) '    NH4 half saturation for pico             concpnh4  = ', concpnh4
722         WRITE(numout,*) '    NH4 half saturation for diatoms          concdnh4  = ', concdnh4
723         WRITE(numout,*) '    PO4 half saturation for phyto            concnpo4  = ', concnpo4
724         WRITE(numout,*) '    PO4 half saturation for pico             concppo4  = ', concppo4
725         WRITE(numout,*) '    PO4 half saturation for diatoms          concdpo4  = ', concdpo4
726         WRITE(numout,*) '    half saturation constant for Si uptake   xksi1     = ', xksi1
727         WRITE(numout,*) '    half saturation constant for Si/C        xksi2     = ', xksi2
728         WRITE(numout,*) '    half-sat. of DOC remineralization        xkdoc     = ', xkdoc
729         WRITE(numout,*) '    Iron half saturation for nanophyto       concnfer  = ', concnfer
730         WRITE(numout,*) '    Iron half saturation for picophyto       concpfer  = ', concpfer
731         WRITE(numout,*) '    Iron half saturation for diatoms         concdfer  = ', concdfer
732         WRITE(numout,*) '    size ratio for nanophytoplankton         xsizern   = ', xsizern
733         WRITE(numout,*) '    size ratio for picophytoplankton         xsizerp   = ', xsizerp
734         WRITE(numout,*) '    size ratio for diatoms                   xsizerd   = ', xsizerd
735         WRITE(numout,*) '    NO3 half saturation of bacteria          concbno3  = ', concbno3
736         WRITE(numout,*) '    NH4 half saturation for bacteria         concbnh4  = ', concbnh4
737         WRITE(numout,*) '    Minimum size criteria for diatoms        xsizedia  = ', xsizedia
738         WRITE(numout,*) '    Minimum size criteria for picophyto      xsizepic  = ', xsizepic
739         WRITE(numout,*) '    Minimum size criteria for nanophyto      xsizephy  = ', xsizephy
740         WRITE(numout,*) '    Fe half saturation for bacteria          concbfe   = ', concbfe
741         WRITE(numout,*) '    halk saturation constant for anoxia       oxymin   =' , oxymin
742      ENDIF
743
744      REWIND( numnatp_ref )              ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters
745      READ  ( numnatp_ref, namp5zquota, IOSTAT = ios, ERR = 903)
746903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisquota in reference namelist', lwp )
747
748      REWIND( numnatp_cfg )              ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters
749      READ  ( numnatp_cfg, namp5zquota, IOSTAT = ios, ERR = 904 )
750904   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisquota in configuration namelist', lwp )
751      IF(lwm) WRITE ( numonp, namp5zquota )
752
753      IF(lwp) THEN                         ! control print
754         WRITE(numout,*) ' '
755         WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zquota'
756         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
757         WRITE(numout,*) '    optimal Fe quota for nano.               qfnopt    = ', qfnopt
758         WRITE(numout,*) '    optimal Fe quota for pico.               qfpopt    = ', qfpopt
759         WRITE(numout,*) '    Optimal Fe quota for diatoms             qfdopt    = ', qfdopt
760         WRITE(numout,*) '    Minimal N quota for nano                 qnnmin    = ', qnnmin
761         WRITE(numout,*) '    Maximal N quota for nano                 qnnmax    = ', qnnmax
762         WRITE(numout,*) '    Minimal P quota for nano                 qpnmin    = ', qpnmin
763         WRITE(numout,*) '    Maximal P quota for nano                 qpnmax    = ', qpnmax
764         WRITE(numout,*) '    Minimal N quota for pico                 qnpmin    = ', qnpmin
765         WRITE(numout,*) '    Maximal N quota for pico                 qnpmax    = ', qnpmax
766         WRITE(numout,*) '    Minimal P quota for pico                 qppmin    = ', qppmin
767         WRITE(numout,*) '    Maximal P quota for pico                 qppmax    = ', qppmax
768         WRITE(numout,*) '    Minimal N quota for diatoms              qndmin    = ', qndmin
769         WRITE(numout,*) '    Maximal N quota for diatoms              qndmax    = ', qndmax
770         WRITE(numout,*) '    Minimal P quota for diatoms              qpdmin    = ', qpdmin
771         WRITE(numout,*) '    Maximal P quota for diatoms              qpdmax    = ', qpdmax
772         WRITE(numout,*) '    Maximal Fe quota for nanophyto.          qfnmax    = ', qfnmax
773         WRITE(numout,*) '    Maximal Fe quota for picophyto.          qfpmax    = ', qfpmax
774         WRITE(numout,*) '    Maximal Fe quota for diatoms             qfdmax    = ', qfdmax
775      ENDIF
776
777      zpsino3 = 2.3 * rno3
778      zpsinh4 = 1.8 * rno3
779      zpsiuptk = 2.3 * rno3
780      !
781      nitrfac (:,:,:) = 0._wp
782      !
783   END SUBROUTINE p5z_lim_init
784
785   INTEGER FUNCTION p4z_lim_alloc()
786      !!----------------------------------------------------------------------
787      !!                     ***  ROUTINE p5z_lim_alloc  ***
788      !!----------------------------------------------------------------------
789      USE lib_mpp , ONLY: ctl_warn
790      INTEGER ::   ierr(3)        ! Local variables
791      !!----------------------------------------------------------------------
792      ierr(:) = 0
793
794      !*  Biological arrays for phytoplankton growth
795      ALLOCATE( xnanono3(jpi,jpj,jpk), xdiatno3(jpi,jpj,jpk),       &
796         &      xnanonh4(jpi,jpj,jpk), xdiatnh4(jpi,jpj,jpk),       &
797         &      xnanopo4(jpi,jpj,jpk), xdiatpo4(jpi,jpj,jpk),       &
798         &      xlimphy (jpi,jpj,jpk), xlimdia (jpi,jpj,jpk),       &
799         &      xlimnfe (jpi,jpj,jpk), xlimdfe (jpi,jpj,jpk),       &
800         &      xlimbac (jpi,jpj,jpk), xlimbacl(jpi,jpj,jpk),       &
801         &      concnfe (jpi,jpj,jpk), concdfe (jpi,jpj,jpk),       &
802         &      xlimsi  (jpi,jpj,jpk), STAT=ierr(1) )
803
804      IF (ln_p5z) THEN
805      !*  Biological arrays for phytoplankton growth
806         ALLOCATE( xpicono3(jpi,jpj,jpk), xpiconh4(jpi,jpj,jpk),       &
807         &      xpicopo4(jpi,jpj,jpk), xpicodop(jpi,jpj,jpk),       &
808         &      xnanodop(jpi,jpj,jpk), xdiatdop(jpi,jpj,jpk),       &
809         &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       &
810         &      xpicofer(jpi,jpj,jpk), xlimpfe (jpi,jpj,jpk),       &
811         &      fvnuptk (jpi,jpj,jpk), fvduptk (jpi,jpj,jpk),       &
812         &      fvpuptk (jpi,jpj,jpk), xlimpic (jpi,jpj,jpk),       &
813         &      xlimsi2 (jpi,jpj,jpk), STAT=ierr(2) )
814
815      !*  Minimum/maximum quotas of phytoplankton
816         ALLOCATE( xqnnmin (jpi,jpj,jpk), xqnnmax(jpi,jpj,jpk),       &
817         &      xqpnmin (jpi,jpj,jpk), xqpnmax(jpi,jpj,jpk),       &
818         &      xqnpmin (jpi,jpj,jpk), xqnpmax(jpi,jpj,jpk),       &
819         &      xqppmin (jpi,jpj,jpk), xqppmax(jpi,jpj,jpk),       &
820         &      xqndmin (jpi,jpj,jpk), xqndmax(jpi,jpj,jpk),       &
821         &      xqpdmin (jpi,jpj,jpk), xqpdmax(jpi,jpj,jpk),     STAT=ierr(3) )
822      ENDIF
823      !
824
825      p4z_lim_alloc = MAXVAL( ierr ) 
826      !
827      IF( p4z_lim_alloc /= 0 ) CALL ctl_warn('p4z_lim_alloc : failed to allocate arrays.')
828      !
829   END FUNCTION p4z_lim_alloc
830
831   !!======================================================================
832END MODULE p4zlim
Note: See TracBrowser for help on using the repository browser.