source: NEMO/branches/2020/dev_r12563_ASINTER-06_ABL_improvement/src/TOP/PISCES/P4Z/p5zlim.F90

Last change on this file was 12377, checked in by acc, 10 months ago

The big one. Merging all 2019 developments from the option 1 branch back onto the trunk.

This changeset reproduces 2019/dev_r11943_MERGE_2019 on the trunk using a 2-URL merge
onto a working copy of the trunk. I.e.:

svn merge —ignore-ancestry \

svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/trunk \
svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/branches/2019/dev_r11943_MERGE_2019 ./

The —ignore-ancestry flag avoids problems that may otherwise arise from the fact that
the merge history been trunk and branch may have been applied in a different order but
care has been taken before this step to ensure that all applicable fixes and updates
are present in the merge branch.

The trunk state just before this step has been branched to releases/release-4.0-HEAD
and that branch has been immediately tagged as releases/release-4.0.2. Any fixes
or additions in response to tickets on 4.0, 4.0.1 or 4.0.2 should be done on
releases/release-4.0-HEAD. From now on future 'point' releases (e.g. 4.0.2) will
remain unchanged with periodic releases as needs demand. Note release-4.0-HEAD is a
transitional naming convention. Future full releases, say 4.2, will have a release-4.2
branch which fulfills this role and the first point release (e.g. 4.2.0) will be made
immediately following the release branch creation.

2020 developments can be started from any trunk revision later than this one.

