Changeset 14385 for NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zmeso.F90
- Timestamp:
- 2021-02-03T16:03:34+01:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/TOP/PISCES/P4Z/p4zmeso.F90
r13295 r14385 8 8 !! 3.4 ! 2011-06 (O. Aumont, C. Ethe) Quota model for iron 9 9 !!---------------------------------------------------------------------- 10 !! p4z_meso : Compute the sources/sinks for mesozooplankton 11 !! p4z_meso_init : Initialization of the parameters for mesozooplankton 10 !! p4z_meso : Compute the sources/sinks for mesozooplankton 11 !! p4z_meso_init : Initialization of the parameters for mesozooplankton 12 !! p4z_meso_alloc : Allocate variables for mesozooplankton 12 13 !!---------------------------------------------------------------------- 13 14 USE oce_trc ! shared variables between ocean and passive tracers … … 23 24 PUBLIC p4z_meso ! called in p4zbio.F90 24 25 PUBLIC p4z_meso_init ! called in trcsms_pisces.F90 25 26 PUBLIC p4z_meso_alloc ! called in trcini_pisces.F90 27 28 !! * Shared module variables 26 29 REAL(wp), PUBLIC :: part2 !: part of calcite not dissolved in mesozoo guts 27 30 REAL(wp), PUBLIC :: xpref2d !: mesozoo preference for diatoms … … 42 45 REAL(wp), PUBLIC :: epsher2 !: growth efficiency 43 46 REAL(wp), PUBLIC :: epsher2min !: minimum growth efficiency at high food for grazing 2 47 REAL(wp), PUBLIC :: xsigma2 !: Width of the predation window 48 REAL(wp), PUBLIC :: xsigma2del !: Maximum width of the predation window at low food density 44 49 REAL(wp), PUBLIC :: grazflux !: mesozoo flux feeding rate 50 REAL(wp), PUBLIC :: xfracmig !: Fractional biomass of meso that performs DVM 51 LOGICAL , PUBLIC :: ln_dvm_meso !: Boolean to activate DVM of mesozooplankton 52 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig !: DVM of mesozooplankton : migration depth 53 INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig !: Vertical indice of the the migration depth 45 54 46 55 !! * Substitutions … … 53 62 CONTAINS 54 63 55 SUBROUTINE p4z_meso( kt, knt, Kbb, K rhs )64 SUBROUTINE p4z_meso( kt, knt, Kbb, Kmm, Krhs ) 56 65 !!--------------------------------------------------------------------- 57 66 !! *** ROUTINE p4z_meso *** 58 67 !! 59 68 !! ** Purpose : Compute the sources/sinks for mesozooplankton 69 !! This includes ingestion and assimilation, flux feeding 70 !! and mortality. We use a passive prey switching 71 !! parameterization. 72 !! All living compartments smaller than mesozooplankton 73 !! are potential preys of mesozooplankton as well as small 74 !! sinking particles 60 75 !! 61 76 !! ** Method : - ??? 62 77 !!--------------------------------------------------------------------- 63 78 INTEGER, INTENT(in) :: kt, knt ! ocean time step and ??? 64 INTEGER, INTENT(in) :: Kbb, Krhs ! time level indices65 ! 66 INTEGER :: ji, jj, jk 79 INTEGER, INTENT(in) :: Kbb, kmm, Krhs ! time level indices 80 ! 81 INTEGER :: ji, jj, jk, jkt 67 82 REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam 68 REAL(wp) :: zgraze2 , zdenom, zdenom2 69 REAL(wp) :: zfact , zfood, zfoodlim, zproport, zbeta 83 REAL(wp) :: zgraze2 , zdenom, zdenom2, zfact , zfood, zfoodlim, zproport, zbeta 70 84 REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2, zfracal, zgrazcal 71 REAL(wp) :: zepsherf, zepshert, zepsherv, zepsherq 72 REAL(wp) :: zgrarsig, zgraztotc, zgraztotn, zgraztotf 73 REAL(wp) :: zgrarem2, zgrafer2, zgrapoc2, zprcaca, zmortz, zgrasrat, zgrasratn 74 REAL(wp) :: zrespz, ztortz, zgrazd, zgrazz, zgrazpof 75 REAL(wp) :: zgrazn, zgrazpoc, zgraznf, zgrazf 76 REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg 77 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing2, zfezoo2, zz2ligprod 85 REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgraztotc, zgraztotn, zgraztotf 86 REAL(wp) :: zmigreltime, zprcaca, zmortz, zgrasratf, zgrasratn 87 REAL(wp) :: zrespz, ztortz, zgrazdc, zgrazz, zgrazpof, zgraznc, zgrazpoc, zgraznf, zgrazdf 88 REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg, zrum, zcodel, zargu, zval, zdep 89 REAL(wp) :: zsigma, zdiffdn, ztmp1, ztmp2, ztmp3, ztmp4, ztmptot, zmigthick 78 90 CHARACTER (len=25) :: charout 91 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 92 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof, zgrabsi 93 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigrem, zgramigref, zgramigpoc, zgramigpof 94 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigbsi 79 95 !!--------------------------------------------------------------------- 80 96 ! 81 97 IF( ln_timing ) CALL timing_start('p4z_meso') 98 ! 99 zgrazing(:,:,:) = 0._wp ; zgrapoc(:,:,:) = 0._wp 100 zfezoo2 (:,:,:) = 0._wp ; zgrarem(:,:,:) = 0._wp 101 zgraref (:,:,:) = 0._wp ; zgrapof(:,:,:) = 0._wp 102 zgrabsi (:,:,:) = 0._wp 103 ! 104 ! 105 ! Diurnal vertical migration of mesozooplankton 106 ! Computation of the migration depth 107 ! --------------------------------------------- 108 IF (ln_dvm_meso) CALL p4z_meso_depmig( Kbb, Kmm ) 82 109 ! 83 110 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) … … 85 112 zfact = xstep * tgfunc2(ji,jj,jk) * zcompam 86 113 87 ! Respiration rates of both zooplankton 88 ! ------------------------------------- 114 115 ! linear mortality of mesozooplankton 116 ! A michaelis menten modulation term is used to avoid extinction of 117 ! mesozooplankton at very low food concentration. Mortality is 118 119 ! enhanced in low O2 waters 120 ! ----------------------------------------------------------------- 89 121 zrespz = resrat2 * zfact * ( tr(ji,jj,jk,jpmes,Kbb) / ( xkmort + tr(ji,jj,jk,jpmes,Kbb) ) & 90 122 & + 3. * nitrfac(ji,jj,jk) ) 91 123 92 ! Zooplankton mortality. A square function has been selected with 93 ! no real reason except that it seems to be more stable and may mimic predation 94 ! --------------------------------------------------------------- 124 ! Zooplankton quadratic mortality. A square function has been selected with 125 ! to mimic predation and disease (density dependent mortality). It also tends 126 ! to stabilise the model 127 ! ------------------------------------------------------------------------- 95 128 ztortz = mzrat2 * 1.e6 * zfact * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk) ) 96 129 ! 130 131 ! Computation of the abundance of the preys 132 ! A threshold can be specified in the namelist 133 ! -------------------------------------------- 97 134 zcompadi = MAX( ( tr(ji,jj,jk,jpdia,Kbb) - xthresh2dia ), 0.e0 ) 98 135 zcompaz = MAX( ( tr(ji,jj,jk,jpzoo,Kbb) - xthresh2zoo ), 0.e0 ) 99 136 zcompapoc = MAX( ( tr(ji,jj,jk,jppoc,Kbb) - xthresh2poc ), 0.e0 ) 137 100 138 ! Size effect of nanophytoplankton on grazing : the smaller it is, the less prone 101 ! it is to predation by mesozooplankton 139 ! it is to predation by mesozooplankton. We use a quota dependant parameterization 140 ! as a low quota indicates oligotrophic conditions which are charatcerized by 141 ! small cells 102 142 ! ------------------------------------------------------------------------------- 103 143 zcompaph = MAX( ( tr(ji,jj,jk,jpphy,Kbb) - xthresh2phy ), 0.e0 ) & 104 144 & * MIN(1., MAX( 0., ( quotan(ji,jj,jk) - 0.2) / 0.3 ) ) 105 145 106 ! Mesozooplankton grazing 107 ! ------------------------ 146 147 ! Mesozooplankton grazing 148 ! The total amount of food is the sum of all preys accessible to mesozooplankton 149 ! multiplied by their food preference 150 ! A threshold can be specified in the namelist (xthresh2). However, when food 151 ! concentration is close to this threshold, it is decreased to avoid the 152 ! accumulation of food in the mesozoopelagic domain 153 ! ------------------------------------------------------------------------------- 108 154 zfood = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc 109 155 zfoodlim = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) ) … … 112 158 zgraze2 = grazrat2 * xstep * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpmes,Kbb) * (1. - nitrfac(ji,jj,jk)) 113 159 114 zgrazd = zgraze2 * xpref2d * zcompadi * zdenom2 115 zgrazz = zgraze2 * xpref2z * zcompaz * zdenom2 116 zgrazn = zgraze2 * xpref2n * zcompaph * zdenom2 117 zgrazpoc = zgraze2 * xpref2c * zcompapoc * zdenom2 118 119 zgraznf = zgrazn * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn) 120 zgrazf = zgrazd * tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn) 160 161 ! An active switching parameterization is used here. 162 ! We don't use the KTW parameterization proposed by 163 ! Vallina et al. because it tends to produce too steady biomass 164 ! composition and the variance of Chl is too low as it grazes 165 ! too strongly on winning organisms. We use a generalized 166 ! switching parameterization proposed by Morozov and 167 ! Petrovskii (2013) 168 ! ------------------------------------------------------------ 169 ! The width of the selection window is increased when preys 170 ! have low abundance, .i.e. zooplankton become less specific 171 ! to avoid starvation. 172 ! ---------------------------------------------------------- 173 zsigma = 1.0 - zdenom**2/(0.05**2+zdenom**2) 174 zsigma = xsigma2 + xsigma2del * zsigma 175 ! Nanophytoplankton and diatoms are the only preys considered 176 ! to be close enough to have potential interference 177 ! ----------------------------------------------------------- 178 zdiffdn = exp( -ABS(log(1.67 * sizen(ji,jj,jk) / (5.0 * sized(ji,jj,jk) + rtrn )) )**2 / zsigma**2 ) 179 ztmp1 = xpref2n * zcompaph * ( zcompaph + zdiffdn * zcompadi ) / ( 1.0 + zdiffdn ) 180 ztmp2 = xpref2c * zcompapoc**2 181 ztmp3 = xpref2d * zcompadi * ( zdiffdn * zcompadi + zcompaph ) / ( 1.0 + zdiffdn ) 182 ztmp4 = xpref2z * zcompaz**2 183 ztmptot = ztmp1 + ztmp2 + ztmp3 + ztmp4 + rtrn 184 ztmp1 = ztmp1 / ztmptot 185 ztmp2 = ztmp2 / ztmptot 186 ztmp3 = ztmp3 / ztmptot 187 ztmp4 = ztmp4 / ztmptot 188 189 ! Mesozooplankton regular grazing on the different preys 190 ! ------------------------------------------------------ 191 zgrazdc = zgraze2 * ztmp3 * zdenom ! diatoms 192 zgraznc = zgraze2 * ztmp1 * zdenom ! nanophytoplankton 193 zgrazpoc = zgraze2 * ztmp2 * zdenom ! small POC 194 zgrazz = zgraze2 * ztmp4 * zdenom ! microzooplankton 195 196 ! Ingestion rates of the Fe content of the different preys 197 zgraznf = zgraznc * tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn) 198 zgrazdf = zgrazdc * tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn) 121 199 zgrazpof = zgrazpoc * tr(ji,jj,jk,jpsfe,Kbb) / ( tr(ji,jj,jk,jppoc,Kbb) + rtrn) 122 200 123 ! Mesozooplankton flux feeding on GOC 124 ! ---------------------------------- 201 ! Mesozooplankton flux feeding on GOC and POC. The feeding pressure 202 ! is proportional to the flux 203 ! ------------------------------------------------------------------ 125 204 zgrazffeg = grazflux * xstep * wsbio4(ji,jj,jk) & 126 205 & * tgfunc2(ji,jj,jk) * tr(ji,jj,jk,jpgoc,Kbb) * tr(ji,jj,jk,jpmes,Kbb) & … … 132 211 zgrazfffp = zgrazffep * tr(ji,jj,jk,jpsfe,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + rtrn) 133 212 ! 134 zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg 135 ! Compute the proportion of filter feeders 213 zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg 214 ! Compute the proportion of filter feeders. It is assumed steady state. 215 ! --------------------------------------------------------------------- 136 216 zproport = (zgrazffep + zgrazffeg)/(rtrn + zgraztotc) 217 218 ! Compute fractionation of aggregates. It is assumed that 219 ! diatoms based aggregates are more prone to fractionation 220 ! since they are more porous (marine snow instead of fecal pellets) 221 ! ----------------------------------------------------------------- 222 137 223 ! Compute fractionation of aggregates. It is assumed that 138 224 ! diatoms based aggregates are more prone to fractionation … … 145 231 zfracfe = zfrac * tr(ji,jj,jk,jpbfe,Kbb) / (tr(ji,jj,jk,jpgoc,Kbb) + rtrn) 146 232 233 ! Flux feeding is multiplied by the fractional biomass of flux feeders 147 234 zgrazffep = zproport * zgrazffep 148 235 zgrazffeg = zproport * zgrazffeg 149 236 zgrazfffp = zproport * zgrazfffp 150 237 zgrazfffg = zproport * zgrazfffg 151 zgraztotc = zgrazd + zgrazz + zgrazn + zgrazpoc + zgrazffep + zgrazffeg 152 zgraztotn = zgrazd * quotad(ji,jj,jk) + zgrazz + zgrazn * quotan(ji,jj,jk) & 238 239 ! Total ingestion rates in C, N, Fe 240 zgraztotc = zgrazdc + zgrazz + zgraznc + zgrazpoc + zgrazffep + zgrazffeg 241 zgraztotn = zgrazdc * quotad(ji,jj,jk) + zgrazz + zgraznc * quotan(ji,jj,jk) & 153 242 & + zgrazpoc + zgrazffep + zgrazffeg 154 zgraztotf = zgraz f + zgraznf + zgrazz * ferat3+ zgrazpof + zgrazfffp + zgrazfffg243 zgraztotf = zgrazdf + zgraznf + zgrazz * feratz + zgrazpof + zgrazfffp + zgrazfffg 155 244 156 245 ! Total grazing ( grazing by microzoo is already computed in p4zmicro ) 157 zgrazing 2(ji,jj,jk) = zgraztotc246 zgrazing(ji,jj,jk) = zgraztotc 158 247 159 248 ! Mesozooplankton efficiency. … … 165 254 ! Fulton, 2012) 166 255 ! ----------------------------------------------------------------------------------- 167 zgrasrat = ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) 256 257 zgrasratf = ( zgraztotf + rtrn )/ ( zgraztotc + rtrn ) 168 258 zgrasratn = ( zgraztotn + rtrn )/ ( zgraztotc + rtrn ) 169 zepshert = MIN( 1., zgrasratn, zgrasrat / ferat3)259 zepshert = MIN( 1., zgrasratn, zgrasratf / feratm) 170 260 zbeta = MAX(0., (epsher2 - epsher2min) ) 261 ! Food quantity deprivation of GGE 171 262 zepsherf = epsher2min + zbeta / ( 1.0 + 0.04E6 * 12. * zfood * zbeta ) 263 ! Food quality deprivation of GGE 172 264 zepsherq = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 173 zepsherv = zepsherf * zepshert * zepsherq 174 175 zgrarem2 = zgraztotc * ( 1. - zepsherv - unass2 ) & 176 & + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz 177 zgrafer2 = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasrat - ferat3 * zepsherv ) & 178 & + ferat3 * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz ) 179 zgrapoc2 = zgraztotc * unass2 180 181 182 ! Update the arrays TRA which contain the biological sources and sinks 183 zgrarsig = zgrarem2 * sigma2 184 tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarsig 185 tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarsig 186 tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem2 - zgrarsig 187 ! 188 IF( ln_ligand ) THEN 189 tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + (zgrarem2 - zgrarsig) * ldocz 190 zz2ligprod(ji,jj,jk) = (zgrarem2 - zgrarsig) * ldocz 191 ENDIF 192 ! 193 tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarsig 194 tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgrafer2 195 zfezoo2(ji,jj,jk) = zgrafer2 196 tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarsig 197 tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarsig 198 265 ! Actual GGE 266 zepsherv = zepsherf * zepshert * zepsherq 267 ! 268 ! Impact of grazing on the prognostic variables 269 ! --------------------------------------------- 199 270 zmortz = ztortz + zrespz 271 ! Mortality induced by the upper trophic levels, ztortz, is allocated 272 ! according to a infinite chain of predators (ANderson et al., 2013) 200 273 zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz + zrespz 274 201 275 tr(ji,jj,jk,jpmes,Krhs) = tr(ji,jj,jk,jpmes,Krhs) - zmortz + zepsherv * zgraztotc 202 tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazd 276 tr(ji,jj,jk,jpdia,Krhs) = tr(ji,jj,jk,jpdia,Krhs) - zgrazdc 203 277 tr(ji,jj,jk,jpzoo,Krhs) = tr(ji,jj,jk,jpzoo,Krhs) - zgrazz 204 tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgrazn 205 tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zgrazn * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 206 tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zgrazd * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 207 tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zgrazd * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 208 tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrazd * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 278 tr(ji,jj,jk,jpphy,Krhs) = tr(ji,jj,jk,jpphy,Krhs) - zgraznc 279 tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) - zgraznc * tr(ji,jj,jk,jpnch,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) + rtrn ) 280 tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) - zgrazdc * tr(ji,jj,jk,jpdch,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 281 tr(ji,jj,jk,jpdsi,Krhs) = tr(ji,jj,jk,jpdsi,Krhs) - zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 282 tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 283 zgrabsi(ji,jj,jk) = zgrazdc * tr(ji,jj,jk,jpdsi,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) 284 ! 209 285 tr(ji,jj,jk,jpnfe,Krhs) = tr(ji,jj,jk,jpnfe,Krhs) - zgraznf 210 tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgraz f211 286 tr(ji,jj,jk,jpdfe,Krhs) = tr(ji,jj,jk,jpdfe,Krhs) - zgrazdf 287 ! 212 288 tr(ji,jj,jk,jppoc,Krhs) = tr(ji,jj,jk,jppoc,Krhs) - zgrazpoc - zgrazffep + zfrac 213 289 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfrac 214 290 conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep 215 tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zmortzgoc - zgrazffeg + zgrapoc2 - zfrac216 prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zmortzgoc + zgrapoc2291 ! 292 tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) - zgrazffeg - zfrac 217 293 consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfrac 294 ! 218 295 tr(ji,jj,jk,jpsfe,Krhs) = tr(ji,jj,jk,jpsfe,Krhs) - zgrazpof - zgrazfffp + zfracfe 219 tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + ferat3 * zmortzgoc - zgrazfffg & 220 & + zgraztotf * unass2 - zfracfe 221 zfracal = tr(ji,jj,jk,jpcal,Kbb) / (tr(ji,jj,jk,jppoc,Kbb) + tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) 222 zgrazcal = (zgrazffeg + zgrazpoc) * (1. - part2) * zfracal 223 ! calcite production 224 zprcaca = xfracal(ji,jj,jk) * zgrazn 296 tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) - zgrazfffg - zfracfe 297 298 ! Calcite remineralization due to zooplankton activity 299 ! part2 of the ingested calcite is not dissolving in the 300 ! acidic gut 301 ! ------------------------------------------------------ 302 zfracal = tr(ji,jj,jk,jpcal,Kbb) / ( tr(ji,jj,jk,jpgoc,Kbb) + rtrn ) 303 zgrazcal = zgrazffeg * (1. - part2) * zfracal 304 ! calcite production by zooplankton activity 305 zprcaca = xfracal(ji,jj,jk) * zgraznc 225 306 prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) 226 307 ! 227 308 zprcaca = part2 * zprcaca 228 309 tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrazcal - zprcaca 229 tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * ( zgrazcal +zprcaca )310 tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) - 2. * ( zgrazcal - zprcaca ) 230 311 tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zgrazcal + zprcaca 312 313 ! Computation of total excretion and egestion by mesozoo. 314 ! --------------------------------------------------------- 315 zgrarem(ji,jj,jk) = zgraztotc * ( 1. - zepsherv - unass2 ) & 316 & + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz 317 zgraref(ji,jj,jk) = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasratf - feratm * zepsherv ) & 318 & + feratm * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz ) 319 zgrapoc(ji,jj,jk) = zgraztotc * unass2 + zmortzgoc 320 zgrapof(ji,jj,jk) = zgraztotf * unass2 + feratm * zmortzgoc 321 ! 231 322 END_3D 232 ! 323 324 ! Computation of the effect of DVM by mesozooplankton 325 ! This part is only activated if ln_dvm_meso is set to true 326 ! The parameterization has been published in Gorgues et al. (2019). 327 ! ----------------------------------------------------------------- 328 IF (ln_dvm_meso) THEN 329 ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 330 ALLOCATE( zgramigbsi(jpi,jpj) ) 331 zgramigrem(:,:) = 0.0 ; zgramigref(:,:) = 0.0 332 zgramigpoc(:,:) = 0.0 ; zgramigpof(:,:) = 0.0 333 zgramigbsi(:,:) = 0.0 334 335 ! Compute the amount of materials that will go into vertical migration 336 ! This fraction is sumed over the euphotic zone and is removed from 337 ! the fluxes driven by mesozooplankton in the euphotic zone. 338 ! -------------------------------------------------------------------- 339 DO_3D( 1, 1, 1, 1, 1, jpk ) 340 zmigreltime = (1. - strn(ji,jj)) 341 zmigthick = (1. - zmigreltime ) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) 342 IF ( gdept(ji,jj,jk,Kmm) <= heup(ji,jj) ) THEN 343 zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * zmigthick 344 zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * zmigthick 345 zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * zmigthick 346 zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * zmigthick 347 zgramigbsi(ji,jj) = zgramigbsi(ji,jj) + xfracmig * zgrabsi(ji,jj,jk) * zmigthick 348 349 zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 350 zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 351 zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 352 zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 353 zgrabsi(ji,jj,jk) = zgrabsi(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 354 ENDIF 355 END_3D 356 357 ! The inorganic and organic fluxes induced by migrating organisms are added at the 358 ! the migration depth (corresponding indice is set by kmig) 359 ! -------------------------------------------------------------------------------- 360 DO_2D( 1, 1, 1, 1 ) 361 IF( tmask(ji,jj,1) == 1.) THEN 362 jkt = kmig(ji,jj) 363 zdep = 1. / e3t(ji,jj,jkt,Kmm) 364 zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) * zdep 365 zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) * zdep 366 zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) * zdep 367 zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) * zdep 368 zgrabsi(ji,jj,jkt) = zgrabsi(ji,jj,jkt) + zgramigbsi(ji,jj) * zdep 369 ENDIF 370 END_2D 371 ! 372 ! Deallocate temporary variables 373 ! ------------------------------ 374 DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof, zgramigbsi ) 375 ! End of the ln_dvm_meso part 376 ENDIF 377 378 ! Update the arrays TRA which contain the biological sources and sinks 379 ! This only concerns the variables which are affected by DVM (inorganic 380 ! nutrients, DOC agands, and particulate organic carbon). 381 DO_3D( 1, 1, 1, 1, 1, jpk ) 382 tr(ji,jj,jk,jppo4,Krhs) = tr(ji,jj,jk,jppo4,Krhs) + zgrarem(ji,jj,jk) * sigma2 383 tr(ji,jj,jk,jpnh4,Krhs) = tr(ji,jj,jk,jpnh4,Krhs) + zgrarem(ji,jj,jk) * sigma2 384 tr(ji,jj,jk,jpdoc,Krhs) = tr(ji,jj,jk,jpdoc,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 ) 385 ! 386 IF( ln_ligand ) & 387 & tr(ji,jj,jk,jplgw,Krhs) = tr(ji,jj,jk,jplgw,Krhs) + zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz 388 ! 389 tr(ji,jj,jk,jpoxy,Krhs) = tr(ji,jj,jk,jpoxy,Krhs) - o2ut * zgrarem(ji,jj,jk) * sigma2 390 tr(ji,jj,jk,jpfer,Krhs) = tr(ji,jj,jk,jpfer,Krhs) + zgraref(ji,jj,jk) 391 zfezoo2(ji,jj,jk) = zgraref(ji,jj,jk) 392 tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zgrarem(ji,jj,jk) * sigma2 393 tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * zgrarem(ji,jj,jk) * sigma2 394 tr(ji,jj,jk,jpgoc,Krhs) = tr(ji,jj,jk,jpgoc,Krhs) + zgrapoc(ji,jj,jk) 395 prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk) 396 tr(ji,jj,jk,jpbfe,Krhs) = tr(ji,jj,jk,jpbfe,Krhs) + zgrapof(ji,jj,jk) 397 tr(ji,jj,jk,jpgsi,Krhs) = tr(ji,jj,jk,jpgsi,Krhs) + zgrabsi(ji,jj,jk) 398 END_3D 399 ! 400 ! Write the output 233 401 IF( lk_iomput .AND. knt == nrdttrc ) THEN 234 402 CALL iom_put( "PCAL" , prodcal(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) ) ! Calcite production 235 IF( iom_use("GRAZ2") ) THEN ! Total grazing of phyto by zooplankton 236 zgrazing2(:,:,jpk) = 0._wp ; CALL iom_put( "GRAZ2" , zgrazing2(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) ) 237 ENDIF 238 IF( iom_use("FEZOO2") ) THEN 239 zfezoo2 (:,:,jpk) = 0._wp ; CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 240 ENDIF 241 IF( ln_ligand ) THEN 242 zz2ligprod(:,:,jpk) = 0._wp ; CALL iom_put( "LPRODZ2", zz2ligprod(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 243 ENDIF 403 CALL iom_put( "GRAZ2" , zgrazing(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) ) ! Total grazing of phyto by zoo 404 CALL iom_put( "FEZOO2", zfezoo2(:,:,:) * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 405 IF( ln_ligand ) & 406 & CALL iom_put( "LPRODZ2", zgrarem(ji,jj,jk) * ( 1. - sigma2 ) * ldocz * 1e9 * 1.e+3 * rfact2r * tmask(:,:,:) ) 244 407 ENDIF 245 408 ! … … 261 424 !! ** Purpose : Initialization of mesozooplankton parameters 262 425 !! 263 !! ** Method : Read the namp ismes namelist and check the parameters426 !! ** Method : Read the namp4zmes namelist and check the parameters 264 427 !! called at the first timestep (nittrc000) 265 428 !! … … 270 433 NAMELIST/namp4zmes/ part2, grazrat2, resrat2, mzrat2, xpref2n, xpref2d, xpref2z, & 271 434 & xpref2c, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 272 & xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux 435 & xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux, ln_dvm_meso, & 436 & xsigma2, xsigma2del, xfracmig 273 437 !!---------------------------------------------------------------------- 274 438 ! … … 281 445 READ ( numnatp_ref, namp4zmes, IOSTAT = ios, ERR = 901) 282 446 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namp4zmes in reference namelist' ) 447 283 448 READ ( numnatp_cfg, namp4zmes, IOSTAT = ios, ERR = 902 ) 284 449 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namp4zmes in configuration namelist' ) … … 303 468 WRITE(numout,*) ' non assimilated fraction of P by mesozoo unass2 =', unass2 304 469 WRITE(numout,*) ' Efficiency of Mesozoo growth epsher2 =', epsher2 305 WRITE(numout,*) ' Minimum Efficiency of Mesozoo growth epsher2min =', epsher2min470 WRITE(numout,*) ' Minimum Efficiency of Mesozoo growth epsher2min =', epsher2min 306 471 WRITE(numout,*) ' Fraction of mesozoo excretion as DOM sigma2 =', sigma2 307 472 WRITE(numout,*) ' half sturation constant for grazing 2 xkgraz2 =', xkgraz2 473 WRITE(numout,*) ' Width of the grazing window xsigma2 =', xsigma2 474 WRITE(numout,*) ' Maximum additional width of the grazing window xsigma2del =', xsigma2del 475 WRITE(numout,*) ' Diurnal vertical migration of mesozoo. ln_dvm_meso =', ln_dvm_meso 476 WRITE(numout,*) ' Fractional biomass of meso that performs DVM xfracmig =', xfracmig 308 477 ENDIF 309 478 ! 310 479 END SUBROUTINE p4z_meso_init 480 481 SUBROUTINE p4z_meso_depmig( Kbb, Kmm ) 482 !!---------------------------------------------------------------------- 483 !! *** ROUTINE p4z_meso_depmig *** 484 !! 485 !! ** Purpose : Computation the migration depth of mesozooplankton 486 !! 487 !! ** Method : Computes the DVM depth of mesozooplankton from oxygen 488 !! temperature and chlorophylle following the parameterization 489 !! proposed by Bianchi et al. (2013) 490 !!---------------------------------------------------------------------- 491 INTEGER, INTENT(in) :: Kbb, kmm ! time level indices 492 ! 493 INTEGER :: ji, jj, jk 494 ! 495 REAL(wp) :: ztotchl, z1dep 496 REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 497 498 !!--------------------------------------------------------------------- 499 ! 500 IF( ln_timing == 1 ) CALL timing_start('p4z_meso_zdepmig') 501 ! 502 oxymoy(:,:) = 0. 503 tempmoy(:,:) = 0. 504 zdepmoy(:,:) = 0. 505 depmig (:,:) = 5. 506 kmig (:,:) = 1 507 ! 508 ! Compute the averaged values of oxygen, temperature over the domain 509 ! 150m to 500 m depth. 510 ! ------------------------------------------------------------------ 511 DO_3D( 1, 1, 1, 1, 1, jpk ) 512 IF( tmask(ji,jj,jk) == 1.) THEN 513 IF( gdept(ji,jj,jk,Kmm) >= 150. .AND. gdept(ji,jj,jk,kmm) <= 500.) THEN 514 oxymoy(ji,jj) = oxymoy(ji,jj) + tr(ji,jj,jk,jpoxy,Kbb) * 1E6 * e3t(ji,jj,jk,Kmm) 515 tempmoy(ji,jj) = tempmoy(ji,jj) + ts(ji,jj,jk,jp_tem,kmm) * e3t(ji,jj,jk,kmm) 516 zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t(ji,jj,jk,Kmm) 517 ENDIF 518 ENDIF 519 END_3D 520 521 ! Compute the difference between surface values and the mean values in the mesopelagic 522 ! domain 523 ! ------------------------------------------------------------------------------------ 524 DO_2D( 1, 1, 1, 1 ) 525 z1dep = 1. / ( zdepmoy(ji,jj) + rtrn ) 526 oxymoy(ji,jj) = tr(ji,jj,1,jpoxy,Kbb) * 1E6 - oxymoy(ji,jj) * z1dep 527 tempmoy(ji,jj) = ts(ji,jj,1,jp_tem,Kmm) - tempmoy(ji,jj) * z1dep 528 END_2D 529 ! 530 ! Computation of the migration depth based on the parameterization of 531 ! Bianchi et al. (2013) 532 ! ------------------------------------------------------------------- 533 DO_2D( 1, 1, 1, 1 ) 534 IF( tmask(ji,jj,1) == 1. ) THEN 535 ztotchl = ( tr(ji,jj,1,jpnch,Kbb) + tr(ji,jj,1,jpdch,Kbb) ) * 1E6 536 depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(ztotchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 537 ENDIF 538 END_2D 539 ! 540 ! Computation of the corresponding jk indice 541 ! ------------------------------------------ 542 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 543 IF( depmig(ji,jj) >= gdepw(ji,jj,jk,Kmm) .AND. depmig(ji,jj) < gdepw(ji,jj,jk+1,Kmm) ) THEN 544 kmig(ji,jj) = jk 545 ENDIF 546 END_3D 547 ! 548 ! Correction of the migration depth and indice based on O2 levels 549 ! If O2 is too low, imposing a migration depth at this low O2 levels 550 ! would lead to negative O2 concentrations (respiration while O2 is close 551 ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 552 ! that it falls above the OMZ 553 ! ----------------------------------------------------------------------- 554 DO_2D( 1, 1, 1, 1 ) 555 IF( tr(ji,jj,kmig(ji,jj),jpoxy,Kbb) < 5E-6 ) THEN 556 DO jk = kmig(ji,jj),1,-1 557 IF( tr(ji,jj,jk,jpoxy,Kbb) >= 5E-6 .AND. tr(ji,jj,jk+1,jpoxy,Kbb) < 5E-6) THEN 558 kmig(ji,jj) = jk 559 depmig(ji,jj) = gdept(ji,jj,jk,Kmm) 560 ENDIF 561 END DO 562 ENDIF 563 END_2D 564 ! 565 IF( ln_timing ) CALL timing_stop('p4z_meso_depmig') 566 ! 567 END SUBROUTINE p4z_meso_depmig 568 569 INTEGER FUNCTION p4z_meso_alloc() 570 !!---------------------------------------------------------------------- 571 !! *** ROUTINE p4z_meso_alloc *** 572 !!---------------------------------------------------------------------- 573 ! 574 ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p4z_meso_alloc ) 575 ! 576 IF( p4z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_meso_alloc : failed to allocate arrays.' ) 577 ! 578 END FUNCTION p4z_meso_alloc 311 579 312 580 !!======================================================================
Note: See TracChangeset
for help on using the changeset viewer.