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.
p2zbio.F90 in branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/TOP_SRC/PISCES/P2Z – NEMO

source: branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/TOP_SRC/PISCES/P2Z/p2zbio.F90 @ 5443

Last change on this file since 5443 was 5443, checked in by davestorkey, 9 years ago

Update 2015/dev_r5021_UKMO1_CICE_coupling branch to revision 5442 of the trunk.

  • Property svn:keywords set to Id
File size: 29.1 KB
Line 
1MODULE p2zbio
2   !!======================================================================
3   !!                         ***  MODULE p2zbio  ***
4   !! TOP :   LOBSTER
5   !!======================================================================
6   !! History :    -   !  1999-07  (M. Levy) Original code
7   !!              -   !  2000-12  (E. Kestenare) assign a parameter to name individual tracers
8   !!              -   !  2001-03  (M. Levy)  LNO3 + dia2d
9   !!             2.0  !  2007-12  (C. Deltel, G. Madec)  F90
10   !!----------------------------------------------------------------------
11#if defined key_pisces_reduced
12   !!----------------------------------------------------------------------
13   !!   'key_pisces_reduced'                                     LOBSTER bio-model
14   !!----------------------------------------------------------------------
15   !!   p2z_bio        : 
16   !!----------------------------------------------------------------------
17   USE oce_trc         !
18   USE trc             !
19   USE sms_pisces
20   USE p2zopt
21   USE lbclnk          !
22   USE prtctl_trc      ! Print control for debbuging
23   USE trd_oce
24   USE trdtrc
25   USE iom
26   
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   p2z_bio         ! called in ???
31   PUBLIC   p2z_bio_init    ! called in ???
32
33   REAL(wp) ::   tmumax     ! maximal phytoplankton growth rate            [s-1]
34   REAL(wp) ::   rgamma     ! phytoplankton exudation fraction             [%]
35   REAL(wp) ::   fphylab    ! NH4 fraction of phytoplankton exsudation
36   REAL(wp) ::   tmminp     ! minimal phytoplancton mortality rate         [0.05/86400 s-1=20 days]
37   REAL(wp) ::   aki        ! light photosynthesis half saturation constant[W/m2]
38   !
39   REAL(wp) ::   akno3      ! nitrate limitation half-saturation value     [mmol/m3]
40   REAL(wp) ::   aknh4      ! ammonium limitation half-saturation value    [mmol/m3]
41   REAL(wp) ::   taunn      ! nitrification rate                           [s-1]
42   REAL(wp) ::   psinut     ! inhibition of nitrate uptake by ammonium
43   !
44   REAL(wp) ::   taudn      ! detritus breakdown rate                        [0.1/86400 s-1=10 days]
45   REAL(wp) ::   fdetlab    ! NH4 fraction of detritus dissolution
46   !
47   REAL(wp) ::   taudomn    ! DOM breakdown rate                             [s-1]
48   !                        ! slow remineralization rate of semi-labile dom to nh4 (1 month)
49   !
50   REAL(wp) ::   rppz       ! ivlev coeff for zoo mortality
51   REAL(wp) ::   taus       ! specific zooplankton maximal grazing rate              [s-1]
52   !                                     ! 0.75/86400 s-1=8.680555E-6    1/86400 = 1.15e-5
53   REAL(wp) ::   aks        ! half-saturation constant for total zooplankton grazing [mmolN.m-3]
54   REAL(wp) ::   rpnaz      ! non-assimilated phytoplankton by zooplancton           [%]
55   REAL(wp) ::   rdnaz      ! non-assimilated detritus by zooplankton                [%]
56   REAL(wp) ::   tauzn      ! zooplancton specific excretion rate                    [0.1/86400 s-1=10 days]
57   REAL(wp) ::   tmminz     ! minimal zooplankton mortality rate                     [(mmolN/m3)-1 d-1]
58   REAL(wp) ::   fzoolab    ! NH4 fraction of zooplankton excretion
59   REAL(wp) ::   fdbod      ! zooplankton mortality fraction that goes to detritus
60
61   !!* Substitution
62#  include "top_substitute.h90"
63   !!----------------------------------------------------------------------
64   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
65   !! $Id$
66   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
67   !!----------------------------------------------------------------------
68
69CONTAINS
70
71   SUBROUTINE p2z_bio( kt )
72      !!---------------------------------------------------------------------
73      !!                     ***  ROUTINE p2z_bio  ***
74      !!
75      !! ** Purpose :   compute the now trend due to biogeochemical processes
76      !!              and add it to the general trend of passive tracers equations
77      !!
78      !! ** Method  :   each now biological flux is calculated in function of now
79      !!              concentrations of tracers.
80      !!              depending on the tracer, these fluxes are sources or sinks.
81      !!              the total of the sources and sinks for each tracer
82      !!              is added to the general trend.
83      !!       
84      !!                      tra = tra + zf...tra - zftra...
85      !!                                     |         |
86      !!                                     |         |
87      !!                                  source      sink
88      !!       
89      !!              IF 'key_diabio' defined , the biogeochemical trends
90      !!              for passive tracers are saved for futher diagnostics.
91      !!---------------------------------------------------------------------
92      !!
93      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index     
94      !!
95      INTEGER  ::   ji, jj, jk, jl
96      REAL(wp) ::   zdet, zzoo, zphy, zno3, znh4, zdom      ! now concentrations
97      REAL(wp) ::   zlno3, zlnh4, zle, zlt                  ! limitation terms for phyto
98      REAL(wp) ::   zno3phy, znh4phy, zphynh4, zphydom
99      REAL(wp) ::   zphydet, zphyzoo, zdetzoo
100      REAL(wp) ::   zzoonh4, zzoodom, zzoodet, zdetnh4, zdetdom
101      REAL(wp) ::   znh4no3, zdomnh4, zppz, zpdz, zpppz, zppdz, zfood
102      REAL(wp) ::   zfilpz, zfildz, zphya, zzooa, zno3a
103      REAL(wp) ::   znh4a, zdeta, zdoma, zzoobod, zboddet, zdomaju
104      REAL(wp) ::   ze3t
105      REAL(wp), POINTER,   DIMENSION(:,:,:) :: zw2d
106      REAL(wp), POINTER, DIMENSION(:,:,:,:) :: zw3d
107      CHARACTER (len=25) :: charout
108      !!---------------------------------------------------------------------
109      !
110      IF( nn_timing == 1 )  CALL timing_start('p2z_bio')
111      !
112      IF( ln_diatrc .OR. lk_iomput ) THEN
113         CALL wrk_alloc( jpi, jpj,     17, zw2d )
114         CALL wrk_alloc( jpi, jpj, jpk, 3, zw3d )
115      ENDIF
116
117      IF( kt == nittrc000 ) THEN
118         IF(lwp) WRITE(numout,*)
119         IF(lwp) WRITE(numout,*) ' p2z_bio: LOBSTER bio-model'
120         IF(lwp) WRITE(numout,*) ' ~~~~~~~'
121      ENDIF
122
123      xksi(:,:) = 0.e0        ! zooplakton closure ( fbod)
124      IF( ln_diatrc .OR. lk_iomput ) THEN
125         zw2d  (:,:,:) = 0.e0
126         zw3d(:,:,:,:) = 0.e0
127      ENDIF
128
129      !                                      ! -------------------------- !
130      DO jk = 1, jpkbm1                      !  Upper ocean (bio-layers)  !
131         !                                   ! -------------------------- !
132         DO jj = 2, jpjm1
133            DO ji = fs_2, fs_jpim1 
134               ! trophic variables( det, zoo, phy, no3, nh4, dom)
135               ! ------------------------------------------------
136
137               ! negative trophic variables DO not contribute to the fluxes
138               zdet = MAX( 0.e0, trn(ji,jj,jk,jpdet) )
139               zzoo = MAX( 0.e0, trn(ji,jj,jk,jpzoo) )
140               zphy = MAX( 0.e0, trn(ji,jj,jk,jpphy) )
141               zno3 = MAX( 0.e0, trn(ji,jj,jk,jpno3) )
142               znh4 = MAX( 0.e0, trn(ji,jj,jk,jpnh4) )
143               zdom = MAX( 0.e0, trn(ji,jj,jk,jpdom) )
144
145               ! Limitations
146               zlt   = 1.
147               zle   = 1. - EXP( -etot(ji,jj,jk) / aki / zlt )
148               ! psinut,akno3,aknh4 added by asklod AS Kremeur 2005-03
149               zlno3 = zno3 * EXP( -psinut * znh4 ) / ( akno3 + zno3 )
150               zlnh4 = znh4 / (znh4+aknh4) 
151
152               ! sinks and sources
153               !    phytoplankton production and exsudation
154               zno3phy = tmumax * zle * zlt * zlno3 * zphy
155               znh4phy = tmumax * zle * zlt * zlnh4 * zphy
156
157               !    fphylab added by asklod AS Kremeur 2005-03
158               zphydom = rgamma * (1 - fphylab) * (zno3phy + znh4phy)
159               zphynh4 = rgamma * fphylab * (zno3phy + znh4phy)
160               ! zooplankton production
161               !    preferences
162               zppz = rppz
163               zpdz = 1. - rppz
164               zpppz = ( zppz * zphy ) / ( ( zppz * zphy + zpdz * zdet ) + 1.e-13 )
165               zppdz = ( zpdz * zdet ) / ( ( zppz * zphy + zpdz * zdet ) + 1.e-13 )
166               zfood = zpppz * zphy + zppdz * zdet
167               !    filtration
168               zfilpz = taus * zpppz / (aks + zfood)
169               zfildz = taus * zppdz / (aks + zfood)
170               !    grazing
171               zphyzoo = zfilpz * zphy * zzoo
172               zdetzoo = zfildz * zdet * zzoo
173
174               ! fecal pellets production
175               zzoodet = rpnaz * zphyzoo + rdnaz * zdetzoo
176
177               ! zooplankton liquide excretion
178               zzoonh4 = tauzn * fzoolab * zzoo 
179               zzoodom = tauzn * (1 - fzoolab) * zzoo
180
181               ! mortality
182               !    phytoplankton mortality
183               zphydet = tmminp * zphy
184
185               !    zooplankton mortality
186               !    closure : flux grazing is redistributed below level jpkbio
187               zzoobod = tmminz * zzoo * zzoo
188               xksi(ji,jj) = xksi(ji,jj) + (1-fdbod) * zzoobod * fse3t(ji,jj,jk)
189               zboddet = fdbod * zzoobod
190
191               ! detritus and dom breakdown
192               zdetnh4 = taudn * fdetlab * zdet
193               zdetdom = taudn * (1 - fdetlab) * zdet
194
195               zdomnh4 = taudomn * zdom
196
197               ! flux added to express how the excess of nitrogen from
198               ! PHY, ZOO and DET to DOM goes directly to NH4 (flux of ajustment)
199               zdomaju = (1 - redf/reddom) * (zphydom + zzoodom + zdetdom)
200
201               ! Nitrification
202               znh4no3 = taunn * znh4
203
204               ! determination of trends
205               !    total trend for each biological tracer
206               zphya =   zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet
207               zzooa =   zphyzoo + zdetzoo - zzoodet - zzoodom - zzoonh4 - zzoobod
208               zno3a = - zno3phy + znh4no3
209               znh4a = - znh4phy - znh4no3 + zphynh4 + zzoonh4 + zdomnh4 + zdetnh4 + zdomaju
210               zdeta =   zphydet + zzoodet - zdetzoo - zdetnh4 - zdetdom + zboddet
211               zdoma =   zphydom + zzoodom + zdetdom - zdomnh4 - zdomaju
212
213               ! tracer flux at totox-point added to the general trend
214               tra(ji,jj,jk,jpdet) = tra(ji,jj,jk,jpdet) + zdeta
215               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) + zzooa
216               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zphya
217               tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zno3a
218               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + znh4a
219               tra(ji,jj,jk,jpdom) = tra(ji,jj,jk,jpdom) + zdoma
220
221
222               IF( ( ln_diabio .AND. .NOT. lk_iomput ) .OR. l_trdtrc ) THEN
223                  trbio(ji,jj,jk,jp_pcs0_trd     ) = zno3phy
224                  trbio(ji,jj,jk,jp_pcs0_trd +  1) = znh4phy
225                  trbio(ji,jj,jk,jp_pcs0_trd +  2) = zphynh4
226                  trbio(ji,jj,jk,jp_pcs0_trd +  3) = zphydom
227                  trbio(ji,jj,jk,jp_pcs0_trd +  4) = zphyzoo
228                  trbio(ji,jj,jk,jp_pcs0_trd +  5) = zphydet
229                  trbio(ji,jj,jk,jp_pcs0_trd +  6) = zdetzoo
230                  !  trend number 8 in p2zsed
231                  trbio(ji,jj,jk,jp_pcs0_trd +  8) = zzoodet
232                  trbio(ji,jj,jk,jp_pcs0_trd +  9) = zzoobod
233                  trbio(ji,jj,jk,jp_pcs0_trd + 10) = zzoonh4
234                  trbio(ji,jj,jk,jp_pcs0_trd + 11) = zzoodom
235                  trbio(ji,jj,jk,jp_pcs0_trd + 12) = znh4no3
236                  trbio(ji,jj,jk,jp_pcs0_trd + 13) = zdomnh4
237                  trbio(ji,jj,jk,jp_pcs0_trd + 14) = zdetnh4
238                  trbio(ji,jj,jk,jp_pcs0_trd + 15) = zdetdom
239                  !  trend number 17 in p2zexp
240                ENDIF
241                IF( ln_diatrc .OR. lk_iomput ) THEN
242                  ! convert fluxes in per day
243                  ze3t = fse3t(ji,jj,jk) * 86400.
244                  zw2d(ji,jj,1)  = zw2d(ji,jj,1)  + zno3phy * ze3t
245                  zw2d(ji,jj,2)  = zw2d(ji,jj,2)  + znh4phy * ze3t
246                  zw2d(ji,jj,3)  = zw2d(ji,jj,3)  + zphydom * ze3t
247                  zw2d(ji,jj,4)  = zw2d(ji,jj,4)  + zphynh4 * ze3t
248                  zw2d(ji,jj,5)  = zw2d(ji,jj,5)  + zphyzoo * ze3t
249                  zw2d(ji,jj,6)  = zw2d(ji,jj,6)  + zphydet * ze3t
250                  zw2d(ji,jj,7)  = zw2d(ji,jj,7)  + zdetzoo * ze3t
251                  zw2d(ji,jj,8)  = zw2d(ji,jj,8)  + zzoodet * ze3t
252                  zw2d(ji,jj,9)  = zw2d(ji,jj,9)  + zzoobod * ze3t
253                  zw2d(ji,jj,10) = zw2d(ji,jj,10) + zzoonh4 * ze3t
254                  zw2d(ji,jj,11) = zw2d(ji,jj,11) + zzoodom * ze3t
255                  zw2d(ji,jj,12) = zw2d(ji,jj,12) + znh4no3 * ze3t
256                  zw2d(ji,jj,13) = zw2d(ji,jj,13) + zdomnh4 * ze3t
257                  zw2d(ji,jj,14) = zw2d(ji,jj,14) + zdetnh4 * ze3t
258                  zw2d(ji,jj,15) = zw2d(ji,jj,15) + ( zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet ) * ze3t
259                  zw2d(ji,jj,16) = zw2d(ji,jj,16) + ( zphyzoo + zdetzoo - zzoodet - zzoobod - zzoonh4 - zzoodom ) * ze3t
260                  zw2d(ji,jj,17) = zw2d(ji,jj,17) + zdetdom * ze3t
261                  !   
262                  zw3d(ji,jj,jk,1) = zno3phy * 86400
263                  zw3d(ji,jj,jk,2) = znh4phy * 86400     
264                  zw3d(ji,jj,jk,3) = znh4no3 * 86400   
265                   !
266                ENDIF
267            END DO
268         END DO
269      END DO
270
271      !                                      ! -------------------------- !
272      DO jk = jpkb, jpkm1                    !  Upper ocean (bio-layers)  !
273         !                                   ! -------------------------- !
274         DO jj = 2, jpjm1
275            DO ji = fs_2, fs_jpim1 
276               ! remineralisation of all quantities towards nitrate
277
278               !    trophic variables( det, zoo, phy, no3, nh4, dom)
279               !       negative trophic variables DO not contribute to the fluxes
280               zdet = MAX( 0.e0, trn(ji,jj,jk,jpdet) )
281               zzoo = MAX( 0.e0, trn(ji,jj,jk,jpzoo) )
282               zphy = MAX( 0.e0, trn(ji,jj,jk,jpphy) )
283               zno3 = MAX( 0.e0, trn(ji,jj,jk,jpno3) )
284               znh4 = MAX( 0.e0, trn(ji,jj,jk,jpnh4) )
285               zdom = MAX( 0.e0, trn(ji,jj,jk,jpdom) )
286
287               !    Limitations
288               zlt   = 0.e0
289               zle   = 0.e0
290               zlno3 = 0.e0
291               zlnh4 = 0.e0
292
293               !    sinks and sources
294               !       phytoplankton production and exsudation
295               zno3phy = 0.e0
296               znh4phy = 0.e0
297               zphydom = 0.e0
298               zphynh4 = 0.e0
299
300               !    zooplankton production
301               zphyzoo = 0.e0      ! grazing
302               zdetzoo = 0.e0
303
304               zzoodet = 0.e0      ! fecal pellets production
305
306               zzoonh4 = tauzn * fzoolab * zzoo         ! zooplankton liquide excretion
307               zzoodom = tauzn * (1 - fzoolab) * zzoo
308
309               !    mortality
310               zphydet = tmminp * zphy      ! phytoplankton mortality
311
312               zzoobod = 0.e0               ! zooplankton mortality
313               zboddet = 0.e0               ! closure : flux fbod is redistributed below level jpkbio
314
315               !    detritus and dom breakdown
316               zdetnh4 = taudn * fdetlab * zdet
317               zdetdom = taudn * (1 - fdetlab) * zdet
318
319               zdomnh4 = taudomn * zdom
320               zdomaju = (1 - redf/reddom) * (zphydom + zzoodom + zdetdom)
321
322               !    Nitrification
323               znh4no3 = taunn * znh4
324
325
326               ! determination of trends
327               !     total trend for each biological tracer
328               zphya =   zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet
329               zzooa =   zphyzoo + zdetzoo - zzoodet - zzoodom - zzoonh4 - zzoobod
330               zno3a = - zno3phy + znh4no3 
331               znh4a = - znh4phy - znh4no3 + zphynh4 + zzoonh4 + zdomnh4 + zdetnh4 + zdomaju
332               zdeta = zphydet + zzoodet  - zdetzoo - zdetnh4 - zdetdom + zboddet
333               zdoma = zphydom + zzoodom + zdetdom - zdomnh4 - zdomaju
334
335               ! tracer flux at totox-point added to the general trend
336               tra(ji,jj,jk,jpdet) = tra(ji,jj,jk,jpdet) + zdeta
337               tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) + zzooa
338               tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zphya
339               tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zno3a
340               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + znh4a
341               tra(ji,jj,jk,jpdom) = tra(ji,jj,jk,jpdom) + zdoma
342               !
343               IF( ( ln_diabio .AND. .NOT. lk_iomput ) .OR. l_trdtrc ) THEN
344                  trbio(ji,jj,jk,jp_pcs0_trd     ) = zno3phy
345                  trbio(ji,jj,jk,jp_pcs0_trd +  1) = znh4phy
346                  trbio(ji,jj,jk,jp_pcs0_trd +  2) = zphynh4
347                  trbio(ji,jj,jk,jp_pcs0_trd +  3) = zphydom
348                  trbio(ji,jj,jk,jp_pcs0_trd +  4) = zphyzoo
349                  trbio(ji,jj,jk,jp_pcs0_trd +  5) = zphydet
350                  trbio(ji,jj,jk,jp_pcs0_trd +  6) = zdetzoo
351                  !  trend number 8 in p2zsed
352                  trbio(ji,jj,jk,jp_pcs0_trd +  8) = zzoodet
353                  trbio(ji,jj,jk,jp_pcs0_trd +  9) = zzoobod
354                  trbio(ji,jj,jk,jp_pcs0_trd + 10) = zzoonh4
355                  trbio(ji,jj,jk,jp_pcs0_trd + 11) = zzoodom
356                  trbio(ji,jj,jk,jp_pcs0_trd + 12) = znh4no3
357                  trbio(ji,jj,jk,jp_pcs0_trd + 13) = zdomnh4
358                  trbio(ji,jj,jk,jp_pcs0_trd + 14) = zdetnh4
359                  trbio(ji,jj,jk,jp_pcs0_trd + 15) = zdetdom
360                  !  trend number 17 in p2zexp
361                ENDIF
362                IF( ln_diatrc .OR. lk_iomput ) THEN
363                  ! convert fluxes in per day
364                  ze3t = fse3t(ji,jj,jk) * 86400.
365                  zw2d(ji,jj,1)  = zw2d(ji,jj,1)  + zno3phy * ze3t
366                  zw2d(ji,jj,2)  = zw2d(ji,jj,2)  + znh4phy * ze3t
367                  zw2d(ji,jj,3)  = zw2d(ji,jj,3)  + zphydom * ze3t
368                  zw2d(ji,jj,4)  = zw2d(ji,jj,4)  + zphynh4 * ze3t
369                  zw2d(ji,jj,5)  = zw2d(ji,jj,5)  + zphyzoo * ze3t
370                  zw2d(ji,jj,6)  = zw2d(ji,jj,6)  + zphydet * ze3t
371                  zw2d(ji,jj,7)  = zw2d(ji,jj,7)  + zdetzoo * ze3t
372                  zw2d(ji,jj,8)  = zw2d(ji,jj,8)  + zzoodet * ze3t
373                  zw2d(ji,jj,9)  = zw2d(ji,jj,9)  + zzoobod * ze3t
374                  zw2d(ji,jj,10) = zw2d(ji,jj,10) + zzoonh4 * ze3t
375                  zw2d(ji,jj,11) = zw2d(ji,jj,11) + zzoodom * ze3t
376                  zw2d(ji,jj,12) = zw2d(ji,jj,12) + znh4no3 * ze3t
377                  zw2d(ji,jj,13) = zw2d(ji,jj,13) + zdomnh4 * ze3t
378                  zw2d(ji,jj,14) = zw2d(ji,jj,14) + zdetnh4 * ze3t
379                  zw2d(ji,jj,15) = zw2d(ji,jj,15) + ( zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet ) * ze3t
380                  zw2d(ji,jj,16) = zw2d(ji,jj,16) + ( zphyzoo + zdetzoo - zzoodet - zzoobod - zzoonh4 - zzoodom ) * ze3t
381                  zw2d(ji,jj,17) = zw2d(ji,jj,17) + zdetdom * ze3t
382                  !   
383                  zw3d(ji,jj,jk,1) = zno3phy * 86400
384                  zw3d(ji,jj,jk,2) = znh4phy * 86400
385                  zw3d(ji,jj,jk,3) = znh4no3 * 86400
386                   !
387                ENDIF
388            END DO
389         END DO
390      END DO
391
392      IF( ln_diatrc .OR. lk_iomput ) THEN
393         DO jl = 1, 17 
394            CALL lbc_lnk( zw2d(:,:,jl),'T', 1. )
395         END DO
396         DO jl = 1, 3
397            CALL lbc_lnk( zw3d(:,:,:,jl),'T', 1. )
398         END DO
399      ENDIF
400      IF( lk_iomput ) THEN
401            ! Save diagnostics
402        CALL iom_put( "TNO3PHY", zw2d(:,:,1) )
403        CALL iom_put( "TNH4PHY", zw2d(:,:,2) )
404        CALL iom_put( "TPHYDOM", zw2d(:,:,3) )
405        CALL iom_put( "TPHYNH4", zw2d(:,:,4) )
406        CALL iom_put( "TPHYZOO", zw2d(:,:,5) )
407        CALL iom_put( "TPHYDET", zw2d(:,:,6) )
408        CALL iom_put( "TDETZOO", zw2d(:,:,7) )
409        CALL iom_put( "TZOODET", zw2d(:,:,8) )
410        CALL iom_put( "TZOOBOD", zw2d(:,:,9) )
411        CALL iom_put( "TZOONH4", zw2d(:,:,10) )
412        CALL iom_put( "TZOODOM", zw2d(:,:,11) )
413        CALL iom_put( "TNH4NO3", zw2d(:,:,12) )
414        CALL iom_put( "TDOMNH4", zw2d(:,:,13) )
415        CALL iom_put( "TDETNH4", zw2d(:,:,14) )
416        CALL iom_put( "TPHYTOT", zw2d(:,:,15) )
417        CALL iom_put( "TZOOTOT", zw2d(:,:,16) )
418         !
419        CALL iom_put( "FNO3PHY", zw3d(:,:,:,1) )
420        CALL iom_put( "FNH4PHY", zw3d(:,:,:,2) )
421        CALL iom_put( "FNH4NO3", zw3d(:,:,:,3) )
422         !
423       ELSE
424          IF( ln_diatrc ) THEN
425            !
426            trc2d(:,:,jp_pcs0_2d    ) = zw2d(:,:,1) 
427            trc2d(:,:,jp_pcs0_2d + 1) = zw2d(:,:,2) 
428            trc2d(:,:,jp_pcs0_2d + 2) = zw2d(:,:,3) 
429            trc2d(:,:,jp_pcs0_2d + 3) = zw2d(:,:,4) 
430            trc2d(:,:,jp_pcs0_2d + 4) = zw2d(:,:,5) 
431            trc2d(:,:,jp_pcs0_2d + 5) = zw2d(:,:,6) 
432            trc2d(:,:,jp_pcs0_2d + 6) = zw2d(:,:,7) 
433                     ! trend number 8 is in p2zsed.F
434            trc2d(:,:,jp_pcs0_2d +  8) = zw2d(:,:,8) 
435            trc2d(:,:,jp_pcs0_2d +  9) = zw2d(:,:,9) 
436            trc2d(:,:,jp_pcs0_2d + 10) = zw2d(:,:,10) 
437            trc2d(:,:,jp_pcs0_2d + 11) = zw2d(:,:,11) 
438            trc2d(:,:,jp_pcs0_2d + 12) = zw2d(:,:,12) 
439            trc2d(:,:,jp_pcs0_2d + 13) = zw2d(:,:,13) 
440            trc2d(:,:,jp_pcs0_2d + 14) = zw2d(:,:,14) 
441            trc2d(:,:,jp_pcs0_2d + 15) = zw2d(:,:,15) 
442            trc2d(:,:,jp_pcs0_2d + 16) = zw2d(:,:,16) 
443            trc2d(:,:,jp_pcs0_2d + 17) = zw2d(:,:,17) 
444            ! trend number 19 is in p2zexp.F
445            trc3d(:,:,:,jp_pcs0_3d    ) = zw3d(:,:,:,1) 
446            trc3d(:,:,:,jp_pcs0_3d + 1) = zw3d(:,:,:,2) 
447            trc3d(:,:,:,jp_pcs0_3d + 2) = zw3d(:,:,:,3) 
448         ENDIF
449        !
450      ENDIF
451
452      IF( ln_diabio .AND. .NOT. lk_iomput )  THEN
453         DO jl = jp_pcs0_trd, jp_pcs1_trd
454            CALL lbc_lnk( trbio(:,:,1,jl),'T', 1. )
455         END DO
456      ENDIF
457      !
458      IF( l_trdtrc ) THEN
459         DO jl = jp_pcs0_trd, jp_pcs1_trd
460            CALL trd_trc( trbio(:,:,:,jl), jl, kt )   ! handle the trend
461         END DO
462      ENDIF
463
464      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
465         WRITE(charout, FMT="('bio')")
466         CALL prt_ctl_trc_info(charout)
467         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
468      ENDIF
469      !
470      IF( ln_diatrc .OR. lk_iomput ) THEN
471         CALL wrk_dealloc( jpi, jpj,     17, zw2d )
472         CALL wrk_dealloc( jpi, jpj, jpk, 3, zw3d )
473      ENDIF
474      !
475      IF( nn_timing == 1 )  CALL timing_stop('p2z_bio')
476      !
477   END SUBROUTINE p2z_bio
478
479   SUBROUTINE p2z_bio_init
480      !!----------------------------------------------------------------------
481      !!                  ***  ROUTINE p2z_bio_init  ***
482      !!
483      !! ** Purpose :  biological parameters
484      !!
485      !! ** Method  :   Read namelist and check the parameters
486      !!
487      !!----------------------------------------------------------------------
488      NAMELIST/namlobphy/ tmumax, rgamma, fphylab, tmminp, aki
489      NAMELIST/namlobnut/ akno3, aknh4, taunn, psinut
490      NAMELIST/namlobzoo/ rppz, taus, aks, rpnaz, rdnaz, tauzn, fzoolab, fdbod, tmminz
491      NAMELIST/namlobdet/  taudn, fdetlab
492      NAMELIST/namlobdom/ taudomn
493      INTEGER :: ios                 ! Local integer output status for namelist read
494      !!----------------------------------------------------------------------
495
496      REWIND( numnatp_ref )              ! Namelist namlobphy in reference namelist : Lobster biological parameters
497      READ  ( numnatp_ref, namlobphy, IOSTAT = ios, ERR = 901)
498901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobphy in reference namelist', lwp )
499
500      REWIND( numnatp_cfg )              ! Namelist namlobphy in configuration namelist : Lobster biological parameters
501      READ  ( numnatp_cfg, namlobphy, IOSTAT = ios, ERR = 902 )
502902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobphy in configuration namelist', lwp )
503      IF(lwm) WRITE ( numonp, namlobphy )
504
505      IF(lwp) THEN
506          WRITE(numout,*) ' Namelist namlobphy'
507          WRITE(numout,*) '    phyto max growth rate                                tmumax    =', 86400 * tmumax, ' d'
508          WRITE(numout,*) '    phytoplankton exudation fraction                     rgamma    =', rgamma
509          WRITE(numout,*) '    NH4 fraction of phytoplankton exsudation             fphylab   =', fphylab
510          WRITE(numout,*) '    minimal phyto mortality rate                         tmminp    =', 86400 * tmminp
511          WRITE(numout,*) '    light hlaf saturation constant                       aki       =', aki
512          WRITE(numout,*) ' '
513      ENDIF
514
515      REWIND( numnatp_ref )              ! Namelist namlobnut in reference namelist : Lobster nutriments parameters
516      READ  ( numnatp_ref, namlobnut, IOSTAT = ios, ERR = 903)
517903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobnut in reference namelist', lwp )
518
519      REWIND( numnatp_cfg )              ! Namelist namlobnut in configuration namelist : Lobster nutriments parameters
520      READ  ( numnatp_cfg, namlobnut, IOSTAT = ios, ERR = 904 )
521904   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobnut in configuration namelist', lwp )
522      IF(lwm) WRITE ( numonp, namlobnut )
523
524      IF(lwp) THEN
525          WRITE(numout,*) ' Namelist namlobnut'
526          WRITE(numout,*) '    half-saturation nutrient for no3 uptake              akno3     =', akno3
527          WRITE(numout,*) '    half-saturation nutrient for nh4 uptake              aknh4     =', aknh4
528          WRITE(numout,*) '    nitrification rate                                   taunn     =', taunn
529          WRITE(numout,*) '    inhibition of no3 uptake by nh4                      psinut    =', psinut
530          WRITE(numout,*) ' '
531      ENDIF
532
533      REWIND( numnatp_ref )              ! Namelist namlobzoo in reference namelist : Lobster zooplankton parameters
534      READ  ( numnatp_ref, namlobzoo, IOSTAT = ios, ERR = 905)
535905   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobzoo in reference namelist', lwp )
536
537      REWIND( numnatp_cfg )              ! Namelist namlobzoo in configuration namelist : Lobster zooplankton parameters
538      READ  ( numnatp_cfg, namlobzoo, IOSTAT = ios, ERR = 906 )
539906   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobzoo in configuration namelist', lwp )
540      IF(lwm) WRITE ( numonp, namlobzoo )
541
542      IF(lwp) THEN
543          WRITE(numout,*) ' Namelist namlobzoo'
544          WRITE(numout,*) '    zoo preference for phyto                             rppz      =', rppz
545          WRITE(numout,*) '    maximal zoo grazing rate                             taus      =', 86400 * taus, ' d'
546          WRITE(numout,*) '    half saturation constant for zoo food                aks       =', aks
547          WRITE(numout,*) '    non-assimilated phyto by zoo                         rpnaz     =', rpnaz
548          WRITE(numout,*) '    non-assimilated detritus by zoo                      rdnaz     =', rdnaz
549          WRITE(numout,*) '    zoo specific excretion rate                          tauzn     =', 86400 * tauzn
550          WRITE(numout,*) '    minimal zoo mortality rate                           tmminz    =', 86400 * tmminz
551          WRITE(numout,*) '    NH4 fraction of zooplankton excretion                fzoolab   =', fzoolab
552          WRITE(numout,*) '    Zooplankton mortality fraction that goes to detritus fdbod     =', fdbod
553          WRITE(numout,*) ' '
554      ENDIF
555
556      REWIND( numnatp_ref )              ! Namelist namlobdet in reference namelist : Lobster detritus parameters
557      READ  ( numnatp_ref, namlobdet, IOSTAT = ios, ERR = 907)
558907   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobdet in reference namelist', lwp )
559
560      REWIND( numnatp_cfg )              ! Namelist namlobdet in configuration namelist : Lobster detritus parameters
561      READ  ( numnatp_cfg, namlobdet, IOSTAT = ios, ERR = 908 )
562908   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobdet in configuration namelist', lwp )
563      IF(lwm) WRITE ( numonp, namlobdet )
564
565      IF(lwp) THEN
566          WRITE(numout,*) ' Namelist namlobdet'
567          WRITE(numout,*) '    detrital breakdown rate                              taudn     =', 86400 * taudn , ' d'
568          WRITE(numout,*) '    NH4 fraction of detritus dissolution                 fdetlab   =', fdetlab
569          WRITE(numout,*) ' '
570      ENDIF
571
572      REWIND( numnatp_ref )              ! Namelist namlobdom in reference namelist : Lobster DOM breakdown rate
573      READ  ( numnatp_ref, namlobdom, IOSTAT = ios, ERR = 909)
574909   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobdom in reference namelist', lwp )
575
576      REWIND( numnatp_cfg )              ! Namelist namlobdom in configuration namelist : Lobster DOM breakdown rate
577      READ  ( numnatp_cfg, namlobdom, IOSTAT = ios, ERR = 910 )
578910   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlobdom in configuration namelist', lwp )
579      IF(lwm) WRITE ( numonp, namlobdom )
580
581      IF(lwp) THEN
582          WRITE(numout,*) ' Namelist namlobdom'
583          WRITE(numout,*) '    DOM breakdown rate                                 taudomn     =', 86400 * taudn , ' d'
584          WRITE(numout,*) ' '
585      ENDIF
586      !
587   END SUBROUTINE p2z_bio_init
588
589#else
590   !!======================================================================
591   !!  Dummy module :                                   No PISCES bio-model
592   !!======================================================================
593CONTAINS
594   SUBROUTINE p2z_bio( kt )                   ! Empty routine
595      INTEGER, INTENT( in ) ::   kt
596      WRITE(*,*) 'p2z_bio: You should not have seen this print! error?', kt
597   END SUBROUTINE p2z_bio
598#endif 
599
600   !!======================================================================
601END MODULE  p2zbio
Note: See TracBrowser for help on using the repository browser.