MODULE trcbio !!====================================================================== !! *** MODULE trcbio *** !! TOP : LOBSTER !!====================================================================== !! History : - ! 1999-07 (M. Levy) Original code !! - ! 2000-12 (E. Kestenare) assign a parameter to name individual tracers !! - ! 2001-03 (M. Levy) LNO3 + dia2d !! 2.0 ! 2007-12 (C. Deltel, G. Madec) F90 !!---------------------------------------------------------------------- #if defined key_lobster !!---------------------------------------------------------------------- !! 'key_lobster' LOBSTER bio-model !!---------------------------------------------------------------------- !! trc_bio : !!---------------------------------------------------------------------- USE oce_trc ! USE trp_trc ! USE sms ! USE lbclnk ! IMPLICIT NONE PRIVATE PUBLIC trc_bio ! called in ??? !!* Substitution # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/TOP 2.0 , LOCEAN-IPSL (2007) !! $Id:$ !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE trc_bio( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE trc_bio *** !! !! ** Purpose : compute the now trend due to biogeochemical processes !! and add it to the general trend of passive tracers equations !! !! ** Method : each now biological flux is calculated in function of now !! concentrations of tracers. !! depending on the tracer, these fluxes are sources or sinks. !! the total of the sources and sinks for each tracer !! is added to the general trend. !! !! tra = tra + zf...tra - zftra... !! | | !! | | !! source sink !! !! IF 'key_trc_diabio' defined , the biogeochemical trends !! for passive tracers are saved for futher diagnostics. !!--------------------------------------------------------------------- INTEGER, INTENT( in ) :: kt ! ocean time-step index !! INTEGER :: ji, jj, jk REAL(wp) :: zdet, zzoo, zphy, zno3, znh4, zdom ! now concentrations REAL(wp) :: zlno3, zlnh4, zle, zlt ! limitation terms for phyto REAL(wp) :: zno3phy, znh4phy, zphynh4, zphydom REAL(wp) :: zphydet, zphyzoo, zdetzoo REAL(wp) :: zzoonh4, zzoodom, zzoodet, zdetnh4, zdetdom REAL(wp) :: znh4no3, zdomnh4, zppz, zpdz, zpppz, zppdz, zfood REAL(wp) :: zfilpz, zfildz, zphya, zzooa, zno3a REAL(wp) :: znh4a, zdeta, zdoma, zzoobod, zboddet, zdomaju #if defined key_trc_diaadd REAL(wp), DIMENSION(jpi,jpj,jpk) :: ze3t #endif !!--------------------------------------------------------------------- IF( kt == nit000 ) THEN IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) ' trc_bio: LOBSTER bio-model' IF(lwp) WRITE(numout,*) ' ~~~~~~~' ENDIF #if defined key_trc_diaadd ! convert fluxes in per day ze3t(:,:,:) = 0.e0 DO jk = 1, jpkbm1 ze3t(:,:,jk) = fse3t(:,:,jk) * 86400. END DO #endif fbod(:,:) = 0.e0 #if defined key_trc_diaadd DO ji = 1, jpdia2d trc2d(:,:,ji) = 0.e0 END DO #endif ! ! -------------------------- ! DO jk = 1, jpkbm1 ! Upper ocean (bio-layers) ! ! ! -------------------------- ! DO jj = 2, jpjm1 DO ji = 2, jpim1 !!gm use of fs_2 fs_jpm1 required here ! trophic variables( det, zoo, phy, no3, nh4, dom) ! ------------------------------------------------ ! negative trophic variables DO not contribute to the fluxes zdet = MAX( 0.e0, trn(ji,jj,jk,jpdet) ) zzoo = MAX( 0.e0, trn(ji,jj,jk,jpzoo) ) zphy = MAX( 0.e0, trn(ji,jj,jk,jpphy) ) zno3 = MAX( 0.e0, trn(ji,jj,jk,jpno3) ) znh4 = MAX( 0.e0, trn(ji,jj,jk,jpnh4) ) zdom = MAX( 0.e0, trn(ji,jj,jk,jpdom) ) ! Limitations zlt = 1. zle = 1. - EXP( -xpar(ji,jj,jk) / aki / zlt ) ! psinut,akno3,aknh4 added by asklod AS Kremeur 2005-03 zlno3 = zno3 * EXP( -psinut * znh4 ) / ( akno3 + zno3 ) zlnh4 = znh4 / (znh4+aknh4) ! sinks and sources ! phytoplankton production and exsudation zno3phy = tmumax * zle * zlt * zlno3 * zphy znh4phy = tmumax * zle * zlt * zlnh4 * zphy ! fphylab added by asklod AS Kremeur 2005-03 zphydom = rgamma * (1 - fphylab) * (zno3phy + znh4phy) zphynh4 = rgamma * fphylab * (zno3phy + znh4phy) ! zooplankton production ! preferences zppz = rppz zpdz = 1. - rppz zpppz = ( zppz * zphy ) / ( ( zppz * zphy + zpdz * zdet ) + 1.e-13 ) zppdz = ( zpdz * zdet ) / ( ( zppz * zphy + zpdz * zdet ) + 1.e-13 ) zfood = zpppz * zphy + zppdz * zdet ! filtration zfilpz = taus * zpppz / (aks + zfood) zfildz = taus * zppdz / (aks + zfood) ! grazing zphyzoo = zfilpz * zphy * zzoo zdetzoo = zfildz * zdet * zzoo ! fecal pellets production zzoodet = rpnaz * zphyzoo + rdnaz * zdetzoo ! zooplankton liquide excretion zzoonh4 = tauzn * fzoolab * zzoo zzoodom = tauzn * (1 - fzoolab) * zzoo ! mortality ! phytoplankton mortality zphydet = tmminp * zphy ! zooplankton mortality ! closure : flux fbod is redistributed below level jpkbio zzoobod = tmminz * zzoo * zzoo fbod(ji,jj) = fbod(ji,jj) + (1-fdbod) * zzoobod * fse3t(ji,jj,jk) zboddet = fdbod * zzoobod ! detritus and dom breakdown zdetnh4 = taudn * fdetlab * zdet zdetdom = taudn * (1 - fdetlab) * zdet zdomnh4 = taudomn * zdom ! flux added to express how the excess of nitrogen from ! PHY, ZOO and DET to DOM goes directly to NH4 (flux of ajustment) zdomaju = (1 - redf/reddom) * (zphydom + zzoodom + zdetdom) ! Nitrification znh4no3 = taunn * znh4 ! determination of trends ! total trend for each biological tracer zphya = zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet zzooa = zphyzoo + zdetzoo - zzoodet - zzoodom - zzoonh4 - zzoobod zno3a = - zno3phy + znh4no3 znh4a = - znh4phy - znh4no3 + zphynh4 + zzoonh4 + zdomnh4 + zdetnh4 + zdomaju zdeta = zphydet + zzoodet - zdetzoo - zdetnh4 - zdetdom + zboddet zdoma = zphydom + zzoodom + zdetdom - zdomnh4 - zdomaju #if defined key_trc_diabio trbio(ji,jj,jk, 1) = zno3phy trbio(ji,jj,jk, 2) = znh4phy trbio(ji,jj,jk, 3) = zphynh4 trbio(ji,jj,jk, 4) = zphydom trbio(ji,jj,jk, 5) = zphyzoo trbio(ji,jj,jk, 6) = zphydet trbio(ji,jj,jk, 7) = zdetzoo trbio(ji,jj,jk, 9) = zzoodet trbio(ji,jj,jk,10) = zzoobod trbio(ji,jj,jk,11) = zzoonh4 trbio(ji,jj,jk,12) = zzoodom trbio(ji,jj,jk,13) = znh4no3 trbio(ji,jj,jk,14) = zdomnh4 trbio(ji,jj,jk,15) = zdetnh4 #endif #if defined key_trc_diaadd trc2d(ji,jj, 1) = trc2d(ji,jj, 1) + zno3phy * ze3t(ji,jj,jk) trc2d(ji,jj, 2) = trc2d(ji,jj, 2) + znh4phy * ze3t(ji,jj,jk) trc2d(ji,jj, 3) = trc2d(ji,jj, 3) + zphydom * ze3t(ji,jj,jk) trc2d(ji,jj, 4) = trc2d(ji,jj, 4) + zphynh4 * ze3t(ji,jj,jk) trc2d(ji,jj, 5) = trc2d(ji,jj, 5) + zphyzoo * ze3t(ji,jj,jk) trc2d(ji,jj, 6) = trc2d(ji,jj, 6) + zphydet * ze3t(ji,jj,jk) trc2d(ji,jj, 7) = trc2d(ji,jj, 7) + zdetzoo * ze3t(ji,jj,jk) ! trend number 8 is in trcsed.F trc2d(ji,jj, 9) = trc2d(ji,jj, 9) + zzoodet * ze3t(ji,jj,jk) trc2d(ji,jj,10) = trc2d(ji,jj,10) + zzoobod * ze3t(ji,jj,jk) trc2d(ji,jj,11) = trc2d(ji,jj,11) + zzoonh4 * ze3t(ji,jj,jk) trc2d(ji,jj,12) = trc2d(ji,jj,12) + zzoodom * ze3t(ji,jj,jk) trc2d(ji,jj,13) = trc2d(ji,jj,13) + znh4no3 * ze3t(ji,jj,jk) trc2d(ji,jj,14) = trc2d(ji,jj,14) + zdomnh4 * ze3t(ji,jj,jk) trc2d(ji,jj,15) = trc2d(ji,jj,15) + zdetnh4 * ze3t(ji,jj,jk) trc2d(ji,jj,16) = trc2d(ji,jj,16) + ( zno3phy + znh4phy - zphynh4 & & - zphydom - zphyzoo - zphydet ) * ze3t(ji,jj,jk) trc2d(ji,jj,17) = trc2d(ji,jj,17) + ( zphyzoo + zdetzoo - zzoodet & & - zzoobod - zzoonh4 - zzoodom ) * ze3t(ji,jj,jk) trc2d(ji,jj,18) = trc2d(ji,jj,18) + zdetdom * ze3t(ji,jj,jk) ! trend number 19 is in trcexp.F trc3d(ji,jj,jk,1) = zno3phy * 86400 trc3d(ji,jj,jk,2) = znh4phy * 86400 trc3d(ji,jj,jk,3) = znh4no3 * 86400 #endif ! tracer flux at totox-point added to the general trend tra(ji,jj,jk,jpdet) = tra(ji,jj,jk,jpdet) + zdeta tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) + zzooa tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zphya tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zno3a tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + znh4a tra(ji,jj,jk,jpdom) = tra(ji,jj,jk,jpdom) + zdoma END DO END DO END DO !!gm do loop until jpkm1 only! ! ! -------------------------- ! DO jk = jpkb, jpk ! Upper ocean (bio-layers) ! ! ! -------------------------- ! DO jj = 2, jpjm1 DO ji = 2,jpim1 !!gm use of fs_2 & fs_jpim1 required ! remineralisation of all quantities towards nitrate ! trophic variables( det, zoo, phy, no3, nh4, dom) ! negative trophic variables DO not contribute to the fluxes zdet = MAX( 0.e0, trn(ji,jj,jk,jpdet) ) zzoo = MAX( 0.e0, trn(ji,jj,jk,jpzoo) ) zphy = MAX( 0.e0, trn(ji,jj,jk,jpphy) ) zno3 = MAX( 0.e0, trn(ji,jj,jk,jpno3) ) znh4 = MAX( 0.e0, trn(ji,jj,jk,jpnh4) ) zdom = MAX( 0.e0, trn(ji,jj,jk,jpdom) ) ! Limitations zlt = 0.e0 zle = 0.e0 zlno3 = 0.e0 zlnh4 = 0.e0 ! sinks and sources ! phytoplankton production and exsudation zno3phy = 0.e0 znh4phy = 0.e0 zphydom = 0.e0 zphynh4 = 0.e0 ! zooplankton production zphyzoo = 0.e0 ! grazing zdetzoo = 0.e0 zzoodet = 0.e0 ! fecal pellets production zzoonh4 = tauzn * fzoolab * zzoo ! zooplankton liquide excretion zzoodom = tauzn * (1 - fzoolab) * zzoo ! mortality zphydet = tmminp * zphy ! phytoplankton mortality zzoobod = 0.e0 ! zooplankton mortality zboddet = 0.e0 ! closure : flux fbod is redistributed below level jpkbio ! detritus and dom breakdown zdetnh4 = taudn * fdetlab * zdet zdetdom = taudn * (1 - fdetlab) * zdet zdomnh4 = taudomn * zdom zdomaju = (1 - redf/reddom) * (zphydom + zzoodom + zdetdom) ! Nitrification znh4no3 = taunn * znh4 ! determination of trends ! total trend for each biological tracer zphya = zno3phy + znh4phy - zphynh4 - zphydom - zphyzoo - zphydet zzooa = zphyzoo + zdetzoo - zzoodet - zzoodom - zzoonh4 - zzoobod zno3a = - zno3phy + znh4no3 znh4a = - znh4phy - znh4no3 + zphynh4 + zzoonh4 + zdomnh4 + zdetnh4 + zdomaju zdeta = zphydet + zzoodet - zdetzoo - zdetnh4 - zdetdom + zboddet zdoma = zphydom + zzoodom + zdetdom - zdomnh4 - zdomaju #if defined key_trc_diabio trbio(ji,jj,jk, 1) = zno3phy trbio(ji,jj,jk, 2) = znh4phy trbio(ji,jj,jk, 3) = zphynh4 trbio(ji,jj,jk, 4) = zphydom trbio(ji,jj,jk, 5) = zphyzoo trbio(ji,jj,jk, 6) = zphydet trbio(ji,jj,jk, 7) = zdetzoo trbio(ji,jj,jk, 9) = zzoodet trbio(ji,jj,jk,10) = zzoobod trbio(ji,jj,jk,11) = zzoonh4 trbio(ji,jj,jk,12) = zzoodom trbio(ji,jj,jk,13) = znh4no3 trbio(ji,jj,jk,14) = zdomnh4 trbio(ji,jj,jk,15) = zdetnh4 #endif #if defined key_trc_diaadd trc2d(ji,jj, 1) = trc2d(ji,jj, 1) + zno3phy * ze3t(ji,jj,jk) trc2d(ji,jj, 2) = trc2d(ji,jj, 2) + znh4phy * ze3t(ji,jj,jk) trc2d(ji,jj, 3) = trc2d(ji,jj, 3) + zphydom * ze3t(ji,jj,jk) trc2d(ji,jj, 4) = trc2d(ji,jj, 4) + zphynh4 * ze3t(ji,jj,jk) trc2d(ji,jj, 5) = trc2d(ji,jj, 5) + zphyzoo * ze3t(ji,jj,jk) trc2d(ji,jj, 6) = trc2d(ji,jj, 6) + zphydet * ze3t(ji,jj,jk) trc2d(ji,jj, 7) = trc2d(ji,jj, 7) + zdetzoo * ze3t(ji,jj,jk) ! trend number 8 is in trcsed.F trc2d(ji,jj, 9) = trc2d(ji,jj, 9) + zzoodet * ze3t(ji,jj,jk) trc2d(ji,jj,10) = trc2d(ji,jj,10) + zzoobod * ze3t(ji,jj,jk) trc2d(ji,jj,11) = trc2d(ji,jj,11) + zzoonh4 * ze3t(ji,jj,jk) trc2d(ji,jj,12) = trc2d(ji,jj,12) + zzoodom * ze3t(ji,jj,jk) trc2d(ji,jj,13) = trc2d(ji,jj,13) + znh4no3 * ze3t(ji,jj,jk) trc2d(ji,jj,14) = trc2d(ji,jj,14) + zdomnh4 * ze3t(ji,jj,jk) trc2d(ji,jj,15) = trc2d(ji,jj,15) + zdetnh4 * ze3t(ji,jj,jk) trc2d(ji,jj,16) = trc2d(ji,jj,16) + ( zno3phy + znh4phy - zphynh4 & & - zphydom - zphyzoo - zphydet ) * ze3t(ji,jj,jk) trc2d(ji,jj,17) = trc2d(ji,jj,17) + ( zphyzoo + zdetzoo - zzoodet & & - zzoobod - zzoonh4 - zzoodom ) * ze3t(ji,jj,jk) trc2d(ji,jj,18) = trc2d(ji,jj,18) + zdetdom * ze3t(ji,jj,jk) trc3d(ji,jj,jk,1) = zno3phy * 86400 trc3d(ji,jj,jk,2) = znh4phy * 86400 trc3d(ji,jj,jk,3) = znh4no3 * 86400 #endif ! tracer flux at totox-point added to the general trend tra(ji,jj,jk,jpdet) = tra(ji,jj,jk,jpdet) + zdeta tra(ji,jj,jk,jpzoo) = tra(ji,jj,jk,jpzoo) + zzooa tra(ji,jj,jk,jpphy) = tra(ji,jj,jk,jpphy) + zphya tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zno3a tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) + znh4a tra(ji,jj,jk,jpdom) = tra(ji,jj,jk,jpdom) + zdoma ! END DO END DO END DO #if defined key_trc_diaadd ! Lateral boundary conditions on trc2d and trc3d DO ji = 1, jpdia2d CALL lbc_lnk( trc2d(:,:,ji),'T', 1. ) END DO DO ji = 1, jpdia3d CALL lbc_lnk( trc3d(:,:,1,ji),'T', 1. ) END DO #endif #if defined key_trc_diabio ! Lateral boundary conditions on trcbio DO ji = 1, jpdiabio CALL lbc_lnk( trbio(:,:,1,ji),'T', 1. ) END DO #endif ! END SUBROUTINE trc_bio #else !!====================================================================== !! Dummy module : No PISCES bio-model !!====================================================================== CONTAINS SUBROUTINE trc_bio( kt ) ! Empty routine INTEGER, INTENT( in ) :: kt WRITE(*,*) 'trc_bio: You should not have seen this print! error?', kt END SUBROUTINE trc_bio #endif !!====================================================================== END MODULE trcbio