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.
p4zfechem.F90 in NEMO/trunk/src/TOP/PISCES/P4Z – NEMO

source: NEMO/trunk/src/TOP/PISCES/P4Z/p4zfechem.F90 @ 12587

Last change on this file since 12587 was 12377, checked in by acc, 4 years ago

The big one. Merging all 2019 developments from the option 1 branch back onto the trunk.

This changeset reproduces 2019/dev_r11943_MERGE_2019 on the trunk using a 2-URL merge
onto a working copy of the trunk. I.e.:

svn merge --ignore-ancestry \

svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/trunk \
svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/branches/2019/dev_r11943_MERGE_2019 ./

The --ignore-ancestry flag avoids problems that may otherwise arise from the fact that
the merge history been trunk and branch may have been applied in a different order but
care has been taken before this step to ensure that all applicable fixes and updates
are present in the merge branch.

The trunk state just before this step has been branched to releases/release-4.0-HEAD
and that branch has been immediately tagged as releases/release-4.0.2. Any fixes
or additions in response to tickets on 4.0, 4.0.1 or 4.0.2 should be done on
releases/release-4.0-HEAD. From now on future 'point' releases (e.g. 4.0.2) will
remain unchanged with periodic releases as needs demand. Note release-4.0-HEAD is a
transitional naming convention. Future full releases, say 4.2, will have a release-4.2
branch which fulfills this role and the first point release (e.g. 4.2.0) will be made
immediately following the release branch creation.

2020 developments can be started from any trunk revision later than this one.

  • Property svn:keywords set to Id
