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

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

style of all top namelist has been modified ; update modules to take it into account, see ticket:196

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