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 @ 1263

Last change on this file since 1263 was 1255, checked in by cetlod, 15 years ago

minor modifications in all top models, see ticket:299

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