- Timestamp:
- 2018-03-30T18:08:29+02:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/CNRS/dev_r8832_PISCO/NEMOGCM/NEMO/TOP_SRC/PISCES/P4Z/p4zlim.F90
r8533 r9450 20 20 21 21 PUBLIC p4z_lim 22 PUBLIC p5z_lim 22 23 PUBLIC p4z_lim_init 24 PUBLIC p5z_lim_init 23 25 PUBLIC p4z_lim_alloc 24 26 25 27 !! * Shared module variables 26 28 REAL(wp), PUBLIC :: concnno3 !: NO3, PO4 half saturation 29 REAL(wp), PUBLIC :: concpno3 !: NO3, PO4 half saturation 27 30 REAL(wp), PUBLIC :: concdno3 !: Phosphate half saturation for diatoms 28 31 REAL(wp), PUBLIC :: concnnh4 !: NH4 half saturation for phyto 32 REAL(wp), PUBLIC :: concpnh4 !: NH4 half saturation for phyto 29 33 REAL(wp), PUBLIC :: concdnh4 !: NH4 half saturation for diatoms 34 REAL(wp), PUBLIC :: concnpo4 !: NH4 half saturation for diatoms 35 REAL(wp), PUBLIC :: concppo4 !: NH4 half saturation for diatoms 36 REAL(wp), PUBLIC :: concdpo4 !: NH4 half saturation for diatoms 30 37 REAL(wp), PUBLIC :: concnfer !: Iron half saturation for nanophyto 38 REAL(wp), PUBLIC :: concpfer !: Iron half saturation for nanophyto 31 39 REAL(wp), PUBLIC :: concdfer !: Iron half saturation for diatoms 32 40 REAL(wp), PUBLIC :: concbno3 !: NO3 half saturation for bacteria 33 41 REAL(wp), PUBLIC :: concbnh4 !: NH4 half saturation for bacteria 42 REAL(wp), PUBLIC :: concbpo4 !: PO4 half saturation for bacteria 34 43 REAL(wp), PUBLIC :: xsizedia !: Minimum size criteria for diatoms 44 REAL(wp), PUBLIC :: xsizepic !: Minimum size criteria for diatoms 35 45 REAL(wp), PUBLIC :: xsizephy !: Minimum size criteria for nanophyto 36 46 REAL(wp), PUBLIC :: xsizern !: Size ratio for nanophytoplankton 47 REAL(wp), PUBLIC :: xsizerp !: Size ratio for nanophytoplankton 37 48 REAL(wp), PUBLIC :: xsizerd !: Size ratio for diatoms 38 49 REAL(wp), PUBLIC :: xksi1 !: half saturation constant for Si uptake … … 41 52 REAL(wp), PUBLIC :: concbfe !: Fe half saturation for bacteria 42 53 REAL(wp), PUBLIC :: oxymin !: half saturation constant for anoxia 54 REAL(wp), PUBLIC :: qfnopt !: optimal Fe quota for nanophyto 55 REAL(wp), PUBLIC :: qfpopt !: optimal Fe quota for nanophyto 56 REAL(wp), PUBLIC :: qfdopt !: optimal Fe quota for diatoms 57 REAL(wp), PUBLIC :: qnnmin !: optimal Fe quota for diatoms 58 REAL(wp), PUBLIC :: qnnmax !: optimal Fe quota for diatoms 59 REAL(wp), PUBLIC :: qpnmin !: optimal Fe quota for diatoms 60 REAL(wp), PUBLIC :: qpnmax !: optimal Fe quota for diatoms 61 REAL(wp), PUBLIC :: qnpmin !: optimal Fe quota for diatoms 62 REAL(wp), PUBLIC :: qnpmax !: optimal Fe quota for diatoms 63 REAL(wp), PUBLIC :: qppmin !: optimal Fe quota for diatoms 64 REAL(wp), PUBLIC :: qppmax !: optimal Fe quota for diatoms 65 REAL(wp), PUBLIC :: qndmin !: optimal Fe quota for diatoms 66 REAL(wp), PUBLIC :: qndmax !: optimal Fe quota for diatoms 67 REAL(wp), PUBLIC :: qpdmin !: optimal Fe quota for diatoms 68 REAL(wp), PUBLIC :: qpdmax !: optimal Fe quota for diatoms 69 REAL(wp), PUBLIC :: qfnmax !: optimal Fe quota for diatoms 70 REAL(wp), PUBLIC :: qfpmax !: optimal Fe quota for diatoms 71 REAL(wp), PUBLIC :: qfdmax !: optimal Fe quota for diatoms 43 72 REAL(wp), PUBLIC :: qnfelim !: optimal Fe quota for nanophyto 44 73 REAL(wp), PUBLIC :: qdfelim !: optimal Fe quota for diatoms 45 74 REAL(wp), PUBLIC :: caco3r !: mean rainratio 75 REAL(wp), PUBLIC :: zpsinh4 76 REAL(wp), PUBLIC :: zpsino3 77 REAL(wp), PUBLIC :: zpsiuptk 46 78 47 79 !!* Phytoplankton limitation terms 48 80 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanono3 !: ??? 81 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xpicono3 !: ??? 49 82 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatno3 !: ??? 50 83 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanonh4 !: ??? 84 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xpiconh4 !: ??? 51 85 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatnh4 !: ??? 52 86 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanopo4 !: ??? 87 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xpicopo4 !: ??? 53 88 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatpo4 !: ??? 89 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanodop !: ??? 90 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xpicodop !: ??? 91 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatdop !: ??? 92 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xnanofer !: ??? 93 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xpicofer !: ??? 94 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xdiatfer !: ??? 54 95 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimphy !: ??? 96 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimpic !: ??? 55 97 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimdia !: ??? 56 98 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimnfe !: ??? 99 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimpfe !: ??? 57 100 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimdfe !: ??? 58 101 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimsi !: ??? 102 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimsi2 !: ??? 59 103 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimbac !: ?? 60 104 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xlimbacl !: ?? 61 105 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: concdfe !: ??? 62 106 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: concnfe !: ??? 107 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: fvnuptk 108 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: fvpuptk 109 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: fvduptk 110 111 !!* Allometric variations of the quotas 112 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqnnmin !: ??? 113 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqnnmax !: ??? 114 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqpnmin !: ??? 115 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqpnmax !: ??? 116 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqnpmin !: ??? 117 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqnpmax !: ??? 118 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqppmin !: ??? 119 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqppmax !: ??? 120 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqndmin !: ??? 121 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqndmax !: ??? 122 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqpdmin !: ??? 123 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xqpdmax !: ? 63 124 64 125 ! Coefficient for iron limitation 65 REAL(wp) :: xcoef1 = 0.0016 / 55.85126 REAL(wp) :: xcoef1 = 0.00167 / 55.85 66 127 REAL(wp) :: xcoef2 = 1.21E-5 * 14. / 55.85 / 7.625 * 0.5 * 1.5 67 128 REAL(wp) :: xcoef3 = 1.15E-4 * 14. / 55.85 / 7.625 * 0.5 … … 227 288 ! 228 289 END SUBROUTINE p4z_lim 290 291 292 SUBROUTINE p5z_lim( kt, knt ) 293 !!--------------------------------------------------------------------- 294 !! *** ROUTINE p5z_lim *** 295 !! 296 !! ** Purpose : Compute the co-limitations by the various nutrients 297 !! for the various phytoplankton species 298 !! 299 !! ** Method : - ??? 300 !!--------------------------------------------------------------------- 301 ! 302 INTEGER, INTENT(in) :: kt, knt 303 ! 304 INTEGER :: ji, jj, jk 305 REAL(wp) :: zlim1, zlim2, zlim3, zlim4, zno3, zferlim 306 REAL(wp) :: z1_trndia, z1_trnpic, z1_trnphy, ztem1, ztem2, zetot1 307 REAL(wp) :: zratio, zration, zratiof, znutlim, zfalim 308 REAL(wp) :: zconc1d, zconc1dnh4, zconc0n, zconc0nnh4, zconc0npo4, zconc0dpo4 309 REAL(wp) :: zconc0p, zconc0pnh4, zconc0ppo4, zconcpfe, zconcnfe, zconcdfe 310 REAL(wp) :: fanano, fananop, fananof, fadiat, fadiatp, fadiatf 311 REAL(wp) :: fapico, fapicop, fapicof 312 REAL(wp) :: zrpho, zrass, zcoef, zfuptk, zratchl 313 REAL(wp) :: zfvn, zfvp, zfvf, zsizen, zsizep, zsized, znanochl, zpicochl, zdiatchl 314 REAL(wp) :: zqfemn, zqfemp, zqfemd, zbactno3, zbactnh4 315 !!--------------------------------------------------------------------- 316 ! 317 !!--------------------------------------------------------------------- 318 ! 319 IF( nn_timing == 1 ) CALL timing_start('p5z_lim') 320 ! 321 zratchl = 6.0 322 ! 323 DO jk = 1, jpkm1 324 DO jj = 1, jpj 325 DO ji = 1, jpi 326 ! 327 ! Tuning of the iron concentration to a minimum level that is set to the detection limit 328 !------------------------------------- 329 zno3 = trb(ji,jj,jk,jpno3) / 40.e-6 330 zferlim = MAX( 3e-11 * zno3 * zno3, 5e-12 ) 331 zferlim = MIN( zferlim, 7e-11 ) 332 trb(ji,jj,jk,jpfer) = MAX( trb(ji,jj,jk,jpfer), zferlim ) 333 334 ! Computation of the mean relative size of each community 335 ! ------------------------------------------------------- 336 z1_trnphy = 1. / ( trb(ji,jj,jk,jpphy) + rtrn ) 337 z1_trnpic = 1. / ( trb(ji,jj,jk,jppic) + rtrn ) 338 z1_trndia = 1. / ( trb(ji,jj,jk,jpdia) + rtrn ) 339 znanochl = trb(ji,jj,jk,jpnch) * z1_trnphy 340 zpicochl = trb(ji,jj,jk,jppch) * z1_trnpic 341 zdiatchl = trb(ji,jj,jk,jpdch) * z1_trndia 342 343 ! Computation of a variable Ks for iron on diatoms taking into account 344 ! that increasing biomass is made of generally bigger cells 345 !------------------------------------------------ 346 zsized = sized(ji,jj,jk)**0.81 347 zconcdfe = concdfer * zsized 348 zconc1d = concdno3 * zsized 349 zconc1dnh4 = concdnh4 * zsized 350 zconc0dpo4 = concdpo4 * zsized 351 352 zsizep = 1. 353 zconcpfe = concpfer * zsizep 354 zconc0p = concpno3 * zsizep 355 zconc0pnh4 = concpnh4 * zsizep 356 zconc0ppo4 = concppo4 * zsizep 357 358 zsizen = 1. 359 zconcnfe = concnfer * zsizen 360 zconc0n = concnno3 * zsizen 361 zconc0nnh4 = concnnh4 * zsizen 362 zconc0npo4 = concnpo4 * zsizen 363 364 ! Allometric variations of the minimum and maximum quotas 365 ! From Talmy et al. (2014) and Maranon et al. (2013) 366 ! ------------------------------------------------------- 367 xqnnmin(ji,jj,jk) = qnnmin 368 xqnnmax(ji,jj,jk) = qnnmax 369 xqndmin(ji,jj,jk) = qndmin * sized(ji,jj,jk)**(-0.27) 370 xqndmax(ji,jj,jk) = qndmax 371 xqnpmin(ji,jj,jk) = qnpmin 372 xqnpmax(ji,jj,jk) = qnpmax 373 374 ! Computation of the optimal allocation parameters 375 ! Based on the different papers by Pahlow et al., and Smith et al. 376 ! ----------------------------------------------------------------- 377 znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc0nnh4, & 378 & trb(ji,jj,jk,jpno3) / zconc0n) 379 fanano = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 380 znutlim = trb(ji,jj,jk,jppo4) / zconc0npo4 381 fananop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 382 znutlim = biron(ji,jj,jk) / zconcnfe 383 fananof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 384 znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc0pnh4, & 385 & trb(ji,jj,jk,jpno3) / zconc0p) 386 fapico = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 387 znutlim = trb(ji,jj,jk,jppo4) / zconc0ppo4 388 fapicop = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 389 znutlim = biron(ji,jj,jk) / zconcpfe 390 fapicof = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 391 znutlim = MAX( trb(ji,jj,jk,jpnh4) / zconc1dnh4, & 392 & trb(ji,jj,jk,jpno3) / zconc1d ) 393 fadiat = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 394 znutlim = trb(ji,jj,jk,jppo4) / zconc0dpo4 395 fadiatp = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 396 znutlim = biron(ji,jj,jk) / zconcdfe 397 fadiatf = MAX(0.01, MIN(0.99, 1. / ( SQRT(znutlim) + 1.) ) ) 398 ! 399 ! Michaelis-Menten Limitation term for nutrients Small bacteria 400 ! ------------------------------------------------------------- 401 zbactnh4 = trb(ji,jj,jk,jpnh4) / ( concbnh4 + trb(ji,jj,jk,jpnh4) ) 402 zbactno3 = trb(ji,jj,jk,jpno3) / ( concbno3 + trb(ji,jj,jk,jpno3) ) * (1. - zbactnh4) 403 ! 404 zlim1 = zbactno3 + zbactnh4 405 zlim2 = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concbpo4) 406 zlim3 = biron(ji,jj,jk) / ( concbfe + biron(ji,jj,jk) ) 407 zlim4 = trb(ji,jj,jk,jpdoc) / ( xkdoc + trb(ji,jj,jk,jpdoc) ) 408 xlimbacl(ji,jj,jk) = MIN( zlim1, zlim2, zlim3 ) 409 xlimbac (ji,jj,jk) = xlimbacl(ji,jj,jk) * zlim4 410 ! 411 ! Michaelis-Menten Limitation term for nutrients Small flagellates 412 ! ----------------------------------------------- 413 zfalim = (1.-fanano) / fanano 414 xnanonh4(ji,jj,jk) = (1. - fanano) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc0nnh4 + trb(ji,jj,jk,jpnh4) ) 415 xnanono3(ji,jj,jk) = (1. - fanano) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc0n + trb(ji,jj,jk,jpno3) ) & 416 & * (1. - xnanonh4(ji,jj,jk)) 417 ! 418 zfalim = (1.-fananop) / fananop 419 xnanopo4(ji,jj,jk) = (1. - fananop) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0npo4 ) 420 xnanodop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc ) & 421 & * ( 1.0 - xnanopo4(ji,jj,jk) ) 422 xnanodop(ji,jj,jk) = 0. 423 ! 424 zfalim = (1.-fananof) / fananof 425 xnanofer(ji,jj,jk) = (1. - fananof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcnfe ) 426 ! 427 zratiof = trb(ji,jj,jk,jpnfe) * z1_trnphy 428 zqfemn = xcoef1 * znanochl + xcoef2 + xcoef3 * xnanono3(ji,jj,jk) 429 ! 430 zration = trb(ji,jj,jk,jpnph) * z1_trnphy 431 zration = MIN(xqnnmax(ji,jj,jk), MAX( 2. * xqnnmin(ji,jj,jk), zration )) 432 fvnuptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqnnmin(ji,jj,jk) / (zration + rtrn) & 433 & * MAX(0., (1. - zratchl * znanochl / 12. ) ) 434 ! 435 zlim1 = max(0., (zration - 2. * xqnnmin(ji,jj,jk) ) & 436 & / (xqnnmax(ji,jj,jk) - 2. * xqnnmin(ji,jj,jk) ) ) * xqnnmax(ji,jj,jk) & 437 & / (zration + rtrn) 438 zlim3 = MAX( 0.,( zratiof - zqfemn ) / qfnopt ) 439 xlimnfe(ji,jj,jk) = MIN( 1., zlim3 ) 440 xlimphy(ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 441 ! 442 ! Michaelis-Menten Limitation term for nutrients picophytoplankton 443 ! ---------------------------------------------------------------- 444 zfalim = (1.-fapico) / fapico 445 xpiconh4(ji,jj,jk) = (1. - fapico) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc0pnh4 + trb(ji,jj,jk,jpnh4) ) 446 xpicono3(ji,jj,jk) = (1. - fapico) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc0p + trb(ji,jj,jk,jpno3) ) & 447 & * (1. - xpiconh4(ji,jj,jk)) 448 ! 449 zfalim = (1.-fapicop) / fapicop 450 xpicopo4(ji,jj,jk) = (1. - fapicop) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0ppo4 ) 451 xpicodop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc ) & 452 & * ( 1.0 - xpicopo4(ji,jj,jk) ) 453 xpicodop(ji,jj,jk) = 0. 454 ! 455 zfalim = (1.-fapicof) / fapicof 456 xpicofer(ji,jj,jk) = (1. - fapicof) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcpfe ) 457 ! 458 zratiof = trb(ji,jj,jk,jppfe) * z1_trnpic 459 zqfemp = xcoef1 * zpicochl + xcoef2 + xcoef3 * xpicono3(ji,jj,jk) 460 ! 461 zration = trb(ji,jj,jk,jpnpi) * z1_trnpic 462 zration = MIN(xqnpmax(ji,jj,jk), MAX( 2. * xqnpmin(ji,jj,jk), zration )) 463 fvpuptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqnpmin(ji,jj,jk) / (zration + rtrn) & 464 & * MAX(0., (1. - zratchl * zpicochl / 12. ) ) 465 ! 466 zlim1 = max(0., (zration - 2. * xqnpmin(ji,jj,jk) ) & 467 & / (xqnpmax(ji,jj,jk) - 2. * xqnpmin(ji,jj,jk) ) ) * xqnpmax(ji,jj,jk) & 468 & / (zration + rtrn) 469 zlim3 = MAX( 0.,( zratiof - zqfemp ) / qfpopt ) 470 xlimpfe(ji,jj,jk) = MIN( 1., zlim3 ) 471 xlimpic(ji,jj,jk) = MIN( 1., zlim1, zlim3 ) 472 ! 473 ! Michaelis-Menten Limitation term for nutrients Diatoms 474 ! ------------------------------------------------------ 475 zfalim = (1.-fadiat) / fadiat 476 xdiatnh4(ji,jj,jk) = (1. - fadiat) * trb(ji,jj,jk,jpnh4) / ( zfalim * zconc1dnh4 + trb(ji,jj,jk,jpnh4) ) 477 xdiatno3(ji,jj,jk) = (1. - fadiat) * trb(ji,jj,jk,jpno3) / ( zfalim * zconc1d + trb(ji,jj,jk,jpno3) ) & 478 & * (1. - xdiatnh4(ji,jj,jk)) 479 ! 480 zfalim = (1.-fadiatp) / fadiatp 481 xdiatpo4(ji,jj,jk) = (1. - fadiatp) * trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + zfalim * zconc0dpo4 ) 482 xdiatdop(ji,jj,jk) = trb(ji,jj,jk,jpdop) / ( trb(ji,jj,jk,jpdop) + xkdoc ) & 483 & * ( 1.0 - xdiatpo4(ji,jj,jk) ) 484 xdiatdop(ji,jj,jk) = 0. 485 ! 486 zfalim = (1.-fadiatf) / fadiatf 487 xdiatfer(ji,jj,jk) = (1. - fadiatf) * biron(ji,jj,jk) / ( biron(ji,jj,jk) + zfalim * zconcdfe ) 488 ! 489 zratiof = trb(ji,jj,jk,jpdfe) * z1_trndia 490 zqfemd = xcoef1 * zdiatchl + xcoef2 + xcoef3 * xdiatno3(ji,jj,jk) 491 ! 492 zration = trb(ji,jj,jk,jpndi) * z1_trndia 493 zration = MIN(xqndmax(ji,jj,jk), MAX( 2. * xqndmin(ji,jj,jk), zration )) 494 fvduptk(ji,jj,jk) = 1. / zpsiuptk * rno3 * 2. * xqndmin(ji,jj,jk) / (zration + rtrn) & 495 & * MAX(0., (1. - zratchl * zdiatchl / 12. ) ) 496 ! 497 zlim1 = max(0., (zration - 2. * xqndmin(ji,jj,jk) ) & 498 & / (xqndmax(ji,jj,jk) - 2. * xqndmin(ji,jj,jk) ) ) & 499 & * xqndmax(ji,jj,jk) / (zration + rtrn) 500 zlim3 = trb(ji,jj,jk,jpsil) / ( trb(ji,jj,jk,jpsil) + xksi(ji,jj) ) 501 zlim4 = MAX( 0., ( zratiof - zqfemd ) / qfdopt ) 502 xlimdfe(ji,jj,jk) = MIN( 1., zlim4 ) 503 xlimdia(ji,jj,jk) = MIN( 1., zlim1, zlim3, zlim4 ) 504 xlimsi(ji,jj,jk) = MIN( 1., zlim3, zlim4 ) 505 xlimsi2(ji,jj,jk) = MIN( 1., zlim1, zlim4 ) 506 END DO 507 END DO 508 END DO 509 ! 510 ! Compute the phosphorus quota values. It is based on Litchmann et al., 2004 and Daines et al, 2013. 511 ! The relative contribution of three fonctional pools are computed: light harvesting apparatus, 512 ! nutrient uptake pool and assembly machinery. DNA is assumed to represent 1% of the dry mass of 513 ! phytoplankton (see Daines et al., 2013). 514 ! -------------------------------------------------------------------------------------------------- 515 DO jk = 1, jpkm1 516 DO jj = 1, jpj 517 DO ji = 1, jpi 518 ! Size estimation of nanophytoplankton 519 ! ------------------------------------ 520 zfvn = zpsiuptk / rno3 * fvnuptk(ji,jj,jk) 521 sizen(ji,jj,jk) = MAX(1., MIN(xsizern, 1.0 / ( MAX(rtrn, zfvn) ) ) ) 522 523 ! N/P ratio of nanophytoplankton 524 ! ------------------------------ 525 zfuptk = 0.23 * zfvn 526 zrpho = 2.24 * trb(ji,jj,jk,jpnch) / ( trb(ji,jj,jk,jpnph) * rno3 * 15. + rtrn ) 527 zrass = 1. - 0.2 - zrpho - zfuptk 528 xqpnmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16. + 0.13 529 xqpnmax(ji,jj,jk) = xqpnmax(ji,jj,jk) * trb(ji,jj,jk,jpnph) / ( trb(ji,jj,jk,jpphy) + rtrn ) 530 xqpnmin(ji,jj,jk) = qpnmin 531 532 ! Size estimation of picophytoplankton 533 ! ------------------------------------ 534 zfvn = zpsiuptk / rno3 * fvpuptk(ji,jj,jk) 535 sizep(ji,jj,jk) = MAX(1., MIN(xsizerp, 1.0 / ( MAX(rtrn, zfvn) ) ) ) 536 537 ! N/P ratio of picophytoplankton 538 ! ------------------------------ 539 zfuptk = 0.35 * zfvn 540 zrpho = 2.24 * trb(ji,jj,jk,jppch) / ( trb(ji,jj,jk,jpnpi) * rno3 * 15. + rtrn ) 541 zrass = 1. - 0.4 - zrpho - zfuptk 542 xqppmax(ji,jj,jk) = (zrpho + zfuptk) * 0.0128 * 16. + zrass * 1./ 10.9 * 16. + 0.13 543 xqppmax(ji,jj,jk) = xqppmax(ji,jj,jk) * trb(ji,jj,jk,jpnpi) / ( trb(ji,jj,jk,jppic) + rtrn ) 544 xqppmin(ji,jj,jk) = qppmin 545 546 ! Size estimation of diatoms 547 ! -------------------------- 548 zfvn = zpsiuptk / rno3 * fvduptk(ji,jj,jk) 549 sized(ji,jj,jk) = MAX(1., MIN(xsizerd, 1.0 / ( MAX(rtrn, zfvn) ) ) ) 550 ! zcoef = trb(ji,jj,jk,jpdia) - MIN(xsizedia, trb(ji,jj,jk,jpdia) ) 551 ! sized(ji,jj,jk) = 1. + xsizerd * zcoef *1E6 / ( 1. + zcoef * 1E6 ) 552 553 ! N/P ratio of diatoms 554 ! -------------------- 555 zfuptk = 0.2 * zfvn 556 zrpho = 2.24 * trb(ji,jj,jk,jpdch) / ( trb(ji,jj,jk,jpndi) * rno3 * 15. + rtrn ) 557 zrass = 1. - 0.2 - zrpho - zfuptk 558 xqpdmax(ji,jj,jk) = ( zfuptk + zrpho ) * 0.0128 * 16. + zrass * 1./ 7.2 * 16. + 0.13 559 xqpdmax(ji,jj,jk) = xqpdmax(ji,jj,jk) * trb(ji,jj,jk,jpndi) / ( trb(ji,jj,jk,jpdia) + rtrn ) 560 xqpdmin(ji,jj,jk) = qpdmin * sized(ji,jj,jk)**(-0.27) 561 562 END DO 563 END DO 564 END DO 565 566 ! Compute the fraction of nanophytoplankton that is made of calcifiers 567 ! -------------------------------------------------------------------- 568 DO jk = 1, jpkm1 569 DO jj = 1, jpj 570 DO ji = 1, jpi 571 zlim1 = trb(ji,jj,jk,jpnh4) / ( trb(ji,jj,jk,jpnh4) + concnnh4 ) + trb(ji,jj,jk,jpno3) & 572 & / ( trb(ji,jj,jk,jpno3) + concnno3 ) * ( 1.0 - trb(ji,jj,jk,jpnh4) & 573 & / ( trb(ji,jj,jk,jpnh4) + concnnh4 ) ) 574 zlim2 = trb(ji,jj,jk,jppo4) / ( trb(ji,jj,jk,jppo4) + concnpo4 ) 575 zlim3 = trb(ji,jj,jk,jpfer) / ( trb(ji,jj,jk,jpfer) + 1.E-10 ) 576 ztem1 = MAX( 0., tsn(ji,jj,jk,jp_tem) ) 577 ztem2 = tsn(ji,jj,jk,jp_tem) - 10. 578 zetot1 = MAX( 0., etot(ji,jj,jk) - 1.) / ( 4. + etot(ji,jj,jk) ) * 20. / ( 20. + etot(ji,jj,jk) ) 579 580 ! xfracal(ji,jj,jk) = caco3r * MIN( zlim1, zlim2, zlim3 ) & 581 xfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk) & 582 & * ztem1 / ( 1. + ztem1 ) * MAX( 1., trb(ji,jj,jk,jpphy)*1E6 ) & 583 & * ( 1. + EXP(-ztem2 * ztem2 / 25. ) ) & 584 & * zetot1 * MIN( 1., 50. / ( hmld(ji,jj) + rtrn ) ) 585 xfracal(ji,jj,jk) = MAX( 0.02, MIN( 0.8 , xfracal(ji,jj,jk) ) ) 586 END DO 587 END DO 588 END DO 589 ! 590 DO jk = 1, jpkm1 591 DO jj = 1, jpj 592 DO ji = 1, jpi 593 ! denitrification factor computed from O2 levels 594 nitrfac(ji,jj,jk) = MAX( 0.e0, 0.4 * ( 6.e-6 - trb(ji,jj,jk,jpoxy) ) & 595 & / ( oxymin + trb(ji,jj,jk,jpoxy) ) ) 596 nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) 597 END DO 598 END DO 599 END DO 600 ! 601 IF( lk_iomput .AND. knt == nrdttrc ) THEN ! save output diagnostics 602 IF( iom_use( "xfracal" ) ) CALL iom_put( "xfracal", xfracal(:,:,:) * tmask(:,:,:) ) ! euphotic layer deptht 603 IF( iom_use( "LNnut" ) ) CALL iom_put( "LNnut" , xlimphy(:,:,:) * tmask(:,:,:) ) ! Nutrient limitation term 604 IF( iom_use( "LPnut" ) ) CALL iom_put( "LPnut" , xlimpic(:,:,:) * tmask(:,:,:) ) ! Nutrient limitation term 605 IF( iom_use( "LDnut" ) ) CALL iom_put( "LDnut" , xlimdia(:,:,:) * tmask(:,:,:) ) ! Nutrient limitation term 606 IF( iom_use( "LNFe" ) ) CALL iom_put( "LNFe" , xlimnfe(:,:,:) * tmask(:,:,:) ) ! Iron limitation term 607 IF( iom_use( "LPFe" ) ) CALL iom_put( "LPFe" , xlimpfe(:,:,:) * tmask(:,:,:) ) ! Iron limitation term 608 IF( iom_use( "LDFe" ) ) CALL iom_put( "LDFe" , xlimdfe(:,:,:) * tmask(:,:,:) ) ! Iron limitation term 609 IF( iom_use( "SIZEN" ) ) CALL iom_put( "SIZEN" , sizen(:,:,:) * tmask(:,:,:) ) ! Iron limitation term 610 IF( iom_use( "SIZEP" ) ) CALL iom_put( "SIZEP" , sizep(:,:,:) * tmask(:,:,:) ) ! Iron limitation term 611 IF( iom_use( "SIZED" ) ) CALL iom_put( "SIZED" , sized(:,:,:) * tmask(:,:,:) ) ! Iron limitation term 612 ENDIF 613 ! 614 IF( nn_timing == 1 ) CALL timing_stop('p5z_lim') 615 ! 616 END SUBROUTINE p5z_lim 229 617 230 618 SUBROUTINE p4z_lim_init … … 286 674 END SUBROUTINE p4z_lim_init 287 675 676 SUBROUTINE p5z_lim_init 677 678 !!---------------------------------------------------------------------- 679 !! *** ROUTINE p5z_lim_init *** 680 !! 681 !! ** Purpose : Initialization of nutrient limitation parameters 682 !! 683 !! ** Method : Read the nampislim and nampisquota namelists and check 684 !! the parameters called at the first timestep (nittrc000) 685 !! 686 !! ** input : Namelist nampislim 687 !! 688 !!---------------------------------------------------------------------- 689 690 NAMELIST/namp5zlim/ concnno3, concpno3, concdno3, concnnh4, concpnh4, concdnh4, & 691 & concnfer, concpfer, concdfer, concbfe, concnpo4, concppo4, & 692 & concdpo4, concbno3, concbnh4, concbpo4, xsizedia, xsizepic, & 693 & xsizephy, xsizern, xsizerp, xsizerd, xksi1, xksi2, xkdoc, & 694 & caco3r, oxymin 695 696 NAMELIST/namp5zquota/ qnnmin, qnnmax, qpnmin, qpnmax, qnpmin, qnpmax, qppmin, & 697 & qppmax, qndmin, qndmax, qpdmin, qpdmax, qfnmax, qfpmax, qfdmax, & 698 & qfnopt, qfpopt, qfdopt 699 700 701 INTEGER :: ios ! Local integer output status for namelist read 702 703 REWIND( numnatp_ref ) ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters 704 READ ( numnatp_ref, namp5zlim, IOSTAT = ios, ERR = 901) 705 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in reference namelist', lwp ) 706 707 REWIND( numnatp_cfg ) ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters 708 READ ( numnatp_cfg, namp5zlim, IOSTAT = ios, ERR = 902 ) 709 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampislim in configuration namelist', lwp ) 710 IF(lwm) WRITE ( numonp, namp5zlim ) 711 712 IF(lwp) THEN ! control print 713 WRITE(numout,*) ' ' 714 WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zlim' 715 WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' 716 WRITE(numout,*) ' mean rainratio caco3r = ', caco3r 717 WRITE(numout,*) ' NO3 half saturation of nanophyto concnno3 = ', concnno3 718 WRITE(numout,*) ' NO3 half saturation of picophyto concpno3 = ', concpno3 719 WRITE(numout,*) ' NO3 half saturation of diatoms concdno3 = ', concdno3 720 WRITE(numout,*) ' NH4 half saturation for phyto concnnh4 = ', concnnh4 721 WRITE(numout,*) ' NH4 half saturation for pico concpnh4 = ', concpnh4 722 WRITE(numout,*) ' NH4 half saturation for diatoms concdnh4 = ', concdnh4 723 WRITE(numout,*) ' PO4 half saturation for phyto concnpo4 = ', concnpo4 724 WRITE(numout,*) ' PO4 half saturation for pico concppo4 = ', concppo4 725 WRITE(numout,*) ' PO4 half saturation for diatoms concdpo4 = ', concdpo4 726 WRITE(numout,*) ' half saturation constant for Si uptake xksi1 = ', xksi1 727 WRITE(numout,*) ' half saturation constant for Si/C xksi2 = ', xksi2 728 WRITE(numout,*) ' half-sat. of DOC remineralization xkdoc = ', xkdoc 729 WRITE(numout,*) ' Iron half saturation for nanophyto concnfer = ', concnfer 730 WRITE(numout,*) ' Iron half saturation for picophyto concpfer = ', concpfer 731 WRITE(numout,*) ' Iron half saturation for diatoms concdfer = ', concdfer 732 WRITE(numout,*) ' size ratio for nanophytoplankton xsizern = ', xsizern 733 WRITE(numout,*) ' size ratio for picophytoplankton xsizerp = ', xsizerp 734 WRITE(numout,*) ' size ratio for diatoms xsizerd = ', xsizerd 735 WRITE(numout,*) ' NO3 half saturation of bacteria concbno3 = ', concbno3 736 WRITE(numout,*) ' NH4 half saturation for bacteria concbnh4 = ', concbnh4 737 WRITE(numout,*) ' Minimum size criteria for diatoms xsizedia = ', xsizedia 738 WRITE(numout,*) ' Minimum size criteria for picophyto xsizepic = ', xsizepic 739 WRITE(numout,*) ' Minimum size criteria for nanophyto xsizephy = ', xsizephy 740 WRITE(numout,*) ' Fe half saturation for bacteria concbfe = ', concbfe 741 WRITE(numout,*) ' halk saturation constant for anoxia oxymin =' , oxymin 742 ENDIF 743 744 REWIND( numnatp_ref ) ! Namelist nampislim in reference namelist : Pisces nutrient limitation parameters 745 READ ( numnatp_ref, namp5zquota, IOSTAT = ios, ERR = 903) 746 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisquota in reference namelist', lwp ) 747 748 REWIND( numnatp_cfg ) ! Namelist nampislim in configuration namelist : Pisces nutrient limitation parameters 749 READ ( numnatp_cfg, namp5zquota, IOSTAT = ios, ERR = 904 ) 750 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nampisquota in configuration namelist', lwp ) 751 IF(lwm) WRITE ( numonp, namp5zquota ) 752 753 IF(lwp) THEN ! control print 754 WRITE(numout,*) ' ' 755 WRITE(numout,*) ' Namelist parameters for nutrient limitations, namp5zquota' 756 WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' 757 WRITE(numout,*) ' optimal Fe quota for nano. qfnopt = ', qfnopt 758 WRITE(numout,*) ' optimal Fe quota for pico. qfpopt = ', qfpopt 759 WRITE(numout,*) ' Optimal Fe quota for diatoms qfdopt = ', qfdopt 760 WRITE(numout,*) ' Minimal N quota for nano qnnmin = ', qnnmin 761 WRITE(numout,*) ' Maximal N quota for nano qnnmax = ', qnnmax 762 WRITE(numout,*) ' Minimal P quota for nano qpnmin = ', qpnmin 763 WRITE(numout,*) ' Maximal P quota for nano qpnmax = ', qpnmax 764 WRITE(numout,*) ' Minimal N quota for pico qnpmin = ', qnpmin 765 WRITE(numout,*) ' Maximal N quota for pico qnpmax = ', qnpmax 766 WRITE(numout,*) ' Minimal P quota for pico qppmin = ', qppmin 767 WRITE(numout,*) ' Maximal P quota for pico qppmax = ', qppmax 768 WRITE(numout,*) ' Minimal N quota for diatoms qndmin = ', qndmin 769 WRITE(numout,*) ' Maximal N quota for diatoms qndmax = ', qndmax 770 WRITE(numout,*) ' Minimal P quota for diatoms qpdmin = ', qpdmin 771 WRITE(numout,*) ' Maximal P quota for diatoms qpdmax = ', qpdmax 772 WRITE(numout,*) ' Maximal Fe quota for nanophyto. qfnmax = ', qfnmax 773 WRITE(numout,*) ' Maximal Fe quota for picophyto. qfpmax = ', qfpmax 774 WRITE(numout,*) ' Maximal Fe quota for diatoms qfdmax = ', qfdmax 775 ENDIF 776 777 zpsino3 = 2.3 * rno3 778 zpsinh4 = 1.8 * rno3 779 zpsiuptk = 2.3 * rno3 780 ! 781 nitrfac (:,:,:) = 0._wp 782 ! 783 END SUBROUTINE p5z_lim_init 784 288 785 INTEGER FUNCTION p4z_lim_alloc() 289 786 !!---------------------------------------------------------------------- … … 291 788 !!---------------------------------------------------------------------- 292 789 USE lib_mpp , ONLY: ctl_warn 790 INTEGER :: ierr(3) ! Local variables 293 791 !!---------------------------------------------------------------------- 792 ierr(:) = 0 294 793 295 794 !* Biological arrays for phytoplankton growth … … 301 800 & xlimbac (jpi,jpj,jpk), xlimbacl(jpi,jpj,jpk), & 302 801 & concnfe (jpi,jpj,jpk), concdfe (jpi,jpj,jpk), & 303 & xlimsi (jpi,jpj,jpk), STAT=p4z_lim_alloc ) 802 & xlimsi (jpi,jpj,jpk), STAT=ierr(1) ) 803 804 IF (ln_p5z) THEN 805 !* Biological arrays for phytoplankton growth 806 ALLOCATE( xpicono3(jpi,jpj,jpk), xpiconh4(jpi,jpj,jpk), & 807 & xpicopo4(jpi,jpj,jpk), xpicodop(jpi,jpj,jpk), & 808 & xnanodop(jpi,jpj,jpk), xdiatdop(jpi,jpj,jpk), & 809 & xnanofer(jpi,jpj,jpk), xdiatfer(jpi,jpj,jpk), & 810 & xpicofer(jpi,jpj,jpk), xlimpfe (jpi,jpj,jpk), & 811 & fvnuptk (jpi,jpj,jpk), fvduptk (jpi,jpj,jpk), & 812 & fvpuptk (jpi,jpj,jpk), xlimpic (jpi,jpj,jpk), & 813 & xlimsi2 (jpi,jpj,jpk), STAT=ierr(2) ) 814 815 !* Minimum/maximum quotas of phytoplankton 816 ALLOCATE( xqnnmin (jpi,jpj,jpk), xqnnmax(jpi,jpj,jpk), & 817 & xqpnmin (jpi,jpj,jpk), xqpnmax(jpi,jpj,jpk), & 818 & xqnpmin (jpi,jpj,jpk), xqnpmax(jpi,jpj,jpk), & 819 & xqppmin (jpi,jpj,jpk), xqppmax(jpi,jpj,jpk), & 820 & xqndmin (jpi,jpj,jpk), xqndmax(jpi,jpj,jpk), & 821 & xqpdmin (jpi,jpj,jpk), xqpdmax(jpi,jpj,jpk), STAT=ierr(3) ) 822 ENDIF 823 ! 824 825 p4z_lim_alloc = MAXVAL( ierr ) 304 826 ! 305 827 IF( p4z_lim_alloc /= 0 ) CALL ctl_warn('p4z_lim_alloc : failed to allocate arrays.')
Note: See TracChangeset
for help on using the changeset viewer.