@@ -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, &
0 commit comments