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_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/TOP/PISCES/P4Z – NEMO

source: NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/TOP/PISCES/P4Z/p5zlim.F90 @ 10975

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

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : Finish converting all TOP routines and knock-on effects of these conversions. Fully SETTE tested (SETTE tests 1-6 and 9). This completes the first stage conversion of TRA and TOP but need to revisit and pass ts and tr arrays through the argument lists where appropriate.

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