Skip to content

Commit 94bfdd3

Browse files
authored
Merge pull request #395 from rgknox/rgknox-growth-allom-fixes
Fixes: growth and allometry
2 parents 0a18594 + 68d2bf6 commit 94bfdd3

File tree

2 files changed

+46
-20
lines changed

2 files changed

+46
-20
lines changed

biogeochem/EDPhysiologyMod.F90

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -887,9 +887,11 @@ subroutine PlantGrowth( currentSite, currentCohort, bc_in )
887887
! Woody turnover timescale [years]
888888
real(r8), parameter :: cbal_prec = 1.0e-15_r8 ! Desired precision in carbon balance
889889
! non-integrator part
890-
integer , parameter :: max_substeps = 300
891-
real(r8), parameter :: max_trunc_error = 1.0_r8
892-
integer, parameter :: ODESolve = 2 ! 1=RKF45, 2=Euler
890+
integer , parameter :: max_substeps = 300 ! Number of step attempts before
891+
! giving up
892+
real(r8), parameter :: max_trunc_error = 1.0_r8 ! allowable numerical truncation error
893+
integer, parameter :: ODESolve = 2 ! 1=RKF45, 2=Euler
894+
893895

894896
ipft = currentCohort%pft
895897

@@ -952,12 +954,6 @@ subroutine PlantGrowth( currentSite, currentCohort, bc_in )
952954
! II. Calculate target size of living biomass compartment for a given dbh.
953955
! -----------------------------------------------------------------------------------
954956

955-
! Target leaf biomass according to allometry and trimming
956-
call bleaf(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_leaf,dbt_leaf_dd)
957-
958-
! Target fine-root biomass and deriv. according to allometry and trimming [kgC, kgC/cm]
959-
call bfineroot(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_fineroot,dbt_fineroot_dd)
960-
961957
! Target sapwood biomass and deriv. according to allometry and trimming [kgC, kgC/cm]
962958
call bsap_allom(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_sap,dbt_sap_dd)
963959

@@ -971,20 +967,42 @@ subroutine PlantGrowth( currentSite, currentCohort, bc_in )
971967
call bdead_allom( bt_agw, bt_bgw, bt_sap, ipft, bt_dead, &
972968
dbt_agw_dd, dbt_bgw_dd, dbt_sap_dd, dbt_dead_dd )
973969

974-
! Target storage carbon [kgC,kgC/cm]
975-
call bstore_allom(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_store,dbt_store_dd)
976-
977970
! ------------------------------------------------------------------------------------
978971
! If structure is larger than target, then we need to correct some integration errors
979972
! by slightly increasing dbh to match it.
980-
! For grasses, if leaf biomass is larger than target, then we reset dbh to match
981973
! -----------------------------------------------------------------------------------
982974
if( ((currentCohort%bdead-bt_dead) > calloc_abs_error) .and. &
983975
(EDPftvarcon_inst%woody(ipft) == itrue) ) then
984976
call StructureResetOfDH( currentCohort%bdead, ipft, &
985977
currentCohort%canopy_trim, currentCohort%dbh, currentCohort%hite )
978+
979+
! Re-calculate the sapwood and structural wood targets based on the new dbh
980+
! ------------------------------------------------------------------------------------------
981+
982+
! Target sapwood biomass and deriv. according to allometry and trimming [kgC, kgC/cm]
983+
call bsap_allom(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_sap,dbt_sap_dd)
984+
985+
! Target total above ground deriv. biomass in woody/fibrous tissues [kgC, kgC/cm]
986+
call bagw_allom(currentCohort%dbh,ipft,bt_agw,dbt_agw_dd)
987+
988+
! Target total below ground deriv. biomass in woody/fibrous tissues [kgC, kgC/cm]
989+
call bbgw_allom(currentCohort%dbh,ipft,bt_bgw,dbt_bgw_dd)
990+
991+
! Target total dead (structrual) biomass and deriv. [kgC, kgC/cm]
992+
call bdead_allom( bt_agw, bt_bgw, bt_sap, ipft, bt_dead, &
993+
dbt_agw_dd, dbt_bgw_dd, dbt_sap_dd, dbt_dead_dd )
994+
986995
end if
987996

997+
! Target leaf biomass according to allometry and trimming
998+
call bleaf(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_leaf,dbt_leaf_dd)
999+
1000+
! Target fine-root biomass and deriv. according to allometry and trimming [kgC, kgC/cm]
1001+
call bfineroot(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_fineroot,dbt_fineroot_dd)
1002+
1003+
! Target storage carbon [kgC,kgC/cm]
1004+
call bstore_allom(currentCohort%dbh,ipft,currentCohort%canopy_trim,bt_store,dbt_store_dd)
1005+
9881006

9891007
! -----------------------------------------------------------------------------------
9901008
! III(b). Calculate the maintenance turnover demands
@@ -1189,8 +1207,6 @@ subroutine PlantGrowth( currentSite, currentCohort, bc_in )
11891207

11901208
end if
11911209

1192-
1193-
11941210
! -----------------------------------------------------------------------------------
11951211
! X. If carbon is yet still available ...
11961212
! Our pools are now either on allometry or above (from fusion).
@@ -1203,10 +1219,20 @@ subroutine PlantGrowth( currentSite, currentCohort, bc_in )
12031219
if( carbon_balance<cbal_prec) return
12041220

12051221

1206-
! This routine checks that actual carbon is not below that targets. It does
1222+
! This routine checks that actual carbon is not below the targets. It does
12071223
! allow actual pools to be above the target, and in these cases, it sends
12081224
! a false on the "grow_<>" flag, allowing the plant to grow into these pools.
1209-
! It also checks to make sure that structural biomass is not above the target.
1225+
! Again this is possible due to erors in numerical integration and/or the fusion
1226+
! process.
1227+
! It also checks to make sure that structural biomass is not below the target.
1228+
! Note that we assume structural biomass is always on allometry.
1229+
! For non-woody plants, we do not perform this partial growth logic (ie
1230+
! allowing only some pools to grow), we let all pools at or above allometry to
1231+
! grow. This is because we can't force any single pool to be on-allometry, and
1232+
! thus a condition could potentially occur where all pools, either from fusion or
1233+
! numerical errors, are above allometry and would be flagged to not grow, in which
1234+
! case the plant would be frozen in time
1235+
12101236
if ( EDPftvarcon_inst%woody(ipft) == itrue ) then
12111237
call TargetAllometryCheck(currentCohort%bl,currentCohort%br,currentCohort%bsw, &
12121238
currentCohort%bstore,currentCohort%bdead, &

biogeochem/FatesAllometryMod.F90

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -669,10 +669,10 @@ subroutine bsap_allom(d,ipft,canopy_trim,bsap,dbsapdd)
669669
! Force sapwood to be less than a maximum fraction of total biomass
670670
! (this comes into play typically in very small plants)
671671
bsap_cap = max_frac*(bagw+bbgw)
672-
bsap = min( bsap_cap,bsap)
673672

674-
if(present(dbsapdd))then
675-
if ( bsap >= bsap_cap ) then
673+
if(bsap>bsap_cap) then
674+
bsap = bsap_cap
675+
if(present(dbsapdd))then
676676
dbsapdd = max_frac*(dbagwdd+dbbgwdd)
677677
end if
678678
end if

0 commit comments

Comments
 (0)