File size: 13.5 KB
RevLine 
[3443]1MODULE p4zfechem
2   !!======================================================================
3   !!                         ***  MODULE p4zfechem  ***
4   !! TOP :   PISCES Compute iron chemistry and scavenging
5   !!======================================================================
[3461]6   !! History :   3.5  !  2012-07 (O. Aumont, A. Tagliabue, C. Ethe) Original code
[7646]7   !!             3.6  !  2015-05  (O. Aumont) PISCES quota
[3443]8   !!----------------------------------------------------------------------
[9169]9   !!   p4z_fechem       : Compute remineralization/scavenging of iron
10   !!   p4z_fechem_init  : Initialisation of parameters for remineralisation
11   !!   p4z_fechem_alloc : Allocate remineralisation variables
[3443]12   !!----------------------------------------------------------------------
[9169]13   USE oce_trc         ! shared variables between ocean and passive tracers
14   USE trc             ! passive tracers common variables
15   USE sms_pisces      ! PISCES Source Minus Sink variables
16   USE p4zche          ! chemical model
[12377]17   USE p4zbc           ! Boundary conditions from sediments
[9169]18   USE prtctl_trc      ! print control for debugging
19   USE iom             ! I/O manager
[3443]20
21   IMPLICIT NONE
22   PRIVATE
23
[9169]24   PUBLIC   p4z_fechem        ! called in p4zbio.F90
25   PUBLIC   p4z_fechem_init   ! called in trcsms_pisces.F90
[3443]26
[9169]27   LOGICAL          ::   ln_ligvar    !: boolean for variable ligand concentration following Tagliabue and voelker
28   REAL(wp), PUBLIC ::   xlam1        !: scavenging rate of Iron
29   REAL(wp), PUBLIC ::   xlamdust     !: scavenging rate of Iron by dust
30   REAL(wp), PUBLIC ::   ligand       !: ligand concentration in the ocean
31   REAL(wp), PUBLIC ::   kfep         !: rate constant for nanoparticle formation
[3443]32
[12377]33   !! * Substitutions
34#  include "do_loop_substitute.h90"
[3443]35   !!----------------------------------------------------------------------
[10067]36   !! NEMO/TOP 4.0 , NEMO Consortium (2018)
[10069]37   !! $Id$
[10068]38   !! Software governed by the CeCILL license (see ./LICENSE)
[3443]39   !!----------------------------------------------------------------------
40CONTAINS
41
[12377]42   SUBROUTINE p4z_fechem( kt, knt, Kbb, Kmm, Krhs )
[3443]43      !!---------------------------------------------------------------------
44      !!                     ***  ROUTINE p4z_fechem  ***
45      !!
46      !! ** Purpose :   Compute remineralization/scavenging of iron
47      !!
[10401]48      !! ** Method  :   A simple chemistry model of iron from Aumont and Bopp (2006)
49      !!                based on one ligand and one inorganic form
[3443]50      !!---------------------------------------------------------------------
[9169]51      INTEGER, INTENT(in) ::   kt, knt   ! ocean time step
[12377]52      INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs  ! time level indices
[3443]53      !
[7646]54      INTEGER  ::   ji, jj, jk, jic, jn
[3446]55      REAL(wp) ::   zdep, zlam1a, zlam1b, zlamfac
[7646]56      REAL(wp) ::   zkeq, zfeequi, zfesatur, zfecoll, fe3sol
[3446]57      REAL(wp) ::   zdenom1, zscave, zaggdfea, zaggdfeb, zcoag
[3443]58      REAL(wp) ::   ztrc, zdust
[7646]59      REAL(wp) ::   zdenom2
60      REAL(wp) ::   zzFeL1, zzFeL2, zzFe2, zzFeP, zzFe3, zzstrn2
61      REAL(wp) ::   zrum, zcodel, zargu, zlight
[9169]62      REAL(wp) ::   zkox, zkph1, zkph2, zph, zionic, ztligand
63      REAL(wp) ::   za, zb, zc, zkappa1, zkappa2, za0, za1, za2
64      REAL(wp) ::   zxs, zfunc, zp, zq, zd, zr, zphi, zfff, zp3, zq2
[10362]65      REAL(wp) ::   ztfe, zoxy, zhplus, zxlam
[9169]66      REAL(wp) ::   zaggliga, zaggligb
67      REAL(wp) ::   dissol, zligco
[10362]68      REAL(wp) :: zrfact2
[7646]69      CHARACTER (len=25) :: charout
[9169]70      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zTL1, zFe3, ztotlig, precip, zFeL1
[10362]71      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zcoll3d, zscav3d, zlcoll3d
[3443]72      !!---------------------------------------------------------------------
73      !
[9124]74      IF( ln_timing )   CALL timing_start('p4z_fechem')
[3443]75      !
76      ! Total ligand concentration : Ligands can be chosen to be constant or variable
77      ! Parameterization from Tagliabue and Voelker (2011)
78      ! -------------------------------------------------
79      IF( ln_ligvar ) THEN
[12377]80         ztotlig(:,:,:) =  0.09 * tr(:,:,:,jpdoc,Kbb) * 1E6 + ligand * 1E9
[7753]81         ztotlig(:,:,:) =  MIN( ztotlig(:,:,:), 10. )
[3443]82      ELSE
[12377]83        IF( ln_ligand ) THEN  ;   ztotlig(:,:,:) = tr(:,:,:,jplgw,Kbb) * 1E9
[7753]84        ELSE                  ;   ztotlig(:,:,:) = ligand * 1E9
[7646]85        ENDIF
[3443]86      ENDIF
87
[10401]88      ! ------------------------------------------------------------
89      !  from Aumont and Bopp (2006)
90      ! This model is based on one ligand and Fe'
91      ! Chemistry is supposed to be fast enough to be at equilibrium
92      ! ------------------------------------------------------------
[12377]93      DO_3D_11_11( 1, jpkm1 )
94         zTL1(ji,jj,jk)  = ztotlig(ji,jj,jk)
95         zkeq            = fekeq(ji,jj,jk)
96         zfesatur        = zTL1(ji,jj,jk) * 1E-9
97         ztfe            = tr(ji,jj,jk,jpfer,Kbb) 
98         ! Fe' is the root of a 2nd order polynom
99         zFe3 (ji,jj,jk) = ( -( 1. + zfesatur * zkeq - zkeq * ztfe )               &
100            &              + SQRT( ( 1. + zfesatur * zkeq - zkeq * ztfe )**2       &
101            &              + 4. * ztfe * zkeq) ) / ( 2. * zkeq )
102         zFe3 (ji,jj,jk) = zFe3(ji,jj,jk) * 1E9
103         zFeL1(ji,jj,jk) = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) * 1E9 - zFe3(ji,jj,jk) )
104      END_3D
[3443]105         !
[7646]106
[3531]107      zdust = 0.         ! if no dust available
[12377]108      DO_3D_11_11( 1, jpkm1 )
109         ! Scavenging rate of iron. This scavenging rate depends on the load of particles of sea water.
110         ! This parameterization assumes a simple second order kinetics (k[Particles][Fe]).
111         ! Scavenging onto dust is also included as evidenced from the DUNE experiments.
112         ! --------------------------------------------------------------------------------------
113         zhplus  = max( rtrn, hi(ji,jj,jk) )
114         fe3sol  = fesol(ji,jj,jk,1) * ( zhplus**3 + fesol(ji,jj,jk,2) * zhplus**2  &
115         &         + fesol(ji,jj,jk,3) * zhplus + fesol(ji,jj,jk,4)     &
116         &         + fesol(ji,jj,jk,5) / zhplus )
117         !
118         zfeequi = zFe3(ji,jj,jk) * 1E-9
119         zhplus  = max( rtrn, hi(ji,jj,jk) )
120         fe3sol  = fesol(ji,jj,jk,1) * ( zhplus**3 + fesol(ji,jj,jk,2) * zhplus**2  &
121            &         + fesol(ji,jj,jk,3) * zhplus + fesol(ji,jj,jk,4)     &
122            &         + fesol(ji,jj,jk,5) / zhplus )
123         zfecoll = 0.5 * zFeL1(ji,jj,jk) * 1E-9
124         ! precipitation of Fe3+, creation of nanoparticles
125         precip(ji,jj,jk) = MAX( 0., ( zFe3(ji,jj,jk) * 1E-9 - fe3sol ) ) * kfep * xstep
126         !
127         ztrc   = ( tr(ji,jj,jk,jppoc,Kbb) + tr(ji,jj,jk,jpgoc,Kbb) + tr(ji,jj,jk,jpcal,Kbb) + tr(ji,jj,jk,jpgsi,Kbb) ) * 1.e6 
128         IF( ll_dust )  zdust  = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) &
129         &  * EXP( -gdept(ji,jj,jk,Kmm) / 540. )
130         IF (ln_ligand) THEN
131            zxlam  = xlam1 * MAX( 1.E-3, EXP(-2 * etot(ji,jj,jk) / 10. ) * (1. - EXP(-2 * tr(ji,jj,jk,jpoxy,Kbb) / 100.E-6 ) ))
132         ELSE
133            zxlam  = xlam1 * 1.0
134         ENDIF
135         zlam1b = 3.e-5 + xlamdust * zdust + zxlam * ztrc
136         zscave = zfeequi * zlam1b * xstep
[3443]137
[12377]138         ! Compute the different ratios for scavenging of iron
139         ! to later allocate scavenged iron to the different organic pools
140         ! ---------------------------------------------------------
141         zdenom1 = zxlam * tr(ji,jj,jk,jppoc,Kbb) / zlam1b
142         zdenom2 = zxlam * tr(ji,jj,jk,jpgoc,Kbb) / zlam1b
[3443]143
[12377]144         !  Increased scavenging for very high iron concentrations found near the coasts
145         !  due to increased lithogenic particles and let say it is unknown processes (precipitation, ...)
146         !  -----------------------------------------------------------
147         zlamfac = MAX( 0.e0, ( gphit(ji,jj) + 55.) / 30. )
148         zlamfac = MIN( 1.  , zlamfac )
149         zdep    = MIN( 1., 1000. / gdept(ji,jj,jk,Kmm) )
150         zcoag   = 1E-4 * ( 1. - zlamfac ) * zdep * xstep * tr(ji,jj,jk,jpfer,Kbb)
[3443]151
[12377]152         !  Compute the coagulation of colloidal iron. This parameterization
153         !  could be thought as an equivalent of colloidal pumping.
154         !  It requires certainly some more work as it is very poorly constrained.
155         !  ----------------------------------------------------------------
156         zlam1a   = ( 0.369  * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4  * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk)    &
157             &      + ( 114.   * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) )
158         zaggdfea = zlam1a * xstep * zfecoll
159         !
160         zlam1b   = 3.53E3 * tr(ji,jj,jk,jpgoc,Kbb) * xdiss(ji,jj,jk)
161         zaggdfeb = zlam1b * xstep * zfecoll
162         !
163         tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zscave - zaggdfea - zaggdfeb &
164         &                     - zcoag - precip(ji,jj,jk)
165         tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * zdenom1 + zaggdfea
166         tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * zdenom2 + zaggdfeb
167         zscav3d(ji,jj,jk)   = zscave
168         zcoll3d(ji,jj,jk)   = zaggdfea + zaggdfeb
169         !
170      END_3D
[3443]171      !
[3446]172      !  Define the bioavailable fraction of iron
173      !  ----------------------------------------
[12377]174      biron(:,:,:) = tr(:,:,:,jpfer,Kbb) 
[7646]175      !
176      IF( ln_ligand ) THEN
177         !
[12377]178         DO_3D_11_11( 1, jpkm1 )
179            zlam1a   = ( 0.369  * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4  * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk)    &
180                &    + ( 114.   * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) )
181            !
182            zlam1b   = 3.53E3 *   tr(ji,jj,jk,jpgoc,Kbb) * xdiss(ji,jj,jk)
183            zligco   = 0.5 * tr(ji,jj,jk,jplgw,Kmm)
184            zaggliga = zlam1a * xstep * zligco
185            zaggligb = zlam1b * xstep * zligco
186            tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) - zaggliga - zaggligb
187            zlcoll3d(ji,jj,jk)  = zaggliga + zaggligb
188         END_3D
[7646]189         !
[12377]190         plig(:,:,:) =  MAX( 0., ( ( zFeL1(:,:,:) * 1E-9 ) / ( tr(:,:,:,jpfer,Kbb) +rtrn ) ) )
[7646]191         !
192      ENDIF
[3443]193      !  Output of some diagnostics variables
194      !     ---------------------------------
[7646]195      IF( lk_iomput ) THEN
196         IF( knt == nrdttrc ) THEN
[10401]197            zrfact2 = 1.e3 * rfact2r  ! conversion from mol/L/timestep into mol/m3/s
[12276]198            IF( iom_use("Fe3")  )  THEN
199               zFe3(:,:,jpk) = 0.  ;  CALL iom_put("Fe3" , zFe3(:,:,:) * tmask(:,:,:) )   ! Fe3+
200            ENDIF
201            IF( iom_use("FeL1") )  THEN
202              zFeL1(:,:,jpk) = 0.  ;  CALL iom_put("FeL1", zFeL1(:,:,:) * tmask(:,:,:) )   ! FeL1
203            ENDIF
204            IF( iom_use("TL1")  )  THEN
205              zTL1(:,:,jpk) = 0.   ;  CALL iom_put("TL1" , zTL1(:,:,:) * tmask(:,:,:) )   ! TL1
206            ENDIF
[12377]207            IF( iom_use("Totlig") )  CALL iom_put("Totlig" , ztotlig(:,:,:)       * tmask(:,:,:) )   ! TL
208            IF( iom_use("Biron")  )  CALL iom_put("Biron"  , biron  (:,:,:)  * 1e9 * tmask(:,:,:) )   ! biron
[12276]209            IF( iom_use("FESCAV") )  THEN
210               zscav3d (:,:,jpk) = 0.  ;  CALL iom_put("FESCAV" , zscav3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 )
211            ENDIF
212            IF( iom_use("FECOLL") ) THEN
213               zcoll3d (:,:,jpk) = 0.  ;   CALL iom_put("FECOLL" , zcoll3d(:,:,:)  * 1e9 * tmask(:,:,:) * zrfact2 )
214            ENDIF
215            IF( iom_use("LGWCOLL")) THEN
216               zlcoll3d(:,:,jpk) = 0.  ;  CALL iom_put("LGWCOLL", zlcoll3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 )
217            ENDIF
[12377]218          ENDIF
[3443]219      ENDIF
220
[12377]221      IF(sn_cfctl%l_prttrc)   THEN  ! print mean trends (used for debugging)
[3449]222         WRITE(charout, FMT="('fechem')")
[3443]223         CALL prt_ctl_trc_info(charout)
[12377]224         CALL prt_ctl_trc(tab4d=tr(:,:,:,:,Krhs), mask=tmask, clinfo=ctrcnm)
[3443]225      ENDIF
226      !
[9124]227      IF( ln_timing )   CALL timing_stop('p4z_fechem')
[3443]228      !
229   END SUBROUTINE p4z_fechem
230
231
232   SUBROUTINE p4z_fechem_init
233      !!----------------------------------------------------------------------
234      !!                  ***  ROUTINE p4z_fechem_init  ***
235      !!
236      !! ** Purpose :   Initialization of iron chemistry parameters
237      !!
238      !! ** Method  :   Read the nampisfer namelist and check the parameters
239      !!      called at the first timestep
240      !!
241      !! ** input   :   Namelist nampisfer
242      !!
243      !!----------------------------------------------------------------------
[9124]244      INTEGER ::   ios   ! Local integer
245      !!
[10401]246      NAMELIST/nampisfer/ ln_ligvar, xlam1, xlamdust, ligand, kfep 
[9124]247      !!----------------------------------------------------------------------
[9169]248      !
249      IF(lwp) THEN
250         WRITE(numout,*)
251         WRITE(numout,*) 'p4z_rem_init : Initialization of iron chemistry parameters'
252         WRITE(numout,*) '~~~~~~~~~~~~'
253      ENDIF
254      !
[4147]255      READ  ( numnatp_ref, nampisfer, IOSTAT = ios, ERR = 901)
[11536]256901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nampisfer in reference namelist' )
[4147]257      READ  ( numnatp_cfg, nampisfer, IOSTAT = ios, ERR = 902 )
[11536]258902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nampisfer in configuration namelist' )
[9169]259      IF(lwm) WRITE( numonp, nampisfer )
[4147]260
[9169]261      IF(lwp) THEN                     ! control print
262         WRITE(numout,*) '   Namelist : nampisfer'
263         WRITE(numout,*) '      variable concentration of ligand          ln_ligvar    =', ln_ligvar
264         WRITE(numout,*) '      scavenging rate of Iron                   xlam1        =', xlam1
265         WRITE(numout,*) '      scavenging rate of Iron by dust           xlamdust     =', xlamdust
266         WRITE(numout,*) '      ligand concentration in the ocean         ligand       =', ligand
267         WRITE(numout,*) '      rate constant for nanoparticle formation  kfep         =', kfep
[3443]268      ENDIF
[10362]269      !
[3443]270   END SUBROUTINE p4z_fechem_init
[9124]271   
[3443]272   !!======================================================================
273END MODULE p4zfechem
Note: See TracBrowser for help on using the repository browser.