Changeset 12524
- Timestamp:
- 2020-03-09T14:42:03+01:00 (5 years ago)
- Location:
- NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p4zligand.F90
r11536 r12524 25 25 REAL(wp), PUBLIC :: rlig !: Remin ligand production 26 26 REAL(wp), PUBLIC :: prlgw !: Photochemical of weak ligand 27 REAL(wp), PUBLIC :: xklig !: 1/2 saturation constant of photolysis 27 28 28 29 !!---------------------------------------------------------------------- … … 65 66 zlgwr = 1. / zlgwr * tgfunc(ji,jj,jk) * ( xstep / nyear_len(1) ) * blim(ji,jj,jk) * trb(ji,jj,jk,jplgw) 66 67 ! photochem loss of weak ligand 67 zlgwpr = prlgw * xstep * etot(ji,jj,jk) * trb(ji,jj,jk,jplgw) * (1. - fr_i(ji,jj)) 68 zlgwpr = prlgw * xstep * etot(ji,jj,jk) * trb(ji,jj,jk,jplgw)**3 * (1. - fr_i(ji,jj)) & 69 & / ( trb(ji,jj,jk,jplgw)**2 + (xklig)**2) 68 70 tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + zlgwp - zlgwr - zlgwpr 69 71 zligrem(ji,jj,jk) = zlgwr … … 117 119 INTEGER :: ios ! Local integer 118 120 ! 119 NAMELIST/nampislig/ rlgw, prlgw, rlgs, rlig 121 NAMELIST/nampislig/ rlgw, prlgw, rlgs, rlig, xklig 120 122 !!---------------------------------------------------------------------- 121 123 ! … … 139 141 WRITE(numout,*) ' Photolysis of weak ligand prlgw =', prlgw 140 142 WRITE(numout,*) ' Lifetime (years) of strong ligands rlgs =', rlgs 143 WRITE(numout,*) ' 1/2 saturation for photolysis xklig =', xklig 141 144 ENDIF 142 145 ! -
NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p4zmeso.F90
r12360 r12524 23 23 PUBLIC p4z_meso ! called in p4zbio.F90 24 24 PUBLIC p4z_meso_init ! called in trcsms_pisces.F90 25 PUBLIC p4z_meso_alloc 25 26 26 27 REAL(wp), PUBLIC :: part2 !: part of calcite not dissolved in mesozoo guts … … 43 44 REAL(wp), PUBLIC :: epsher2min !: minimum growth efficiency at high food for grazing 2 44 45 REAL(wp), PUBLIC :: grazflux !: mesozoo flux feeding rate 46 REAL(wp), PUBLIC :: xfracmig !: Fractional biomass of meso that performs DVM 47 LOGICAL , PUBLIC :: ln_dvm_meso !: Boolean to activate DVM of mesozooplankton 48 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig 49 INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig 45 50 46 51 !!---------------------------------------------------------------------- … … 61 66 INTEGER, INTENT(in) :: kt, knt ! ocean time step and ??? 62 67 ! 63 INTEGER :: ji, jj, jk 68 INTEGER :: ji, jj, jk, jkt 64 69 REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam 65 70 REAL(wp) :: zgraze2 , zdenom, zdenom2 … … 67 72 REAL(wp) :: zmortzgoc, zfrac, zfracfe, zratio, zratio2, zfracal, zgrazcal 68 73 REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zgrarsig, zgraztotc, zgraztotn, zgraztotf 69 REAL(wp) :: z grarem2, zgrafer2, zgrapoc2, zprcaca, zmortz, zgrasrat, zgrasratn74 REAL(wp) :: zmigreltime, zprcaca, zmortz, zgrasrat, zgrasratn 70 75 REAL(wp) :: zrespz, ztortz, zgrazd, zgrazz, zgrazpof 71 76 REAL(wp) :: zgrazn, zgrazpoc, zgraznf, zgrazf 72 77 REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg 78 REAL(wp) :: zrum, zcodel, zargu, zval 73 79 CHARACTER (len=25) :: charout 74 80 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 81 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof 82 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigrem, zgramigref, zgramigpoc, zgramigpof, zstrn 75 83 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d, zz2ligprod 76 84 !!--------------------------------------------------------------------- … … 85 93 zz2ligprod(:,:,:) = 0._wp 86 94 ENDIF 95 ! 96 ! Diurnal vertical migration of mesozooplankton 97 ! --------------------------------------------- 98 IF (ln_dvm_meso) CALL p4z_meso_depmig 87 99 ! 88 100 DO jk = 1, jpkm1 … … 111 123 & * MIN(1., MAX( 0., ( quotan(ji,jj,jk) - 0.2) / 0.3 ) ) 112 124 113 ! 114 ! 125 ! Mesozooplankton grazing 126 ! ------------------------ 115 127 zfood = xpref2d * zcompadi + xpref2z * zcompaz + xpref2n * zcompaph + xpref2c * zcompapoc 116 128 zfoodlim = MAX( 0., zfood - MIN( 0.5 * zfood, xthresh2 ) ) … … 173 185 zepsherq = 0.5 + (1.0 - 0.5) * zepshert * ( 1.0 + 1.0 ) / ( zepshert + 1.0 ) 174 186 zepsherv = zepsherf * zepshert * zepsherq 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 ! Update the arrays TRA which contain the biological sources and sinks 182 zgrarsig = zgrarem2 * sigma2 183 tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig 184 tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig 185 tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem2 - zgrarsig 186 ! 187 IF( ln_ligand ) THEN 188 tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + (zgrarem2 - zgrarsig) * ldocz 189 zz2ligprod(ji,jj,jk) = (zgrarem2 - zgrarsig) * ldocz 190 ENDIF 191 ! 192 tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig 193 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgrafer2 194 zfezoo2(ji,jj,jk) = zgrafer2 195 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarsig 196 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgrarsig 197 187 ! 188 ! Impact of grazing on the prognostic variables 189 ! --------------------------------------------- 198 190 zmortz = ztortz + zrespz 199 191 zmortzgoc = unass2 / ( 1. - epsher2 ) * ztortz + zrespz 200 tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) - zmortz + zepsherv * zgraztotc 192 tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) - zmortz + zepsherv * zgraztotc 201 193 tra(ji,jj,jk,jpdia) = tra(ji,jj,jk,jpdia) - zgrazd 202 194 tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) - zgrazz … … 208 200 tra(ji,jj,jk,jpnfe) = tra(ji,jj,jk,jpnfe) - zgraznf 209 201 tra(ji,jj,jk,jpdfe) = tra(ji,jj,jk,jpdfe) - zgrazf 210 211 202 tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfrac 212 203 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfrac 213 204 conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep 214 tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zmortzgoc - zgrazffeg + zgrapoc2 - zfrac 215 prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zmortzgoc + zgrapoc2 205 tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg - zfrac 216 206 consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfrac 217 207 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe 218 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + ferat3 * zmortzgoc - zgrazfffg &219 & + zgraztotf * unass2 - zfracfe208 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg - zfracfe 209 ! Calcite remineralization due to zooplankton activity 220 210 zfracal = trb(ji,jj,jk,jpcal) / (trb(ji,jj,jk,jppoc) + trb(ji,jj,jk,jpgoc) + rtrn ) 221 211 zgrazcal = (zgrazffeg + zgrazpoc) * (1. - part2) * zfracal 222 ! calcite production 212 ! calcite production by zooplankton activity 223 213 zprcaca = xfracal(ji,jj,jk) * zgrazn 224 214 prodcal(ji,jj,jk) = prodcal(ji,jj,jk) + zprcaca ! prodcal=prodcal(nanophy)+prodcal(microzoo)+prodcal(mesozoo) … … 228 218 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - 2. * ( zgrazcal + zprcaca ) 229 219 tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) - zgrazcal + zprcaca 220 221 ! Correct the fluxes for the effect of DVM 222 ! A fixed fraction of mesozooplankton is assumed to migrate 223 ! --------------------------------------------------------- 224 zgrarem(ji,jj,jk) = zgraztotc * ( 1. - zepsherv - unass2 ) & 225 & + ( 1. - epsher2 - unass2 ) / ( 1. - epsher2 ) * ztortz 226 zgraref(ji,jj,jk) = zgraztotc * MAX( 0. , ( 1. - unass2 ) * zgrasrat - ferat3 * zepsherv ) & 227 & + ferat3 * ( ( 1. - epsher2 - unass2 ) /( 1. - epsher2 ) * ztortz ) 228 zgrapoc(ji,jj,jk) = zgraztotc * unass2 + zmortzgoc 229 zgrapof(ji,jj,jk) = zgraztotf * unass2 + ferat3 * zmortzgoc 230 END DO 231 END DO 232 END DO 233 234 IF (ln_dvm_meso) THEN 235 ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 236 ALLOCATE( zstrn(jpi,jpj) ) 237 zgramigrem(:,:) = 0.0 ; zgramigref(:,:) = 0.0 238 zgramigpoc(:,:) = 0.0 ; zgramigpof(:,:) = 0.0 239 240 ! compute the day length depending on latitude and the day 241 zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) 242 zcodel = ASIN( SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp ) ) 243 244 ! day length in hours 245 zstrn(:,:) = 0. 246 DO jj = 1, jpj 247 DO ji = 1, jpi 248 zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) 249 zargu = MAX( -1., MIN( 1., zargu ) ) 250 zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. ) 251 zstrn(ji,jj) = MIN(0.75, MAX( 0.25, zstrn(ji,jj) / 24.) ) 252 END DO 253 END DO 254 255 256 DO jk = 1, jpk 257 DO jj = 1, jpj 258 DO ji = 1, jpi 259 260 ! Compute the amount of materials that will go into vertical migration 261 zmigreltime = (1. - zstrn(ji,jj)) 262 IF ( gdept_n(ji,jj,jk) <= heup(ji,jj) ) THEN 263 zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * (1. - zmigreltime ) & 264 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 265 zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * (1. - zmigreltime ) & 266 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 267 zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * (1. - zmigreltime ) & 268 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 269 zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * (1. - zmigreltime ) & 270 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 271 272 zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 273 zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 274 zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 275 zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 276 ENDIF 277 END DO 278 END DO 279 END DO 280 281 DO jj = 1, jpj 282 DO ji = 1, jpi 283 IF (tmask(ji,jj,1) == 1.) THEN 284 jkt = kmig(ji,jj) 285 zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) / e3t_n(ji,jj,jkt) 286 zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) / e3t_n(ji,jj,jkt) 287 zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) / e3t_n(ji,jj,jkt) 288 zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) / e3t_n(ji,jj,jkt) 289 ENDIF 290 END DO 291 END DO 292 ! 293 ! Deallocate temporary variables 294 ! ------------------------------ 295 DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof ) 296 DEALLOCATE( zstrn ) 297 298 ENDIF 299 300 DO jk = 1, jpk 301 DO jj = 1, jpj 302 DO ji = 1, jpi 303 ! Update the arrays TRA which contain the biological sources and sinks 304 zgrarsig = zgrarem(ji,jj,jk) * sigma2 305 tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarsig 306 tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgrarsig 307 tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgrarem(ji,jj,jk) - zgrarsig 308 ! 309 IF( ln_ligand ) THEN 310 tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + (zgrarem(ji,jj,jk) - zgrarsig) * ldocz 311 zz2ligprod(ji,jj,jk) = (zgrarem(ji,jj,jk) - zgrarsig) * ldocz 312 ENDIF 313 ! 314 tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarsig 315 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref(ji,jj,jk) 316 zfezoo2(ji,jj,jk) = zgraref(ji,jj,jk) 317 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarsig 318 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgrarsig 319 tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zgrapoc(ji,jj,jk) 320 prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk) 321 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zgrapof(ji,jj,jk) 230 322 END DO 231 323 END DO … … 281 373 NAMELIST/namp4zmes/ part2, grazrat2, resrat2, mzrat2, xpref2n, xpref2d, xpref2z, & 282 374 & xpref2c, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 283 & xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux 375 & xthresh2, xkgraz2, epsher2, epsher2min, sigma2, unass2, grazflux, ln_dvm_meso, & 376 & xfracmig 284 377 !!---------------------------------------------------------------------- 285 378 ! … … 316 409 WRITE(numout,*) ' non assimilated fraction of P by mesozoo unass2 =', unass2 317 410 WRITE(numout,*) ' Efficiency of Mesozoo growth epsher2 =', epsher2 318 WRITE(numout,*) ' Minimum Efficiency of Mesozoo growth epsher2min =', epsher2min411 WRITE(numout,*) ' Minimum Efficiency of Mesozoo growth epsher2min =', epsher2min 319 412 WRITE(numout,*) ' Fraction of mesozoo excretion as DOM sigma2 =', sigma2 320 413 WRITE(numout,*) ' half sturation constant for grazing 2 xkgraz2 =', xkgraz2 414 WRITE(numout,*) ' Diurnal vertical migration of mesozoo. ln_dvm_meso =', ln_dvm_meso 415 WRITE(numout,*) ' Fractional biomass of meso that performs DVM xfracmig =', xfracmig 321 416 ENDIF 322 417 ! 323 418 END SUBROUTINE p4z_meso_init 419 420 SUBROUTINE p4z_meso_depmig 421 !!---------------------------------------------------------------------- 422 !! *** ROUTINE p4z_meso_depmig *** 423 !! 424 !! ** Purpose : Computation the migration depth of mesozooplankton 425 !! 426 !! ** Method : Computes the DVM depth of mesozooplankton from oxygen 427 !! temperature and chlorophylle following the parameterization 428 !! proposed by Bianchi et al. (2013) 429 !! 430 !! ** input : 431 !!---------------------------------------------------------------------- 432 INTEGER :: ji, jj, jk 433 ! 434 REAL(wp) :: totchl 435 REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 436 437 !!--------------------------------------------------------------------- 438 ! 439 IF( ln_timing == 1 ) CALL timing_start('p4z_meso_zdepmig') 440 ! 441 oxymoy(:,:) = 0. 442 tempmoy(:,:) = 0. 443 zdepmoy(:,:) = 0. 444 depmig (:,:) = 5. 445 kmig (:,:) = 1 446 ! 447 ! Compute the averaged values of oxygen, temperature over the domain 448 ! 150m to 500 m depth. 449 ! 450 DO jk =1, jpk 451 DO jj = 1, jpj 452 DO ji = 1, jpi 453 IF (tmask(ji,jj,jk) == 1.) THEN 454 IF (gdept_n(ji,jj,jk) >= 150. .AND. gdept_n(ji,jj,jk) <= 500.) THEN 455 oxymoy(ji,jj) = oxymoy(ji,jj) + trb(ji,jj,jk,jpoxy)*e3t_n(ji,jj,jk)*1E6 456 tempmoy(ji,jj) = tempmoy(ji,jj) + tsn(ji,jj,jk,jp_tem)*e3t_n(ji,jj,jk) 457 zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t_n(ji,jj,jk) 458 ENDIF 459 ENDIF 460 END DO 461 END DO 462 END DO 463 464 DO jj = 1, jpj 465 DO ji = 1, jpi 466 oxymoy(ji,jj) = trb(ji,jj,1,jpoxy)*1E6 - oxymoy(ji,jj) / (zdepmoy(ji,jj) + rtrn) 467 tempmoy(ji,jj) = tsn(ji,jj,1,jp_tem)-tempmoy(ji,jj) / (zdepmoy(ji,jj) + rtrn) 468 END DO 469 END DO 470 ! 471 ! Computation of the migration depth based on the parameterization of 472 ! Bianchi et al. (2013) 473 ! ------------------------------------------------------------------- 474 ! 475 DO jj = 1, jpj 476 DO ji = 1, jpi 477 IF (tmask(ji,jj,1) == 1.) THEN 478 totchl = (trb(ji,jj,1,jpnch)+trb(ji,jj,1,jpdch))*1E6 479 depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(totchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 480 ENDIF 481 END DO 482 END DO 483 ! 484 ! Computation of the corresponding jk indice 485 ! ------------------------------------------ 486 ! 487 DO jk = 1, jpk-1 488 DO jj = 1, jpj 489 DO ji = 1, jpi 490 IF (depmig(ji,jj) .GE. gdepw_n(ji,jj,jk) .AND. depmig(ji,jj) .LT. gdepw_n(ji,jj,jk+1) ) THEN 491 kmig(ji,jj) = jk 492 ENDIF 493 END DO 494 END DO 495 END DO 496 ! 497 ! Correction of the migration depth and indice based on O2 levels 498 ! If O2 is too low, imposing a migration depth at this low O2 levels 499 ! would lead to negative O2 concentrations (respiration while O2 is close 500 ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 501 ! that it falls above the OMZ 502 ! ----------------------------------------------------------------------- 503 ! 504 DO ji =1, jpi 505 DO jj = 1, jpj 506 IF (trb(ji,jj,kmig(ji,jj),jpoxy) < 5E-6) THEN 507 DO jk = kmig(ji,jj),1,-1 508 IF (trb(ji,jj,jk,jpoxy) >= 5E-6 .AND. trb(ji,jj,jk+1,jpoxy) < 5E-6) THEN 509 kmig(ji,jj) = jk 510 depmig(ji,jj) = gdept_n(ji,jj,jk) 511 ENDIF 512 END DO 513 ENDIF 514 END DO 515 END DO 516 ! 517 IF( ln_timing ) CALL timing_stop('p4z_meso_depmig') 518 ! 519 END SUBROUTINE p4z_meso_depmig 520 521 INTEGER FUNCTION p4z_meso_alloc() 522 !!---------------------------------------------------------------------- 523 !! *** ROUTINE p4z_meso_alloc *** 524 !!---------------------------------------------------------------------- 525 ! 526 ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p4z_meso_alloc ) 527 ! 528 IF( p4z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_meso_alloc : failed to allocate arrays.' ) 529 ! 530 END FUNCTION p4z_meso_alloc 531 324 532 325 533 !!====================================================================== -
NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p4zrem.F90
r11536 r12524 223 223 zbactfer = feratb * rfact2 * 0.6_wp / rday * tgfunc(ji,jj,jk) * xlimbacl(ji,jj,jk) & 224 224 & * trb(ji,jj,jk,jpfer) / ( xkferb + trb(ji,jj,jk,jpfer) ) & 225 & * zdep prod(ji,jj,jk) * zdepeff(ji,jj,jk) * zdepbac(ji,jj,jk)225 & * zdepeff(ji,jj,jk) * zdepbac(ji,jj,jk) 226 226 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zbactfer*0.33 227 227 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zbactfer*0.25 228 228 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zbactfer*0.08 229 229 zfebact(ji,jj,jk) = zbactfer * 0.33 230 blim(ji,jj,jk) = xlimbacl(ji,jj,jk) * zdepbac(ji,jj,jk) / 1.e-6 * zdepprod(ji,jj,jk)230 blim(ji,jj,jk) = xlimbacl(ji,jj,jk) * zdepbac(ji,jj,jk) / 1.e-6 231 231 END DO 232 232 END DO -
NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/P4Z/p5zmeso.F90
r12349 r12524 23 23 PUBLIC p5z_meso ! called in p5zbio.F90 24 24 PUBLIC p5z_meso_init ! called in trcsms_pisces.F90 25 PUBLIC p5z_meso_alloc 25 26 26 27 !! * Shared module variables … … 49 50 REAL(wp), PUBLIC :: srespir2 !: Active respiration 50 51 REAL(wp), PUBLIC :: grazflux !: mesozoo flux feeding rate 52 REAL(wp), PUBLIC :: xfracmig !: Fractional biomass of meso that performs DVM 51 53 LOGICAL, PUBLIC :: bmetexc2 !: Use of excess carbon for respiration 54 LOGICAL , PUBLIC :: ln_dvm_meso !: Boolean to activate DVM of mesozooplankton 55 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: depmig 56 INTEGER , ALLOCATABLE, SAVE, DIMENSION(:,:) :: kmig 57 52 58 53 59 !!---------------------------------------------------------------------- … … 68 74 !!--------------------------------------------------------------------- 69 75 INTEGER, INTENT(in) :: kt, knt ! ocean time step 70 INTEGER :: ji, jj, jk 76 INTEGER :: ji, jj, jk, jkt 71 77 REAL(wp) :: zcompadi, zcompaph, zcompapoc, zcompaz, zcompam, zcompames 72 78 REAL(wp) :: zgraze2, zdenom, zfact, zfood, zfoodlim, zproport … … 74 80 REAL(wp) :: zepsherf, zepshert, zepsherq, zepsherv, zrespirc, zrespirn, zrespirp, zbasresb, zbasresi 75 81 REAL(wp) :: zgraztotc, zgraztotn, zgraztotp, zgraztotf, zbasresn, zbasresp, zbasresf 76 REAL(wp) :: zgradoc, zgradon, zgradop, zgratmp, zgradoct, zgradont, zgrareft, zgradopt 77 REAL(wp) :: zgrapoc, zgrapon, zgrapop, zgrapof, zprcaca, zmortz 78 REAL(wp) :: zexcess, zgrarem, zgraren, zgrarep, zgraref 82 REAL(wp) :: zgratmp, zgradoct, zgradont, zgrareft, zgradopt 83 REAL(wp) :: zprcaca, zmortz, zexcess 79 84 REAL(wp) :: zbeta, zrespz, ztortz, zgrasratp, zgrasratn, zgrasratf 80 85 REAL(wp) :: ztmp1, ztmp2, ztmp3, ztmp4, ztmp5, ztmptot … … 84 89 REAL(wp) :: zgrazfffp, zgrazfffg, zgrazffep, zgrazffeg 85 90 REAL(wp) :: zgrazffnp, zgrazffng, zgrazffpp, zgrazffpg 91 REAL(wp) :: zmigreltime, zrum, zcodel, zargu, zval 86 92 CHARACTER (len=25) :: charout 87 93 REAL(wp) :: zrfact2, zmetexcess, zsigma, zdiffdn 88 94 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrazing, zfezoo2 89 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d, zz2ligprod 95 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarem, zgraref, zgrapoc, zgrapof 96 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgrarep, zgraren, zgrapon, zgrapop 97 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zgradoc, zgradon, zgradop 98 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigrem, zgramigref, zgramigpoc, zgramigpof, zstrn 99 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigrep, zgramigren, zgramigpop, zgramigpon 100 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zgramigdoc, zgramigdop, zgramigdon 101 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d, zz2ligprod 90 102 91 103 !!--------------------------------------------------------------------- … … 93 105 IF( ln_timing ) CALL timing_start('p5z_meso') 94 106 ! 95 96 107 zgrazing(:,:,:) = 0._wp 97 108 zfezoo2 (:,:,:) = 0._wp … … 101 112 zz2ligprod(:,:,:) = 0._wp 102 113 ENDIF 114 115 ! 116 ! Diurnal vertical migration of mesozooplankton 117 ! --------------------------------------------- 118 IF (ln_dvm_meso) CALL p5z_meso_depmig 103 119 104 120 zmetexcess = 0.0 … … 268 284 zgrareft = (1. - unass2c) * zgraztotf - zepsherv * ferat3 * zgraztotc - zbasresf 269 285 ztmp1 = ( 1. - epsher2 - unass2c ) /( 1. - 0.8 * epsher2 ) * ztortz 270 zgradoc = (zgradoct + ztmp1) * ssigma2271 zgradon = (zgradont + no3rat3 * ztmp1) * ssigma2272 zgradop = (zgradopt + po4rat3 * ztmp1) * ssigma2286 zgradoc(ji,jj,jk) = (zgradoct + ztmp1) * ssigma2 287 zgradon(ji,jj,jk) = (zgradont + no3rat3 * ztmp1) * ssigma2 288 zgradop(ji,jj,jk) = (zgradopt + po4rat3 * ztmp1) * ssigma2 273 289 zgratmp = 0.2 * epsher2 /( 1. - 0.8 * epsher2 ) * ztortz 274 290 … … 277 293 ! as dissolved inorganic compounds (ssigma2) 278 294 ! -------------------------------------------------- 279 zgrarem = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2)280 zgraren = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2)281 zgrarep = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2)282 zgraref = zgrareft + ferat3 * ( ztmp1 + zgratmp )295 zgrarem(ji,jj,jk) = zgratmp + ( zgradoct + ztmp1 ) * (1.0 - ssigma2) 296 zgraren(ji,jj,jk) = no3rat3 * zgratmp + ( zgradont + no3rat3 * ztmp1 ) * (1.0 - ssigma2) 297 zgrarep(ji,jj,jk) = po4rat3 * zgratmp + ( zgradopt + po4rat3 * ztmp1 ) * (1.0 - ssigma2) 298 zgraref(ji,jj,jk) = zgrareft + ferat3 * ( ztmp1 + zgratmp ) 283 299 284 300 ! Defecation as a result of non assimilated products 285 301 ! -------------------------------------------------- 286 zgrapoc = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz287 zgrapon = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz288 zgrapop = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz289 zgrapof = zgraztotf * unass2c + ferat3 * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz302 zgrapoc(ji,jj,jk) = zgraztotc * unass2c + unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 303 zgrapon(ji,jj,jk) = zgraztotn * unass2n + no3rat3 * unass2n / ( 1. - 0.8 * epsher2 ) * ztortz 304 zgrapop(ji,jj,jk) = zgraztotp * unass2p + po4rat3 * unass2p / ( 1. - 0.8 * epsher2 ) * ztortz 305 zgrapof(ji,jj,jk) = zgraztotf * unass2c + ferat3 * unass2c / ( 1. - 0.8 * epsher2 ) * ztortz 290 306 291 307 ! Addition of respiration to the release of inorganic nutrients 292 308 ! ------------------------------------------------------------- 293 zgrarem = zgrarem+ zbasresi + zrespirc294 zgraren = zgraren+ zbasresn + zrespirc * no3rat3295 zgrarep = zgrarep+ zbasresp + zrespirc * po4rat3296 zgraref = zgraref+ zbasresf + zrespirc * ferat3309 zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) + zbasresi + zrespirc 310 zgraren(ji,jj,jk) = zgraren(ji,jj,jk) + zbasresn + zrespirc * no3rat3 311 zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) + zbasresp + zrespirc * po4rat3 312 zgraref(ji,jj,jk) = zgraref(ji,jj,jk) + zbasresf + zrespirc * ferat3 297 313 298 314 ! Update the arrays TRA which contain the biological sources and 299 315 ! sinks 300 316 ! -------------------------------------------------------------- 301 tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarep302 tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgraren303 tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgradoc304 !305 IF( ln_ligand ) THEN306 tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + zgradoc * ldocz307 zz2ligprod(ji,jj,jk) = zgradoc * ldocz308 ENDIF309 !310 tra(ji,jj,jk,jpdon) = tra(ji,jj,jk,jpdon) + zgradon311 tra(ji,jj,jk,jpdop) = tra(ji,jj,jk,jpdop) + zgradop312 tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarem313 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref314 zfezoo2(ji,jj,jk) = zgraref315 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarem316 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgraren317 317 tra(ji,jj,jk,jpmes) = tra(ji,jj,jk,jpmes) + zepsherv * zgraztotc - zrespirc & 318 318 & - ztortz - zgrazm … … 332 332 333 333 tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zgrazpoc - zgrazffep + zfracc 334 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfracc335 conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep334 prodpoc(ji,jj,jk) = prodpoc(ji,jj,jk) + zfracc 335 conspoc(ji,jj,jk) = conspoc(ji,jj,jk) - zgrazpoc - zgrazffep 336 336 tra(ji,jj,jk,jppon) = tra(ji,jj,jk,jppon) - zgrazpon - zgrazffnp + zfracn 337 337 tra(ji,jj,jk,jppop) = tra(ji,jj,jk,jppop) - zgrazpop - zgrazffpp + zfracp 338 tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg + zgrapoc - zfracc 339 prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zgrapoc 340 consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfracc 341 tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) - zgrazffng + zgrapon - zfracn 342 tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) - zgrazffpg + zgrapop - zfracp 338 tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zgrazffeg - zfracc 339 consgoc(ji,jj,jk) = consgoc(ji,jj,jk) - zgrazffeg - zfracc 340 tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) - zgrazffng - zfracn 341 tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) - zgrazffpg - zfracp 343 342 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zgrazpof - zgrazfffp + zfracfe 344 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg + zgrapof- zfracfe343 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zgrazfffg - zfracfe 345 344 zfracal = trb(ji,jj,jk,jpcal) / ( trb(ji,jj,jk,jpgoc) + rtrn ) 346 345 zgrazcal = zgrazffeg * (1. - part2) * zfracal 347 348 346 ! calcite production 349 347 ! ------------------ … … 354 352 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + 2. * ( zgrazcal - zprcaca ) 355 353 tra(ji,jj,jk,jpcal) = tra(ji,jj,jk,jpcal) - zgrazcal + zprcaca 354 END DO 355 END DO 356 END DO 357 358 IF (ln_dvm_meso) THEN 359 ALLOCATE( zgramigrem(jpi,jpj), zgramigref(jpi,jpj), zgramigpoc(jpi,jpj), zgramigpof(jpi,jpj) ) 360 ALLOCATE( zgramigrep(jpi,jpj), zgramigren(jpi,jpj), zgramigpop(jpi,jpj), zgramigpon(jpi,jpj) ) 361 ALLOCATE( zgramigdoc(jpi,jpj), zgramigdon(jpi,jpj), zgramigdop(jpi,jpj) ) 362 363 ALLOCATE( zstrn(jpi,jpj) ) 364 zgramigrem(:,:) = 0.0 ; zgramigref(:,:) = 0.0 365 zgramigrep(:,:) = 0.0 ; zgramigren(:,:) = 0.0 366 zgramigpoc(:,:) = 0.0 ; zgramigpof(:,:) = 0.0 367 zgramigpop(:,:) = 0.0 ; zgramigpon(:,:) = 0.0 368 zgramigdoc(:,:) = 0.0 ; zgramigdon(:,:) = 0.0 369 zgramigdop(:,:) = 0.0 370 371 ! compute the day length depending on latitude and the day 372 zrum = REAL( nday_year - 80, wp ) / REAL( nyear_len(1), wp ) 373 zcodel = ASIN( SIN( zrum * rpi * 2._wp ) * SIN( rad * 23.5_wp ) ) 374 375 ! day length in hours 376 zstrn(:,:) = 0. 377 DO jj = 1, jpj 378 DO ji = 1, jpi 379 zargu = TAN( zcodel ) * TAN( gphit(ji,jj) * rad ) 380 zargu = MAX( -1., MIN( 1., zargu ) ) 381 zstrn(ji,jj) = MAX( 0.0, 24. - 2. * ACOS( zargu ) / rad / 15. ) 382 zstrn(ji,jj) = MIN(0.75, MAX( 0.25, zstrn(ji,jj) / 24.) ) 383 END DO 384 END DO 385 386 387 DO jk = 1, jpk 388 DO jj = 1, jpj 389 DO ji = 1, jpi 390 391 ! Compute the amount of materials that will go into vertical migration 392 zmigreltime = (1. - zstrn(ji,jj)) 393 IF ( gdept_n(ji,jj,jk) <= heup(ji,jj) ) THEN 394 zgramigrem(ji,jj) = zgramigrem(ji,jj) + xfracmig * zgrarem(ji,jj,jk) * (1. - zmigreltime ) & 395 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 396 zgramigrep(ji,jj) = zgramigrep(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime ) & 397 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 398 zgramigrep(ji,jj) = zgramigren(ji,jj) + xfracmig * zgrarep(ji,jj,jk) * (1. - zmigreltime ) & 399 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 400 zgramigref(ji,jj) = zgramigref(ji,jj) + xfracmig * zgraref(ji,jj,jk) * (1. - zmigreltime ) & 401 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 402 zgramigpoc(ji,jj) = zgramigpoc(ji,jj) + xfracmig * zgrapoc(ji,jj,jk) * (1. - zmigreltime ) & 403 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 404 zgramigpop(ji,jj) = zgramigpop(ji,jj) + xfracmig * zgrapop(ji,jj,jk) * (1. - zmigreltime ) & 405 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 406 zgramigpon(ji,jj) = zgramigpon(ji,jj) + xfracmig * zgrapon(ji,jj,jk) * (1. - zmigreltime ) & 407 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 408 zgramigpof(ji,jj) = zgramigpof(ji,jj) + xfracmig * zgrapof(ji,jj,jk) * (1. - zmigreltime ) & 409 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 410 zgramigdoc(ji,jj) = zgramigdoc(ji,jj) + xfracmig * zgradoc(ji,jj,jk) * (1. - zmigreltime ) & 411 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 412 zgramigdop(ji,jj) = zgramigdop(ji,jj) + xfracmig * zgradop(ji,jj,jk) * (1. - zmigreltime ) & 413 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 414 zgramigdon(ji,jj) = zgramigdon(ji,jj) + xfracmig * zgradon(ji,jj,jk) * (1. - zmigreltime ) & 415 & * e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 416 417 zgrarem(ji,jj,jk) = zgrarem(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 418 zgrarep(ji,jj,jk) = zgrarep(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 419 zgraren(ji,jj,jk) = zgraren(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 420 zgraref(ji,jj,jk) = zgraref(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 421 zgrapoc(ji,jj,jk) = zgrapoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 422 zgrapop(ji,jj,jk) = zgrapop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 423 zgrapon(ji,jj,jk) = zgrapon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 424 zgrapof(ji,jj,jk) = zgrapof(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 425 zgradoc(ji,jj,jk) = zgradoc(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 426 zgradop(ji,jj,jk) = zgradop(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 427 zgradon(ji,jj,jk) = zgradon(ji,jj,jk) * ( (1.0 - xfracmig) + xfracmig * zmigreltime ) 428 ENDIF 429 END DO 430 END DO 431 END DO 432 433 DO jj = 1, jpj 434 DO ji = 1, jpi 435 IF (tmask(ji,jj,1) == 1.) THEN 436 jkt = kmig(ji,jj) 437 zgrarem(ji,jj,jkt) = zgrarem(ji,jj,jkt) + zgramigrem(ji,jj) / e3t_n(ji,jj,jkt) 438 zgrarep(ji,jj,jkt) = zgrarep(ji,jj,jkt) + zgramigrep(ji,jj) / e3t_n(ji,jj,jkt) 439 zgraren(ji,jj,jkt) = zgraren(ji,jj,jkt) + zgramigren(ji,jj) / e3t_n(ji,jj,jkt) 440 zgraref(ji,jj,jkt) = zgraref(ji,jj,jkt) + zgramigref(ji,jj) / e3t_n(ji,jj,jkt) 441 zgrapoc(ji,jj,jkt) = zgrapoc(ji,jj,jkt) + zgramigpoc(ji,jj) / e3t_n(ji,jj,jkt) 442 zgrapop(ji,jj,jkt) = zgrapop(ji,jj,jkt) + zgramigpop(ji,jj) / e3t_n(ji,jj,jkt) 443 zgrapon(ji,jj,jkt) = zgrapon(ji,jj,jkt) + zgramigpon(ji,jj) / e3t_n(ji,jj,jkt) 444 zgrapof(ji,jj,jkt) = zgrapof(ji,jj,jkt) + zgramigpof(ji,jj) / e3t_n(ji,jj,jkt) 445 zgradoc(ji,jj,jkt) = zgradoc(ji,jj,jkt) + zgramigdoc(ji,jj) / e3t_n(ji,jj,jkt) 446 zgradop(ji,jj,jkt) = zgradop(ji,jj,jkt) + zgramigdop(ji,jj) / e3t_n(ji,jj,jkt) 447 zgradon(ji,jj,jkt) = zgradon(ji,jj,jkt) + zgramigdon(ji,jj) / e3t_n(ji,jj,jkt) 448 ENDIF 449 END DO 450 END DO 451 ! 452 ! Deallocate temporary variables 453 ! ------------------------------ 454 DEALLOCATE( zgramigrem, zgramigref, zgramigpoc, zgramigpof ) 455 DEALLOCATE( zgramigrep, zgramigren, zgramigpop, zgramigpon ) 456 DEALLOCATE( zgramigdoc, zgramigdon, zgramigdop ) 457 DEALLOCATE( zstrn ) 458 459 ENDIF 460 461 DO jk = 1, jpk 462 DO jj = 1, jpj 463 DO ji = 1, jpi 464 ! Update the arrays TRA which contain the biological sources and sinks 465 tra(ji,jj,jk,jppo4) = tra(ji,jj,jk,jppo4) + zgrarep(ji,jj,jk) 466 tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + zgraren(ji,jj,jk) 467 tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zgradoc(ji,jj,jk) 468 ! 469 IF( ln_ligand ) THEN 470 tra(ji,jj,jk,jplgw) = tra(ji,jj,jk,jplgw) + zgradoc(ji,jj,jk) * ldocz 471 zz2ligprod(ji,jj,jk) = zgradoc(ji,jj,jk) * ldocz 472 ENDIF 473 ! 474 tra(ji,jj,jk,jpdon) = tra(ji,jj,jk,jpdon) + zgradon(ji,jj,jk) 475 tra(ji,jj,jk,jpdop) = tra(ji,jj,jk,jpdop) + zgradop(ji,jj,jk) 476 tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2ut * zgrarem(ji,jj,jk) 477 tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zgraref(ji,jj,jk) 478 zfezoo2(ji,jj,jk) = zgraref(ji,jj,jk) 479 tra(ji,jj,jk,jpdic) = tra(ji,jj,jk,jpdic) + zgrarem(ji,jj,jk) 480 tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) + rno3 * zgraren(ji,jj,jk) 481 tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) + zgrapoc(ji,jj,jk) 482 prodgoc(ji,jj,jk) = prodgoc(ji,jj,jk) + zgrapoc(ji,jj,jk) 483 tra(ji,jj,jk,jpgon) = tra(ji,jj,jk,jpgon) + zgrapon(ji,jj,jk) 484 tra(ji,jj,jk,jpgop) = tra(ji,jj,jk,jpgop) + zgrapop(ji,jj,jk) 485 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zgrapof(ji,jj,jk) 356 486 END DO 357 487 END DO … … 407 537 & xpref2m, xpref2d, xthresh2dia, xthresh2phy, xthresh2zoo, xthresh2poc, & 408 538 & xthresh2mes, xthresh2, xkgraz2, epsher2, epsher2min, ssigma2, unass2c, & 409 & unass2n, unass2p, srespir2, grazflux 539 & unass2n, unass2p, srespir2, grazflux, ln_dvm_meso, xfracmig 410 540 !!---------------------------------------------------------------------- 411 541 ! … … 448 578 WRITE(numout,*) ' half sturation constant for grazing 2 xkgraz2 = ', xkgraz2 449 579 WRITE(numout,*) ' Use excess carbon for respiration bmetexc2 = ', bmetexc2 580 WRITE(numout,*) ' Diurnal vertical migration of mesozoo. ln_dvm_meso =', ln_dvm_meso 581 WRITE(numout,*) ' Fractional biomass of meso that performs DVM xfracmig =', xfracmig 450 582 ENDIF 451 583 ! 452 584 END SUBROUTINE p5z_meso_init 585 586 SUBROUTINE p5z_meso_depmig 587 !!---------------------------------------------------------------------- 588 !! *** ROUTINE p5z_meso_depmig *** 589 !! 590 !! ** Purpose : Computation the migration depth of mesozooplankton 591 !! 592 !! ** Method : Computes the DVM depth of mesozooplankton from oxygen 593 !! temperature and chlorophylle following the parameterization 594 !! proposed by Bianchi et al. (2013) 595 !! 596 !! ** input : 597 !!---------------------------------------------------------------------- 598 INTEGER :: ji, jj, jk 599 ! 600 REAL(wp) :: totchl 601 REAL(wp), DIMENSION(jpi,jpj) :: oxymoy, tempmoy, zdepmoy 602 603 !!--------------------------------------------------------------------- 604 ! 605 IF( ln_timing == 1 ) CALL timing_start('p5z_meso_zdepmig') 606 ! 607 oxymoy(:,:) = 0. 608 tempmoy(:,:) = 0. 609 zdepmoy(:,:) = 0. 610 depmig (:,:) = 5. 611 kmig (:,:) = 1 612 ! 613 ! Compute the averaged values of oxygen, temperature over the domain 614 ! 150m to 500 m depth. 615 ! 616 DO jk =1, jpk 617 DO jj = 1, jpj 618 DO ji = 1, jpi 619 IF (tmask(ji,jj,jk) == 1.) THEN 620 IF (gdept_n(ji,jj,jk) >= 150. .AND. gdept_n(ji,jj,jk) <= 500.) THEN 621 oxymoy(ji,jj) = oxymoy(ji,jj) + trb(ji,jj,jk,jpoxy)*e3t_n(ji,jj,jk)*1E6 622 tempmoy(ji,jj) = tempmoy(ji,jj) + tsn(ji,jj,jk,jp_tem)*e3t_n(ji,jj,jk) 623 zdepmoy(ji,jj) = zdepmoy(ji,jj) + e3t_n(ji,jj,jk) 624 ENDIF 625 ENDIF 626 END DO 627 END DO 628 END DO 629 630 DO jj = 1, jpj 631 DO ji = 1, jpi 632 oxymoy(ji,jj) = trb(ji,jj,1,jpoxy)*1E6 - oxymoy(ji,jj) / (zdepmoy(ji,jj) + rtrn) 633 tempmoy(ji,jj) = tsn(ji,jj,1,jp_tem)-tempmoy(ji,jj) / (zdepmoy(ji,jj) + rtrn) 634 END DO 635 END DO 636 ! 637 ! Computation of the migration depth based on the parameterization of 638 ! 639 DO jj = 1, jpj 640 DO ji = 1, jpi 641 IF (tmask(ji,jj,1) == 1.) THEN 642 totchl = (trb(ji,jj,1,jppch)+trb(ji,jj,1,jpnch)+trb(ji,jj,1,jpdch))*1E6 643 depmig(ji,jj) = 398. - 0.56 * oxymoy(ji,jj) -115. * log10(totchl) + 0.36 * hmld(ji,jj) -2.4 * tempmoy(ji,jj) 644 ENDIF 645 END DO 646 END DO 647 ! 648 ! Computation of the corresponding jk indice 649 ! ------------------------------------------ 650 ! 651 DO jk = 1, jpk-1 652 DO jj = 1, jpj 653 DO ji = 1, jpi 654 IF (depmig(ji,jj) .GE. gdepw_n(ji,jj,jk) .AND. depmig(ji,jj) .LT. gdepw_n(ji,jj,jk+1) ) THEN 655 kmig(ji,jj) = jk 656 ENDIF 657 END DO 658 END DO 659 END DO 660 ! 661 ! Correction of the migration depth and indice based on O2 levels 662 ! If O2 is too low, imposing a migration depth at this low O2 levels 663 ! would lead to negative O2 concentrations (respiration while O2 is close 664 ! to 0. Thus, to avoid that problem, the migration depth is adjusted so 665 ! that it falls above the OMZ 666 ! ----------------------------------------------------------------------- 667 ! 668 DO ji =1, jpi 669 DO jj = 1, jpj 670 IF (trb(ji,jj,kmig(ji,jj),jpoxy) < 5E-6) THEN 671 DO jk = kmig(ji,jj),1,-1 672 IF (trb(ji,jj,jk,jpoxy) >= 5E-6 .AND. trb(ji,jj,jk+1,jpoxy) < 5E-6) THEN 673 kmig(ji,jj) = jk 674 depmig(ji,jj) = gdept_n(ji,jj,jk) 675 ENDIF 676 END DO 677 ENDIF 678 END DO 679 END DO 680 ! 681 IF( ln_timing ) CALL timing_stop('p5z_meso_depmig') 682 ! 683 END SUBROUTINE p5z_meso_depmig 684 685 INTEGER FUNCTION p5z_meso_alloc() 686 !!---------------------------------------------------------------------- 687 !! *** ROUTINE p4z_meso_alloc *** 688 !!---------------------------------------------------------------------- 689 ! 690 ALLOCATE( depmig(jpi,jpj), kmig(jpi,jpj), STAT= p5z_meso_alloc ) 691 ! 692 IF( p5z_meso_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p5z_meso_alloc : failed to allocate arrays.' ) 693 ! 694 END FUNCTION p5z_meso_alloc 453 695 454 696 !!====================================================================== -
NEMO/branches/2019/dev_r11708_aumont_PISCES_QUOTA/src/TOP/PISCES/trcini_pisces.F90
r10817 r12524 112 112 IF( ln_p4z ) THEN 113 113 ierr = ierr + p4z_prod_alloc() 114 ierr = ierr + p4z_meso_alloc() 114 115 ELSE 115 116 ierr = ierr + p5z_lim_alloc() 116 117 ierr = ierr + p5z_prod_alloc() 118 ierr = ierr + p5z_meso_alloc() 117 119 ENDIF 118 120 ierr = ierr + p4z_rem_alloc()
Note: See TracChangeset
for help on using the changeset viewer.