MODULE p4zrem !!====================================================================== !! *** MODULE p4zrem *** !! TOP : PISCES Compute remineralization/scavenging of organic compounds !!====================================================================== !! History : 1.0 ! 2004 (O. Aumont) Original code !! 2.0 ! 2007-12 (C. Ethe, G. Madec) F90 !!---------------------------------------------------------------------- #if defined key_pisces !!---------------------------------------------------------------------- !! 'key_top' and TOP models !! 'key_pisces' PISCES bio-model !!---------------------------------------------------------------------- !! p4z_rem : Compute remineralization/scavenging of organic compounds !!---------------------------------------------------------------------- USE trc USE oce_trc ! USE sms_pisces ! USE prtctl_trc USE p4zint USE p4zopt USE p4zmeso USE p4zprod USE p4zche IMPLICIT NONE PRIVATE PUBLIC p4z_rem ! called in p4zbio.F90 PUBLIC p4z_rem_init ! called in trcsms_pisces.F90 PUBLIC p4z_rem_alloc REAL(wp), PUBLIC :: & xremik = 0.3_wp , & !: xremip = 0.025_wp , & !: nitrif = 0.05_wp , & !: xsirem = 0.015_wp , & !: xlam1 = 0.005_wp , & !: oxymin = 1.e-6_wp !: REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: denitr !: denitrification array !!* Substitution # include "top_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/TOP 3.3 , NEMO Consortium (2010) !! $Id$ !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE p4z_rem( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE p4z_rem *** !! !! ** Purpose : Compute remineralization/scavenging of organic compounds !! !! ** Method : - ??? !!--------------------------------------------------------------------- USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released USE wrk_nemo, ONLY: ztempbac => wrk_2d_1 USE wrk_nemo, ONLY: zdepbac => wrk_3d_2 , zolimi => wrk_3d_3 ! INTEGER, INTENT(in) :: kt ! ocean time step ! INTEGER :: ji, jj, jk REAL(wp) :: zremip, zremik , zlam1b REAL(wp) :: zkeq , zfeequi, zsiremin, zfesatur REAL(wp) :: zsatur, zsatur2, znusil REAL(wp) :: zbactfer, zorem, zorem2, zofer REAL(wp) :: zosil, zdenom1, zscave, zaggdfe #if ! defined key_kriest REAL(wp) :: zofer2, zdenom, zdenom2 #endif REAL(wp) :: zlamfac, zonitr, zstep CHARACTER (len=25) :: charout !!--------------------------------------------------------------------- IF( wrk_in_use(2, 1) .OR. wrk_in_use(3, 2,3) ) THEN CALL ctl_stop('p4z_rem: requested workspace arrays unavailable') ; RETURN ENDIF ! Initialisation of temprary arrys zdepbac (:,:,:) = 0._wp zolimi (:,:,:) = 0._wp ztempbac(:,:) = 0._wp ! Computation of the mean phytoplankton concentration as ! a crude estimate of the bacterial biomass ! -------------------------------------------------- DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi IF( fsdept(ji,jj,jk) < 120. ) THEN zdepbac(ji,jj,jk) = MIN( 0.7 * ( trn(ji,jj,jk,jpzoo) + 2.* trn(ji,jj,jk,jpmes) ), 4.e-6 ) ztempbac(ji,jj) = zdepbac(ji,jj,jk) ELSE zdepbac(ji,jj,jk) = MIN( 1., 120./ fsdept(ji,jj,jk) ) * ztempbac(ji,jj) ENDIF END DO END DO END DO DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi ! denitrification factor computed from O2 levels nitrfac(ji,jj,jk) = MAX( 0.e0, 0.4 * ( 6.e-6 - trn(ji,jj,jk,jpoxy) ) & & / ( oxymin + trn(ji,jj,jk,jpoxy) ) ) nitrfac(ji,jj,jk) = MIN( 1., nitrfac(ji,jj,jk) ) END DO END DO END DO DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi # if defined key_degrad zstep = xstep * facvol(ji,jj,jk) # else zstep = xstep # endif ! DOC ammonification. Depends on depth, phytoplankton biomass ! and a limitation term which is supposed to be a parameterization ! of the bacterial activity. zremik = xremik * zstep / 1.e-6 * xlimbac(ji,jj,jk) * zdepbac(ji,jj,jk) zremik = MAX( zremik, 5.5e-4 * xstep ) ! Ammonification in oxic waters with oxygen consumption ! ----------------------------------------------------- zolimi(ji,jj,jk) = MIN( ( trn(ji,jj,jk,jpoxy) - rtrn ) / o2ut, & & zremik * ( 1.- nitrfac(ji,jj,jk) ) * trn(ji,jj,jk,jpdoc) ) ! Ammonification in suboxic waters with denitrification ! ------------------------------------------------------- denitr(ji,jj,jk) = MIN( ( trn(ji,jj,jk,jpno3) - rtrn ) / rdenit, & & zremik * nitrfac(ji,jj,jk) * trn(ji,jj,jk,jpdoc) ) END DO END DO END DO DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi zolimi (ji,jj,jk) = MAX( 0.e0, zolimi (ji,jj,jk) ) denitr (ji,jj,jk) = MAX( 0.e0, denitr (ji,jj,jk) ) END DO END DO END DO DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi # if defined key_degrad zstep = xstep * facvol(ji,jj,jk) # else zstep = xstep # endif ! NH4 nitrification to NO3. Ceased for oxygen concentrations ! below 2 umol/L. Inhibited at strong light ! ---------------------------------------------------------- zonitr = nitrif * zstep * trn(ji,jj,jk,jpnh4) / ( 1.+ emoy(ji,jj,jk) ) * ( 1.- nitrfac(ji,jj,jk) ) ! Update of the tracers trends ! ---------------------------- tra(ji,jj,jk,jpnh4) = tra(ji,jj,jk,jpnh4) - zonitr tra(ji,jj,jk,jpno3) = tra(ji,jj,jk,jpno3) + zonitr tra(ji,jj,jk,jpoxy) = tra(ji,jj,jk,jpoxy) - o2nit * zonitr tra(ji,jj,jk,jptal) = tra(ji,jj,jk,jptal) - rno3 * zonitr END DO END DO END DO IF(ln_ctl) THEN ! print mean trends (used for debugging) WRITE(charout, FMT="('rem1')") CALL prt_ctl_trc_info(charout) CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) ENDIF DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi ! Bacterial uptake of iron. No iron is available in DOC. So ! Bacteries are obliged to take up iron from the water. Some ! studies (especially at Papa) have shown this uptake to be significant ! ---------------------------------------------------------- zbactfer = 15.e-6 * rfact2 * 4.* 0.4 * prmax(ji,jj,jk) & & * ( xlimphy(ji,jj,jk) * zdepbac(ji,jj,jk)) & & * ( xlimphy(ji,jj,jk) * zdepbac(ji,jj,jk)) & & / ( xkgraz2 + zdepbac(ji,jj,jk) ) & & * ( 0.5 + SIGN( 0.5, trn(ji,jj,jk,jpfer) -2.e-11 ) ) tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zbactfer #if defined key_kriest tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zbactfer #else tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zbactfer #endif END DO END DO END DO IF(ln_ctl) THEN ! print mean trends (used for debugging) WRITE(charout, FMT="('rem2')") CALL prt_ctl_trc_info(charout) CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) ENDIF DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi # if defined key_degrad zstep = xstep * facvol(ji,jj,jk) # else zstep = xstep # endif ! POC disaggregation by turbulence and bacterial activity. ! ------------------------------------------------------------- zremip = xremip * zstep * tgfunc(ji,jj,jk) * ( 1.- 0.5 * nitrfac(ji,jj,jk) ) ! POC disaggregation rate is reduced in anoxic zone as shown by ! sediment traps data. In oxic area, the exponent of the martin s ! law is around -0.87. In anoxic zone, it is around -0.35. This ! means a disaggregation constant about 0.5 the value in oxic zones ! ----------------------------------------------------------------- zorem = zremip * trn(ji,jj,jk,jppoc) zofer = zremip * trn(ji,jj,jk,jpsfe) #if ! defined key_kriest zorem2 = zremip * trn(ji,jj,jk,jpgoc) zofer2 = zremip * trn(ji,jj,jk,jpbfe) #else zorem2 = zremip * trn(ji,jj,jk,jpnum) #endif ! Update the appropriate tracers trends ! ------------------------------------- tra(ji,jj,jk,jpdoc) = tra(ji,jj,jk,jpdoc) + zorem tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) + zofer #if defined key_kriest tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) - zorem tra(ji,jj,jk,jpnum) = tra(ji,jj,jk,jpnum) - zorem2 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) - zofer #else tra(ji,jj,jk,jppoc) = tra(ji,jj,jk,jppoc) + zorem2 - zorem tra(ji,jj,jk,jpgoc) = tra(ji,jj,jk,jpgoc) - zorem2 tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zofer2 - zofer tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) - zofer2 #endif END DO END DO END DO IF(ln_ctl) THEN ! print mean trends (used for debugging) WRITE(charout, FMT="('rem3')") CALL prt_ctl_trc_info(charout) CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) ENDIF DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi # if defined key_degrad zstep = xstep * facvol(ji,jj,jk) # else zstep = xstep # endif ! Remineralization rate of BSi depedant on T and saturation ! --------------------------------------------------------- zsatur = ( sio3eq(ji,jj,jk) - trn(ji,jj,jk,jpsil) ) / ( sio3eq(ji,jj,jk) + rtrn ) zsatur = MAX( rtrn, zsatur ) zsatur2 = zsatur * ( 1. + tsn(ji,jj,jk,jp_tem) / 400.)**4 znusil = 0.225 * ( 1. + tsn(ji,jj,jk,jp_tem) / 15.) * zsatur + 0.775 * zsatur2**9 zsiremin = xsirem * zstep * znusil zosil = zsiremin * trn(ji,jj,jk,jpdsi) tra(ji,jj,jk,jpdsi) = tra(ji,jj,jk,jpdsi) - zosil tra(ji,jj,jk,jpsil) = tra(ji,jj,jk,jpsil) + zosil ! END DO END DO END DO IF(ln_ctl) THEN ! print mean trends (used for debugging) WRITE(charout, FMT="('rem4')") CALL prt_ctl_trc_info(charout) CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) ENDIF zfesatur = 0.6e-9 !CDIR NOVERRCHK DO jk = 1, jpkm1 !CDIR NOVERRCHK DO jj = 1, jpj !CDIR NOVERRCHK DO ji = 1, jpi # if defined key_degrad zstep = xstep * facvol(ji,jj,jk) # else zstep = xstep # endif ! Compute de different ratios for scavenging of iron ! -------------------------------------------------- #if defined key_kriest zdenom1 = trn(ji,jj,jk,jppoc) / & & ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn ) #else zdenom = 1. / ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpgoc) & & + trn(ji,jj,jk,jpdsi) + trn(ji,jj,jk,jpcal) + rtrn ) zdenom1 = trn(ji,jj,jk,jppoc) * zdenom zdenom2 = trn(ji,jj,jk,jpgoc) * zdenom #endif ! scavenging rate of iron. this scavenging rate depends on the load in particles ! on which they are adsorbed. The parameterization has been taken from studies on Th ! ------------------------------------------------------------ zkeq = fekeq(ji,jj,jk) zfeequi = ( -( 1. + zfesatur * zkeq - zkeq * trn(ji,jj,jk,jpfer) ) & & + SQRT( ( 1. + zfesatur * zkeq - zkeq * trn(ji,jj,jk,jpfer) )**2 & & + 4. * trn(ji,jj,jk,jpfer) * zkeq) ) / ( 2. * zkeq ) #if defined key_kriest zlam1b = 3.e-5 + xlam1 * ( trn(ji,jj,jk,jppoc) & & + trn(ji,jj,jk,jpcal) + trn(ji,jj,jk,jpdsi) ) * 1.e6 #else zlam1b = 3.e-5 + xlam1 * ( trn(ji,jj,jk,jppoc) + trn(ji,jj,jk,jpgoc) & & + trn(ji,jj,jk,jpcal) + trn(ji,jj,jk,jpdsi) ) * 1.e6 #endif zscave = zfeequi * zlam1b * zstep ! Increased scavenging for very high iron concentrations ! found near the coasts due to increased lithogenic particles ! and let s say it unknown processes (precipitation, ...) ! ----------------------------------------------------------- zlamfac = MAX( 0.e0, ( gphit(ji,jj) + 55.) / 30. ) zlamfac = MIN( 1. , zlamfac ) #if ! defined key_kriest zlam1b = ( 80.* ( trn(ji,jj,jk,jpdoc) + 35.e-6 ) & & + 698.* trn(ji,jj,jk,jppoc) + 1.05e4 * trn(ji,jj,jk,jpgoc) ) & & * xdiss(ji,jj,jk) + 1E-4 * (1.-zlamfac) & & + xlam1 * MAX( 0.e0, ( trn(ji,jj,jk,jpfer) * 1.e9 - 1.) ) #else zlam1b = ( 80.* (trn(ji,jj,jk,jpdoc) + 35E-6) & & + 698.* trn(ji,jj,jk,jppoc) ) & & * xdiss(ji,jj,jk) + 1E-4 * (1.-zlamfac) & & + xlam1 * MAX( 0.e0, ( trn(ji,jj,jk,jpfer) * 1.e9 - 1.) ) #endif zaggdfe = zlam1b * zstep * 0.5 * ( trn(ji,jj,jk,jpfer) - zfeequi ) tra(ji,jj,jk,jpfer) = tra(ji,jj,jk,jpfer) - zscave - zaggdfe #if defined key_kriest tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zscave * zdenom1 #else tra(ji,jj,jk,jpsfe) = tra(ji,jj,jk,jpsfe) + zscave * zdenom1 tra(ji,jj,jk,jpbfe) = tra(ji,jj,jk,jpbfe) + zscave * zdenom2 #endif END DO END DO END DO ! IF(ln_ctl) THEN ! print mean trends (used for debugging) WRITE(charout, FMT="('rem5')") CALL prt_ctl_trc_info(charout) CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) ENDIF ! Update the arrays TRA which contain the biological sources and sinks ! -------------------------------------------------------------------- DO jk = 1, jpkm1 tra(:,:,jk,jppo4) = tra(:,:,jk,jppo4) + zolimi(:,:,jk) + denitr(:,:,jk) tra(:,:,jk,jpnh4) = tra(:,:,jk,jpnh4) + zolimi(:,:,jk) + denitr(:,:,jk) tra(:,:,jk,jpno3) = tra(:,:,jk,jpno3) - denitr(:,:,jk) * rdenit tra(:,:,jk,jpdoc) = tra(:,:,jk,jpdoc) - zolimi(:,:,jk) - denitr(:,:,jk) tra(:,:,jk,jpoxy) = tra(:,:,jk,jpoxy) - zolimi(:,:,jk) * o2ut tra(:,:,jk,jpdic) = tra(:,:,jk,jpdic) + zolimi(:,:,jk) + denitr(:,:,jk) tra(:,:,jk,jptal) = tra(:,:,jk,jptal) + denitr(:,:,jk) * rno3 * rdenit END DO IF(ln_ctl) THEN ! print mean trends (used for debugging) WRITE(charout, FMT="('rem6')") CALL prt_ctl_trc_info(charout) CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm) ENDIF ! IF( wrk_not_released(2, 1) .OR. & wrk_not_released(3, 2,3) ) CALL ctl_stop('p4z_rem: failed to release workspace arrays') ! END SUBROUTINE p4z_rem SUBROUTINE p4z_rem_init !!---------------------------------------------------------------------- !! *** ROUTINE p4z_rem_init *** !! !! ** Purpose : Initialization of remineralization parameters !! !! ** Method : Read the nampisrem namelist and check the parameters !! called at the first timestep !! !! ** input : Namelist nampisrem !! !!---------------------------------------------------------------------- NAMELIST/nampisrem/ xremik, xremip, nitrif, xsirem, xlam1, oxymin !!---------------------------------------------------------------------- REWIND( numnat ) ! read numnat READ ( numnat, nampisrem ) IF(lwp) THEN ! control print WRITE(numout,*) ' ' WRITE(numout,*) ' Namelist parameters for remineralization, nampisrem' WRITE(numout,*) ' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' WRITE(numout,*) ' remineralisation rate of POC xremip =', xremip WRITE(numout,*) ' remineralization rate of DOC xremik =', xremik WRITE(numout,*) ' remineralization rate of Si xsirem =', xsirem WRITE(numout,*) ' scavenging rate of Iron xlam1 =', xlam1 WRITE(numout,*) ' NH4 nitrification rate nitrif =', nitrif WRITE(numout,*) ' halk saturation constant for anoxia oxymin =', oxymin ENDIF ! nitrfac(:,:,:) = 0._wp denitr (:,:,:) = 0._wp ! END SUBROUTINE p4z_rem_init INTEGER FUNCTION p4z_rem_alloc() !!---------------------------------------------------------------------- !! *** ROUTINE p4z_rem_alloc *** !!---------------------------------------------------------------------- ALLOCATE( denitr(jpi,jpj,jpk), STAT=p4z_rem_alloc ) ! IF( p4z_rem_alloc /= 0 ) CALL ctl_warn('p4z_rem_alloc: failed to allocate arrays') ! END FUNCTION p4z_rem_alloc #else !!====================================================================== !! Dummy module : No PISCES bio-model !!====================================================================== CONTAINS SUBROUTINE p4z_rem ! Empty routine END SUBROUTINE p4z_rem #endif !!====================================================================== END MODULE p4zrem