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

source: trunk/NEMOGCM/NEMO/TOP_SRC/PISCES/p4zrem.F90 @ 2528

Last change on this file since 2528 was 2528, checked in by rblod, 13 years ago

Update NEMOGCM from branch nemo_v3_3_beta

  • Property svn:keywords set to Id
File size: 18.1 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   PUBLIC   p4z_rem_init    ! called in trcsms_pisces.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 "top_substitute.h90"
47   !!----------------------------------------------------------------------
48   !! NEMO/TOP 3.3 , NEMO Consortium (2010)
49   !! $Id$
50   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
51   !!----------------------------------------------------------------------
52
53CONTAINS
54
55   SUBROUTINE p4z_rem( kt )
56      !!---------------------------------------------------------------------
57      !!                     ***  ROUTINE p4z_rem  ***
58      !!
59      !! ** Purpose :   Compute remineralization/scavenging of organic compounds
60      !!
61      !! ** Method  : - ???
62      !!---------------------------------------------------------------------
63      INTEGER, INTENT(in) ::   kt ! 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
69      REAL(wp) ::   zosil, zdenom1, zscave, zaggdfe
70#if ! defined key_kriest
71      REAL(wp) ::   zofer2, zdenom, zdenom2
72#endif
73      REAL(wp) ::   zlamfac, zonitr, zstep
74      REAL(wp), DIMENSION(jpi,jpj)     ::   ztempbac
75      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zdepbac, zfesatur, zolimi
76      CHARACTER (len=25) :: charout
77
78      !!---------------------------------------------------------------------
79
80
81       ! Initialisation of temprary arrys
82       zdepbac (:,:,:) = 0.0
83       zfesatur(:,:,:) = 0.0
84       zolimi  (:,:,:) = 0.0
85       ztempbac(:,:)   = 0.0
86
87      !  Computation of the mean phytoplankton concentration as
88      !  a crude estimate of the bacterial biomass
89      !   --------------------------------------------------
90
91      DO jk = 1, jpkm1
92         DO jj = 1, jpj
93            DO ji = 1, jpi
94               IF( fsdept(ji,jj,jk) < 120. ) THEN
95                  zdepbac(ji,jj,jk) = MIN( 0.7 * ( trn(ji,jj,jk,jpzoo) + 2.* trn(ji,jj,jk,jpmes) ), 4.e-6 )
96                  ztempbac(ji,jj)   = zdepbac(ji,jj,jk)
97               ELSE
98                  zdepbac(ji,jj,jk) = MIN( 1., 120./ fsdept(ji,jj,jk) ) * ztempbac(ji,jj)
99               ENDIF
100            END DO
101         END DO
102      END DO
103
104      DO jk = 1, jpkm1
105         DO jj = 1, jpj
106            DO ji = 1, jpi
107               ! denitrification factor computed from O2 levels
108               nitrfac(ji,jj,jk) = MAX(  0.e0, 0.4 * ( 6.e-6  - trn(ji,jj,jk,jpoxy) )    &
109                  &                                / ( oxymin + trn(ji,jj,jk,jpoxy) )  )
110               nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) )
111            END DO
112         END DO
113      END DO
114
115      DO jk = 1, jpkm1
116         DO jj = 1, jpj
117            DO ji = 1, jpi
118# if defined key_degrad
119               zstep = xstep * facvol(ji,jj,jk)
120# else
121               zstep = xstep
122# endif
123               ! DOC ammonification. Depends on depth, phytoplankton biomass
124               !     and a limitation term which is supposed to be a parameterization
125               !     of the bacterial activity.
126               zremik = xremik * zstep / 1.e-6 * xlimbac(ji,jj,jk) * zdepbac(ji,jj,jk) 
127               zremik = MAX( zremik, 5.5e-4 * xstep )
128
129               !     Ammonification in oxic waters with oxygen consumption
130               !     -----------------------------------------------------
131               zolimi(ji,jj,jk) = MIN(  ( trn(ji,jj,jk,jpoxy) - rtrn ) / o2ut,  &
132                  &                    zremik * ( 1.- nitrfac(ji,jj,jk) ) * trn(ji,jj,jk,jpdoc)  ) 
133
134               !     Ammonification in suboxic waters with denitrification
135               !     -------------------------------------------------------
136               denitr(ji,jj,jk) = MIN(  ( trn(ji,jj,jk,jpno3) - rtrn ) / rdenit,   &
137                  &                     zremik * nitrfac(ji,jj,jk) * trn(ji,jj,jk,jpdoc)  )
138            END DO
139         END DO
140      END DO
141
142      DO jk = 1, jpkm1
143         DO jj = 1, jpj
144            DO ji = 1, jpi
145               zolimi (ji,jj,jk) = MAX( 0.e0, zolimi (ji,jj,jk) )
146               denitr (ji,jj,jk) = MAX( 0.e0, denitr (ji,jj,jk) )
147            END DO
148         END DO
149      END DO
150
151      DO jk = 1, jpkm1
152         DO jj = 1, jpj
153            DO ji = 1, jpi
154# if defined key_degrad
155               zstep = xstep * facvol(ji,jj,jk)
156# else
157               zstep = xstep
158# endif
159               !    NH4 nitrification to NO3. Ceased for oxygen concentrations
160               !    below 2 umol/L. Inhibited at strong light
161               !    ----------------------------------------------------------
162               zonitr  = nitrif * zstep * trn(ji,jj,jk,jpnh4) / ( 1.+ emoy(ji,jj,jk) ) * ( 1.- nitrfac(ji,jj,jk) ) 
163
164               !   Update of the tracers trends
165               !   ----------------------------
166
167               tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zonitr
168               tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zonitr
169               tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2nit * zonitr
170               tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - rno3  * zonitr
171
172            END DO
173         END DO
174      END DO
175
176       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
177         WRITE(charout, FMT="('rem1')")
178         CALL prt_ctl_trc_info(charout)
179         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
180       ENDIF
181
182      DO jk = 1, jpkm1
183         DO jj = 1, jpj
184            DO ji = 1, jpi
185
186               !    Bacterial uptake of iron. No iron is available in DOC. So
187               !    Bacteries are obliged to take up iron from the water. Some
188               !    studies (especially at Papa) have shown this uptake to be significant
189               !    ----------------------------------------------------------
190               zbactfer = 15.e-6 * rfact2 * 4.* 0.4 * prmax(ji,jj,jk)           &
191                  &               * ( xlimphy(ji,jj,jk) * zdepbac(ji,jj,jk))           &
192                  &               * ( xlimphy(ji,jj,jk) * zdepbac(ji,jj,jk))           &
193                  &                  / ( xkgraz2 + zdepbac(ji,jj,jk) )                    &
194                  &                  * ( 0.5 + SIGN( 0.5, trn(ji,jj,jk,jpfer) -2.e-11 )  )
195
196               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zbactfer
197#if defined key_kriest
198               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zbactfer
199#else
200               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zbactfer
201#endif
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# if defined key_degrad
216               zstep = xstep * facvol(ji,jj,jk)
217# else
218               zstep = xstep
219# endif
220               !    POC disaggregation by turbulence and bacterial activity.
221               !    -------------------------------------------------------------
222               zremip = xremip * zstep * tgfunc(ji,jj,jk) * ( 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# if defined key_degrad
268               zstep = xstep * facvol(ji,jj,jk)
269# else
270               zstep = xstep
271# endif
272               !     Remineralization rate of BSi depedant on T and saturation
273               !     ---------------------------------------------------------
274               zsatur  = ( sio3eq(ji,jj,jk) - trn(ji,jj,jk,jpsil) ) / ( sio3eq(ji,jj,jk) + rtrn )
275               zsatur  = MAX( rtrn, zsatur )
276               zsatur2 = zsatur * ( 1. + tn(ji,jj,jk) / 400.)**4
277               znusil  = 0.225  * ( 1. + tn(ji,jj,jk) / 15.) * zsatur + 0.775 * zsatur2**9
278               zsiremin = xsirem * zstep * znusil
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            END DO
285         END DO
286      END DO
287
288      IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
289         WRITE(charout, FMT="('rem4')")
290         CALL prt_ctl_trc_info(charout)
291         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
292       ENDIF
293
294      zfesatur(:,:,:) = 0.6e-9
295!CDIR NOVERRCHK
296      DO jk = 1, jpkm1
297!CDIR NOVERRCHK
298         DO jj = 1, jpj
299!CDIR NOVERRCHK
300            DO ji = 1, jpi
301# if defined key_degrad
302               zstep = xstep * facvol(ji,jj,jk)
303# else
304               zstep = xstep
305# endif
306               !  Compute de different ratios for scavenging of iron
307               !  --------------------------------------------------
308
309#if  defined key_kriest
310               zdenom1 = trn(ji,jj,jk,jppoc) / &
311           &           ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn )
312#else
313               zdenom = 1. / ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpgoc)  &
314           &            + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn )
315
316               zdenom1 = trn(ji,jj,jk,jppoc) * zdenom
317               zdenom2 = trn(ji,jj,jk,jpgoc) * zdenom
318#endif
319               !  scavenging rate of iron. this scavenging rate depends on the load in particles
320               !  on which they are adsorbed. The  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               zscave = zfeequi * zlam1b * zstep
335
336               !  Increased scavenging for very high iron concentrations
337               !  found near the coasts due to increased lithogenic particles
338               !  and let s say it unknown processes (precipitation, ...)
339               !  -----------------------------------------------------------
340               zlamfac = MAX( 0.e0, ( gphit(ji,jj) + 55.) / 30. )
341               zlamfac = MIN( 1.  , zlamfac )
342#if ! defined key_kriest
343               zlam1b = (  80.* ( trn(ji,jj,jk,jpdoc) + 35.e-6 )                           &
344                  &     + 698.*   trn(ji,jj,jk,jppoc) + 1.05e4 * trn(ji,jj,jk,jpgoc)  )                    &
345                  &   * xdiss(ji,jj,jk) + 1E-4 * (1.-zlamfac)                &
346                  &   + xlam1 * MAX( 0.e0, ( trn(ji,jj,jk,jpfer) * 1.e9 - 1.)  )
347#else
348               zlam1b = (  80.* (trn(ji,jj,jk,jpdoc) + 35E-6)           &
349                  &     + 698.*  trn(ji,jj,jk,jppoc)  )                    &
350                  &   * xdiss(ji,jj,jk) + 1E-4 * (1.-zlamfac)           &
351                  &   + xlam1 * MAX( 0.e0, ( trn(ji,jj,jk,jpfer) * 1.e9 - 1.)  )
352#endif
353
354               zaggdfe = zlam1b * zstep * 0.5 * ( trn(ji,jj,jk,jpfer) - zfeequi )
355
356               tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zscave - zaggdfe
357
358#if defined key_kriest
359               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zscave * zdenom1
360#else
361               tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zscave * zdenom1
362               tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zscave * zdenom2
363#endif
364
365            END DO
366         END DO
367      END DO
368      !
369
370       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
371         WRITE(charout, FMT="('rem5')")
372         CALL prt_ctl_trc_info(charout)
373         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
374       ENDIF
375
376       !     Update the arrays TRA which contain the biological sources and sinks
377       !     --------------------------------------------------------------------
378
379      DO jk = 1, jpkm1
380         tra(:,:,jk,jppo4) = tra(:,:,jk,jppo4) + zolimi(:,:,jk) + denitr(:,:,jk)
381         tra(:,:,jk,jpnh4) = tra(:,:,jk,jpnh4) + zolimi(:,:,jk) + denitr(:,:,jk)
382         tra(:,:,jk,jpno3) = tra(:,:,jk,jpno3) - denitr(:,:,jk) * rdenit
383         tra(:,:,jk,jpdoc) = tra(:,:,jk,jpdoc) - zolimi(:,:,jk) - denitr(:,:,jk)
384         tra(:,:,jk,jpoxy) = tra(:,:,jk,jpoxy) - zolimi(:,:,jk) * o2ut
385         tra(:,:,jk,jpdic) = tra(:,:,jk,jpdic) + zolimi(:,:,jk) + denitr(:,:,jk)
386         tra(:,:,jk,jptal) = tra(:,:,jk,jptal) + denitr(:,:,jk) * rno3 * rdenit
387     END DO
388
389       IF(ln_ctl)   THEN  ! print mean trends (used for debugging)
390         WRITE(charout, FMT="('rem6')")
391         CALL prt_ctl_trc_info(charout)
392         CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)
393       ENDIF
394
395   END SUBROUTINE p4z_rem
396
397   SUBROUTINE p4z_rem_init
398
399      !!----------------------------------------------------------------------
400      !!                  ***  ROUTINE p4z_rem_init  ***
401      !!
402      !! ** Purpose :   Initialization of remineralization parameters
403      !!
404      !! ** Method  :   Read the nampisrem namelist and check the parameters
405      !!      called at the first timestep
406      !!
407      !! ** input   :   Namelist nampisrem
408      !!
409      !!----------------------------------------------------------------------
410
411      NAMELIST/nampisrem/ xremik, xremip, nitrif, xsirem, xlam1, oxymin
412
413      REWIND( numnat )                     ! read numnat
414      READ  ( numnat, nampisrem )
415
416      IF(lwp) THEN                         ! control print
417         WRITE(numout,*) ' '
418         WRITE(numout,*) ' Namelist parameters for remineralization, nampisrem'
419         WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
420         WRITE(numout,*) '    remineralisation rate of POC              xremip    =', xremip
421         WRITE(numout,*) '    remineralization rate of DOC              xremik    =', xremik
422         WRITE(numout,*) '    remineralization rate of Si               xsirem    =', xsirem
423         WRITE(numout,*) '    scavenging rate of Iron                   xlam1     =', xlam1
424         WRITE(numout,*) '    NH4 nitrification rate                    nitrif    =', nitrif
425         WRITE(numout,*) '    halk saturation constant for anoxia       oxymin    =', oxymin
426      ENDIF
427
428      nitrfac(:,:,:) = 0.0
429      denitr (:,:,:) = 0.0 
430
431   END SUBROUTINE p4z_rem_init
432
433#else
434   !!======================================================================
435   !!  Dummy module :                                   No PISCES bio-model
436   !!======================================================================
437CONTAINS
438   SUBROUTINE p4z_rem                    ! Empty routine
439   END SUBROUTINE p4z_rem
440#endif 
441
442   !!======================================================================
443END MODULE p4zrem
Note: See TracBrowser for help on using the repository browser.