MODULE p4zbio !!====================================================================== !! *** MODULE p4zbio *** !! TOP : PISCES bio-model !!====================================================================== !! History : 1.0 ! 2004 (O. Aumont) Original code !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90 !!---------------------------------------------------------------------- #if defined key_pisces !!---------------------------------------------------------------------- !! 'key_pisces' PISCES bio-model !!---------------------------------------------------------------------- !! p4z_bio : computes the interactions between the different !! compartments of PISCES !!---------------------------------------------------------------------- USE oce_trc ! USE trp_trc ! USE sms ! USE p4zsink ! USE p4zsink_kriest ! USE p4zopt ! USE p4zlim ! USE p4zprod ! USE p4znano ! USE p4zdiat ! USE p4zmicro ! USE p4zmeso ! USE p4zrem ! IMPLICIT NONE PRIVATE PUBLIC p4z_bio ! called in p4zprg.F90 !!* Substitution # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/TOP 2.0 , LOCEAN-IPSL (2007) !! $Header:$ !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE p4z_bio !!--------------------------------------------------------------------- !! *** ROUTINE p4z_bio *** !! !! ** Purpose : Ecosystem model in the whole ocean: computes the !! different interactions between the different compartments !! of PISCES !! !! ** Method : - ??? !!--------------------------------------------------------------------- INTEGER :: ji, jj, jk, jn REAL(wp) :: zdenom, ztemp REAL(wp) :: zprodt, zprodca REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdenom1 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zfracal #if defined key_kriest REAL(wp) :: znumpoc, znumdoc #else REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdenom2 #endif !!--------------------------------------------------------------------- ! ASSIGN THE SHEAR RATE THAT IS USED FOR AGGREGATION ! OF PHYTOPLANKTON AND DETRITUS zdiss(:,:,:) = 0.01 !!gm the use of nmld should be better here? DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi IF( fsdepw(ji,jj,jk+1) .le. hmld(ji,jj) ) zdiss(ji,jj,jk) = 1.e0 END DO END DO END DO ! Compute de different ratios for scavenging of iron ! -------------------------------------------------- DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi #if ! defined key_kriest zdenom = 1. / ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpgoc) & & + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn ) zdenom1(ji,jj,jk) = trn(ji,jj,jk,jppoc) * zdenom zdenom2(ji,jj,jk) = trn(ji,jj,jk,jpgoc) * zdenom #else zdenom = 1. / ( trn(ji,jj,jk,jppoc) & & + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn ) zdenom1(ji,jj,jk) = trn(ji,jj,jk,jppoc) * zdenom #endif END DO END DO END DO ! Compute the fraction of nanophytoplankton that is made of calcifiers ! -------------------------------------------------------------------- DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi ztemp = MAX( 0., tn(ji,jj,jk) ) zfracal(ji,jj,jk) = caco3r * xlimphy(ji,jj,jk) & & * MAX( 0.0001, ztemp / ( 2.+ ztemp ) ) & & * MAX( 1., trn(ji,jj,jk,jpphy) * 1.e6 / 2. ) zfracal(ji,jj,jk) = MIN( 0.8 , zfracal(ji,jj,jk) ) zfracal(ji,jj,jk) = MAX( 0.01, zfracal(ji,jj,jk) ) END DO END DO END DO ! computation of the vertical flux of particulate organic matter ! -------------------------------------------------------------- IF( lk_kriest ) THEN ; CALL p4z_sink_kriest ! Sink due to vertical flux of POM ELSE ; CALL p4z_sink ! ENDIF ! compute the PAR in the water column ! ----------------------------------- CALL p4z_opt ! Optical ! compute the co-limitations by the various nutrients ! ---------------------------------------------------- CALL p4z_lim ! compute phytoplankton growth rate over the global ocean. ! ------------------------------------------------------- ! (Growth rates for each element is computed (C, Si, Fe, Chl)) CALL p4z_prod ! phytoplankton mortality (Mortality losses for each elements are computed (C, Fe, Si, Chl) ) ! ----------------------- CALL p4z_nano ! nanophytoplankton CALL p4z_diat ! diatoms ! zooplankton sources/sinks routines (each elements are computed (C, Fe, Si, Chl) ) ! ---------------------------------- CALL p4z_micro ! microzooplankton CALL p4z_meso ! mesozooplankton ! computation of remineralization terms of organic matter + scavenging of Fe ! -------------------------------------------------------------------------- CALL p4z_rem ! remineralization ! Determination of tracers concentration as a function of biological sources and sinks ! ------------------------------------------------------------------------------------ DO jk = 1, jpkm1 ! Evolution of PO4 ! ---------------- trn(:,:,jk,jppo4) = trn(:,:,jk,jppo4) - prorca(:,:,jk) - prorca2(:,:,jk) & & + olimi (:,:,jk) + grarem (:,:,jk) * sigma1 & & + denitr(:,:,jk) + grarem2(:,:,jk) * sigma2 ! Evolution of NO3 and NH4 ! ------------------------ trn(:,:,jk,jpno3) = trn(:,:,jk,jpno3) - pronew(:,:,jk) - pronew2(:,:,jk) & & + onitr (:,:,jk) - denitr (:,:,jk) * rdenit trn(:,:,jk,jpnh4) = trn(:,:,jk,jpnh4) - proreg(:,:,jk) - proreg2(:,:,jk) & & + olimi (:,:,jk) + grarem (:,:,jk) * sigma1 & & + grarem2(:,:,jk) * sigma2 & & - onitr (:,:,jk) + denitr (:,:,jk) ! Evolution of Phytoplankton ! -------------------------- trn(:,:,jk,jpphy) = trn(:,:,jk,jpphy) + prorca (:,:,jk) * ( 1.- excret ) - tortp(:,:,jk) & & - grazp (:,:,jk) - grazn(:,:,jk) - respp(:,:,jk) trn(:,:,jk,jpnch) = trn(:,:,jk,jpnch) + prorca6(:,:,jk) * ( 1.- excret ) - tortnch(:,:,jk) & & - grazpch(:,:,jk) - graznch(:,:,jk)- respnch(:,:,jk) ! Evolution of Diatoms ! -------------------- trn(:,:,jk,jpdia) = trn(:,:,jk,jpdia) + prorca2(:,:,jk) * ( 1.- excret2 ) - tortp2(:,:,jk) & & - respp2 (:,:,jk) - grazd(:,:,jk) - grazsd(:,:,jk) trn(:,:,jk,jpdch) = trn(:,:,jk,jpdch) + prorca7(:,:,jk) * ( 1.- excret2 ) - tortdch(:,:,jk) & & - respdch(:,:,jk) - grazdch(:,:,jk) - grazsch(:,:,jk) ! Evolution of Zooplankton ! ------------------------ trn(:,:,jk,jpzoo) = trn(:,:,jk,jpzoo) + epsher * ( grazp(:,:,jk) + grazm(:,:,jk) + grazsd(:,:,jk) ) & & - grazz(:,:,jk) - tortz(:,:,jk) - respz(:,:,jk) ! Evolution of Mesozooplankton ! ------------------------ trn(:,:,jk,jpmes) = trn(:,:,jk,jpmes) + epsher2 * ( grazd (:,:,jk) + grazz (:,:,jk) + grazn(:,:,jk) & & + grazpoc(:,:,jk) + grazffe(:,:,jk) ) & & - tortz2(:,:,jk) - respz2(:,:,jk) ! Evolution of O2 ! --------------- trn(:,:,jk,jpoxy) = trn(:,:,jk,jpoxy) + o2ut * ( proreg(:,:,jk) + proreg2(:,:,jk) - olimi(:,:,jk) & & -grarem(:,:,jk) * sigma1 - grarem2(:,:,jk) * sigma2 ) & & + ( o2ut + o2nit ) * ( pronew(:,:,jk) + pronew2(:,:,jk) ) & & - o2nit * onitr(:,:,jk) ! Evolution of IRON ! ----------------- trn(:,:,jk,jpfer) = trn(:,:,jk,jpfer) + ( excret - 1.) * prorca5(:,:,jk) - xaggdfe (:,:,jk) & & + ( excret2 - 1.) * prorca4(:,:,jk) - xbactfer(:,:,jk) & & + grafer(:,:,jk) + grafer2(:,:,jk) & & + ofer (:,:,jk) - xscave (:,:,jk) ! END DO #if defined key_kriest #include "p4zbio_kriest.h90" #else #include "p4zbio_std.h90" #endif DO jk = 1, jpkm1 ! Evolution of biogenic Silica ! ---------------------------- trn(:,:,jk,jpbsi) = trn(:,:,jk,jpbsi) + prorca3(:,:,jk) * ( 1.- excret2 ) - grazss(:,:,jk) & & - tortds (:,:,jk) - respds(:,:,jk) - grazs (:,:,jk) ! Evolution of sinking biogenic silica ! ------------------------------------ trn(:,:,jk,jpdsi) = trn(:,:,jk,jpdsi) + tortds (:,:,jk) + respds(:,:,jk) + grazs(:,:,jk) & & - osil (:,:,jk) + grazss(:,:,jk) ! Evolution of biogenic diatom Iron ! --------------------------------- trn(:,:,jk,jpdfe) = trn(:,:,jk,jpdfe) + prorca4(:,:,jk) * ( 1.- excret2 ) - grazsf(:,:,jk) & & - tortdf (:,:,jk) - respdf(:,:,jk) - grazf (:,:,jk) ! Evolution of biogenic nanophytoplankton Iron ! -------------------------------------------- trn(:,:,jk,jpnfe) = trn(:,:,jk,jpnfe) + prorca5(:,:,jk) * ( 1.- excret ) - graznf(:,:,jk) & & - tortnf (:,:,jk) - respnf(:,:,jk) - grazpf(:,:,jk) ! Evolution of dissolved Silica ! ----------------------------- trn(:,:,jk,jpsil) = trn(:,:,jk,jpsil) - ( 1.- excret2 ) * prorca3(:,:,jk) + osil(:,:,jk) END DO ! Evolution of calcite and silicates as a function of the two tracers ! ------------------------------------------------------------------- DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi zprodt = prorca(ji,jj,jk) + prorca2(ji,jj,jk) - olimi(ji,jj,jk) - grarem(ji,jj,jk) * sigma1 & & - grarem2(ji,jj,jk) * sigma2 - denitr(ji,jj,jk) zprodca = pronew(ji,jj,jk) + pronew2(ji,jj,jk) - onitr(ji,jj,jk) + rdenit * denitr(ji,jj,jk) ! potential production of calcite and biogenic silicate ! ------------------------------------------------------ prcaca(ji,jj,jk) = zfracal(ji,jj,jk) & & * ( part * ( unass*grazp(ji,jj,jk) + unass2*grazn(ji,jj,jk) ) & & + tortp(ji,jj,jk) + respp(ji,jj,jk) ) ! Consumption of Total (12C)O2 ! ---------------------------- trn(ji,jj,jk,jpdic) = trn(ji,jj,jk,jpdic) - zprodt - prcaca(ji,jj,jk) ! Consumption of alkalinity due to ca++ uptake and increase of ! alkalinity due to nitrate consumption during organic soft tissue production ! --------------------------------------------------------- trn(ji,jj,jk,jptal) = trn(ji,jj,jk,jptal) + rno3 * zprodca - 2.* prcaca(ji,jj,jk) ! END DO END DO END DO ! Production of calcite due to biological production ! -------------------------------------------------- DO jk = 1, jpkm1 trn(:,:,jk,jpcal) = trn(:,:,jk,jpcal) + prcaca(:,:,jk) END DO ! Loop to test if tracers concentrations fall below 0. ! ---------------------------------------------------- znegtr(:,:,:) = 1.e0 DO jn = 1, jptra DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi IF( trn(ji,jj,jk,jn) < 0.e0 ) znegtr(ji,jj,jk) = 0.e0 END DO END DO END DO END DO ! ! where at least 1 tracer concentration becomes negative ! ! all tracer tendancy are set to zero (i.e. trn = trb) DO jn = 1, jptra trn(:,:,:,jn) = trb(:,:,:,jn) + znegtr(:,:,:) * ( trn(:,:,:,jn) - trb(:,:,:,jn) ) END DO # if defined key_trc_dia3d !!gm potential bug hard coded index on trc3d trc3d(:,:,:, 4) = etot(:,:,:) trc3d(:,:,:, 5) = prorca (:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r trc3d(:,:,:, 6) = prorca2(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r trc3d(:,:,:, 7) = pronew (:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r trc3d(:,:,:, 8) = pronew2(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r trc3d(:,:,:, 9) = prorca3(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r trc3d(:,:,:,10) = prorca4(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r # if ! defined key_kriest trc3d(:,:,:,11) = prorca5(:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r # else trc3d(:,:,:,11) = prcaca (:,:,:) * znegtr(:,:,:) * 1.e3 * rfact2r # endif # endif ! END SUBROUTINE p4z_bio #else !!====================================================================== !! Dummy module : No PISCES bio-model !!====================================================================== CONTAINS SUBROUTINE p4z_bio ! Empty routine END SUBROUTINE p4z_bio #endif !!====================================================================== END MODULE p4zbio