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.
p4zrem.F90 in trunk/NEMO/TOP_SRC/PISCES – NEMO

source: trunk/NEMO/TOP_SRC/PISCES/p4zrem.F90 @ 1073

Last change on this file since 1073 was 1073, checked in by cetlod, 16 years ago

update PISCES model, see ticket:190

  • Property svn:executable set to *
File size: 17.5 KB
Line 
1MODULE p4zrem
2   !!======================================================================
3   !!                         ***  MODULE p4zrem  ***
4   !! TOP :   PISCES Compute remineralization/scavenging of organic compounds
5   !!======================================================================
6   !! History :   1.0  !  2004     (O. Aumont) Original code
7   !!             2.0  !  2007-12  (C. Ethe, G. Madec)  F90
8   !!----------------------------------------------------------------------
9#if defined key_pisces
10   !!----------------------------------------------------------------------
11   !!   'key_top'       and                                      TOP models
12   !!   'key_pisces'                                       PISCES bio-model
13   !!----------------------------------------------------------------------
14   !!   p4z_rem       :   Compute remineralization/scavenging of organic compounds
15   !!----------------------------------------------------------------------
16   USE trc
17   USE oce_trc         !
18   USE trp_trc         !
19   USE sms_pisces      !
20   USE prtctl_trc
21   USE p4zint
22   USE p4zopt
23   USE p4zmeso
24   USE p4zprod
25   USE p4zche
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC   p4z_rem    ! called in p4zbio.F90
31
32   !! * Shared module variables
33   REAL(wp), PUBLIC ::   &
34     xremik  = 0.3_wp      ,  & !:
35     xremip  = 0.025_wp    ,  & !:
36     nitrif  = 0.05_wp     ,  & !:
37     xsirem  = 0.015_wp    ,  & !:
38     xlam1   = 0.005_wp    ,  & !:
39     oxymin  = 1.e-6_wp         !:
40
41   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::    & !:
42     &                   denitr                     !: denitrification array
43
44
45   !!* Substitution
46#  include "domzgr_substitute.h90"
47   !!----------------------------------------------------------------------
48   !! NEMO/TOP 2.0 , LOCEAN-IPSL (2007)
49   !! $Header:$
50   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
51   !!----------------------------------------------------------------------
52
53CONTAINS
54
55   SUBROUTINE p4z_rem(kt, jnt)
56      !!---------------------------------------------------------------------
57      !!                     ***  ROUTINE p4z_rem  ***
58      !!
59      !! ** Purpose :   Compute remineralization/scavenging of organic compounds
60      !!
61      !! ** Method  : - ???
62      !!---------------------------------------------------------------------
63      INTEGER, INTENT(in) ::   kt, jnt ! ocean time step
64      INTEGER  ::   ji, jj, jk
65      REAL(wp) ::   zremip, zremik , zlam1b
66      REAL(wp) ::   zkeq  , zfeequi, zsiremin
67      REAL(wp) ::   zsatur, zsatur2, znusil
68      REAL(wp) ::   zbactfer, zorem, zorem2, zofer, zofer2
69      REAL(wp) ::   zosil, zdenom, zdenom1, zdenom2, zscave, zaggdfe
70      REAL(wp) ::   zlamfac, zstep, zonitr
71      REAL(wp), DIMENSION(jpi,jpj)     ::   ztempbac
72      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdepbac, zfesatur, zolimi
73      CHARACTER (len=25) :: charout
74
75      !!---------------------------------------------------------------------
76
77
78      IF( ( kt * jnt ) == nittrc000  )   CALL p4z_rem_init      ! Initialization (first time-step only)
79
80       zstep = rfact2 / rjjss      ! Time step duration for the biology
81
82
83!      Computation of the mean phytoplankton concentration as
84!      a crude estimate of the bacterial biomass
85!      --------------------------------------------------
86
87      DO jk = 1, jpkm1
88         DO jj = 1, jpj
89            DO ji = 1, jpi
90               IF( fsdept(ji,jj,jk) < 120. ) THEN
91                  zdepbac(ji,jj,jk) = MIN( 0.7 * ( trn(ji,jj,jk,jpzoo) + 2.* trn(ji,jj,jk,jpmes) ), 4.e-6 )
92                  ztempbac(ji,jj)   = zdepbac(ji,jj,jk)
93               ELSE
94                  zdepbac(ji,jj,jk) = MIN( 1., 120./ fsdept(ji,jj,jk) ) * ztempbac(ji,jj)
95               ENDIF
96            END DO
97         END DO
98      END DO
99
100      DO jk = 1, jpkm1
101         DO jj = 1, jpj
102            DO ji = 1, jpi
103
104!    DENITRIFICATION FACTOR COMPUTED FROM O2 LEVELS
105!    ----------------------------------------------
106
107               nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - trn(ji,jj,jk,jpoxy) )    &
108                  &                                / ( oxymin + trn(ji,jj,jk,jpoxy) )  )
109            END DO
110         END DO
111      END DO
112
113      nitrfac(:,:,:) = MIN( 1., nitrfac(:,:,:) )
114
115
116      DO jk = 1, jpkm1
117         DO jj = 1, jpj
118            DO ji = 1, jpi
119
120!     DOC ammonification. Depends on depth, phytoplankton biomass
121!     and a limitation term which is supposed to be a parameterization
122!     of the bacterial activity.
123!     ----------------------------------------------------------------
124               zremik = xremik * zstep / 1.e-6 * xlimbac(ji,jj,jk)         &
125# if defined key_off_degrad
126                  &            * facvol(ji,jj,jk)              &
127# endif
128                  &            * zdepbac(ji,jj,jk)
129               zremik = MAX( zremik, 5.5e-4 * zstep )
130
131!     Ammonification in oxic waters with oxygen consumption
132!     -----------------------------------------------------
133               zolimi(ji,jj,jk) = MIN(  ( trn(ji,jj,jk,jpoxy) - rtrn ) / o2ut,  &
134                  &                    zremik * ( 1.- nitrfac(ji,jj,jk) ) * trn(ji,jj,jk,jpdoc)  ) 
135
136!     Ammonification in suboxic waters with denitrification
137!     -------------------------------------------------------
138               denitr(ji,jj,jk) = MIN(  ( trn(ji,jj,jk,jpno3) - rtrn ) / rdenit,   &
139                  &                     zremik * nitrfac(ji,jj,jk) * trn(ji,jj,jk,jpdoc)  )
140            END DO
141         END DO
142      END DO
143
144      zolimi (:,:,:) = MAX( 0.e0, zolimi (:,:,:) )
145      denitr (:,:,:) = MAX( 0.e0, denitr (:,:,:) )
146
147      DO jk = 1, jpkm1
148         DO jj = 1, jpj
149            DO ji = 1, jpi
150
151!    NH4 nitrification to NO3. Ceased for oxygen concentrations
152!    below 2 umol/L. Inhibited at strong light
153!    ----------------------------------------------------------
154               zonitr  = nitrif * zstep * trn(ji,jj,jk,jpnh4) / ( 1.+ emoy(ji,jj,jk) )     &
155# if defined key_off_degrad
156                  &      * facvol(ji,jj,jk)              &
157# endif
158                  &      * ( 1.- nitrfac(ji,jj,jk) )
159
160!
161!   Update of the tracers trends
162!   ----------------------------
163
164              tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zonitr
165              tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zonitr
166              tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2nit * zonitr
167              tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - rno3  * zonitr
168
169            END DO
170         END DO
171      END DO
172
173       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
174         WRITE(charout, FMT="('rem1')")
175         CALL prt_ctl_trc_info(charout)
176         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
177       ENDIF
178
179      DO jk = 1, jpkm1
180         DO jj = 1, jpj
181            DO ji = 1, jpi
182
183!    Bacterial uptake of iron. No iron is available in DOC. So
184!    Bacteries are obliged to take up iron from the water. Some
185!    studies (especially at Papa) have shown this uptake to be
186!    significant
187!    ----------------------------------------------------------
188               zbactfer = 15.e-6 * rfact2 * 4.* 0.4 * prmax(ji,jj,jk)           &
189                  &               * ( xlimphy(ji,jj,jk) * zdepbac(ji,jj,jk))**2           &
190                  &                  / ( xkgraz2 + zdepbac(ji,jj,jk) )                    &
191                  &                  * ( 0.5 + SIGN( 0.5, trn(ji,jj,jk,jpfer) -2.e-11 )  )
192
193               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zbactfer
194#if defined key_kriest
195               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zbactfer
196#else
197               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zbactfer
198#endif
199
200            END DO
201         END DO
202      END DO
203
204       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
205         WRITE(charout, FMT="('rem2')")
206         CALL prt_ctl_trc_info(charout)
207         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
208       ENDIF
209
210      DO jk = 1, jpkm1
211         DO jj = 1, jpj
212            DO ji = 1, jpi
213
214!    POC disaggregation by turbulence and bacterial activity.
215!    -------------------------------------------------------------
216               zremip = xremip * zstep * tgfunc(ji,jj,jk)   &
217# if defined key_off_degrad
218                  &            * facvol(ji,jj,jk)              &
219# endif
220                  &            * ( 1.- 0.5 * nitrfac(ji,jj,jk) )
221
222!    POC disaggregation rate is reduced in anoxic zone as shown by
223!    sediment traps data. In oxic area, the exponent of the martin s
224!    law is around -0.87. In anoxic zone, it is around -0.35. This
225!    means a disaggregation constant about 0.5 the value in oxic zones
226!    -----------------------------------------------------------------
227               zorem  = zremip * trn(ji,jj,jk,jppoc)
228               zofer  = zremip * trn(ji,jj,jk,jpsfe)
229#if ! defined key_kriest
230               zorem2 = zremip * trn(ji,jj,jk,jpgoc)
231               zofer2 = zremip * trn(ji,jj,jk,jpbfe)
232#else
233               zorem2 = zremip * trn(ji,jj,jk,jpnum)
234#endif
235
236!  Update the appropriate tracers trends
237!  -------------------------------------
238
239               tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zorem
240               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zofer
241#if defined key_kriest
242               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zorem
243               tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) - zorem2
244               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zofer
245#else
246               tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zorem2 - zorem
247               tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zorem2
248               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zofer2 - zofer
249               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zofer2
250#endif
251
252            END DO
253         END DO
254      END DO
255
256       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
257         WRITE(charout, FMT="('rem3')")
258         CALL prt_ctl_trc_info(charout)
259         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
260       ENDIF
261
262      DO jk = 1, jpkm1
263         DO jj = 1, jpj
264            DO ji = 1, jpi
265
266!     Remineralization rate of BSi depedant on T and saturation
267!     ---------------------------------------------------------
268               zsatur  = ( sio3eq(ji,jj,jk) - trn(ji,jj,jk,jpsil) ) / ( sio3eq(ji,jj,jk) + rtrn )
269               zsatur  = MAX( rtrn, zsatur )
270               zsatur2 = zsatur * ( 1. + tn(ji,jj,jk) / 400.)**4
271               znusil  = 0.225  * ( 1. + tn(ji,jj,jk) / 15.) * zsatur + 0.775 * zsatur2**9
272#    if defined key_off_degrad
273               zsiremin = xsirem * zstep * znusil * facvol(ji,jj,jk)
274# else
275               zsiremin = xsirem * zstep * znusil
276#    endif
277               zosil = zsiremin * trn(ji,jj,jk,jpdsi)
278
279               tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zosil
280               tra(ji,jj,jk,jpsil) = tra(ji,jj,jk,jpsil) + zosil
281
282               !
283            END DO
284         END DO
285      END DO
286
287      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
288         WRITE(charout, FMT="('rem4')")
289         CALL prt_ctl_trc_info(charout)
290         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
291       ENDIF
292
293      zfesatur(:,:,:) = 0.6e-9
294!CDIR NOVERRCHK
295      DO jk = 1, jpkm1
296!CDIR NOVERRCHK
297         DO jj = 1, jpj
298!CDIR NOVERRCHK
299            DO ji = 1, jpi
300!
301!      Compute de different ratios for scavenging of iron
302!      --------------------------------------------------
303
304#if  defined key_kriest
305               zdenom1 = trn(ji,jj,jk,jppoc) / &
306           &           ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn )
307#else
308                zdenom = 1. / ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpgoc)  &
309           &            + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn )
310
311                zdenom1 = trn(ji,jj,jk,jppoc) * zdenom
312                zdenom2 = trn(ji,jj,jk,jpgoc) * zdenom
313#endif
314
315
316!     scavenging rate of iron. this scavenging rate depends on the
317!     load in particles on which they are adsorbed. The
318!     parameterization has been taken from studies on Th
319!     ------------------------------------------------------------
320               zkeq = fekeq(ji,jj,jk)
321               zfeequi = ( -( 1. + zfesatur(ji,jj,jk) * zkeq - zkeq * trn(ji,jj,jk,jpfer) )               &
322                  &        + SQRT( ( 1. + zfesatur(ji,jj,jk) * zkeq - zkeq * trn(ji,jj,jk,jpfer) )**2       &
323                  &               + 4. * trn(ji,jj,jk,jpfer) * zkeq) ) / ( 2. * zkeq )
324
325#if defined key_kriest
326               zlam1b = 3.e-5 + xlam1 * (  trn(ji,jj,jk,jppoc)                   &
327                  &                      + trn(ji,jj,jk,jpcal) + trn(ji,jj,jk,jpdsi)  ) * 1.e6
328#else
329               zlam1b = 3.e-5 + xlam1 * (  trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpgoc)   &
330                  &                      + trn(ji,jj,jk,jpcal) + trn(ji,jj,jk,jpdsi)  ) * 1.e6
331#endif
332
333# if defined key_off_degrad
334               zscave = zfeequi * zlam1b * zstep  * facvol(ji,jj,jk)
335# else
336               zscave = zfeequi * zlam1b * zstep
337# endif
338
339!  Increased scavenging for very high iron concentrations
340!  found near the coasts due to increased lithogenic particles
341!  and let s say it unknown processes (precipitation, ...)
342!  -----------------------------------------------------------
343               zlamfac = MAX( 0.e0, ( gphit(ji,jj) + 55.) / 30. )
344               zlamfac = MIN( 1.  , zlamfac )
345#if ! defined key_kriest
346               zlam1b = (  80.* ( trn(ji,jj,jk,jpdoc) + 35.e-6 )                           &
347                  &     + 698.*   trn(ji,jj,jk,jppoc) + 1.05e4 * trn(ji,jj,jk,jpgoc)  )                    &
348                  &   * xdiss(ji,jj,jk) + 1E-4 * (1.-zlamfac)                &
349                  &   + xlam1 * MAX( 0.e0, ( trn(ji,jj,jk,jpfer) * 1.e9 - 1.)  )
350#else
351               zlam1b = (  80.* (trn(ji,jj,jk,jpdoc) + 35E-6)           &
352                  &     + 698.*  trn(ji,jj,jk,jppoc)  )                    &
353                  &   * xdiss(ji,jj,jk) + 1E-4 * (1.-zlamfac)           &
354                  &   + xlam1 * MAX( 0.e0, ( trn(ji,jj,jk,jpfer) * 1.e9 - 1.)  )
355#endif
356
357# if defined key_off_degrad
358               zaggdfe = zlam1b * zstep * 0.5 * ( trn(ji,jj,jk,jpfer) - zfeequi ) * facvol(ji,jj,jk)
359# else
360               zaggdfe = zlam1b * zstep * 0.5 * ( trn(ji,jj,jk,jpfer) - zfeequi )
361# endif
362
363               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zscave - zaggdfe
364
365#if defined key_kriest
366               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zscave * zdenom1
367#else
368               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zscave * zdenom1
369               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zscave * zdenom2
370#endif
371
372            END DO
373         END DO
374      END DO
375      !
376
377       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
378         WRITE(charout, FMT="('rem5')")
379         CALL prt_ctl_trc_info(charout)
380         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
381       ENDIF
382
383!     Update the arrays TRA which contain the biological sources and sinks
384!     --------------------------------------------------------------------
385
386      DO jk = 1, jpkm1
387         tra(:,:,jk,jppo4) = tra(:,:,jk,jppo4) + zolimi(:,:,jk) + denitr(:,:,jk)
388         tra(:,:,jk,jpnh4) = tra(:,:,jk,jpnh4) + zolimi(:,:,jk) + denitr(:,:,jk)
389         tra(:,:,jk,jpno3) = tra(:,:,jk,jpno3) - denitr(:,:,jk) * rdenit
390         tra(:,:,jk,jpdoc) = tra(:,:,jk,jpdoc) - zolimi(:,:,jk) - denitr(:,:,jk)
391         tra(:,:,jk,jpoxy) = tra(:,:,jk,jpoxy) - zolimi(:,:,jk) * o2ut
392         tra(:,:,jk,jpdic) = tra(:,:,jk,jpdic) + zolimi(:,:,jk) + denitr(:,:,jk)
393         tra(:,:,jk,jptal) = tra(:,:,jk,jptal) + denitr(:,:,jk) * rno3 * rdenit
394     END DO
395
396       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
397         WRITE(charout, FMT="('rem6')")
398         CALL prt_ctl_trc_info(charout)
399         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
400       ENDIF
401
402   END SUBROUTINE p4z_rem
403
404   SUBROUTINE p4z_rem_init
405
406      !!----------------------------------------------------------------------
407      !!                  ***  ROUTINE p4z_rem_init  ***
408      !!
409      !! ** Purpose :   Initialization of remineralization parameters
410      !!
411      !! ** Method  :   Read the natrem namelist and check the parameters
412      !!      called at the first timestep (nittrc000)
413      !!
414      !! ** input   :   Namelist natrem
415      !!
416      !!----------------------------------------------------------------------
417
418      NAMELIST/natrem/ xremik, xremip, nitrif, xsirem, xlam1, oxymin
419
420      REWIND( numnat )                     ! read numnat
421      READ  ( numnat, natrem )
422
423      IF(lwp) THEN                         ! control print
424         WRITE(numout,*) ' '
425         WRITE(numout,*) ' Namelist parameters for remineralization, natrem'
426         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
427         WRITE(numout,*) '    remineralisation rate of POC              xremip    =', xremip
428         WRITE(numout,*) '    remineralization rate of DOC              xremik    =', xremik
429         WRITE(numout,*) '    remineralization rate of Si               xsirem    =', xsirem
430         WRITE(numout,*) '    scavenging rate of Iron                   xlam1     =', xlam1
431         WRITE(numout,*) '    NH4 nitrification rate                    nitrif    =', nitrif
432         WRITE(numout,*) '    halk saturation constant for anoxia       oxymin    =', oxymin
433      ENDIF
434
435   END SUBROUTINE p4z_rem_init
436
437
438
439
440
441#else
442   !!======================================================================
443   !!  Dummy module :                                   No PISCES bio-model
444   !!======================================================================
445CONTAINS
446   SUBROUTINE p4z_rem                    ! Empty routine
447   END SUBROUTINE p4z_rem
448#endif 
449
450   !!======================================================================
451END MODULE p4zrem
Note: See TracBrowser for help on using the repository browser.