Changeset 13463 for NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/TOP/PISCES/P4Z/p4zfechem.F90
- Timestamp:
- 2020-09-14T17:40:34+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@13382 sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/TOP/PISCES/P4Z/p4zfechem.F90
r10416 r13463 15 15 USE sms_pisces ! PISCES Source Minus Sink variables 16 16 USE p4zche ! chemical model 17 USE p4z sbc! Boundary conditions from sediments18 USE prtctl _trc! print control for debugging17 USE p4zbc ! Boundary conditions from sediments 18 USE prtctl ! print control for debugging 19 19 USE iom ! I/O manager 20 20 … … 31 31 REAL(wp), PUBLIC :: kfep !: rate constant for nanoparticle formation 32 32 33 !! * Substitutions 34 # include "do_loop_substitute.h90" 35 # include "domzgr_substitute.h90" 33 36 !!---------------------------------------------------------------------- 34 37 !! NEMO/TOP 4.0 , NEMO Consortium (2018) … … 38 41 CONTAINS 39 42 40 SUBROUTINE p4z_fechem( kt, knt )43 SUBROUTINE p4z_fechem( kt, knt, Kbb, Kmm, Krhs ) 41 44 !!--------------------------------------------------------------------- 42 45 !! *** ROUTINE p4z_fechem *** … … 48 51 !!--------------------------------------------------------------------- 49 52 INTEGER, INTENT(in) :: kt, knt ! ocean time step 53 INTEGER, INTENT(in) :: Kbb, Kmm, Krhs ! time level indices 50 54 ! 51 55 INTEGER :: ji, jj, jk, jic, jn … … 71 75 IF( ln_timing ) CALL timing_start('p4z_fechem') 72 76 ! 73 zFe3 (:,:,:) = 0.74 zFeL1(:,:,:) = 0.75 zTL1 (:,:,:) = 0.76 77 77 ! Total ligand concentration : Ligands can be chosen to be constant or variable 78 78 ! Parameterization from Tagliabue and Voelker (2011) 79 79 ! ------------------------------------------------- 80 80 IF( ln_ligvar ) THEN 81 ztotlig(:,:,:) = 0.09 * tr b(:,:,:,jpdoc) * 1E6 + ligand * 1E981 ztotlig(:,:,:) = 0.09 * tr(:,:,:,jpdoc,Kbb) * 1E6 + ligand * 1E9 82 82 ztotlig(:,:,:) = MIN( ztotlig(:,:,:), 10. ) 83 83 ELSE 84 IF( ln_ligand ) THEN ; ztotlig(:,:,:) = tr b(:,:,:,jplgw) * 1E984 IF( ln_ligand ) THEN ; ztotlig(:,:,:) = tr(:,:,:,jplgw,Kbb) * 1E9 85 85 ELSE ; ztotlig(:,:,:) = ligand * 1E9 86 86 ENDIF … … 92 92 ! Chemistry is supposed to be fast enough to be at equilibrium 93 93 ! ------------------------------------------------------------ 94 DO jk = 1, jpkm1 95 DO jj = 1, jpj 96 DO ji = 1, jpi 97 zTL1(ji,jj,jk) = ztotlig(ji,jj,jk) 98 zkeq = fekeq(ji,jj,jk) 99 zfesatur = zTL1(ji,jj,jk) * 1E-9 100 ztfe = trb(ji,jj,jk,jpfer) 101 ! Fe' is the root of a 2nd order polynom 102 zFe3 (ji,jj,jk) = ( -( 1. + zfesatur * zkeq - zkeq * ztfe ) & 103 & + SQRT( ( 1. + zfesatur * zkeq - zkeq * ztfe )**2 & 104 & + 4. * ztfe * zkeq) ) / ( 2. * zkeq ) 105 zFe3 (ji,jj,jk) = zFe3(ji,jj,jk) * 1E9 106 zFeL1(ji,jj,jk) = MAX( 0., trb(ji,jj,jk,jpfer) * 1E9 - zFe3(ji,jj,jk) ) 107 END DO 108 END DO 109 END DO 94 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 95 zTL1(ji,jj,jk) = ztotlig(ji,jj,jk) 96 zkeq = fekeq(ji,jj,jk) 97 zfesatur = zTL1(ji,jj,jk) * 1E-9 98 ztfe = tr(ji,jj,jk,jpfer,Kbb) 99 ! Fe' is the root of a 2nd order polynom 100 zFe3 (ji,jj,jk) = ( -( 1. + zfesatur * zkeq - zkeq * ztfe ) & 101 & + SQRT( ( 1. + zfesatur * zkeq - zkeq * ztfe )**2 & 102 & + 4. * ztfe * zkeq) ) / ( 2. * zkeq ) 103 zFe3 (ji,jj,jk) = zFe3(ji,jj,jk) * 1E9 104 zFeL1(ji,jj,jk) = MAX( 0., tr(ji,jj,jk,jpfer,Kbb) * 1E9 - zFe3(ji,jj,jk) ) 105 END_3D 110 106 ! 111 107 112 108 zdust = 0. ! if no dust available 113 DO jk = 1, jpkm1 114 DO jj = 1, jpj 115 DO ji = 1, jpi 116 ! Scavenging rate of iron. This scavenging rate depends on the load of particles of sea water. 117 ! This parameterization assumes a simple second order kinetics (k[Particles][Fe]). 118 ! Scavenging onto dust is also included as evidenced from the DUNE experiments. 119 ! -------------------------------------------------------------------------------------- 120 zhplus = max( rtrn, hi(ji,jj,jk) ) 121 fe3sol = fesol(ji,jj,jk,1) * ( zhplus**3 + fesol(ji,jj,jk,2) * zhplus**2 & 122 & + fesol(ji,jj,jk,3) * zhplus + fesol(ji,jj,jk,4) & 123 & + fesol(ji,jj,jk,5) / zhplus ) 124 ! 125 zfeequi = zFe3(ji,jj,jk) * 1E-9 126 zhplus = max( rtrn, hi(ji,jj,jk) ) 127 fe3sol = fesol(ji,jj,jk,1) * ( zhplus**3 + fesol(ji,jj,jk,2) * zhplus**2 & 128 & + fesol(ji,jj,jk,3) * zhplus + fesol(ji,jj,jk,4) & 129 & + fesol(ji,jj,jk,5) / zhplus ) 130 zfecoll = 0.5 * zFeL1(ji,jj,jk) * 1E-9 131 ! precipitation of Fe3+, creation of nanoparticles 132 precip(ji,jj,jk) = MAX( 0., ( zFe3(ji,jj,jk) * 1E-9 - fe3sol ) ) * kfep * xstep 133 ! 134 ztrc = ( trb(ji,jj,jk,jppoc) + trb(ji,jj,jk,jpgoc) + trb(ji,jj,jk,jpcal) + trb(ji,jj,jk,jpgsi) ) * 1.e6 135 IF( ln_dust ) zdust = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) & 136 & * EXP( -gdept_n(ji,jj,jk) / 540. ) 137 IF (ln_ligand) THEN 138 zxlam = xlam1 * MAX( 1.E-3, EXP(-2 * etot(ji,jj,jk) / 10. ) * (1. - EXP(-2 * trb(ji,jj,jk,jpoxy) / 100.E-6 ) )) 139 ELSE 140 zxlam = xlam1 * 1.0 141 ENDIF 142 zlam1b = 3.e-5 + xlamdust * zdust + zxlam * ztrc 143 zscave = zfeequi * zlam1b * xstep 144 145 ! Compute the different ratios for scavenging of iron 146 ! to later allocate scavenged iron to the different organic pools 147 ! --------------------------------------------------------- 148 zdenom1 = zxlam * trb(ji,jj,jk,jppoc) / zlam1b 149 zdenom2 = zxlam * trb(ji,jj,jk,jpgoc) / zlam1b 150 151 ! Increased scavenging for very high iron concentrations found near the coasts 152 ! due to increased lithogenic particles and let say it is unknown processes (precipitation, ...) 153 ! ----------------------------------------------------------- 154 zlamfac = MAX( 0.e0, ( gphit(ji,jj) + 55.) / 30. ) 155 zlamfac = MIN( 1. , zlamfac ) 156 zdep = MIN( 1., 1000. / gdept_n(ji,jj,jk) ) 157 zcoag = 1E-4 * ( 1. - zlamfac ) * zdep * xstep * trb(ji,jj,jk,jpfer) 158 159 ! Compute the coagulation of colloidal iron. This parameterization 160 ! could be thought as an equivalent of colloidal pumping. 161 ! It requires certainly some more work as it is very poorly constrained. 162 ! ---------------------------------------------------------------- 163 zlam1a = ( 0.369 * 0.3 * trb(ji,jj,jk,jpdoc) + 102.4 * trb(ji,jj,jk,jppoc) ) * xdiss(ji,jj,jk) & 164 & + ( 114. * 0.3 * trb(ji,jj,jk,jpdoc) ) 165 zaggdfea = zlam1a * xstep * zfecoll 166 ! 167 zlam1b = 3.53E3 * trb(ji,jj,jk,jpgoc) * xdiss(ji,jj,jk) 168 zaggdfeb = zlam1b * xstep * zfecoll 169 ! 170 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zscave - zaggdfea - zaggdfeb & 171 & - zcoag - precip(ji,jj,jk) 172 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zscave * zdenom1 + zaggdfea 173 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zscave * zdenom2 + zaggdfeb 174 zscav3d(ji,jj,jk) = zscave 175 zcoll3d(ji,jj,jk) = zaggdfea + zaggdfeb 176 ! 177 END DO 178 END DO 179 END DO 109 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 110 ! Scavenging rate of iron. This scavenging rate depends on the load of particles of sea water. 111 ! This parameterization assumes a simple second order kinetics (k[Particles][Fe]). 112 ! Scavenging onto dust is also included as evidenced from the DUNE experiments. 113 ! -------------------------------------------------------------------------------------- 114 zhplus = max( rtrn, hi(ji,jj,jk) ) 115 fe3sol = fesol(ji,jj,jk,1) * ( zhplus**3 + fesol(ji,jj,jk,2) * zhplus**2 & 116 & + fesol(ji,jj,jk,3) * zhplus + fesol(ji,jj,jk,4) & 117 & + fesol(ji,jj,jk,5) / zhplus ) 118 ! 119 zfeequi = zFe3(ji,jj,jk) * 1E-9 120 zhplus = max( rtrn, hi(ji,jj,jk) ) 121 fe3sol = fesol(ji,jj,jk,1) * ( zhplus**3 + fesol(ji,jj,jk,2) * zhplus**2 & 122 & + fesol(ji,jj,jk,3) * zhplus + fesol(ji,jj,jk,4) & 123 & + fesol(ji,jj,jk,5) / zhplus ) 124 zfecoll = 0.5 * zFeL1(ji,jj,jk) * 1E-9 125 ! precipitation of Fe3+, creation of nanoparticles 126 precip(ji,jj,jk) = MAX( 0., ( zFe3(ji,jj,jk) * 1E-9 - fe3sol ) ) * kfep * xstep 127 ! 128 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 129 IF( ll_dust ) zdust = dust(ji,jj) / ( wdust / rday ) * tmask(ji,jj,jk) & 130 & * EXP( -gdept(ji,jj,jk,Kmm) / 540. ) 131 IF (ln_ligand) THEN 132 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 ) )) 133 ELSE 134 zxlam = xlam1 * 1.0 135 ENDIF 136 zlam1b = 3.e-5 + xlamdust * zdust + zxlam * ztrc 137 zscave = zfeequi * zlam1b * xstep 138 139 ! Compute the different ratios for scavenging of iron 140 ! to later allocate scavenged iron to the different organic pools 141 ! --------------------------------------------------------- 142 zdenom1 = zxlam * tr(ji,jj,jk,jppoc,Kbb) / zlam1b 143 zdenom2 = zxlam * tr(ji,jj,jk,jpgoc,Kbb) / zlam1b 144 145 ! Increased scavenging for very high iron concentrations found near the coasts 146 ! due to increased lithogenic particles and let say it is unknown processes (precipitation, ...) 147 ! ----------------------------------------------------------- 148 zlamfac = MAX( 0.e0, ( gphit(ji,jj) + 55.) / 30. ) 149 zlamfac = MIN( 1. , zlamfac ) 150 zdep = MIN( 1., 1000. / gdept(ji,jj,jk,Kmm) ) 151 zcoag = 1E-4 * ( 1. - zlamfac ) * zdep * xstep * tr(ji,jj,jk,jpfer,Kbb) 152 153 ! Compute the coagulation of colloidal iron. This parameterization 154 ! could be thought as an equivalent of colloidal pumping. 155 ! It requires certainly some more work as it is very poorly constrained. 156 ! ---------------------------------------------------------------- 157 zlam1a = ( 0.369 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4 * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk) & 158 & + ( 114. * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) ) 159 zaggdfea = zlam1a * xstep * zfecoll 160 ! 161 zlam1b = 3.53E3 * tr(ji,jj,jk,jpgoc,Kbb) * xdiss(ji,jj,jk) 162 zaggdfeb = zlam1b * xstep * zfecoll 163 ! 164 tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) - zscave - zaggdfea - zaggdfeb & 165 & - zcoag - precip(ji,jj,jk) 166 tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) + zscave * zdenom1 + zaggdfea 167 tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zscave * zdenom2 + zaggdfeb 168 zscav3d(ji,jj,jk) = zscave 169 zcoll3d(ji,jj,jk) = zaggdfea + zaggdfeb 170 ! 171 END_3D 180 172 ! 181 173 ! Define the bioavailable fraction of iron 182 174 ! ---------------------------------------- 183 biron(:,:,:) = tr b(:,:,:,jpfer)175 biron(:,:,:) = tr(:,:,:,jpfer,Kbb) 184 176 ! 185 177 IF( ln_ligand ) THEN 186 178 ! 187 DO jk = 1, jpkm1 188 DO jj = 1, jpj 189 DO ji = 1, jpi 190 zlam1a = ( 0.369 * 0.3 * trb(ji,jj,jk,jpdoc) + 102.4 * trb(ji,jj,jk,jppoc) ) * xdiss(ji,jj,jk) & 191 & + ( 114. * 0.3 * trb(ji,jj,jk,jpdoc) ) 192 ! 193 zlam1b = 3.53E3 * trb(ji,jj,jk,jpgoc) * xdiss(ji,jj,jk) 194 zligco = 0.5 * trn(ji,jj,jk,jplgw) 195 zaggliga = zlam1a * xstep * zligco 196 zaggligb = zlam1b * xstep * zligco 197 tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) - zaggliga - zaggligb 198 zlcoll3d(ji,jj,jk) = zaggliga + zaggligb 199 END DO 200 END DO 201 END DO 202 ! 203 plig(:,:,:) = MAX( 0., ( ( zFeL1(:,:,:) * 1E-9 ) / ( trb(:,:,:,jpfer) +rtrn ) ) ) 179 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 180 zlam1a = ( 0.369 * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) + 102.4 * tr(ji,jj,jk,jppoc,Kbb) ) * xdiss(ji,jj,jk) & 181 & + ( 114. * 0.3 * tr(ji,jj,jk,jpdoc,Kbb) ) 182 ! 183 zlam1b = 3.53E3 * tr(ji,jj,jk,jpgoc,Kbb) * xdiss(ji,jj,jk) 184 zligco = 0.5 * tr(ji,jj,jk,jplgw,Kmm) 185 zaggliga = zlam1a * xstep * zligco 186 zaggligb = zlam1b * xstep * zligco 187 tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) - zaggliga - zaggligb 188 zlcoll3d(ji,jj,jk) = zaggliga + zaggligb 189 END_3D 190 ! 191 plig(:,:,:) = MAX( 0., ( ( zFeL1(:,:,:) * 1E-9 ) / ( tr(:,:,:,jpfer,Kbb) +rtrn ) ) ) 204 192 ! 205 193 ENDIF … … 209 197 IF( knt == nrdttrc ) THEN 210 198 zrfact2 = 1.e3 * rfact2r ! conversion from mol/L/timestep into mol/m3/s 211 IF( iom_use("Fe3") ) CALL iom_put("Fe3" , zFe3 (:,:,:) * tmask(:,:,:) ) ! Fe3+ 212 IF( iom_use("FeL1") ) CALL iom_put("FeL1" , zFeL1 (:,:,:) * tmask(:,:,:) ) ! FeL1 213 IF( iom_use("TL1") ) CALL iom_put("TL1" , zTL1 (:,:,:) * tmask(:,:,:) ) ! TL1 199 IF( iom_use("Fe3") ) THEN 200 zFe3(:,:,jpk) = 0. ; CALL iom_put("Fe3" , zFe3(:,:,:) * tmask(:,:,:) ) ! Fe3+ 201 ENDIF 202 IF( iom_use("FeL1") ) THEN 203 zFeL1(:,:,jpk) = 0. ; CALL iom_put("FeL1", zFeL1(:,:,:) * tmask(:,:,:) ) ! FeL1 204 ENDIF 205 IF( iom_use("TL1") ) THEN 206 zTL1(:,:,jpk) = 0. ; CALL iom_put("TL1" , zTL1(:,:,:) * tmask(:,:,:) ) ! TL1 207 ENDIF 214 208 IF( iom_use("Totlig") ) CALL iom_put("Totlig" , ztotlig(:,:,:) * tmask(:,:,:) ) ! TL 215 209 IF( iom_use("Biron") ) CALL iom_put("Biron" , biron (:,:,:) * 1e9 * tmask(:,:,:) ) ! biron 216 IF( iom_use("FESCAV") ) CALL iom_put("FESCAV" , zscav3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 217 IF( iom_use("FECOLL") ) CALL iom_put("FECOLL" , zcoll3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 218 IF( iom_use("LGWCOLL")) CALL iom_put("LGWCOLL", zlcoll3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 219 ENDIF 220 ENDIF 221 222 IF(ln_ctl) THEN ! print mean trends (used for debugging) 210 IF( iom_use("FESCAV") ) THEN 211 zscav3d (:,:,jpk) = 0. ; CALL iom_put("FESCAV" , zscav3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 212 ENDIF 213 IF( iom_use("FECOLL") ) THEN 214 zcoll3d (:,:,jpk) = 0. ; CALL iom_put("FECOLL" , zcoll3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 215 ENDIF 216 IF( iom_use("LGWCOLL")) THEN 217 zlcoll3d(:,:,jpk) = 0. ; CALL iom_put("LGWCOLL", zlcoll3d(:,:,:) * 1e9 * tmask(:,:,:) * zrfact2 ) 218 ENDIF 219 ENDIF 220 ENDIF 221 222 IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) 223 223 WRITE(charout, FMT="('fechem')") 224 CALL prt_ctl_ trc_info(charout)225 CALL prt_ctl _trc(tab4d=tra, mask=tmask, clinfo=ctrcnm)224 CALL prt_ctl_info( charout, cdcomp = 'top' ) 225 CALL prt_ctl(tab4d_1=tr(:,:,:,:,Krhs), mask1=tmask, clinfo=ctrcnm) 226 226 ENDIF 227 227 ! … … 254 254 ENDIF 255 255 ! 256 REWIND( numnatp_ref ) ! Namelist nampisfer in reference namelist : Pisces iron chemistry257 256 READ ( numnatp_ref, nampisfer, IOSTAT = ios, ERR = 901) 258 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisfer in reference namelist', lwp ) 259 REWIND( numnatp_cfg ) ! Namelist nampisfer in configuration namelist : Pisces iron chemistry 257 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisfer in reference namelist' ) 260 258 READ ( numnatp_cfg, nampisfer, IOSTAT = ios, ERR = 902 ) 261 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'nampisfer in configuration namelist' , lwp)259 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'nampisfer in configuration namelist' ) 262 260 IF(lwm) WRITE( numonp, nampisfer ) 263 261
Note: See TracChangeset
for help on using the changeset viewer.