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/UKMO/r5518_rm_um_cpl/NEMOGCM/NEMO/TOP_SRC/PISCES/P2Z – NEMO

source: branches/UKMO/r5518_rm_um_cpl/NEMOGCM/NEMO/TOP_SRC/PISCES/P2Z/p2zbio.F90 @ 7141

Last change on this file since 7141 was 7141, checked in by jcastill, 7 years ago

Remove svn keywords

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