Skip to content
Snippets Groups Projects
Commit a3735d3a authored by Christian Ethe's avatar Christian Ethe
Browse files

First step of PISCES halo cleanup

parent d3ade78f
No related branches found
No related tags found
No related merge requests found
...@@ -64,41 +64,43 @@ CONTAINS ...@@ -64,41 +64,43 @@ CONTAINS
! !
INTEGER :: ji, jj, jk, jn INTEGER :: ji, jj, jk, jn
REAL(wp) :: zdispot, zrhd, zcalcon REAL(wp) :: zdispot, zrhd, zcalcon
REAL(wp) :: zomegaca, zexcess, zexcess0, zkd REAL(wp) :: zomegaca, zexcess, zexcess0, zkd, zco3, ztra
CHARACTER (len=25) :: charout CHARACTER (len=25) :: charout
REAL(wp), DIMENSION(jpi,jpj,jpk) :: zco3, zcaldiss, zhinit, zhi, zco3sat REAL(wp), DIMENSION(A2D(0),jpk) :: zhinit, zhi
REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zcaldiss, zbicarb, zco3sat
!!--------------------------------------------------------------------- !!---------------------------------------------------------------------
! !
IF( ln_timing ) CALL timing_start('p4z_lys') IF( ln_timing ) CALL timing_start('p4z_lys')
! !
IF( iom_use( "CO3" ) ) ALLOCATE( zbicarb (A2D(0),jpk) )
IF( iom_use( "CO3sat" ) ) ALLOCATE( zco3sat (A2D(0),jpk) )
IF( iom_use( "DCAL" ) ) ALLOCATE( zcaldiss(A2D(0),jpk) )
zhinit (:,:,:) = hi(:,:,:) / ( rhd(:,:,:) + 1._wp ) DO_3D( 0, 0, 0, 0, 1, jpkm1)
zhinit(ji,jj,jk) = hi(ji,jj,jk) / ( rhd(ji,jj,jk) + 1._wp )
END_3D
! !
! ------------------------------------------- ! -------------------------------------------
! COMPUTE [CO3--] and [H+] CONCENTRATIONS ! COMPUTE [CO3--] and [H+] CONCENTRATIONS
! ------------------------------------------- ! -------------------------------------------
CALL solve_at_general( zhinit, zhi, Kbb ) CALL solve_at_general( zhinit, zhi, Kbb )
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
zco3(ji,jj,jk) = tr(ji,jj,jk,jpdic,Kbb) * ak13(ji,jj,jk) * ak23(ji,jj,jk) / (zhi(ji,jj,jk)**2 & DO_3D( 0, 0, 0, 0, 1, jpkm1)
!
zco3 = tr(ji,jj,jk,jpdic,Kbb) * ak13(ji,jj,jk) * ak23(ji,jj,jk) / (zhi(ji,jj,jk)**2 &
& + ak13(ji,jj,jk) * zhi(ji,jj,jk) + ak13(ji,jj,jk) * ak23(ji,jj,jk) + rtrn ) & + ak13(ji,jj,jk) * zhi(ji,jj,jk) + ak13(ji,jj,jk) * ak23(ji,jj,jk) + rtrn )
hi (ji,jj,jk) = zhi(ji,jj,jk) * ( rhd(ji,jj,jk) + 1._wp ) hi (ji,jj,jk) = zhi(ji,jj,jk) * ( rhd(ji,jj,jk) + 1._wp )
END_3D
! --------------------------------------------------------- ! CALCULATE DEGREE OF CACO3 SATURATION AND CORRESPONDING
! CALCULATE DEGREE OF CACO3 SATURATION AND CORRESPONDING ! DISSOLOUTION AND PRECIPITATION OF CACO3 (BE AWARE OF MGCO3)
! DISSOLOUTION AND PRECIPITATION OF CACO3 (BE AWARE OF
! MGCO3)
! ---------------------------------------------------------
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
! DEVIATION OF [CO3--] FROM SATURATION VALUE ! DEVIATION OF [CO3--] FROM SATURATION VALUE
! Salinity dependance in zomegaca and divide by rhd to have good units ! Salinity dependance in zomegaca and divide by rhd to have good units
zcalcon = calcon * ( salinprac(ji,jj,jk) / 35._wp ) zcalcon = calcon * ( salinprac(ji,jj,jk) / 35._wp )
zrhd = rhd(ji,jj,jk) + 1._wp zrhd = rhd(ji,jj,jk) + 1._wp
zomegaca = ( zcalcon * zco3(ji,jj,jk) ) / ( aksp(ji,jj,jk) * zrhd + rtrn ) zomegaca = ( zcalcon * zco3 ) / ( aksp(ji,jj,jk) * zrhd + rtrn )
zco3sat(ji,jj,jk) = aksp(ji,jj,jk) * zrhd / ( zcalcon + rtrn )
! SET DEGREE OF UNDER-/SUPERSATURATION ! SET DEGREE OF UNDER-/SUPERSATURATION
excess(ji,jj,jk) = 1._wp - zomegaca excess(ji,jj,jk) = 1._wp - zomegaca
...@@ -116,24 +118,35 @@ CONTAINS ...@@ -116,24 +118,35 @@ CONTAINS
! CHANGE OF [CO3--] , [ALK], PARTICULATE [CACO3], ! CHANGE OF [CO3--] , [ALK], PARTICULATE [CACO3],
! AND [SUM(CO2)] DUE TO CACO3 DISSOLUTION/PRECIPITATION ! AND [SUM(CO2)] DUE TO CACO3 DISSOLUTION/PRECIPITATION
zcaldiss(ji,jj,jk) = zdispot * rfact2 / rmtss ! calcite dissolution ztra = zdispot * rfact2 / rmtss ! calcite dissolution
!
tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * ztra
tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - ztra
tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + ztra
!
IF( iom_use( "CO3" ) ) zbicarb (ji,jj,jk) = zco3 ! bicarbonate
IF( iom_use( "CO3sat" ) ) zco3sat (ji,jj,jk) = zco3 / ( zomegaca + rtrn ) ! calcite saturation
IF( iom_use( "DCAL" ) ) zcaldiss(ji,jj,jk) = ztra ! calcite dissolution
! !
tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + 2. * zcaldiss(ji,jj,jk)
tr(ji,jj,jk,jpcal,Krhs) = tr(ji,jj,jk,jpcal,Krhs) - zcaldiss(ji,jj,jk)
tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) + zcaldiss(ji,jj,jk)
END_3D END_3D
! !
IF( lk_iomput .AND. knt == nrdttrc ) THEN IF( lk_iomput .AND. knt == nrdttrc ) THEN
CALL iom_put( "PH" , -1. * LOG10( MAX( hi(:,:,:), rtrn ) ) * tmask(:,:,:) ) IF( iom_use( "PH" ) ) CALL iom_put( "PH" , -1. * LOG10( MAX( hi(A2D(0),1:jpk), rtrn ) ) * tmask(A2D(0),1:jpk) )
IF( iom_use( "CO3" ) ) THEN IF( iom_use( "CO3" ) ) THEN ! bicarbonate
zco3(:,:,jpk) = 0. ; CALL iom_put( "CO3" , zco3(:,:,:) * 1.e+3 * tmask(:,:,:) ) zbicarb(A2D(0),jpk) = 0.
CALL iom_put( "CO3" , zbicarb(A2D(0),1:jpk) * 1.e+3 * tmask(A2D(0),1:jpk) )
DEALLOCATE( zbicarb )
ENDIF ENDIF
IF( iom_use( "CO3sat" ) ) THEN IF( iom_use( "CO3sat" ) ) THEN ! calcite saturation
zco3sat(:,:,jpk) = 0. ; CALL iom_put( "CO3sat", zco3sat(:,:,:) * 1.e+3 * tmask(:,:,:) ) zco3sat(A2D(0),jpk) = 0.
CALL iom_put( "CO3sat", zco3sat(A2D(0),1:jpk) * 1.e+3 * tmask(A2D(0),1:jpk) )
DEALLOCATE( zco3sat )
ENDIF ENDIF
IF( iom_use( "DCAL" ) ) THEN IF( iom_use( "DCAL" ) ) THEN ! calcite dissolution
zcaldiss(:,:,jpk) = 0. ; CALL iom_put( "DCAL" , zcaldiss(:,:,:) * 1.e+3 * rfact2r * tmask(:,:,:) ) zcaldiss(A2D(0),jpk) = 0.
CALL iom_put( "DCAL", zcaldiss(A2D(0),1:jpk) * 1.e+3 * rfact2r * tmask(A2D(0),1:jpk) )
DEALLOCATE( zcaldiss )
ENDIF ENDIF
ENDIF ENDIF
! !
......
...@@ -75,73 +75,64 @@ CONTAINS ...@@ -75,73 +75,64 @@ CONTAINS
REAL(wp) :: zproddoc, zprodsil, zprodfer, zprodlig REAL(wp) :: zproddoc, zprodsil, zprodfer, zprodlig
REAL(wp) :: zpislopen, zpisloped, zfact REAL(wp) :: zpislopen, zpisloped, zfact
REAL(wp) :: zratiosi, zmaxsi, zlimfac, zsizetmp, zfecnm, zfecdm REAL(wp) :: zratiosi, zmaxsi, zlimfac, zsizetmp, zfecnm, zfecdm
REAL(wp) :: zprod, zval REAL(wp) :: zprod, zval, zmxl_fac, zmxl_chl
REAL(wp) :: zprmax, zpislopeadn,zpislopeadd,zprchld, zprchln
CHARACTER (len=25) :: charout CHARACTER (len=25) :: charout
REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprmaxn,zprmaxd REAL(wp), DIMENSION(A2D(0),jpk) :: zprdia, zprbio, zysopt, zmxl
REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpislopeadn, zpislopeadd, zysopt REAL(wp), DIMENSION(A2D(0),jpk) :: zprorcan, zprorcad, zprofed, zprofen
REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprdia, zprbio, zprchld, zprchln REAL(wp), DIMENSION(A2D(0),jpk) :: zpronewn, zpronewd
REAL(wp), DIMENSION(jpi,jpj,jpk) :: zprorcan, zprorcad, zprofed, zprofen REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zw3d
REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpronewn, zpronewd
REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxl_fac, zmxl_chl
REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zpligprod
!!--------------------------------------------------------------------- !!---------------------------------------------------------------------
! !
IF( ln_timing ) CALL timing_start('p4z_prod') IF( ln_timing ) CALL timing_start('p4z_prod')
! !
! Allocate temporary workspace
!
zprorcan(:,:,:) = 0._wp ; zprorcad(:,:,:) = 0._wp ; zprofed(:,:,:) = 0._wp
zprofen (:,:,:) = 0._wp ; zysopt (:,:,:) = 0._wp
zpronewn(:,:,:) = 0._wp ; zpronewd(:,:,:) = 0._wp ; zprdia(:,:,:) = 0._wp
zprbio (:,:,:) = 0._wp ; zprchld (:,:,:) = 0._wp ; zprchln(:,:,:) = 0._wp
zmxl_fac(:,:,:) = 0._wp ; zmxl_chl(:,:,:) = 0._wp
! Computation of the maximimum production. Based on a Q10 description
! of the thermal dependency
! Parameters are taken from Bissinger et al. (2008)
zprmaxn(:,:,:) = 0.65_wp * r1_rday * tgfunc(:,:,:)
zprmaxd(:,:,:) = zprmaxn(:,:,:)
! Intermittency is supposed to have a similar effect on production as ! Intermittency is supposed to have a similar effect on production as
! day length (Shatwell et al., 2012). The correcting factor is zmxl_fac. ! day length (Shatwell et al., 2012).
! zmxl_chl is the fractional day length and is used to compute the mean
! PAR during daytime. The effect of mixing is computed using the
! absolute light level definition of the euphotic zone
! ------------------------------------------------------------------------- ! -------------------------------------------------------------------------
IF ( ln_p4z_dcyc ) THEN ! Diurnal cycle in PISCES IF ( ln_p4z_dcyc ) THEN ! Diurnal cycle in PISCES
DO_3D( 0, 0, 0, 0, 1, jpkm1)
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) zval = MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
ENDIF ENDIF
zmxl_chl(ji,jj,jk) = zval / 24. zmxl(ji,jj,jk) = zval
zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
ENDIF ENDIF
END_3D END_3D
ELSE ! No diurnal cycle in PISCES ELSE ! No diurnal cycle in PISCES
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) DO_3D( 0, 0, 0, 0, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
zval = MAX( 1., strn(ji,jj) ) zval = MAX( 1., strn(ji,jj) )
IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN IF( gdepw(ji,jj,jk+1,Kmm) <= hmld(ji,jj) ) THEN
zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn )) zval = zval * MIN(1., heup_01(ji,jj) / ( hmld(ji,jj) + rtrn ))
ENDIF ENDIF
zmxl_chl(ji,jj,jk) = zval / 24. zmxl(ji,jj,jk) = zval
zmxl_fac(ji,jj,jk) = 1.0 - exp( -0.26 * zval )
ENDIF ENDIF
END_3D END_3D
ENDIF ENDIF
zprbio(:,:,:) = zprmaxn(:,:,:) * zmxl_fac(:,:,:)
zprdia(:,:,:) = zprmaxd(:,:,:) * zmxl_fac(:,:,:)
! The formulation proposed by Geider et al. (1997) has been modified ! The formulation proposed by Geider et al. (1997) has been modified
! to exclude the effect of nutrient limitation and temperature in the PI ! to exclude the effect of nutrient limitation and temperature in the PI
! curve following Vichi et al. (2007) ! curve following Vichi et al. (2007)
! ----------------------------------------------------------------------- ! -----------------------------------------------------------------------
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) DO_3D( 0, 0, 0, 0, 1, jpkm1)
!
! Computation of the maximimum production. Based on a Q10 description
! of the thermal dependency. Parameters are taken from Bissinger et al. (2008)
zprmax = 0.65_wp * r1_rday * tgfunc(ji,jj,jk)
!
! The correcting factor of Intermittency is zmxl_fac.
! zmxl_chl is the fractional day length and is used to compute the mean
! PAR during daytime. The effect of mixing is computed using the
! absolute light level definition of the euphotic zone
zmxl_fac = 1.0 - EXP( -0.26 * zmxl(ji,jj,jk) )
zmxl_chl = zmxl(ji,jj,jk) / 24.
!
zprbio(ji,jj,jk) = zprmax * zmxl_fac
zprdia(ji,jj,jk) = zprmax * zmxl_fac
!
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
ztn = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. ) ztn = MAX( 0., ts(ji,jj,jk,jp_tem,Kmm) - 15. )
zadap = xadap * ztn / ( 2.+ ztn ) zadap = xadap * ztn / ( 2.+ ztn )
...@@ -154,66 +145,59 @@ CONTAINS ...@@ -154,66 +145,59 @@ CONTAINS
! improved or removed in future versions of the model ! improved or removed in future versions of the model
! Nanophytoplankton ! Nanophytoplankton
zpislopeadn(ji,jj,jk) = pislopen * ( 1.+ zadap * EXP( -0.25 * enano(ji,jj,jk) ) ) & zpislopeadn = pislopen * ( 1.+ zadap * EXP( -0.25 * enano(ji,jj,jk) ) ) &
& * tr(ji,jj,jk,jpnch,Kbb) /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn) & * tr(ji,jj,jk,jpnch,Kbb) /( tr(ji,jj,jk,jpphy,Kbb) * 12. + rtrn)
! Diatoms ! Diatoms
zpislopeadd(ji,jj,jk) = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) & zpislopeadd = (pislopen * zconctemp2 + pisloped * zconctemp) / ( tr(ji,jj,jk,jpdia,Kbb) + rtrn ) &
& * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn) & * tr(ji,jj,jk,jpdch,Kbb) /( tr(ji,jj,jk,jpdia,Kbb) * 12. + rtrn)
!
! Computation of production function for Carbon ; Actual light levels are used here
zfact = 1._wp / ( ( r1_rday + bresp * r1_rday ) * zmxl_fac * rday + rtrn)
zpislopen = zpislopeadn * zfact
zpisloped = zpislopeadd * zfact
!
zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) ) )
zprdia(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) ) )
ENDIF ENDIF
END_3D ! Computation of a proxy of the N/C quota from nutrient limitation
! and light limitation. Steady state is assumed to allow the computation
! ----------------------------------------------------------------------
zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) ) &
& * zprmax / ( zprbio(ji,jj,jk) + rtrn )
quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
!
zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) ) &
& * zprmax / ( zprdia(ji,jj,jk) + rtrn )
quotad(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
! Sea-ice effect on production : No production is assumed below sea ice
zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
! Computation of production function for Carbon ! Computation of production function for Chlorophyll
! Actual light levels are used here ! Mean light level in the mixed layer (when appropriate)
! ---------------------------------------------- ! is used here (acclimation is in general slower than
zpislopen = zpislopeadn(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) & ! the characteristic time scales of vertical mixing)
& * zmxl_fac(ji,jj,jk) * rday + rtrn) ! ------------------------------------------------------
zpisloped = zpislopeadd(ji,jj,jk) / ( ( r1_rday + bresp * r1_rday ) & zfact = 1._wp / ( zprmax * zmxl_chl * rday + rtrn )
& * zmxl_fac(ji,jj,jk) * rday + rtrn) zpislopen = zpislopeadn * zfact
zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1.- EXP( -zpislopen * enano(ji,jj,jk) ) ) zpisloped = zpislopeadd * zfact
zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediat(ji,jj,jk) ) ) zprchln = zprmax * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) )
zprchld = zprmax * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) )
! Computation of production function for Chlorophyll ! Si/C of diatoms
! Mean light level in the mixed layer (when appropriate) ! ------------------------
! is used here (acclimation is in general slower than ! Si/C increases with iron stress and silicate availability
! the characteristic time scales of vertical mixing) ! Si/C is arbitrariliy increased for very high Si concentrations
! ------------------------------------------------------ ! to mimic the very high ratios observed in the Southern Ocean (zsilfac)
zpislopen = zpislopeadn(ji,jj,jk) / ( zprmaxn(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn ) ! A parameterization derived from Flynn (2003) is used for the control
zpisloped = zpislopeadd(ji,jj,jk) / ( zprmaxd(ji,jj,jk) * zmxl_chl(ji,jj,jk) * rday + rtrn ) ! when Si is not limiting which is similar to the parameterisation
zprchln(ji,jj,jk) = zprmaxn(ji,jj,jk) * ( 1.- EXP( -zpislopen * enanom(ji,jj,jk) ) ) ! proposed by Gurney and Davidson (1999).
zprchld(ji,jj,jk) = zprmaxd(ji,jj,jk) * ( 1.- EXP( -zpisloped * ediatm(ji,jj,jk) ) ) ! -----------------------------------------------------------------------
ENDIF
END_3D
! Computation of a proxy of the N/C quota from nutrient limitation
! and light limitation. Steady state is assumed to allow the computation
! ----------------------------------------------------------------------
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
zval = MIN( xnanopo4(ji,jj,jk), ( xnanonh4(ji,jj,jk) + xnanono3(ji,jj,jk) ) ) &
& * zprmaxn(ji,jj,jk) / ( zprbio(ji,jj,jk) + rtrn )
quotan(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
zval = MIN( xdiatpo4(ji,jj,jk), ( xdiatnh4(ji,jj,jk) + xdiatno3(ji,jj,jk) ) ) &
& * zprmaxd(ji,jj,jk) / ( zprdia(ji,jj,jk) + rtrn )
quotad(ji,jj,jk) = MIN( 1., 0.3 + 0.7 * zval )
END_3D
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
! Si/C of diatoms
! ------------------------
! Si/C increases with iron stress and silicate availability
! Si/C is arbitrariliy increased for very high Si concentrations
! to mimic the very high ratios observed in the Southern Ocean (zsilfac)
! A parameterization derived from Flynn (2003) is used for the control
! when Si is not limiting which is similar to the parameterisation
! proposed by Gurney and Davidson (1999).
! -----------------------------------------------------------------------
zlim = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 ) zlim = tr(ji,jj,jk,jpsil,Kbb) / ( tr(ji,jj,jk,jpsil,Kbb) + xksi1 )
zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) !
zsilim = xlimdia(ji,jj,jk) * zprdia(ji,jj,jk) / ( zprmax + rtrn )
zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) zsiborn = tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb) * tr(ji,jj,jk,jpsil,Kbb)
IF (gphit(ji,jj) < -30 ) THEN IF (gphit(ji,jj) < -30 ) THEN
zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 ) zsilfac = 1. + 2. * zsiborn / ( zsiborn + xksi2**3 )
...@@ -228,21 +212,9 @@ CONTAINS ...@@ -228,21 +212,9 @@ CONTAINS
ELSE ELSE
zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi zysopt(ji,jj,jk) = zlim * zsilfac * grosip * 1.0 * zsilim**0.7 * zmaxsi
ENDIF ENDIF
ENDIF
END_3D
! Sea-ice effect on production
! No production is assumed below sea ice
! --------------------------------------
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
zprbio(ji,jj,jk) = zprbio(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
zprdia(ji,jj,jk) = zprdia(ji,jj,jk) * ( 1. - fr_i(ji,jj) )
END_3D
! Computation of the various production and nutrient uptake terms ! Computation of the various production and nutrient uptake terms
! --------------------------------------------------------------- ! ---------------------------------------------------------------
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
! production terms for nanophyto. (C) ! production terms for nanophyto. (C)
zprorcan(ji,jj,jk) = zprbio(ji,jj,jk) * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2 zprorcan(ji,jj,jk) = zprbio(ji,jj,jk) * xlimphy(ji,jj,jk) * tr(ji,jj,jk,jpphy,Kbb) * rfact2
...@@ -255,7 +227,7 @@ CONTAINS ...@@ -255,7 +227,7 @@ CONTAINS
! size at time step t+1 and is thus updated at the end of the ! size at time step t+1 and is thus updated at the end of the
! current time step ! current time step
! -------------------------------------------------------------------- ! --------------------------------------------------------------------
zlimfac = xlimphy(ji,jj,jk) * zprchln(ji,jj,jk) / ( zprmaxn(ji,jj,jk) + rtrn ) zlimfac = xlimphy(ji,jj,jk) * zprchln / ( zprmax + rtrn )
zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) zsizetmp = 1.0 + 1.3 * ( xsizern - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) ) sizena(ji,jj,jk) = min(xsizern, max( sizena(ji,jj,jk), zsizetmp ) )
...@@ -266,7 +238,7 @@ CONTAINS ...@@ -266,7 +238,7 @@ CONTAINS
zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) ) zfecnm = xqfuncfecn(ji,jj,jk) + ( fecnm - xqfuncfecn(ji,jj,jk) ) * ( xnanono3(ji,jj,jk) + xnanonh4(ji,jj,jk) )
zratio = 1.0 - MIN(1.0,tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * zfecnm + rtrn ) ) zratio = 1.0 - MIN(1.0,tr(ji,jj,jk,jpnfe,Kbb) / ( tr(ji,jj,jk,jpphy,Kbb) * zfecnm + rtrn ) )
zmax = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) zmax = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) )
zprofen(ji,jj,jk) = zfecnm * zprmaxn(ji,jj,jk) * ( 1.0 - fr_i(ji,jj) ) & zprofen(ji,jj,jk) = zfecnm * zprmax * ( 1.0 - fr_i(ji,jj) ) &
& * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk) & & * (1. + 0.8 * xnanono3(ji,jj,jk) / ( rtrn + xnanono3(ji,jj,jk) &
& + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) ) & & + xnanonh4(ji,jj,jk) ) * (1. - xnanofer(ji,jj,jk) ) ) &
& * xnanofer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2 & * xnanofer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpphy,Kbb) * rfact2
...@@ -282,7 +254,7 @@ CONTAINS ...@@ -282,7 +254,7 @@ CONTAINS
! size at time step t+1 and is thus updated at the end of the ! size at time step t+1 and is thus updated at the end of the
! current time step. ! current time step.
! -------------------------------------------------------------------- ! --------------------------------------------------------------------
zlimfac = zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) / ( zprmaxd(ji,jj,jk) + rtrn ) zlimfac = zprchld * xlimdia(ji,jj,jk) / ( zprmax + rtrn )
zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3) zsizetmp = 1.0 + 1.3 * ( xsizerd - 1.0 ) * zlimfac**3/(0.3 + zlimfac**3)
sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) ) sizeda(ji,jj,jk) = min(xsizerd, max( sizeda(ji,jj,jk), zsizetmp ) )
...@@ -293,45 +265,37 @@ CONTAINS ...@@ -293,45 +265,37 @@ CONTAINS
zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) ) zfecdm = xqfuncfecd(ji,jj,jk) + ( fecdm - xqfuncfecd(ji,jj,jk) ) * ( xdiatno3(ji,jj,jk) + xdiatnh4(ji,jj,jk) )
zratio = 1.0 - MIN(1.0, tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zfecdm + rtrn ) ) zratio = 1.0 - MIN(1.0, tr(ji,jj,jk,jpdfe,Kbb) / ( tr(ji,jj,jk,jpdia,Kbb) * zfecdm + rtrn ) )
zmax = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) ) zmax = MAX( 0., MIN( 1.0, zratio**2/ (0.05**2+zratio**2) ) )
zprofed(ji,jj,jk) = zfecdm * zprmaxd(ji,jj,jk) * (1.0 - fr_i(ji,jj) ) & zprofed(ji,jj,jk) = zfecdm * zprmax * (1.0 - fr_i(ji,jj) ) &
& * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk) & & * (1. + 0.8 * xdiatno3(ji,jj,jk) / ( rtrn + xdiatno3(ji,jj,jk) &
& + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) ) & & + xdiatnh4(ji,jj,jk) ) * (1. - xdiatfer(ji,jj,jk) ) ) &
& * xdiatfer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2 & * xdiatfer(ji,jj,jk) * zmax * tr(ji,jj,jk,jpdia,Kbb) * rfact2
ENDIF
END_3D
! Computation of the chlorophyll production terms ! Computation of the chlorophyll production terms
! The parameterization is taken from Geider et al. (1997) ! The parameterization is taken from Geider et al. (1997)
! -------------------------------------------------------
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
! production terms for nanophyto. ( chlorophyll ) ! production terms for nanophyto. ( chlorophyll )
znanotot = enanom(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) znanotot = enanom(ji,jj,jk) / ( zmxl_chl + rtrn )
zprod = rday * zprorcan(ji,jj,jk) * zprchln(ji,jj,jk) * xlimphy(ji,jj,jk) zprod = rday * zprorcan(ji,jj,jk) * zprchln * xlimphy(ji,jj,jk)
zprochln = chlcmin * 12. * zprorcan (ji,jj,jk) zprochln = chlcmin * 12. * zprorcan (ji,jj,jk)
zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / & zprochln = zprochln + (chlcnm - chlcmin) * 12. * zprod / &
& ( zpislopeadn(ji,jj,jk) * znanotot +rtrn) & ( zpislopeadn * znanotot +rtrn)
! production terms for diatoms ( chlorophyll ) ! production terms for diatoms ( chlorophyll )
zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl(ji,jj,jk) + rtrn ) zdiattot = ediatm(ji,jj,jk) / ( zmxl_chl + rtrn )
zprod = rday * zprorcad(ji,jj,jk) * zprchld(ji,jj,jk) * xlimdia(ji,jj,jk) zprod = rday * zprorcad(ji,jj,jk) * zprchld * xlimdia(ji,jj,jk)
zprochld = chlcmin * 12. * zprorcad(ji,jj,jk) zprochld = chlcmin * 12. * zprorcad(ji,jj,jk)
zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / & zprochld = zprochld + (chlcdm - chlcmin) * 12. * zprod / &
& ( zpislopeadd(ji,jj,jk) * zdiattot +rtrn ) & ( zpislopeadd * zdiattot +rtrn )
! Update the arrays TRA which contain the Chla sources and sinks ! Update the arrays TRA which contain the Chla sources and sinks
tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn tr(ji,jj,jk,jpnch,Krhs) = tr(ji,jj,jk,jpnch,Krhs) + zprochln * texcretn
tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld * texcretd tr(ji,jj,jk,jpdch,Krhs) = tr(ji,jj,jk,jpdch,Krhs) + zprochld * texcretd
ENDIF
END_3D
! Update the arrays TRA which contain the biological sources and sinks ! Update the arrays TRA which contain the biological sources and sinks
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
zpptot = zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk) zpptot = zprorcan(ji,jj,jk) + zprorcad(ji,jj,jk)
zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk) zpnewtot = zpronewn(ji,jj,jk) + zpronewd(ji,jj,jk)
zpregtot = zpptot - zpnewtot zpregtot = zpptot - zpnewtot
zprodsil = zprmaxd(ji,jj,jk) * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb) zprodsil = zprmax * zysopt(ji,jj,jk) * rfact2 * tr(ji,jj,jk,jpdia,Kbb)
zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
! !
...@@ -353,7 +317,7 @@ CONTAINS ...@@ -353,7 +317,7 @@ CONTAINS
! !
tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot tr(ji,jj,jk,jpdic,Krhs) = tr(ji,jj,jk,jpdic,Krhs) - zpptot
tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot ) tr(ji,jj,jk,jptal,Krhs) = tr(ji,jj,jk,jptal,Krhs) + rno3 * ( zpnewtot - zpregtot )
ENDIF ENDIF
END_3D END_3D
! Production and uptake of ligands by phytoplankton. This part is activated ! Production and uptake of ligands by phytoplankton. This part is activated
...@@ -362,7 +326,7 @@ CONTAINS ...@@ -362,7 +326,7 @@ CONTAINS
! Shaked et al. (2020) ! Shaked et al. (2020)
! ------------------------------------------------------------------------- ! -------------------------------------------------------------------------
IF( ln_ligand ) THEN IF( ln_ligand ) THEN
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1) DO_3D( 0, 0, 0, 0, 1, jpkm1)
IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN IF( etot_ndcy(ji,jj,jk) > 1.E-3 ) THEN
zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk) zproddoc = excretd * zprorcad(ji,jj,jk) + excretn * zprorcan(ji,jj,jk)
zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk) zprodfer = texcretn * zprofen(ji,jj,jk) + texcretd * zprofed(ji,jj,jk)
...@@ -373,41 +337,109 @@ CONTAINS ...@@ -373,41 +337,109 @@ CONTAINS
END_3D END_3D
ENDIF ENDIF
! Output of the diagnostics ! Output of the diagnostics
! Total primary production per year ! Total primary production per year
IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc ) ) & IF( iom_use( "tintpp" ) .OR. ( ln_check_mass .AND. kt == nitend .AND. knt == nrdttrc ) ) THEN
& tpp = glob_sum( 'p4zprod', ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * cvol(:,:,:) ) ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp
zw3d(A2D(0),1:jpkm1) = ( zprorcan(A2D(0),1:jpkm1) + zprorcad(A2D(0),1:jpkm1) ) * cvol(A2D(0),1:jpkm1)
tpp = glob_sum( 'p4zprod', zw3d )
DEALLOCATE ( zw3d )
ENDIF
IF( lk_iomput .AND. knt == nrdttrc ) THEN IF( lk_iomput .AND. knt == nrdttrc ) THEN
zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s zfact = 1.e+3 * rfact2r ! conversion from mol/l/kt to mol/m3/s
! !
CALL iom_put( "PPPHYN" , zprorcan(:,:,:) * zfact * tmask(:,:,:) ) ! primary production by nanophyto ALLOCATE( zw3d(A2D(0),jpk) ) ; zw3d(A2D(0),jpk) = 0._wp
CALL iom_put( "PPPHYD" , zprorcad(:,:,:) * zfact * tmask(:,:,:) ) ! primary production by diatomes !
CALL iom_put( "PPNEWN" , zpronewn(:,:,:) * zfact * tmask(:,:,:) ) ! new primary production by nanophyto IF( iom_use ( "PPPHYN" ) ) THEN ! primary production by nanophyto
CALL iom_put( "PPNEWD" , zpronewd(:,:,:) * zfact * tmask(:,:,:) ) ! new primary production by diatomes zw3d(A2D(0),1:jpkm1) = zprorcan(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "PBSi" , zprorcad(:,:,:) * zfact * tmask(:,:,:) * zysopt(:,:,:) ) ! biogenic silica production CALL iom_put( "PPPHYN", zw3d )
CALL iom_put( "PFeN" , zprofen(:,:,:) * zfact * tmask(:,:,:) ) ! biogenic iron production by nanophyto ENDIF
CALL iom_put( "PFeD" , zprofed(:,:,:) * zfact * tmask(:,:,:) ) ! biogenic iron production by diatomes !
IF( iom_use ( "PPPHYD" ) ) THEN ! primary production by diatomes
zw3d(A2D(0),1:jpkm1) = zprorcad(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "PPPHYD", zw3d )
ENDIF
!
IF( iom_use ( "PPNEWN" ) ) THEN ! new primary production by nano
zw3d(A2D(0),1:jpkm1) = zpronewn(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "PPNEWN", zw3d )
ENDIF
!
IF( iom_use ( "PPNEWD" ) ) THEN ! new primary production by diatomes
zw3d(A2D(0),1:jpkm1) = zpronewd(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "PPNEWD", zw3d )
ENDIF
!
IF( iom_use ( "PBSi" ) ) THEN ! biogenic silica production
zw3d(A2D(0),1:jpkm1) = zprorcad(A2D(0),1:jpkm1) * zysopt(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "PBSi", zw3d )
ENDIF
!
IF( iom_use ( "PFeN" ) ) THEN ! biogenic iron production by nanophyto
zw3d(A2D(0),1:jpkm1) = zprofen(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "PFeN", zw3d )
ENDIF
!
IF( iom_use ( "PFeD" ) ) THEN ! biogenic iron production by nanophyto
zw3d(A2D(0),1:jpkm1) = zprofed(A2D(0),1:jpkm1) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "PFeD", zw3d )
ENDIF
!
IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN IF( ln_ligand .AND. ( iom_use( "LPRODP" ) .OR. iom_use( "LDETP" ) ) ) THEN
ALLOCATE( zpligprod(jpi,jpj,jpk) ) zw3d(A2D(0),1:jpkm1) = excretd * zprorcad(A2D(0),1:jpkm1) + excretn * zprorcan(A2D(0),1:jpkm1) &
zpligprod(:,:,:) = excretd * zprorcad(:,:,:) + excretn * zprorcan(:,:,:) & * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "LPRODP" , zpligprod(:,:,:) * ldocp * 1e9 * zfact * tmask(:,:,:) ) CALL iom_put( "LPRODP" , zw3d * ldocp * 1e9 )
! !
zpligprod(:,:,:) = ( texcretn * zprofen(:,:,:) + texcretd * zprofed(:,:,:) ) & zw3d(A2D(0),1:jpkm1) = ( texcretn * zprofen(A2D(0),1:jpkm1) + texcretd * zprofed(A2D(0),1:jpkm1) ) &
& * plig(:,:,:) / ( rtrn + plig(:,:,:) + 75.0 * (1.0 - plig(:,:,:) ) ) & * plig(A2D(0),1:jpkm1) / ( rtrn + plig(A2D(0),1:jpkm1) + 75.0 * (1.0 - plig(A2D(0),1:jpkm1) ) ) &
CALL iom_put( "LDETP" , zpligprod(:,:,:) * lthet * 1e9 * zfact * tmask(:,:,:) ) & * zfact * tmask(A2D(0),1:jpkm1)
DEALLOCATE( zpligprod ) CALL iom_put( "LDETP" , zw3d * lthet * 1e9 )
ENDIF
!
IF( iom_use ( "Mumax" ) ) THEN ! Maximum growth rate
zw3d(A2D(0),1:jpkm1) = 0.65_wp * r1_rday * tgfunc(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
CALL iom_put( "Mumax", zw3d )
ENDIF ENDIF
CALL iom_put( "Mumax" , zprmaxn(:,:,:) * tmask(:,:,:) ) ! Maximum growth rate !
CALL iom_put( "MuN" , zprbio(:,:,:) * xlimphy(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for nanophyto IF( iom_use ( "MuN" ) ) THEN ! Realized growth rate for nanophyto
CALL iom_put( "MuD" , zprdia(:,:,:) * xlimdia(:,:,:) * tmask(:,:,:) ) ! Realized growth rate for diatoms zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) * xlimphy(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
CALL iom_put( "LNlight" , zprbio (:,:,:) / (zprmaxn(:,:,:) + rtrn) * tmask(:,:,:) ) ! light limitation term CALL iom_put( "MuN", zw3d )
CALL iom_put( "LDlight" , zprdia (:,:,:) / (zprmaxd(:,:,:) + rtrn) * tmask(:,:,:) ) ENDIF
CALL iom_put( "TPP" , ( zprorcan(:,:,:) + zprorcad(:,:,:) ) * zfact * tmask(:,:,:) ) ! total primary production !
CALL iom_put( "TPNEW" , ( zpronewn(:,:,:) + zpronewd(:,:,:) ) * zfact * tmask(:,:,:) ) ! total new production IF( iom_use ( "MuD" ) ) THEN ! Realized growth rate for diatoms
CALL iom_put( "TPBFE" , ( zprofen(:,:,:) + zprofed(:,:,:) ) * zfact * tmask(:,:,:) ) ! total biogenic iron production zw3d(A2D(0),1:jpkm1) = zprdia(A2D(0),1:jpkm1) * xlimdia(A2D(0),1:jpkm1) * tmask(A2D(0),1:jpkm1)
CALL iom_put( "tintpp" , tpp * zfact ) ! global total integrated primary production molC/s CALL iom_put( "MuD", zw3d )
ENDIF
!
IF( iom_use ( "LNlight" ) ) THEN ! light limitation term for nano
zw3d(A2D(0),1:jpkm1) = zprbio(A2D(0),1:jpkm1) / ( 0.65_wp * r1_rday * tgfunc(A2D(0),1:jpkm1) + rtrn ) * tmask(A2D(0),1:jpkm1)
CALL iom_put( "LNlight", zw3d )
ENDIF
!
IF( iom_use ( "LDlight" ) ) THEN ! light limitation term for diatomes
zw3d(A2D(0),1:jpkm1) = zprdia(A2D(0),1:jpkm1) / ( 0.65_wp * r1_rday * tgfunc(A2D(0),1:jpkm1) + rtrn ) * tmask(A2D(0),1:jpkm1)
CALL iom_put( "LDlight", zw3d )
ENDIF
!
IF( iom_use ( "TPP" ) ) THEN ! total primary production
zw3d(A2D(0),1:jpkm1) = ( zprorcan(A2D(0),1:jpkm1) + zprorcad(A2D(0),1:jpkm1) ) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "TPP", zw3d )
ENDIF
!
IF( iom_use ( "TPNEW" ) ) THEN ! total new production
zw3d(A2D(0),1:jpkm1) = ( zpronewn(A2D(0),1:jpkm1) + zpronewd(A2D(0),1:jpkm1) ) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "TPNEW", zw3d )
ENDIF
!
IF( iom_use ( "TPBFE" ) ) THEN ! total biogenic iron production
zw3d(A2D(0),1:jpkm1) = ( zprofen(A2D(0),1:jpkm1) + zprofed(A2D(0),1:jpkm1) ) * zfact * tmask(A2D(0),1:jpkm1)
CALL iom_put( "TPBFE", zw3d )
ENDIF
!
IF( iom_use( "tintpp") ) CALL iom_put( "tintpp" , tpp * zfact ) ! global total integrated primary production molC/s
!
DEALLOCATE( zw3d )
ENDIF ENDIF
IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging) IF(sn_cfctl%l_prttrc) THEN ! print mean trends (used for debugging)
...@@ -480,7 +512,7 @@ CONTAINS ...@@ -480,7 +512,7 @@ CONTAINS
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
!! *** ROUTINE p4z_prod_alloc *** !! *** ROUTINE p4z_prod_alloc ***
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
ALLOCATE( quotan(jpi,jpj,jpk), quotad(jpi,jpj,jpk), STAT = p4z_prod_alloc ) ALLOCATE( quotan(A2D(0),jpk), quotad(A2D(0),jpk), STAT = p4z_prod_alloc )
! !
IF( p4z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_prod_alloc : failed to allocate arrays.' ) IF( p4z_prod_alloc /= 0 ) CALL ctl_stop( 'STOP', 'p4z_prod_alloc : failed to allocate arrays.' )
! !
......
...@@ -124,6 +124,8 @@ MODULE sms_pisces ...@@ -124,6 +124,8 @@ MODULE sms_pisces
LOGICAL, SAVE :: lk_sed LOGICAL, SAVE :: lk_sed
!! * Substitutions
# include "do_loop_substitute.h90"
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
!! NEMO/TOP 4.0 , NEMO Consortium (2018) !! NEMO/TOP 4.0 , NEMO Consortium (2018)
!! $Id: sms_pisces.F90 15459 2021-10-29 08:19:18Z cetlod $ !! $Id: sms_pisces.F90 15459 2021-10-29 08:19:18Z cetlod $
...@@ -145,47 +147,47 @@ CONTAINS ...@@ -145,47 +147,47 @@ CONTAINS
IF( ln_p4z .OR. ln_p5z ) THEN IF( ln_p4z .OR. ln_p5z ) THEN
!* Optics !* Optics
ALLOCATE( enano(jpi,jpj,jpk) , ediat(jpi,jpj,jpk) , & ALLOCATE( enano(A2D(0),jpk) , ediat(A2D(0),jpk) , &
& enanom(jpi,jpj,jpk), ediatm(jpi,jpj,jpk), & & enanom(A2D(0),jpk), ediatm(A2D(0),jpk), &
& emoy(jpi,jpj,jpk) , etotm(jpi,jpj,jpk), STAT=ierr(2) ) & emoy(A2D(0),jpk) , etotm(A2D(0),jpk), STAT=ierr(2) )
!* Biological SMS !* Biological SMS
ALLOCATE( xksimax(jpi,jpj) , biron(jpi,jpj,jpk) , STAT=ierr(3) ) ALLOCATE( xksimax(jpi,jpj) , biron(A2D(0),jpk) , STAT=ierr(3) )
! Biological SMS ! Biological SMS
ALLOCATE( xfracal (jpi,jpj,jpk), orem (jpi,jpj,jpk), & ALLOCATE( xfracal (A2D(0),jpk), orem (A2D(0),jpk), &
& nitrfac (jpi,jpj,jpk), nitrfac2(jpi,jpj,jpk), & & nitrfac (A2D(0),jpk), nitrfac2(A2D(0),jpk), &
& prodcal (jpi,jpj,jpk), xdiss (jpi,jpj,jpk), & & prodcal (A2D(0),jpk), xdiss (A2D(0),jpk), &
& prodpoc (jpi,jpj,jpk), conspoc (jpi,jpj,jpk), & & prodpoc (A2D(0),jpk), conspoc (A2D(0),jpk), &
& prodgoc (jpi,jpj,jpk), consgoc (jpi,jpj,jpk), & & prodgoc (A2D(0),jpk), consgoc (A2D(0),jpk), &
& blim (jpi,jpj,jpk), consfe3 (jpi,jpj,jpk), & & blim (A2D(0),jpk), consfe3 (A2D(0),jpk), &
& xfecolagg(jpi,jpj,jpk), xcoagfe (jpi,jpj,jpk), STAT=ierr(4) ) & xfecolagg(A2D(0),jpk), xcoagfe (A2D(0),jpk), STAT=ierr(4) )
!* Carbonate chemistry !* Carbonate chemistry
ALLOCATE( ak13 (jpi,jpj,jpk) , & ALLOCATE( ak13 (A2D(0),jpk) , &
& ak23(jpi,jpj,jpk) , aksp (jpi,jpj,jpk) , & & ak23(A2D(0),jpk) , aksp (A2D(0),jpk) , &
& hi (jpi,jpj,jpk) , excess(jpi,jpj,jpk) , & & hi (A2D(0),jpk) , excess(A2D(0),jpk) , &
& aphscale(jpi,jpj,jpk), STAT=ierr(5) ) & aphscale(A2D(0),jpk), STAT=ierr(5) )
! !
!* Temperature dependency of SMS terms !* Temperature dependency of SMS terms
ALLOCATE( tgfunc (jpi,jpj,jpk) , tgfunc2(jpi,jpj,jpk), STAT=ierr(6) ) ALLOCATE( tgfunc (A2D(0),jpk) , tgfunc2(A2D(0),jpk), STAT=ierr(6) )
! !
!* Sinking speed !* Sinking speed
ALLOCATE( wsbio3 (jpi,jpj,jpk) , wsbio4 (jpi,jpj,jpk), STAT=ierr(7) ) ALLOCATE( wsbio3 (A2D(0),jpk) , wsbio4 (A2D(0),jpk), STAT=ierr(7) )
!* Size of phytoplankton cells !* Size of phytoplankton cells
ALLOCATE( sizen (jpi,jpj,jpk), sized (jpi,jpj,jpk), & ALLOCATE( sizen (A2D(0),jpk), sized (A2D(0),jpk), &
& sizena(jpi,jpj,jpk), sizeda(jpi,jpj,jpk), STAT=ierr(8) ) & sizena(A2D(0),jpk), sizeda(A2D(0),jpk), STAT=ierr(8) )
! !
ALLOCATE( plig(jpi,jpj,jpk) , STAT=ierr(9) ) ALLOCATE( plig(A2D(0),jpk) , STAT=ierr(9) )
ENDIF ENDIF
! !
IF( ln_p5z ) THEN IF( ln_p5z ) THEN
! PISCES-QUOTA specific part ! PISCES-QUOTA specific part
ALLOCATE( epico(jpi,jpj,jpk) , epicom(jpi,jpj,jpk) , STAT=ierr(10) ) ALLOCATE( epico(A2D(0),jpk) , epicom(A2D(0),jpk) , STAT=ierr(10) )
!* Size of phytoplankton cells !* Size of phytoplankton cells
ALLOCATE( sizep(jpi,jpj,jpk), sizepa(jpi,jpj,jpk), STAT=ierr(11) ) ALLOCATE( sizep(A2D(0),jpk), sizepa(A2D(0),jpk), STAT=ierr(11) )
ENDIF ENDIF
! !
sms_pisces_alloc = MAXVAL( ierr ) sms_pisces_alloc = MAXVAL( ierr )
......
...@@ -19,6 +19,8 @@ MODULE trcice_pisces ...@@ -19,6 +19,8 @@ MODULE trcice_pisces
PUBLIC trc_ice_ini_pisces ! called by trcini.F90 module PUBLIC trc_ice_ini_pisces ! called by trcini.F90 module
!! * Substitutions
# include "do_loop_substitute.h90"
!!---------------------------------------------------------------------- !!----------------------------------------------------------------------
!! NEMO/TOP 4.0 , NEMO Consortium (2018) !! NEMO/TOP 4.0 , NEMO Consortium (2018)
!! $Id: trcice_pisces.F90 10794 2019-03-22 09:25:28Z cetlod $ !! $Id: trcice_pisces.F90 10794 2019-03-22 09:25:28Z cetlod $
...@@ -283,15 +285,15 @@ CONTAINS ...@@ -283,15 +285,15 @@ CONTAINS
ENDIF ENDIF
! !
DO jn = jp_pcs0, jp_pcs1 DO jn = jp_pcs0, jp_pcs1
IF( cn_trc_o(jn) == 'GL ' ) trc_o(:,:,jn) = zpisc(jn,1) ! Global case IF( cn_trc_o(jn) == 'GL ' ) trc_o(A2D(0),jn) = zpisc(jn,1) ! Global case
IF( cn_trc_o(jn) == 'AA ' ) THEN IF( cn_trc_o(jn) == 'AA ' ) THEN
WHERE( gphit(:,:) >= 0._wp ) ; trc_o(:,:,jn) = zpisc(jn,2) ; END WHERE ! Arctic WHERE( gphit(A2D(0)) >= 0._wp ) ; trc_o(A2D(0),jn) = zpisc(jn,2) ; END WHERE ! Arctic
WHERE( gphit(:,:) < 0._wp ) ; trc_o(:,:,jn) = zpisc(jn,3) ; END WHERE ! Antarctic WHERE( gphit(A2D(0)) < 0._wp ) ; trc_o(A2D(0),jn) = zpisc(jn,3) ; END WHERE ! Antarctic
ENDIF ENDIF
IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN ! Baltic Sea particular case for ORCA configurations IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN ! Baltic Sea particular case for ORCA configurations
WHERE( 14._wp <= glamt(:,:) .AND. glamt(:,:) <= 32._wp .AND. & WHERE( 14._wp <= glamt(A2D(0)) .AND. glamt(A2D(0)) <= 32._wp .AND. &
54._wp <= gphit(:,:) .AND. gphit(:,:) <= 66._wp ) 54._wp <= gphit(A2D(0)) .AND. gphit(A2D(0)) <= 66._wp )
trc_o(:,:,jn) = zpisc(jn,4) trc_o(A2D(0),jn) = zpisc(jn,4)
END WHERE END WHERE
ENDIF ENDIF
ENDDO ENDDO
...@@ -321,16 +323,16 @@ CONTAINS ...@@ -321,16 +323,16 @@ CONTAINS
DO jn = jp_pcs0, jp_pcs1 DO jn = jp_pcs0, jp_pcs1
!-- Everywhere but in the Baltic !-- Everywhere but in the Baltic
IF ( trc_ice_ratio(jn) >= -1._wp ) THEN ! no prescribed conc. ; typically everything but iron) IF ( trc_ice_ratio(jn) >= -1._wp ) THEN ! no prescribed conc. ; typically everything but iron)
trc_i(:,:,jn) = zratio(jn,1) * trc_o(:,:,jn) trc_i(A2D(0),jn) = zratio(jn,1) * trc_o(A2D(0),jn)
ELSE ! prescribed concentration ELSE ! prescribed concentration
trc_i(:,:,jn) = trc_ice_prescr(jn) trc_i(A2D(0),jn) = trc_ice_prescr(jn)
ENDIF ENDIF
!-- Baltic !-- Baltic
IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN IF( cn_cfg == "orca" .OR. cn_cfg == "ORCA" ) THEN
IF ( trc_ice_ratio(jn) >= - 1._wp ) THEN ! no prescribed conc. ; typically everything but iron) IF ( trc_ice_ratio(jn) >= - 1._wp ) THEN ! no prescribed conc. ; typically everything but iron)
WHERE( 14._wp <= glamt(:,:) .AND. glamt(:,:) <= 32._wp .AND. & WHERE( 14._wp <= glamt(A2D(0)) .AND. glamt(A2D(0)) <= 32._wp .AND. &
54._wp <= gphit(:,:) .AND. gphit(:,:) <= 66._wp ) 54._wp <= gphit(A2D(0)) .AND. gphit(A2D(0)) <= 66._wp )
trc_i(:,:,jn) = zratio(jn,2) * trc_o(:,:,jn) trc_i(A2D(0),jn) = zratio(jn,2) * trc_o(A2D(0),jn)
END WHERE END WHERE
ENDIF ENDIF
ENDIF ENDIF
......
...@@ -38,7 +38,7 @@ CONTAINS ...@@ -38,7 +38,7 @@ CONTAINS
CHARACTER (len=20) :: cltra CHARACTER (len=20) :: cltra
REAL(wp) :: zfact REAL(wp) :: zfact
INTEGER :: ji, jj, jk, jn INTEGER :: ji, jj, jk, jn
REAL(wp), DIMENSION(jpi,jpj) :: zdic, zo2min, zdepo2min REAL(wp), DIMENSION(A2D(0)) :: zdic, zo2min, zdepo2min
!!--------------------------------------------------------------------- !!---------------------------------------------------------------------
! write the tracer concentrations in the file ! write the tracer concentrations in the file
...@@ -60,15 +60,19 @@ CONTAINS ...@@ -60,15 +60,19 @@ CONTAINS
IF( iom_use( "INTDIC" ) ) THEN ! DIC content in kg/m2 IF( iom_use( "INTDIC" ) ) THEN ! DIC content in kg/m2
zdic(:,:) = 0. zdic(:,:) = 0.
DO jk = 1, jpkm1 DO jk = 1, jpkm1
zdic(:,:) = zdic(:,:) + tr(:,:,jk,jpdic,Kmm) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) * 12. DO_2D( 0, 0, 0, 0 )
zdic(ji,jj) = zdic(ji,jj) + tr(ji,jj,jk,jpdic,Kmm) * e3t(ji,jj,jk,Kmm) * tmask(ji,jj,jk) * 12.
END_2D
ENDDO ENDDO
CALL iom_put( 'INTDIC', zdic ) CALL iom_put( 'INTDIC', zdic )
ENDIF ENDIF
! !
IF( iom_use( "O2MIN" ) .OR. iom_use ( "ZO2MIN" ) ) THEN ! Oxygen minimum concentration and depth IF( iom_use( "O2MIN" ) .OR. iom_use ( "ZO2MIN" ) ) THEN ! Oxygen minimum concentration and depth
zo2min (:,:) = tr(:,:,1,jpoxy,Kmm) * tmask(:,:,1) DO_2D( 0, 0, 0, 0 )
zdepo2min(:,:) = gdepw(:,:,1,Kmm) * tmask(:,:,1) zo2min (ji,jj) = tr(ji,jj,1,jpoxy,Kmm) * tmask(ji,jj,1)
DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpkm1 ) zdepo2min(ji,jj) = gdepw(ji,jj,1,Kmm) * tmask(ji,jj,1)
END_2D
DO_3D( 0, 0, 0, 0, 2, jpkm1 )
IF( tmask(ji,jj,jk) == 1 ) then IF( tmask(ji,jj,jk) == 1 ) then
IF( tr(ji,jj,jk,jpoxy,Kmm) < zo2min(ji,jj) ) then IF( tr(ji,jj,jk,jpoxy,Kmm) < zo2min(ji,jj) ) then
zo2min (ji,jj) = tr(ji,jj,jk,jpoxy,Kmm) zo2min (ji,jj) = tr(ji,jj,jk,jpoxy,Kmm)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment