Skip to content

Commit

Permalink
Introduce option to switch on T- and O2-dependent remineralization in…
Browse files Browse the repository at this point in the history
… all model versions (#424)

Introduce switch to enable T- and O2-dependent remineralization also for the default model (currently just optional) for the water column
  • Loading branch information
jmaerz authored Oct 30, 2024
1 parent f2b96c1 commit 5246946
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 20 deletions.
10 changes: 10 additions & 0 deletions cime_config/namelist_definition_blom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3872,6 +3872,16 @@
<desc>Switch for primary production and remineralization throughout the whole water column</desc>
</entry>

<entry id="lTO2depremin">
<type>logical</type>
<category>bgcnml</category>
<group>bgcnml</group>
<values>
<value>.false.</value>
</values>
<desc>Switch for T- and O2-dependent remineralization of POM</desc>
</entry>

<entry id="do_oalk">
<type>logical</type>
<category>bgcnml</category>
Expand Down
1 change: 1 addition & 0 deletions hamocc/mo_control_bgc.F90
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ module mo_control_bgc
logical :: with_dmsph = .false. ! apply DMS with pH dependence
logical :: use_M4AGO = .false. ! run with M4AGO settling scheme
logical :: lkwrbioz_off = .false. ! if true, allow remin and primary prod throughout full water column
logical :: lTO2depremin = .false. ! Temperature- and O2-dependent remineralization of POM
integer :: sedspin_yr_s = -1 ! start year for sediment spin-up
integer :: sedspin_yr_e = -1 ! end year for sediment spin-up
integer :: sedspin_ncyc = -1 ! sediment spin-up sub-cycles
Expand Down
32 changes: 14 additions & 18 deletions hamocc/mo_ocprod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ subroutine ocprod(kpie,kpje,kpke,kbnd,pdlxp,pdlyp,pddpo,omask,ptho,pi_ph,psao,pp
dmsp1,dmsp2,dmsp3,dmsp4,dmsp5,dmsp6,dms_gamma, &
fbro1,fbro2,atten_f,atten_c,atten_uv,atten_w,bkopal,bkphy,bkzoo, &
POM_remin_q10,POM_remin_Tref,opal_remin_q10,opal_remin_Tref, &
bkphyanh4,bkphyano3,bkphosph,bkiron,ro2utammo,max_limiter
bkphyanh4,bkphyano3,bkphosph,bkiron,ro2utammo,max_limiter, &
O2thresh_aerob,O2thresh_hypoxic,NO3thresh_sulf
use mo_biomod, only: bsiflx0100,bsiflx0500,bsiflx1000,bsiflx2000,bsiflx4000,bsiflx_bot, &
calflx0100,calflx0500,calflx1000,calflx2000,calflx4000,calflx_bot, &
carflx0100,carflx0500,carflx1000,carflx2000,carflx4000,carflx_bot, &
Expand All @@ -96,7 +97,7 @@ subroutine ocprod(kpie,kpje,kpke,kbnd,pdlxp,pdlyp,pddpo,omask,ptho,pi_ph,psao,pp
use mo_control_bgc, only: dtb,io_stdo_bgc,with_dmsph, &
use_BROMO,use_AGG,use_PBGC_OCNP_TIMESTEP,use_FB_BGC_OCE, &
use_AGG,use_cisonew,use_natDIC, use_WLIN,use_sedbypass,use_M4AGO, &
use_extNcycle,lkwrbioz_off
use_extNcycle,lkwrbioz_off,lTO2depremin
use mo_vgrid, only: dp_min,dp_min_sink,k0100,k0500,k1000,k2000,k4000,kwrbioz,ptiestu
use mo_vgrid, only: kmle
use mo_clim_swa, only: swa_clim
Expand Down Expand Up @@ -657,26 +658,21 @@ subroutine ocprod(kpie,kpje,kpke,kbnd,pdlxp,pdlyp,pddpo,omask,ptho,pi_ph,psao,pp
ocetra(i,j,k,izoo14) = ocetra(i,j,k,izoo14)-sterzo14
endif

if(ocetra(i,j,k,ioxygen) > 5.e-8) then
if (use_M4AGO) then
if (.not. use_extNcycle) then
! M4AGO comes with O2-lim
o2lim = ocetra(i,j,k,ioxygen)/(ocetra(i,j,k,ioxygen) + bkox_drempoc)
pocrem = o2lim*drempoc*POM_remin_q10**((ptho(i,j,k)-POM_remin_Tref)/10.)*ocetra(i,j,k,idet)
else
! nitrogen always accounts for O2-lim - see below
pocrem = drempoc*POM_remin_q10**((ptho(i,j,k)-POM_remin_Tref)/10.)*ocetra(i,j,k,idet)
endif
if(ocetra(i,j,k,ioxygen) > O2thresh_aerob) then
if (lTO2depremin) then
! Both, use_M4AGO and use_extNcycle switch lTO2depremin to true!
o2lim = ocetra(i,j,k,ioxygen)/(ocetra(i,j,k,ioxygen) + bkox_drempoc)
pocrem = drempoc*o2lim*POM_remin_q10**((ptho(i,j,k)-POM_remin_Tref)/10.)*ocetra(i,j,k,idet)
else
pocrem = drempoc*ocetra(i,j,k,idet)
endif

if (.not. use_extNcycle) then
pocrem = min(pocrem,0.33*ocetra(i,j,k,ioxygen)/ro2ut)
docrem = min( remido*ocetra(i,j,k,idoc),0.33*ocetra(i,j,k,ioxygen)/ro2ut)
pocrem = min(pocrem, 0.33*ocetra(i,j,k,ioxygen)/ro2ut)
docrem = min(remido*ocetra(i,j,k,idoc), 0.33*ocetra(i,j,k,ioxygen)/ro2ut)
phyrem = min(0.5*dyphy*phythresh, 0.33*ocetra(i,j,k,ioxygen)/ro2ut)
else
o2lim = ocetra(i,j,k,ioxygen)/(ocetra(i,j,k,ioxygen) + bkox_drempoc)
pocrem = min(o2lim*pocrem, 0.33*ocetra(i,j,k,ioxygen)/ro2utammo)
pocrem = min(pocrem, 0.33*ocetra(i,j,k,ioxygen)/ro2utammo)
docrem = min(remido*ocetra(i,j,k,idoc), 0.33*ocetra(i,j,k,ioxygen)/ro2utammo)
phyrem = min(0.5*dyphy*phythresh, 0.33*ocetra(i,j,k,ioxygen)/ro2utammo)
endif
Expand Down Expand Up @@ -815,7 +811,7 @@ subroutine ocprod(kpie,kpje,kpke,kbnd,pdlxp,pdlyp,pddpo,omask,ptho,pi_ph,psao,pp
do i = 1,kpie
do k = merge(1,kwrbioz(i,j)+1,lkwrbioz_off),kpke
if(omask(i,j) > 0.5) then
if(ocetra(i,j,k,ioxygen) < 5.e-7 .and. pddpo(i,j,k) > dp_min) then
if(ocetra(i,j,k,ioxygen) < O2thresh_hypoxic .and. pddpo(i,j,k) > dp_min) then
if (use_AGG) then
avmass = ocetra(i,j,k,iphy) + ocetra(i,j,k,idet)
endif
Expand Down Expand Up @@ -908,7 +904,7 @@ subroutine ocprod(kpie,kpje,kpke,kbnd,pdlxp,pdlyp,pddpo,omask,ptho,pi_ph,psao,pp
do i = 1,kpie
do k = merge(1,kwrbioz(i,j)+1,lkwrbioz_off),kpke
if(omask(i,j) > 0.5 .and. pddpo(i,j,k) > dp_min) then
if(ocetra(i,j,k,ioxygen) < 5.e-7 .and. ocetra(i,j,k,iano3) < 3.e-6) then
if(ocetra(i,j,k,ioxygen) < O2thresh_hypoxic .and. ocetra(i,j,k,iano3) < NO3thresh_sulf ) then

if (use_AGG) then
avmass = ocetra(i,j,k,iphy)+ocetra(i,j,k,idet)
Expand Down
14 changes: 12 additions & 2 deletions hamocc/mo_param_bgc.F90
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ module mo_param_bgc
use_BOXATM,use_CFC,use_PBGC_CK_TIMESTEP, &
use_sedbypass,with_dmsph,use_PBGC_OCNP_TIMESTEP,ocn_co2_type,use_M4AGO,&
do_n2onh3_coupled,use_extNcycle, &
lkwrbioz_off
lkwrbioz_off,lTO2depremin
use mod_xc, only: mnproc

implicit none
Expand Down Expand Up @@ -98,6 +98,7 @@ module mo_param_bgc
public :: calcdens,opaldens,orgdens,claydens
public :: dmsp1,dmsp2,dmsp3,dmsp4,dmsp5,dmsp6,dms_gamma
public :: POM_remin_q10,opal_remin_q10,POM_remin_Tref,opal_remin_Tref
public :: O2thresh_aerob,O2thresh_hypoxic,NO3thresh_sulf

! extended nitrogen cycle
public :: q10ano3denit,sc_ano3denit,Trefano3denit,rano3denit,bkano3denit, &
Expand Down Expand Up @@ -276,6 +277,9 @@ module mo_param_bgc
!********************************************************************
! Remineralization and dissolution parameters
!********************************************************************
real, parameter :: O2thresh_aerob = 5.e-8 ! Above O2thresh_aerob aerob remineralization takes place
real, parameter :: O2thresh_hypoxic = 5.e-7 ! Below O2thresh_hypoxic denitrification and sulfate reduction takes place (default model version)
real, parameter :: NO3thresh_sulf = 3.e-6 ! Below NO3thresh_sulf 'sufate reduction' takes place
real, protected :: remido = 0.004 ! 1/d - remineralization rate (of DOM)
! deep sea remineralisation constants
real, protected :: drempoc = 0.025 ! 1/d Aerob remineralization rate detritus
Expand Down Expand Up @@ -615,7 +619,7 @@ subroutine read_bgcnamelist()
bkoxan2odenit_sed,bkan2odenit_sed,q10dnra_sed, &
bkoxdnra_sed,bkdnra_sed,q10anh4nitr_sed, &
bkoxamox_sed,bkanh4nitr_sed,q10ano2nitr_sed, &
bkoxnitr_sed,bkano2nitr_sed
bkoxnitr_sed,bkano2nitr_sed,lTO2depremin

if (mnproc.eq.1) then
write(io_stdo_bgc,*)
Expand Down Expand Up @@ -656,7 +660,9 @@ subroutine calc_param_biol()
bkanh4anmx_sed = bkano2anmx_sed * rnh4anmx/rno2anmx !Half-saturation constant for NH4 limitation of anammox (kmol/m3)
mufn2o_sed = 0.11/(50.*1e6*bkoxamox_sed) !=6.61e-3 0.11/(50*1e6)=2.2e-9 - ~Santoro et al. 2011 with simple MM
bn2o_sed = 0.077/(50.*mufn2o_sed) !=0.2331 - before set to 0.3 - base fraction entering N2O
lTO2depremin = .true.
endif
if (use_M4AGO) lTO2depremin = .true.
end subroutine calc_param_biol

!********************************************************************
Expand Down Expand Up @@ -837,6 +843,7 @@ subroutine write_parambgc()
call cinfo_add_entry('do_sedspinup', do_sedspinup)
call cinfo_add_entry('l_3Dvarsedpor', l_3Dvarsedpor)
call cinfo_add_entry('lkwrbioz_off', lkwrbioz_off)
call cinfo_add_entry('lTO2depremin', lTO2depremin)
call cinfo_add_entry('use_M4AGO', use_M4AGO)
if (use_extNcycle) then
call cinfo_add_entry('do_n2onh3_coupled', do_n2onh3_coupled)
Expand Down Expand Up @@ -886,6 +893,9 @@ subroutine write_parambgc()
call pinfo_add_entry('wpoc_const', wpoc_const*dtbinv)
call pinfo_add_entry('wcal_const', wcal_const*dtbinv)
call pinfo_add_entry('wopal_const', wopal_const*dtbinv)
call pinfo_add_entry('O2thresh_aerob', O2thresh_aerob)
call pinfo_add_entry('O2thresh_hypoxic',O2thresh_hypoxic)
call pinfo_add_entry('NO3thresh_sulf', NO3thresh_sulf)
call pinfo_add_entry('drempoc', drempoc*dtbinv)
call pinfo_add_entry('dremopal', dremopal*dtbinv)
call pinfo_add_entry('dremn2o', dremn2o*dtbinv)
Expand Down

0 comments on commit 5246946

Please sign in to comment.