File size: 31.3 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   !! * Substitutions
94#  include "do_loop_substitute.h90"
95   !!----------------------------------------------------------------------
96   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
97   !! $Id: p5zlim.F90 10070 2018-08-28 14:30:54Z nicolasmartin $
98   !! Software governed by the CeCILL license (see ./LICENSE)
99   !!----------------------------------------------------------------------
100
101CONTAINS
102
103   SUBROUTINE p5z_lim( kt, knt, Kbb, Kmm )
104      !!---------------------------------------------------------------------
105      !!                     ***  ROUTINE p5z_lim  ***
106      !!
107      !! ** Purpose :   Compute the co-limitations by the various nutrients
108      !!              for the various phytoplankton species
109      !!
110      !! ** Method  : - ???
111      !!---------------------------------------------------------------------
112      !
113      INTEGER, INTENT(in)  :: kt, knt
114      INTEGER, INTENT(in)  :: Kbb, Kmm  ! time level indices
115      !
116      INTEGER  ::   ji, jj, jk
117      REAL(wp) ::   zlim1, zlim2, zlim3, zlim4, zno3, zferlim
118      REAL(wp) ::   z1_trndia, z1_trnpic, z1_trnphy, ztem1, ztem2, zetot1
119      REAL(wp) ::   zratio, zration, zratiof, znutlim, zfalim
120      REAL(wp) ::   zconc1d, zconc1dnh4, zconc0n, zconc0nnh4, zconc0npo4, zconc0dpo4
121      REAL(wp) ::   zconc0p, zconc0pnh4, zconc0ppo4, zconcpfe, zconcnfe, zconcdfe
122      REAL(wp) ::   fanano, fananop, fananof, fadiat, fadiatp, fadiatf
123      REAL(wp) ::   fapico, fapicop, fapicof
124      REAL(wp) ::   zrpho, zrass, zcoef, zfuptk, zratchl
125      REAL(wp) ::   zfvn, zfvp, zfvf, zsizen, zsizep, zsized, znanochl, zpicochl, zdiatchl
126      REAL(wp) ::   zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4
127      !!---------------------------------------------------------------------
128      !
129      IF( ln_timing )   CALL timing_start('p5z_lim')
130      !
131      zratchl = 6.0
132      !
133      DO_3D_11_11( 1, jpkm1 )
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_3D
314      !
315      ! Compute the phosphorus quota values. It is based on Litchmann et al., 2004 and Daines et al, 2013.
316      ! The relative contribution of three fonctional pools are computed: light harvesting apparatus,
317      ! nutrient uptake pool and assembly machinery. DNA is assumed to represent 1% of the dry mass of
318      ! phytoplankton (see Daines et al., 2013).
319      ! --------------------------------------------------------------------------------------------------
320      DO_3D_11_11( 1, jpkm1 )
321         ! Size estimation of nanophytoplankton
322         ! ------------------------------------
323         zfvn = 2. * fvnuptk(ji,jj,jk)
324         sizen(ji,jj,jk) = MAX(1., MIN(xsizern, 1.0 / ( MAX(rtrn, zfvn) ) ) )
325
326         ! N/P ratio of nanophytoplankton
327         ! ------------------------------
328         zfuptk = 0.23 * zfvn
329         zrpho = 2.24 * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpnph,Kbb) * rno3 * 15. + rtrn )
330         zrass = 1. - 0.2 - zrpho - zfuptk
331         xqpnmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16.
332         xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) * tr(ji,jj,jk,jpnph,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) + 0.13
333         xqpnmin(ji,jj,jk) = 0.13 + 0.23 * 0.0128 * 16.
334
335         ! Size estimation of picophytoplankton
336         ! ------------------------------------
337         zfvn = 2. * fvpuptk(ji,jj,jk)
338         sizep(ji,jj,jk) = MAX(1., MIN(xsizerp, 1.0 / ( MAX(rtrn, zfvn) ) ) )
339
340         ! N/P ratio of picophytoplankton
341         ! ------------------------------
342         zfuptk = 0.35 * zfvn
343         zrpho = 2.24 * tr(ji,jj,jk,jppch,Kbb) / ( tr(ji,jj,jk,jpnpi,Kbb) * rno3 * 15. + rtrn )
344         zrass = 1. - 0.4 - zrpho - zfuptk
345         xqppmax(ji,jj,jk) =  (zrpho + zfuptk) * 0.0128 * 16. + zrass * 1./ 9. * 16.
346         xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) * tr(ji,jj,jk,jpnpi,Kbb) / ( tr(ji,jj,jk,jppic,Kbb) + rtrn ) + 0.13
347         xqppmin(ji,jj,jk) = 0.13
348
349         ! Size estimation of diatoms
350         ! --------------------------
351         zfvn = 2. * fvduptk(ji,jj,jk)
352         sized(ji,jj,jk) = MAX(1., MIN(xsizerd, 1.0 / ( MAX(rtrn, zfvn) ) ) )
353         zcoef = tr(ji,jj,jk,jpdia,Kbb) - MIN(xsizedia, tr(ji,jj,jk,jpdia,Kbb) )
354         sized(ji,jj,jk) = 1. + xsizerd * zcoef *1E6 / ( 1. + zcoef * 1E6 )
355
356         ! N/P ratio of diatoms
357         ! --------------------
358         zfuptk = 0.2 * zfvn
359         zrpho = 2.24 * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpndi,Kbb) * rno3 * 15. + rtrn )
360         zrass = 1. - 0.2 - zrpho - zfuptk
361         xqpdmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16.
362         xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) * tr(ji,jj,jk,jpndi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) + 0.13
363         xqpdmin(ji,jj,jk) = 0.13 + 0.2 * 0.0128 * 16.
364
365      END_3D
366
367      ! Compute the fraction of nanophytoplankton that is made of calcifiers
368      ! --------------------------------------------------------------------
369      DO_3D_11_11( 1, jpkm1 )
370         zlim1 =  tr(ji,jj,jk,jpnh4,Kbb) / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) + tr(ji,jj,jk,jpno3,Kbb)    &
371         &        / ( tr(ji,jj,jk,jpno3,Kbb) + concnno3 ) * ( 1.0 - tr(ji,jj,jk,jpnh4,Kbb)   &
372         &        / ( tr(ji,jj,jk,jpnh4,Kbb) + concnnh4 ) )
373         zlim2  = tr(ji,jj,jk,jppo4,Kbb) / ( tr(ji,jj,jk,jppo4,Kbb) + concnpo4 )
374         zlim3  = tr(ji,jj,jk,jpfer,Kbb) / ( tr(ji,jj,jk,jpfer,Kbb) +  5.E-11 ) 
375         ztem1  = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) )
376         ztem2  = ts(ji,jj,jk,jp_tem,Kmm) - 10.
377         zetot1 = MAX( 0., etot(ji,jj,jk) - 1.) / ( 4. + etot(ji,jj,jk) ) * 20. / ( 20. + etot(ji,jj,jk) ) 
378
379!               xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 )                  &
380         xfracal(ji,jj,jk) = caco3r                 &
381         &                   * ztem1 / ( 1. + ztem1 ) * MAX( 1., tr(ji,jj,jk,jpphy,Kbb)*1E6 )   &
382            &                * ( 1. + EXP(-ztem2 * ztem2 / 25. ) )         &
383            &                * zetot1 * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) )
384         xfracal(ji,jj,jk) = MAX( 0.02, MIN( 0.8 , xfracal(ji,jj,jk) ) )
385      END_3D
386      !
387      DO_3D_11_11( 1, jpkm1 )
388         ! denitrification factor computed from O2 levels
389         nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - tr(ji,jj,jk,jpoxy,Kbb) )    &
390            &                                / ( oxymin + tr(ji,jj,jk,jpoxy,Kbb) )  )
391         nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) )
392      END_3D
393      !
394      IF( lk_iomput .AND. knt == nrdttrc ) THEN        ! save output diagnostics
395        CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) )  ! euphotic layer deptht
396        CALL iom_put( "LNnut"  , xlimphy(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
397        CALL iom_put( "LPnut"  , xlimpic(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
398        CALL iom_put( "LDnut"  , xlimdia(:,:,:) * tmask(:,:,:) )  ! Nutrient limitation term
399        CALL iom_put( "LNFe"   , xlimnfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
400        CALL iom_put( "LPFe"   , xlimpfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
401        CALL iom_put( "LDFe"   , xlimdfe(:,:,:) * tmask(:,:,:) )  ! Iron limitation term
402        CALL iom_put( "SIZEN"  , sizen  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
403        CALL iom_put( "SIZEP"  , sizep  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
404        CALL iom_put( "SIZED"  , sized  (:,:,:) * tmask(:,:,:) )  ! Iron limitation term
405      ENDIF
406      !
407      IF( ln_timing )  CALL timing_stop('p5z_lim')
408      !
409   END SUBROUTINE p5z_lim
410
411
412   SUBROUTINE p5z_lim_init
413      !!----------------------------------------------------------------------
414      !!                  ***  ROUTINE p5z_lim_init  ***
415      !!
416      !! ** Purpose :   Initialization of nutrient limitation parameters
417      !!
418      !! ** Method  :   Read the nampislim and nampisquota namelists and check
419      !!      the parameters called at the first timestep (nittrc000)
420      !!
421      !! ** input   :   Namelist nampislim
422      !!
423      !!----------------------------------------------------------------------
424      INTEGER :: ios                 ! Local integer output status for namelist read
425      !!
426      NAMELIST/namp5zlim/ concnno3, concpno3, concdno3, concnnh4, concpnh4, concdnh4,  &
427         &                concnfer, concpfer, concdfer, concbfe, concnpo4, concppo4,   &
428         &                concdpo4, concbno3, concbnh4, concbpo4, xsizedia, xsizepic,  &
429         &                xsizephy, xsizern, xsizerp, xsizerd, xksi1, xksi2, xkdoc,    &
430         &                caco3r, oxymin
431         !
432      NAMELIST/namp5zquota/ qnnmin, qnnmax, qpnmin, qpnmax, qnpmin, qnpmax, qppmin,      &
433         &                  qppmax, qndmin, qndmax, qpdmin, qpdmax, qfnmax, qfpmax, qfdmax,  &
434         &                  qfnopt, qfpopt, qfdopt
435      !!----------------------------------------------------------------------
436      !
437      READ  ( numnatp_ref, namp5zlim, IOSTAT = ios, ERR = 901)
438901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in reference namelist' )
439      !
440      READ  ( numnatp_cfg, namp5zlim, IOSTAT = ios, ERR = 902 )
441902   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampislim in configuration namelist' )
442      IF(lwm) WRITE ( numonp, namp5zlim )
443      !
444      IF(lwp) THEN                         ! control print
445         WRITE(numout,*) ' '
446         WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zlim'
447         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
448         WRITE(numout,*) '    mean rainratio                           caco3r    = ', caco3r
449         WRITE(numout,*) '    NO3 half saturation of nanophyto         concnno3  = ', concnno3
450         WRITE(numout,*) '    NO3 half saturation of picophyto         concpno3  = ', concpno3
451         WRITE(numout,*) '    NO3 half saturation of diatoms           concdno3  = ', concdno3
452         WRITE(numout,*) '    NH4 half saturation for phyto            concnnh4  = ', concnnh4
453         WRITE(numout,*) '    NH4 half saturation for pico             concpnh4  = ', concpnh4
454         WRITE(numout,*) '    NH4 half saturation for diatoms          concdnh4  = ', concdnh4
455         WRITE(numout,*) '    PO4 half saturation for phyto            concnpo4  = ', concnpo4
456         WRITE(numout,*) '    PO4 half saturation for pico             concppo4  = ', concppo4
457         WRITE(numout,*) '    PO4 half saturation for diatoms          concdpo4  = ', concdpo4
458         WRITE(numout,*) '    half saturation constant for Si uptake   xksi1     = ', xksi1
459         WRITE(numout,*) '    half saturation constant for Si/C        xksi2     = ', xksi2
460         WRITE(numout,*) '    half-sat. of DOC remineralization        xkdoc     = ', xkdoc
461         WRITE(numout,*) '    Iron half saturation for nanophyto       concnfer  = ', concnfer
462         WRITE(numout,*) '    Iron half saturation for picophyto       concpfer  = ', concpfer
463         WRITE(numout,*) '    Iron half saturation for diatoms         concdfer  = ', concdfer
464         WRITE(numout,*) '    size ratio for nanophytoplankton         xsizern   = ', xsizern
465         WRITE(numout,*) '    size ratio for picophytoplankton         xsizerp   = ', xsizerp
466         WRITE(numout,*) '    size ratio for diatoms                   xsizerd   = ', xsizerd
467         WRITE(numout,*) '    NO3 half saturation of bacteria          concbno3  = ', concbno3
468         WRITE(numout,*) '    NH4 half saturation for bacteria         concbnh4  = ', concbnh4
469         WRITE(numout,*) '    Minimum size criteria for diatoms        xsizedia  = ', xsizedia
470         WRITE(numout,*) '    Minimum size criteria for picophyto      xsizepic  = ', xsizepic
471         WRITE(numout,*) '    Minimum size criteria for nanophyto      xsizephy  = ', xsizephy
472         WRITE(numout,*) '    Fe half saturation for bacteria          concbfe   = ', concbfe
473         WRITE(numout,*) '    halk saturation constant for anoxia       oxymin   =' , oxymin
474      ENDIF
475
476      READ  ( numnatp_ref, namp5zquota, IOSTAT = ios, ERR = 903)
477903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisquota in reference namelist' )
478      !
479      READ  ( numnatp_cfg, namp5zquota, IOSTAT = ios, ERR = 904 )
480904   IF( ios >  0 ) CALL ctl_nam ( ios , 'nampisquota in configuration namelist' )
481      IF(lwm) WRITE ( numonp, namp5zquota )
482      !
483      IF(lwp) THEN                         ! control print
484         WRITE(numout,*) ' '
485         WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zquota'
486         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
487         WRITE(numout,*) '    optimal Fe quota for nano.               qfnopt    = ', qfnopt
488         WRITE(numout,*) '    optimal Fe quota for pico.               qfpopt    = ', qfpopt
489         WRITE(numout,*) '    Optimal Fe quota for diatoms             qfdopt    = ', qfdopt
490         WRITE(numout,*) '    Minimal N quota for nano                 qnnmin    = ', qnnmin
491         WRITE(numout,*) '    Maximal N quota for nano                 qnnmax    = ', qnnmax
492         WRITE(numout,*) '    Minimal P quota for nano                 qpnmin    = ', qpnmin
493         WRITE(numout,*) '    Maximal P quota for nano                 qpnmax    = ', qpnmax
494         WRITE(numout,*) '    Minimal N quota for pico                 qnpmin    = ', qnpmin
495         WRITE(numout,*) '    Maximal N quota for pico                 qnpmax    = ', qnpmax
496         WRITE(numout,*) '    Minimal P quota for pico                 qppmin    = ', qppmin
497         WRITE(numout,*) '    Maximal P quota for pico                 qppmax    = ', qppmax
498         WRITE(numout,*) '    Minimal N quota for diatoms              qndmin    = ', qndmin
499         WRITE(numout,*) '    Maximal N quota for diatoms              qndmax    = ', qndmax
500         WRITE(numout,*) '    Minimal P quota for diatoms              qpdmin    = ', qpdmin
501         WRITE(numout,*) '    Maximal P quota for diatoms              qpdmax    = ', qpdmax
502         WRITE(numout,*) '    Maximal Fe quota for nanophyto.          qfnmax    = ', qfnmax
503         WRITE(numout,*) '    Maximal Fe quota for picophyto.          qfpmax    = ', qfpmax
504         WRITE(numout,*) '    Maximal Fe quota for diatoms             qfdmax    = ', qfdmax
505      ENDIF
506      !
507      zpsino3 = 2.3 * rno3
508      zpsinh4 = 1.8 * rno3
509      zpsiuptk = 2.3 * rno3
510      !
511      nitrfac(:,:,jpk) = 0._wp
512      xfracal(:,:,jpk) = 0._wp
513      xlimphy(:,:,jpk) = 0._wp
514      xlimpic(:,:,jpk) = 0._wp
515      xlimdia(:,:,jpk) = 0._wp
516      xlimnfe(:,:,jpk) = 0._wp
517      xlimpfe(:,:,jpk) = 0._wp
518      xlimdfe(:,:,jpk) = 0._wp
519      sizen  (:,:,jpk) = 0._wp
520      sizep  (:,:,jpk) = 0._wp
521      sized  (:,:,jpk) = 0._wp
522      !
523   END SUBROUTINE p5z_lim_init
524
525
526   INTEGER FUNCTION p5z_lim_alloc()
527      !!----------------------------------------------------------------------
528      !!                     ***  ROUTINE p5z_lim_alloc  ***
529      !!----------------------------------------------------------------------
530      USE lib_mpp , ONLY: ctl_stop
531      INTEGER ::   ierr(2)        ! Local variables
532      !!----------------------------------------------------------------------
533      ierr(:) = 0
534      !
535      !*  Biological arrays for phytoplankton growth
536      ALLOCATE( xpicono3(jpi,jpj,jpk), xpiconh4(jpi,jpj,jpk),       &
537         &      xpicopo4(jpi,jpj,jpk), xpicodop(jpi,jpj,jpk),       &
538         &      xnanodop(jpi,jpj,jpk), xdiatdop(jpi,jpj,jpk),       &
539         &      xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk),       &
540         &      xpicofer(jpi,jpj,jpk), xlimpfe (jpi,jpj,jpk),       &
541         &      fvnuptk (jpi,jpj,jpk), fvduptk (jpi,jpj,jpk),       &
542         &      fvpuptk (jpi,jpj,jpk), xlimpic (jpi,jpj,jpk),    STAT=ierr(1) )
543         !
544      !*  Minimum/maximum quotas of phytoplankton
545      ALLOCATE( xqnnmin (jpi,jpj,jpk), xqnnmax(jpi,jpj,jpk),       &
546         &      xqpnmin (jpi,jpj,jpk), xqpnmax(jpi,jpj,jpk),       &
547         &      xqnpmin (jpi,jpj,jpk), xqnpmax(jpi,jpj,jpk),       &
548         &      xqppmin (jpi,jpj,jpk), xqppmax(jpi,jpj,jpk),       &
549         &      xqndmin (jpi,jpj,jpk), xqndmax(jpi,jpj,jpk),       &
550         &      xqpdmin (jpi,jpj,jpk), xqpdmax(jpi,jpj,jpk),     STAT=ierr(2) )
551         !
552      p5z_lim_alloc = MAXVAL( ierr )
553      !
554      IF( p5z_lim_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_lim_alloc : failed to allocate arrays.' )
555      !
556   END FUNCTION p5z_lim_alloc
557   !!======================================================================
558END MODULE p5zlim
Note: See TracBrowser for help on using the repository browser.