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.
p5zlim.F90 in NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p5zlim.F90 @ 12349

Last change on this file since 12349 was 12349, checked in by aumont, 4 years ago

update of the quota version of PISCES + some corrections of the GGE of zooplankton

File size: 36.4 KB
Line 
1MODULE p5zlim
2   !!======================================================================
3   !!                         ***  MODULE p5zlim  ***
4   !! TOP :   PISCES with variable stoichiometry
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   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
10   !!----------------------------------------------------------------------
11   !!   p5z_lim        :   Compute the nutrients limitation terms
12   !!   p5z_lim_init   :   Read the namelist
13   !!----------------------------------------------------------------------
14   USE oce_trc         ! Shared ocean-passive tracers variables
15   USE trc             ! Tracers defined
16   USE p4zlim
17   USE sms_pisces      ! PISCES variables
18   USE iom             !  I/O manager
19
20   IMPLICIT NONE
21   PRIVATE
22
23   PUBLIC p5z_lim   
24   PUBLIC p5z_lim_init   
25   PUBLIC p5z_lim_alloc
26
27   !! * Shared module variables
28   REAL(wp), PUBLIC ::  concpno3    !:  NO3 half saturation for picophyto 
29   REAL(wp), PUBLIC ::  concpnh4    !:  NH4 half saturation for picophyto
30   REAL(wp), PUBLIC ::  concnpo4    !:  PO4 half saturation for nanophyto
31   REAL(wp), PUBLIC ::  concppo4    !:  PO4 half saturation for picophyto
32   REAL(wp), PUBLIC ::  concdpo4    !:  PO4 half saturation for diatoms
33   REAL(wp), PUBLIC ::  concpfer    !:  Iron half saturation for picophyto
34   REAL(wp), PUBLIC ::  concbpo4    !:  PO4 half saturation for bacteria
35   REAL(wp), PUBLIC ::  xsizepic    !:  Minimum size criteria for picophyto
36   REAL(wp), PUBLIC ::  xsizerp     !:  Size ratio for picophytoplankton
37   REAL(wp), PUBLIC ::  qfnopt      !:  optimal Fe quota for nanophyto
38   REAL(wp), PUBLIC ::  qfpopt      !:  optimal Fe quota for picophyto
39   REAL(wp), PUBLIC ::  qfdopt      !:  optimal Fe quota for diatoms
40   REAL(wp), PUBLIC ::  qnnmin      !:  minimum N  quota for nanophyto
41   REAL(wp), PUBLIC ::  qnnmax      !:  maximum N quota for nanophyto
42   REAL(wp), PUBLIC ::  qpnmin      !:  minimum P quota for nanophyto
43   REAL(wp), PUBLIC ::  qpnmax      !:  maximum P quota for nanophyto
44   REAL(wp), PUBLIC ::  qnpmin      !:  minimum N quota for nanophyto
45   REAL(wp), PUBLIC ::  qnpmax      !:  maximum N quota for nanophyto
46   REAL(wp), PUBLIC ::  qppmin      !:  minimum P quota for nanophyto
47   REAL(wp), PUBLIC ::  qppmax      !:  maximum P quota for nanophyto
48   REAL(wp), PUBLIC ::  qndmin      !:  minimum N quota for diatoms
49   REAL(wp), PUBLIC ::  qndmax      !:  maximum N quota for diatoms
50   REAL(wp), PUBLIC ::  qpdmin      !:  minimum P quota for diatoms
51   REAL(wp), PUBLIC ::  qpdmax      !:  maximum P quota for diatoms
52   REAL(wp), PUBLIC ::  qfnmax      !:  maximum Fe quota for nanophyto
53   REAL(wp), PUBLIC ::  qfpmax      !:  maximum Fe quota for picophyto
54   REAL(wp), PUBLIC ::  qfdmax      !:  maximum Fe quota for diatoms
55   REAL(wp), PUBLIC ::  zpsinh4     !:  respiration cost of NH4 assimilation
56   REAL(wp), PUBLIC ::  zpsino3     !:  respiration cost of NO3 assimilation
57   REAL(wp), PUBLIC ::  zpsiuptk    !:  Mean respiration cost
58
59   !!*  Allometric variations of the quotas
60   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmin    !: ???
61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnnmax    !: ???
62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmin    !: ???
63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpnmax    !: ???
64   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmin    !: ???
65   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqnpmax    !: ???
66   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmin    !: ???
67   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqppmax    !: ???
68   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmin    !: ???
69   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqndmax    !: ???
70   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmin    !: ???
71   REAL(wp), PUBLIC, ALLOCATABLE, SAVE,   DIMENSION(:,:,:)  ::   xqpdmax    !: ???
72
73   !!* Phytoplankton nutrient limitation terms
74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicono3   !: ???
75   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpiconh4   !: ???
76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicopo4   !: ???
77   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanodop   !: ???
78   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicodop   !: ???
79   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatdop   !: ???
80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xnanofer   !: ???
81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xpicofer   !: ???
82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xdiatfer   !: ???
83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpic    !: ???
84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpics   !: ???
85   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimphys   !: ???
86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimdias   !: ???
87   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   xlimpfe    !: ???
88   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvnuptk
89   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvpuptk
90   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  ::   fvduptk
91
92   ! Coefficient for iron limitation
93   REAL(wp) ::  xcoef1   = 0.00167  / 55.85
94   REAL(wp) ::  xcoef2   = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5
95   REAL(wp) ::  xcoef3   = 1.15E-4 * 14. / 55.85 / 7.625 * 0.5 
96   !!----------------------------------------------------------------------
97   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
98   !! $Id: p5zlim.F90 10070 2018-08-28 14:30:54Z nicolasmartin $
99   !! Software governed by the CeCILL license (see ./LICENSE)
100   !!----------------------------------------------------------------------
101
102CONTAINS
103
104   SUBROUTINE p5z_lim( kt, knt )
105      !!---------------------------------------------------------------------
106      !!                     ***  ROUTINE p5z_lim  ***
107      !!
108      !! ** Purpose :   Compute the co-limitations by the various nutrients
109      !!                for the various phytoplankton species. Quota based
110      !!                approach. The quota model is derived from theoretical
111      !!                models proposed by Pahlow and Oschlies (2009) and
112      !!                Flynn (2001). Various adaptations from several publications
113      !!                by these authors have been also adopted.
114      !!
115      !! ** Method  : Quota based approach. The quota model is derived from
116      !!              theoretical models by Pahlow and Oschlies (2009) and
117      !!              Flynn (2001). Various adaptations from several publications
118      !!              by these authors have been also adopted.
119      !!---------------------------------------------------------------------
120      !
121      INTEGER, INTENT(in)  :: kt, knt
122      !
123      INTEGER  ::   ji, jj, jk
124      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim
125      REAL(wp) ::   z1_trndia, z1_trnpic, z1_trnphy, ztem1, ztem2, zetot1
126      REAL(wp) ::   zratio, zration, zratiof, znutlim, zfalim, zzpsiuptk
127      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4, zconc0npo4, zconc0dpo4
128      REAL(wp) ::   zconc0p, zconc0pnh4, zconc0ppo4, zconcpfe, zconcnfe, zconcdfe
129      REAL(wp) ::   fanano, fananop, fananof, fadiat, fadiatp, fadiatf
130      REAL(wp) ::   fapico, fapicop, fapicof
131      REAL(wp) ::   zrpho, zrass, zcoef, zfuptk, zratchl
132      REAL(wp) ::   zfvn, zfvp, zfvf, zsizen, zsizep, zsized, znanochl, zpicochl, zdiatchl
133      REAL(wp) ::   zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4
134      REAL(wp) ::   zlim1f, zsizetmp
135      REAL(wp), DIMENSION(jpi,jpj,jpk) :: xlimnpn, xlimnpp, xlimnpd
136      !!---------------------------------------------------------------------
137      !
138      IF( ln_timing )   CALL timing_start('p5z_lim')
139      !
140      zratchl = 6.0
141      sizena(:,:,:) = 0.0  ;  sizepa(:,:,:) = 0.0  ;  sizeda(:,:,:) = 0.0
142      !
143      DO jk = 1, jpkm1
144         DO jj = 1, jpj
145            DO ji = 1, jpi
146               !
147               ! Tuning of the iron concentration to a minimum level that is set to the detection limit
148               !-------------------------------------
149               zno3    = trb(ji,jj,jk,jpno3) / 40.e-6
150               zferlim = MAX( 3e-11 * zno3 * zno3, 5e-12 )
151               zferlim = MIN( zferlim, 7e-11 )
152               trb(ji,jj,jk,jpfer) = MAX( trb(ji,jj,jk,jpfer), zferlim )
153
154               ! Computation of the mean relative size of each community
155               ! -------------------------------------------------------
156               z1_trnphy   = 1. / ( trb(ji,jj,jk,jpphy) + rtrn )
157               z1_trnpic   = 1. / ( trb(ji,jj,jk,jppic) + rtrn )
158               z1_trndia   = 1. / ( trb(ji,jj,jk,jpdia) + rtrn )
159               znanochl = trb(ji,jj,jk,jpnch) * z1_trnphy
160               zpicochl = trb(ji,jj,jk,jppch) * z1_trnpic
161               zdiatchl = trb(ji,jj,jk,jpdch) * z1_trndia
162
163               ! Computation of a variable Ks for iron on diatoms taking into account
164               ! that increasing biomass is made of generally bigger cells
165               !------------------------------------------------
166               zsized            = sized(ji,jj,jk)**0.81
167               zconcdfe          = concdfer * zsized
168               zconc1d           = concdno3 * zsized
169               zconc1dnh4        = concdnh4 * zsized
170               zconc0dpo4        = concdpo4 * zsized
171
172               zsizep            = sizep(ji,jj,jk)**0.81
173               zconcpfe          = concpfer * zsizep
174               zconc0p           = concpno3 * zsizep
175               zconc0pnh4        = concpnh4 * zsizep
176               zconc0ppo4        = concppo4 * zsizep
177
178               zsizen            = sizen(ji,jj,jk)**0.81
179               zconcnfe          = concnfer * zsizen
180               zconc0n           = concnno3 * zsizen
181               zconc0nnh4        = concnnh4 * zsizen
182               zconc0npo4        = concnpo4 * zsizen
183
184               ! Allometric variations of the minimum and maximum quotas
185               ! From Talmy et al. (2014) and Maranon et al. (2013)
186               ! -------------------------------------------------------
187               xqnnmin(ji,jj,jk) = qnnmin * sizen(ji,jj,jk)**(-0.3)
188               xqnnmax(ji,jj,jk) = qnnmax
189               xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.3)
190               xqndmax(ji,jj,jk) = qndmax
191               xqnpmin(ji,jj,jk) = qnpmin * sizep(ji,jj,jk)**(-0.48)
192               xqnpmax(ji,jj,jk) = qnpmax * sizep(ji,jj,jk)**(-0.21)
193
194               ! Computation of the optimal allocation parameters
195               ! Based on the different papers by Pahlow et al., and Smith et al.
196               ! -----------------------------------------------------------------
197               znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc0nnh4,    &
198                 &         trb(ji,jj,jk,jpno3) / zconc0n)
199               fanano = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
200               znutlim = trb(ji,jj,jk,jppo4) / zconc0npo4
201               fananop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
202               znutlim = biron(ji,jj,jk) / zconcnfe
203               fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
204               znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc0pnh4,    &
205                 &         trb(ji,jj,jk,jpno3) / zconc0p)
206               fapico = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
207               znutlim = trb(ji,jj,jk,jppo4) / zconc0ppo4
208               fapicop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
209               znutlim = biron(ji,jj,jk) / zconcpfe
210               fapicof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
211               znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc1dnh4,    &
212                 &         trb(ji,jj,jk,jpno3) / zconc1d )
213               fadiat = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
214               znutlim = trb(ji,jj,jk,jppo4) / zconc0dpo4
215               fadiatp = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
216               znutlim = biron(ji,jj,jk) / zconcdfe
217               fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) )
218               !
219               ! Michaelis-Menten Limitation term for nutrients Small bacteria
220               ! -------------------------------------------------------------
221               zbactnh4 = trb(ji,jj,jk,jpnh4) / ( concbnh4 + trb(ji,jj,jk,jpnh4) )
222               zbactno3 = trb(ji,jj,jk,jpno3) / ( concbno3 + trb(ji,jj,jk,jpno3) ) * (1. - zbactnh4)
223               !
224               zlim1    = zbactno3 + zbactnh4
225               zlim2    = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concbpo4)
226               zlim3    = biron(ji,jj,jk) / ( concbfe + biron(ji,jj,jk) )
227               zlim4    = trb(ji,jj,jk,jpdoc) / ( xkdoc   + trb(ji,jj,jk,jpdoc) )
228               xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 )
229               xlimbac (ji,jj,jk) = xlimbacl(ji,jj,jk) * zlim4
230               !
231               ! Michaelis-Menten Limitation term for nutrients Small flagellates
232               ! -----------------------------------------------
233               zfalim = (1.-fanano) / fanano
234               xnanonh4(ji,jj,jk) = (1. - fanano) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc0nnh4 + trb(ji,jj,jk,jpnh4) )
235               xnanono3(ji,jj,jk) = (1. - fanano) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc0n + trb(ji,jj,jk,jpno3) )  &
236               &                    * (1. - xnanonh4(ji,jj,jk))
237               !
238               zfalim = (1.-fananop) / fananop
239               xnanopo4(ji,jj,jk) = (1. - fananop) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0npo4 )
240               xnanodop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc )   &
241               &                    * ( 1.0 - xnanopo4(ji,jj,jk) )
242               xnanodop(ji,jj,jk) = 0.
243               !
244               zfalim = (1.-fananof) / fananof
245               xnanofer(ji,jj,jk) = (1. - fananof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcnfe )
246               !
247               zratiof   = trb(ji,jj,jk,jpnfe) * z1_trnphy
248               zqfemn = xcoef1 * znanochl + xcoef2 + xcoef3 * xnanono3(ji,jj,jk)
249               !
250               zration = trb(ji,jj,jk,jpnph) * z1_trnphy
251               zration = MIN(xqnnmax(ji,jj,jk), MAX( xqnnmin(ji,jj,jk), zration ))
252               zzpsiuptk = xqnnmin(ji,jj,jk) * rno3 / zpsiuptk**2
253               fvnuptk(ji,jj,jk) = 1. / zzpsiuptk * xqnnmin(ji,jj,jk) / (zration + rtrn)  &
254               &                   * MAX(0., (1. - zratchl * znanochl / 12. ) )
255               !
256               zlim1  = max(0., (zration - xqnnmin(ji,jj,jk) )  &
257               &          / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk)  &
258               &          / (zration + rtrn)
259               !  The value of the optimal quota in the formulation below
260               !  has been found by solving a non linear equation
261               zlim1f = max(0., ( 1.086 - xqnnmin(ji,jj,jk) )  &
262               &          / (xqnnmax(ji,jj,jk) - xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk)
263               zlim3  = MAX( 0.,( zratiof - zqfemn ) / qfnopt )
264               xlimnfe (ji,jj,jk) = MIN( 1., zlim3 )
265               xlimphy (ji,jj,jk) = MIN( 1., zlim1, zlim3 )
266               xlimphys(ji,jj,jk) = MIN( 1., zlim1/( zlim1f + rtrn ), zlim3 )
267               xlimnpn (ji,jj,jk) = MIN( 1., zlim1)
268               !
269               ! Michaelis-Menten Limitation term for nutrients picophytoplankton
270               ! ----------------------------------------------------------------
271               zfalim = (1.-fapico) / fapico 
272               xpiconh4(ji,jj,jk) = (1. - fapico) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc0pnh4 + trb(ji,jj,jk,jpnh4) )
273               xpicono3(ji,jj,jk) = (1. - fapico) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc0p + trb(ji,jj,jk,jpno3) )  &
274               &                    * (1. - xpiconh4(ji,jj,jk))
275               !
276               zfalim = (1.-fapicop) / fapicop 
277               xpicopo4(ji,jj,jk) = (1. - fapicop) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0ppo4 )
278               xpicodop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc )   &
279               &                    * ( 1.0 - xpicopo4(ji,jj,jk) )
280               xpicodop(ji,jj,jk) = 0.
281               !
282               zfalim = (1.-fapicof) / fapicof
283               xpicofer(ji,jj,jk) = (1. - fapicof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcpfe )
284               !
285               zratiof   = trb(ji,jj,jk,jppfe) * z1_trnpic
286               zqfemp = xcoef1 * zpicochl + xcoef2 + xcoef3 * xpicono3(ji,jj,jk)
287               !
288               zration   = trb(ji,jj,jk,jpnpi) * z1_trnpic
289               zration = MIN(xqnpmax(ji,jj,jk), MAX( xqnpmin(ji,jj,jk), zration ))
290               zzpsiuptk = xqnpmin(ji,jj,jk) * rno3 / zpsiuptk**2
291               fvpuptk(ji,jj,jk) = 1. / zzpsiuptk * xqnpmin(ji,jj,jk) / (zration + rtrn)  &
292               &                   * MAX(0., (1. - zratchl * zpicochl / 12. ) ) 
293               !
294               zlim1    = max(0., (zration - xqnpmin(ji,jj,jk) )  &
295               &          / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk)  &
296               &          / (zration + rtrn)
297               !  The value of the optimal quota in the formulation below
298               !  has been found by solving a non linear equation
299               zlim1f   = max(0., (1.367 - xqnpmin(ji,jj,jk) )  &
300               &          / (xqnpmax(ji,jj,jk) - xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk)
301               zlim3    = MAX( 0.,( zratiof - zqfemp ) / qfpopt )
302               xlimpfe (ji,jj,jk) = MIN( 1., zlim3 )
303               xlimpic (ji,jj,jk) = MIN( 1., zlim1, zlim3 )
304               xlimnpp (ji,jj,jk) = MIN( 1., zlim1 )
305               xlimpics(ji,jj,jk) = MIN( 1., zlim1/( zlim1f + rtrn ), zlim3 )
306               !
307               !   Michaelis-Menten Limitation term for nutrients Diatoms
308               !   ------------------------------------------------------
309               zfalim = (1.-fadiat) / fadiat 
310               xdiatnh4(ji,jj,jk) = (1. - fadiat) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc1dnh4 + trb(ji,jj,jk,jpnh4) )
311               xdiatno3(ji,jj,jk) = (1. - fadiat) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc1d + trb(ji,jj,jk,jpno3) )  &
312               &                    * (1. - xdiatnh4(ji,jj,jk))
313               !
314               zfalim = (1.-fadiatp) / fadiatp
315               xdiatpo4(ji,jj,jk) = (1. - fadiatp) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0dpo4 )
316               xdiatdop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc )  &
317               &                    * ( 1.0 - xdiatpo4(ji,jj,jk) )
318               xdiatdop(ji,jj,jk) = 0.
319               !
320               zfalim = (1.-fadiatf) / fadiatf
321               xdiatfer(ji,jj,jk) = (1. - fadiatf) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcdfe )
322               !
323               zratiof   = trb(ji,jj,jk,jpdfe) * z1_trndia
324               zqfemd = xcoef1 * zdiatchl + xcoef2 + xcoef3 * xdiatno3(ji,jj,jk)
325               !
326               zration   = trb(ji,jj,jk,jpndi) * z1_trndia
327               zration   = MIN(xqndmax(ji,jj,jk), MAX( xqndmin(ji,jj,jk), zration ))
328               zzpsiuptk = xqndmin(ji,jj,jk) * rno3 / zpsiuptk**2
329               fvduptk(ji,jj,jk) = 1. / zzpsiuptk * xqndmin(ji,jj,jk) / (zration + rtrn)   &
330               &                   * MAX(0., (1. - zratchl * zdiatchl / 12. ) ) 
331               !
332               zlim1    = max(0., (zration - xqndmin(ji,jj,jk) )    &
333               &          / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) )   &
334               &          * xqndmax(ji,jj,jk) / (zration + rtrn)
335               !  The value of the optimal quota in the formulation below
336               !  has been found by solving a non linear equation
337               zlim1f   = max(0., (1.077 - xqndmin(ji,jj,jk) )    &
338               &          / (xqndmax(ji,jj,jk) - xqndmin(ji,jj,jk) ) )   &
339               &          * xqndmax(ji,jj,jk)
340               zlim3    = trb(ji,jj,jk,jpsil) / ( trb(ji,jj,jk,jpsil) + xksi(ji,jj) )
341               zlim4    = MAX( 0., ( zratiof - zqfemd ) / qfdopt )
342               xlimdfe(ji,jj,jk) = MIN( 1., zlim4 )
343               xlimdia(ji,jj,jk) = MIN( 1., zlim1, zlim3, zlim4 )
344               xlimdias(ji,jj,jk) = MIN (1.0, zlim1 / (zlim1f + rtrn ), zlim3, zlim4 )
345               xlimsi(ji,jj,jk)  = MIN( zlim1, zlim4 )
346               xlimnpd(ji,jj,jk) = MIN( 1., zlim1 )
347            END DO
348         END DO
349      END DO
350      !
351      ! Compute the phosphorus quota values. It is based on Litchmann et al., 2004 and Daines et al, 2013.
352      ! The relative contribution of three fonctional pools are computed: light harvesting apparatus,
353      ! nutrient uptake pool and assembly machinery. DNA is assumed to represent 1% of the dry mass of
354      ! phytoplankton (see Daines et al., 2013).
355      ! --------------------------------------------------------------------------------------------------
356      DO jk = 1, jpkm1
357         DO jj = 1, jpj
358            DO ji = 1, jpi
359               ! Size estimation of nanophytoplankton
360               ! ------------------------------------
361               zcoef = trb(ji,jj,jk,jpphy) - MIN(xsizephy, trb(ji,jj,jk,jpphy) )
362               sizena(ji,jj,jk) = 1. + ( xsizern -1.0 ) * zcoef / ( xsizephy + zcoef )
363               ! N/P ratio of nanophytoplankton
364               ! ------------------------------
365               zfuptk = 0.2 + 0.12 / ( 3.0 * sizen(ji,jj,jk) + rtrn )
366               zrpho  = 1.54 * trb(ji,jj,jk,jpnch) / ( trb(ji,jj,jk,jpnph) * rno3 * 14. + rtrn )
367               zrass = MAX(0.62/4., ( 1. - zrpho - zfuptk ) * xlimnpn(ji,jj,jk) )
368               xqpnmin(ji,jj,jk) = ( 0.0 + 0.0078 + 0.62/4. * 0.0783 * xqnnmin(ji,jj,jk) ) * 16.
369               xqpnmax(ji,jj,jk) = ( zrpho * 0.0128 + zrass * 0.0783 ) * 16.
370               xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) * trb(ji,jj,jk,jpnph) / ( trb(ji,jj,jk,jpphy) + rtrn )  &
371               &      + (0.033 + 0.0078 ) * 16.
372               xqpnmax(ji,jj,jk) = MIN( qpnmax, xqpnmax(ji,jj,jk) )
373
374
375               ! Size estimation of picophytoplankton
376               ! ------------------------------------
377               zcoef = trb(ji,jj,jk,jppic) - MIN(xsizepic, trb(ji,jj,jk,jppic) )
378               sizepa(ji,jj,jk) = 1. + ( xsizerp -1.0 ) * zcoef / ( xsizepic + zcoef )
379
380               ! N/P ratio of picophytoplankton
381               ! ------------------------------
382               zfuptk = 0.2 + 0.12 / ( 0.5 * sizep(ji,jj,jk) + rtrn )
383               zrpho = 1.54 * trb(ji,jj,jk,jppch) / ( trb(ji,jj,jk,jpnpi) * rno3 * 14. + rtrn )
384               zrass = MAX(0.4/4., ( 1. - zrpho - zfuptk ) * xlimnpp(ji,jj,jk) )
385               xqppmin(ji,jj,jk) = ( (0.0 + 0.0078 ) + 0.4/4. * 0.0517 * xqnpmin(ji,jj,jk) ) * 16.
386               xqppmax(ji,jj,jk) = ( zrpho * 0.0128 + zrass * 0.0517 ) * 16.
387               xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) * trb(ji,jj,jk,jpnpi) / ( trb(ji,jj,jk,jppic) + rtrn ) &
388               &      +  (0.033 + 0.0078 ) * 16
389               xqppmax(ji,jj,jk) = MIN( qppmax, xqppmax(ji,jj,jk) )
390
391               ! Size estimation of diatoms
392               ! --------------------------
393               zcoef = trb(ji,jj,jk,jpdia) - MIN(xsizedia, trb(ji,jj,jk,jpdia) )
394               sized(ji,jj,jk) = 1. + ( xsizerd - 1.0 ) * zcoef / ( xsizedia + zcoef )
395               sizeda(ji,jj,jk) = 1. + ( xsizerd - 1.0 ) * zcoef / ( xsizedia + zcoef )
396
397               ! N/P ratio of diatoms
398               ! --------------------
399               zfuptk = 0.2 + 0.12 / ( 5.0 * sized(ji,jj,jk) + rtrn )
400               zrpho = 1.54 * trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpndi) * rno3 * 14. + rtrn )
401               zrass = MAX(0.66/4., ( 1. - zrpho - zfuptk ) * xlimnpd(ji,jj,jk) )
402
403               xqpdmin(ji,jj,jk) = ( ( 0.0 + 0.0078 ) + 0.66/4. * 0.0783 *  xqndmin(ji,jj,jk) ) * 16.
404               xqpdmax(ji,jj,jk) = ( zrpho * 0.0128 + zrass * 0.0783 ) * 16.
405               xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) * trb(ji,jj,jk,jpndi) / ( trb(ji,jj,jk,jpdia) + rtrn ) &
406               &      + ( 0.0078 + 0.033 ) * 16.
407               xqpdmax(ji,jj,jk) = MIN(qpdmax, xqpdmax(ji,jj,jk) )
408
409            END DO
410         END DO
411      END DO
412
413      ! Compute the fraction of nanophytoplankton that is made of calcifiers
414      ! --------------------------------------------------------------------
415      DO jk = 1, jpkm1
416         DO jj = 1, jpj
417            DO ji = 1, jpi
418               zlim1 =  trb(ji,jj,jk,jpnh4) / ( trb(ji,jj,jk,jpnh4) + concnnh4 ) + trb(ji,jj,jk,jpno3)    &
419               &        / ( trb(ji,jj,jk,jpno3) + concnno3 ) * ( 1.0 - trb(ji,jj,jk,jpnh4)   &
420               &        / ( trb(ji,jj,jk,jpnh4) + concnnh4 ) )
421               zlim2  = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concnpo4 )
422               zlim3  = trb(ji,jj,jk,jpfer) / ( trb(ji,jj,jk,jpfer) +  5.E-11 ) 
423               ztem1  = MAX( 0., tsn(ji,jj,jk,jp_tem) )
424               ztem2  = tsn(ji,jj,jk,jp_tem) - 10.
425               zetot1 = MAX( 0., etot(ji,jj,jk) - 1.) / ( 4. + etot(ji,jj,jk) ) * 20. / ( 20. + etot(ji,jj,jk) ) 
426
427               xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )    &
428               &                   * ztem1 / ( 1. + ztem1 ) * MAX( 1., trb(ji,jj,jk,jpphy)*1E6 )   &
429                  &                * ( 1. + EXP(-ztem2 * ztem2 / 25. ) )         &
430                  &                * zetot1 * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) )
431               xfracal(ji,jj,jk) = MAX( 0.02, MIN( 0.8 , xfracal(ji,jj,jk) ) )
432            END DO
433         END DO
434      END DO
435      !
436      DO jk = 1, jpkm1
437         DO jj = 1, jpj
438            DO ji = 1, jpi
439               ! denitrification factor computed from O2 levels
440               nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - trb(ji,jj,jk,jpoxy) )    &
441                  &                                / ( oxymin + trb(ji,jj,jk,jpoxy) )  )
442               nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) )
443            END DO
444         END DO
445      END DO
446      !
447      IF( lk_iomput .AND. knt == nrdttrc ) THEN        ! save output diagnostics
448        IF( iom_use( "xfracal" ) ) CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) )  ! euphotic layer deptht
449        IF( iom_use( "LNnut"   ) ) CALL iom_put( "LNnut"  , xlimphy(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
450        IF( iom_use( "LPnut"   ) ) CALL iom_put( "LPnut"  , xlimpic(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
451        IF( iom_use( "LDnut"   ) ) CALL iom_put( "LDnut"  , xlimdia(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
452        IF( iom_use( "LNFe"    ) ) CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
453        IF( iom_use( "LPFe"    ) ) CALL iom_put( "LPFe"   , xlimpfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
454        IF( iom_use( "LDFe"    ) ) CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
455        IF( iom_use( "SIZEN"   ) ) CALL iom_put( "SIZEN"  , sizen(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
456        IF( iom_use( "SIZEP"   ) ) CALL iom_put( "SIZEP"  , sizep(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
457        IF( iom_use( "SIZED"   ) ) CALL iom_put( "SIZED"  , sized(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
458      ENDIF
459      !
460      IF( ln_timing )  CALL timing_stop('p5z_lim')
461      !
462   END SUBROUTINE p5z_lim
463
464
465   SUBROUTINE p5z_lim_init
466      !!----------------------------------------------------------------------
467      !!                  ***  ROUTINE p5z_lim_init  ***
468      !!
469      !! ** Purpose :   Initialization of nutrient limitation parameters
470      !!
471      !! ** Method  :   Read the nampislim and nampisquota namelists and check
472      !!      the parameters called at the first timestep (nittrc000)
473      !!
474      !! ** input   :   Namelist nampislim
475      !!
476      !!----------------------------------------------------------------------
477      INTEGER :: ios                 ! Local integer output status for namelist read
478      !!
479      NAMELIST/namp5zlim/ concnno3, concpno3, concdno3, concnnh4, concpnh4, concdnh4,  &
480         &                concnfer, concpfer, concdfer, concbfe, concnpo4, concppo4,   &
481         &                concdpo4, concbno3, concbnh4, concbpo4, xsizedia, xsizepic,  &
482         &                xsizephy, xsizern, xsizerp, xsizerd, xksi1, xksi2, xkdoc,    &
483         &                caco3r, oxymin
484         !
485      NAMELIST/namp5zquota/ qnnmin, qnnmax, qpnmin, qpnmax, qnpmin, qnpmax, qppmin,      &
486         &                  qppmax, qndmin, qndmax, qpdmin, qpdmax, qfnmax, qfpmax, qfdmax,  &
487         &                  qfnopt, qfpopt, qfdopt
488      !!----------------------------------------------------------------------
489      !
490      REWIND( numnatp_ref )              ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters
491      READ  ( numnatp_ref, namp5zlim, IOSTAT = ios, ERR = 901)
492901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in reference namelist' )
493      !
494      REWIND( numnatp_cfg )              ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters
495      READ  ( numnatp_cfg, namp5zlim, IOSTAT = ios, ERR = 902 )
496902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampislim in configuration namelist' )
497      IF(lwm) WRITE ( numonp, namp5zlim )
498      !
499      IF(lwp) THEN                         ! control print
500         WRITE(numout,*) ' '
501         WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zlim'
502         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
503         WRITE(numout,*) '    mean rainratio                           caco3r    = ', caco3r
504         WRITE(numout,*) '    NO3 half saturation of nanophyto         concnno3  = ', concnno3
505         WRITE(numout,*) '    NO3 half saturation of picophyto         concpno3  = ', concpno3
506         WRITE(numout,*) '    NO3 half saturation of diatoms           concdno3  = ', concdno3
507         WRITE(numout,*) '    NH4 half saturation for phyto            concnnh4  = ', concnnh4
508         WRITE(numout,*) '    NH4 half saturation for pico             concpnh4  = ', concpnh4
509         WRITE(numout,*) '    NH4 half saturation for diatoms          concdnh4  = ', concdnh4
510         WRITE(numout,*) '    PO4 half saturation for phyto            concnpo4  = ', concnpo4
511         WRITE(numout,*) '    PO4 half saturation for pico             concppo4  = ', concppo4
512         WRITE(numout,*) '    PO4 half saturation for diatoms          concdpo4  = ', concdpo4
513         WRITE(numout,*) '    half saturation constant for Si uptake   xksi1     = ', xksi1
514         WRITE(numout,*) '    half saturation constant for Si/C        xksi2     = ', xksi2
515         WRITE(numout,*) '    half-sat. of DOC remineralization        xkdoc     = ', xkdoc
516         WRITE(numout,*) '    Iron half saturation for nanophyto       concnfer  = ', concnfer
517         WRITE(numout,*) '    Iron half saturation for picophyto       concpfer  = ', concpfer
518         WRITE(numout,*) '    Iron half saturation for diatoms         concdfer  = ', concdfer
519         WRITE(numout,*) '    size ratio for nanophytoplankton         xsizern   = ', xsizern
520         WRITE(numout,*) '    size ratio for picophytoplankton         xsizerp   = ', xsizerp
521         WRITE(numout,*) '    size ratio for diatoms                   xsizerd   = ', xsizerd
522         WRITE(numout,*) '    NO3 half saturation of bacteria          concbno3  = ', concbno3
523         WRITE(numout,*) '    NH4 half saturation for bacteria         concbnh4  = ', concbnh4
524         WRITE(numout,*) '    Minimum size criteria for diatoms        xsizedia  = ', xsizedia
525         WRITE(numout,*) '    Minimum size criteria for picophyto      xsizepic  = ', xsizepic
526         WRITE(numout,*) '    Minimum size criteria for nanophyto      xsizephy  = ', xsizephy
527         WRITE(numout,*) '    Fe half saturation for bacteria          concbfe   = ', concbfe
528         WRITE(numout,*) '    halk saturation constant for anoxia       oxymin   =' , oxymin
529      ENDIF
530
531      REWIND( numnatp_ref )              ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters
532      READ  ( numnatp_ref, namp5zquota, IOSTAT = ios, ERR = 903)
533903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisquota in reference namelist' )
534      !
535      REWIND( numnatp_cfg )              ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters
536      READ  ( numnatp_cfg, namp5zquota, IOSTAT = ios, ERR = 904 )
537904   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampisquota in configuration namelist' )
538      IF(lwm) WRITE ( numonp, namp5zquota )
539      !
540      IF(lwp) THEN                         ! control print
541         WRITE(numout,*) ' '
542         WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zquota'
543         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
544         WRITE(numout,*) '    optimal Fe quota for nano.               qfnopt    = ', qfnopt
545         WRITE(numout,*) '    optimal Fe quota for pico.               qfpopt    = ', qfpopt
546         WRITE(numout,*) '    Optimal Fe quota for diatoms             qfdopt    = ', qfdopt
547         WRITE(numout,*) '    Minimal N quota for nano                 qnnmin    = ', qnnmin
548         WRITE(numout,*) '    Maximal N quota for nano                 qnnmax    = ', qnnmax
549         WRITE(numout,*) '    Minimal P quota for nano                 qpnmin    = ', qpnmin
550         WRITE(numout,*) '    Maximal P quota for nano                 qpnmax    = ', qpnmax
551         WRITE(numout,*) '    Minimal N quota for pico                 qnpmin    = ', qnpmin
552         WRITE(numout,*) '    Maximal N quota for pico                 qnpmax    = ', qnpmax
553         WRITE(numout,*) '    Minimal P quota for pico                 qppmin    = ', qppmin
554         WRITE(numout,*) '    Maximal P quota for pico                 qppmax    = ', qppmax
555         WRITE(numout,*) '    Minimal N quota for diatoms              qndmin    = ', qndmin
556         WRITE(numout,*) '    Maximal N quota for diatoms              qndmax    = ', qndmax
557         WRITE(numout,*) '    Minimal P quota for diatoms              qpdmin    = ', qpdmin
558         WRITE(numout,*) '    Maximal P quota for diatoms              qpdmax    = ', qpdmax
559         WRITE(numout,*) '    Maximal Fe quota for nanophyto.          qfnmax    = ', qfnmax
560         WRITE(numout,*) '    Maximal Fe quota for picophyto.          qfpmax    = ', qfpmax
561         WRITE(numout,*) '    Maximal Fe quota for diatoms             qfdmax    = ', qfdmax
562      ENDIF
563      !
564      zpsino3  = 2.3 * rno3
565      zpsinh4  = 1.8 * rno3
566      zpsiuptk = 1.0 / 6.625
567      !
568      nitrfac (:,:,:) = 0._wp
569      !
570   END SUBROUTINE p5z_lim_init
571
572
573   INTEGER FUNCTION p5z_lim_alloc()
574      !!----------------------------------------------------------------------
575      !!                     ***  ROUTINE p5z_lim_alloc  ***
576      !!----------------------------------------------------------------------
577      USE lib_mpp , ONLY: ctl_stop
578      INTEGER ::   ierr(2)        ! Local variables
579      !!----------------------------------------------------------------------
580      ierr(:) = 0
581      !
582      !*  Biological arrays for phytoplankton growth
583      ALLOCATE( xpicono3(jpi,jpj,jpk), xpiconh4(jpi,jpj,jpk),       &
584         &      xpicopo4(jpi,jpj,jpk), xpicodop(jpi,jpj,jpk),       &
585         &      xnanodop(jpi,jpj,jpk), xdiatdop(jpi,jpj,jpk),       &
586         &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       &
587         &      xpicofer(jpi,jpj,jpk), xlimpfe (jpi,jpj,jpk),       &
588         &      fvnuptk (jpi,jpj,jpk), fvduptk (jpi,jpj,jpk),       &
589         &      xlimphys(jpi,jpj,jpk), xlimdias(jpi,jpj,jpk),       &
590         &      xlimpics(jpi,jpj,jpk),                              &
591         &      fvpuptk (jpi,jpj,jpk), xlimpic (jpi,jpj,jpk),    STAT=ierr(1) )
592         !
593      !*  Minimum/maximum quotas of phytoplankton
594      ALLOCATE( xqnnmin (jpi,jpj,jpk), xqnnmax(jpi,jpj,jpk),       &
595         &      xqpnmin (jpi,jpj,jpk), xqpnmax(jpi,jpj,jpk),       &
596         &      xqnpmin (jpi,jpj,jpk), xqnpmax(jpi,jpj,jpk),       &
597         &      xqppmin (jpi,jpj,jpk), xqppmax(jpi,jpj,jpk),       &
598         &      xqndmin (jpi,jpj,jpk), xqndmax(jpi,jpj,jpk),       &
599         &      xqpdmin (jpi,jpj,jpk), xqpdmax(jpi,jpj,jpk),     STAT=ierr(2) )
600         !
601      p5z_lim_alloc = MAXVAL( ierr )
602      !
603      IF( p5z_lim_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_lim_alloc : failed to allocate arrays.' )
604      !
605   END FUNCTION p5z_lim_alloc
606   !!======================================================================
607END MODULE p5zlim
Note: See TracBrowser for help on using the repository browser.