source: branches/CNRS/dev_r6270_PISCES_QUOTA/NEMOGCM/NEMO/TOP_SRC/PISCES/P5Z/p5zlim.F90 @ 8004

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

update of p5zlim for N/P ratios

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