diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90
index a6323efe9e..3fbd7b78bd 100644
--- a/biogeochem/EDCanopyStructureMod.F90
+++ b/biogeochem/EDCanopyStructureMod.F90
@@ -22,6 +22,7 @@ module EDCanopyStructureMod
use FatesAllometryMod , only : tree_sai
use EDTypesMod , only : ed_site_type
use FatesAllometryMod , only : VegAreaLayer
+ use FatesAllometryMod , only : CrownDepth
use FatesPatchMod, only : fates_patch_type
use FatesCohortMod, only : fates_cohort_type
use EDParamsMod , only : nclmax
@@ -1532,7 +1533,7 @@ subroutine leaf_area_profile( currentSite )
real(r8) :: elai_layer,tlai_layer ! leaf area per canopy area
real(r8) :: esai_layer,tsai_layer ! stem area per canopy area
real(r8) :: vai_top,vai_bot ! integrated top down veg area index at boundary of layer
-
+ real(r8) :: crown_depth ! Current cohort's crown depth
real(r8) :: layer_bottom_height,layer_top_height,lai,sai ! Can be removed later
!----------------------------------------------------------------------
@@ -1611,7 +1612,14 @@ subroutine leaf_area_profile( currentSite )
write(fates_log(), *) ' currentPatch%nrad(cl,ft): ', currentPatch%nrad(cl,ft)
call endrun(msg=errMsg(sourcefile, __LINE__))
end if
+
+ !---~---
+ ! Find current crown depth using the allometric function.
+ !---~---
+ call CrownDepth(currentCohort%height,currentCohort%pft,crown_depth)
+ !---~---
+
! --------------------------------------------------------------------------
! Whole layers. Make a weighted average of the leaf area in each layer
! before dividing it by the total area. Fill up layer for whole layers.
@@ -1625,12 +1633,10 @@ subroutine leaf_area_profile( currentSite )
! is obscured by snow.
layer_top_height = currentCohort%height - &
- ( real(iv-1,r8)/currentCohort%NV * currentCohort%height * &
- prt_params%crown_depth_frac(currentCohort%pft) )
-
+ ( real(iv-1,r8)/currentCohort%NV * crown_depth )
+
layer_bottom_height = currentCohort%height - &
- ( real(iv,r8)/currentCohort%NV * currentCohort%height * &
- prt_params%crown_depth_frac(currentCohort%pft) )
+ ( real(iv,r8)/currentCohort%NV * crown_depth )
fraction_exposed = 1.0_r8
if(currentSite%snow_depth > layer_top_height)then
diff --git a/biogeochem/FatesAllometryMod.F90 b/biogeochem/FatesAllometryMod.F90
index 1fcc591666..6cccde4422 100644
--- a/biogeochem/FatesAllometryMod.F90
+++ b/biogeochem/FatesAllometryMod.F90
@@ -307,7 +307,7 @@ subroutine h2d_allom(h,ipft,d,dddh)
p3 => prt_params%allom_d2h3(ipft), &
allom_hmode => prt_params%allom_hmode(ipft))
- select case(int(allom_hmode))
+ select case(allom_hmode)
case (1) ! O'Brien et al 1995, BCI
call h2d_obrien(h,p1,p2,d,dddh)
case (2) ! poorter 2006
@@ -346,7 +346,7 @@ subroutine h_allom(d,ipft,h,dhdd)
p3 => prt_params%allom_d2h3(ipft), &
allom_hmode => prt_params%allom_hmode(ipft))
- select case(int(allom_hmode))
+ select case(allom_hmode)
case (1) ! "obrien"
call d2h_obrien(d,p1,p2,dbh_maxh,h,dhdd)
case (2) ! "poorter06"
@@ -399,7 +399,7 @@ subroutine bagw_allom(d,ipft,crowndamage, elongf_stem, bagw,dbagwdd)
branch_frac = param_derived%branch_frac(ipft)
- select case(int(allom_amode))
+ select case(allom_amode)
case (1) !"salda")
call h_allom(d,ipft,h,dhdd)
call dh2bagw_salda(d,h,dhdd,p1,p2,p3,p4,wood_density,c2b,agb_frac,bagw,dbagwdd)
@@ -409,6 +409,9 @@ subroutine bagw_allom(d,ipft,crowndamage, elongf_stem, bagw,dbagwdd)
case (3) !"chave14")
call h_allom(d,ipft,h,dhdd)
call dh2bagw_chave2014(d,h,dhdd,p1,p2,wood_density,c2b,bagw,dbagwdd)
+ case (4) ! 3par_pwr
+ call h_allom(d,ipft,h,dhdd)
+ call dh2bagw_3pwr(d,h,dhdd,p1,p2,p3,wood_density,c2b,bagw,dbagwdd)
case DEFAULT
write(fates_log(),*) 'An undefined AGB allometry was specified: ',allom_amode
write(fates_log(),*) 'Aborting'
@@ -446,21 +449,28 @@ subroutine blmax_allom(d,ipft,blmax,dblmaxdd)
real(r8),intent(out) :: blmax ! plant leaf biomass [kg]
real(r8),intent(out),optional :: dblmaxdd ! change leaf bio per diameter [kgC/cm]
+ real(r8) :: h ! height
+ real(r8) :: dhdd ! change in height wrt d
+
associate( dbh_maxh => prt_params%allom_dbh_maxheight(ipft), &
rho => prt_params%wood_density(ipft), &
+ slatop => prt_params%slatop(ipft), &
c2b => prt_params%c2b(ipft), &
allom_lmode => prt_params%allom_lmode(ipft), &
p1 => prt_params%allom_d2bl1(ipft), &
p2 => prt_params%allom_d2bl2(ipft), &
p3 => prt_params%allom_d2bl3(ipft))
- select case(int(allom_lmode))
+ select case(allom_lmode)
case(1) !"salda")
call d2blmax_salda(d,p1,p2,p3,rho,dbh_maxh,c2b,blmax,dblmaxdd)
case(2) !"2par_pwr")
call d2blmax_2pwr(d,p1,p2,c2b,blmax,dblmaxdd)
case(3) ! dh2blmax_2pwr
call dh2blmax_2pwr(d,p1,p2,dbh_maxh,c2b,blmax,dblmaxdd)
+ case(4) ! dh2blmax_3pwr
+ call h_allom(d,ipft,h,dhdd)
+ call dh2blmax_3pwr(d,h,dhdd,p1,p2,p3,slatop,dbh_maxh,c2b,blmax,dblmaxdd)
case DEFAULT
write(fates_log(),*) 'An undefined leaf allometry was specified: ', &
allom_lmode
@@ -487,6 +497,7 @@ subroutine carea_allom(dbh,nplant,site_spread,ipft,crowndamage,c_area,inverse)
! instead of crown area from dbh
real(r8) :: dbh_eff ! Effective diameter (cm)
+ real(r8) :: height ! height
logical :: do_inverse ! local copy of the inverse argument
! defaults to false
logical :: capped_allom ! if we are using an allometry that caps
@@ -509,7 +520,7 @@ subroutine carea_allom(dbh,nplant,site_spread,ipft,crowndamage,c_area,inverse)
endif
endif
- select case(int(allom_lmode))
+ select case(allom_lmode)
case(1)
dbh_eff = min(dbh,dbh_maxh)
call carea_2pwr(dbh_eff,site_spread,d2bl_p2,d2bl_ediff,d2ca_min,d2ca_max, &
@@ -524,6 +535,12 @@ subroutine carea_allom(dbh,nplant,site_spread,ipft,crowndamage,c_area,inverse)
call carea_2pwr(dbh_eff,site_spread,d2bl_p2,d2bl_ediff,d2ca_min,d2ca_max, &
crowndamage, c_area, do_inverse)
capped_allom = .true.
+ case (4)
+ dbh_eff = min(dbh,dbh_maxh)
+ call h_allom(dbh,ipft,height)
+ call carea_3pwr(dbh_eff,height,ipft,dbh_maxh, site_spread,d2bl_p2, &
+ d2bl_ediff, d2ca_min,d2ca_max,crowndamage, c_area, do_inverse)
+ capped_allom = .true.
case DEFAULT
write(fates_log(),*) 'An undefined leaf allometry was specified: ', &
allom_lmode
@@ -966,7 +983,7 @@ subroutine bsap_allom(d,ipft,crowndamage,canopy_trim,elongf_stem, sapw_area,bsap
branch_frac = param_derived%branch_frac(ipft)
- select case(int(prt_params%allom_smode(ipft)))
+ select case(prt_params%allom_smode(ipft))
! ---------------------------------------------------------------------
! Currently only one sapwood allometry model. the slope
! of the la:sa to diameter line is zero.
@@ -1040,7 +1057,7 @@ subroutine bbgw_allom(d,ipft,elongf_stem,bbgw,dbbgwdd)
real(r8) :: bagw ! above ground biomass [kgC]
real(r8) :: dbagwdd ! change in agb per diameter [kgC/cm]
- select case(int(prt_params%allom_cmode(ipft)))
+ select case(prt_params%allom_cmode(ipft))
case(1) !"constant")
! bbgw not affected by damage so use target allometry no damage. But note that bbgw
! is affected by stem phenology (typically applied only to grasses). We do not need
@@ -1085,7 +1102,7 @@ subroutine bfineroot(d,ipft,canopy_trim,l2fr,elongf_fnrt,bfr,dbfrdd)
real(r8) :: dbfrmaxdd
real(r8) :: slascaler
- select case(int(prt_params%allom_fmode(ipft)))
+ select case(prt_params%allom_fmode(ipft))
case(1) ! "constant proportionality with TRIMMED target bleaf"
call blmax_allom(d,ipft,blmax,dblmaxdd)
@@ -1146,7 +1163,7 @@ subroutine bstore_allom(d,ipft,crowndamage, canopy_trim,bstore,dbstoredd)
associate( allom_stmode => prt_params%allom_stmode(ipft), &
cushion => prt_params%cushion(ipft) )
- select case(int(allom_stmode))
+ select case(allom_stmode)
case(1) ! Storage is constant proportionality of trimmed maximum leaf
! biomass (ie cushion * bleaf), and thus leaf phenology is ignored.
call bleaf(d,ipft, crowndamage, canopy_trim, 1.0_r8, bl, dbldd)
@@ -1197,7 +1214,7 @@ subroutine bdead_allom(bagw,bbgw,bsap,ipft,bdead,dbagwdd,dbbgwdd,dbsapdd,dbdeadd
associate( agb_fraction => prt_params%allom_agb_frac(ipft))
- select case(int(prt_params%allom_amode(ipft)))
+ select case(prt_params%allom_amode(ipft))
case(1) ! Saldariagga mass allometry originally calculated bdead directly.
! we assume proportionality between bdead and bagw
@@ -1206,7 +1223,7 @@ subroutine bdead_allom(bagw,bbgw,bsap,ipft,bdead,dbagwdd,dbbgwdd,dbsapdd,dbdeadd
dbdeaddd = dbagwdd/agb_fraction
end if
- case(2,3)
+ case(2,3,4)
bdead = bagw + bbgw - bsap
if(present(dbagwdd) .and. present(dbbgwdd) .and. &
@@ -1325,7 +1342,7 @@ subroutine bsap_ltarg_slatop(d,h,dhdd,bleaf,dbleafdd,ipft, &
hbl2bsap = slatop * g_per_kg * wood_density * kg_per_Megag / (c2b*cm2_per_m2 )
! Calculate area. Note that no c2b conversion here, because it is
- ! wood density that is in biomass units, SLA is in units [m2/gC.
+ ! wood density that is in biomass units, SLA is in units [m2/gC].
! [m2] = [m2/gC] * [kgC] * [gC/kgC] / ( [m2/cm2] * [cm2/m2])
la_per_sa = la_per_sa_int + h*la_per_sa_slp
sapw_area = slatop * bleaf * g_per_kg / (la_per_sa*cm2_per_m2 )
@@ -1496,7 +1513,119 @@ subroutine dh2blmax_2pwr(d,p1,p2,dbh_maxh,c2b,blmax,dblmaxdd)
return
end subroutine dh2blmax_2pwr
-
+
+
+ ! ===========================================================================
+
+
+ subroutine dh2blmax_3pwr(d,h,dhdd,p1,p2,p3,slatop,dbh_maxh,c2b,blmax,dblmaxdd)
+ !--------------------------------------------------------------------------
+ !
+ ! This function calculates the maximum leaf biomass from reference
+ ! diameter, plant height and top-of-the-canopy (fully sunlit) SLA. This
+ ! functional form is similar to Lescure et al. (1983) and Longo et al.
+ ! (2020), except that it uses SLA as an additional scaler for the
+ ! allometric equation that can have a different exponent from
+ ! (DBH^2 * Height).
+ !
+ ! -----------------
+ ! References
+ ! -----------------
+ ! Lescure JP, Puig H, Riera B, Leclerc D, Beekman A , Beneteau A. 1983.
+ ! La phytomasse epigee d'une foret dense en Guiane Francaise
+ ! Acta Oecol.-Oec. Gen. 4: 237-251.
+ ! URL http://www.documentation.ird.fr/hor/fdi:010005089
+ !
+ ! Longo M, Saatchi SS, Keller M, Bowman KW, Ferraz A, Moorcroft PR,
+ ! Morton D, Bonal D, Brando P, Burban B et al. 2020. Impacts of
+ ! degradation on water, energy, and carbon cycling of the Amazon
+ ! tropical forests. J. Geophys. Res.-Biogeosci. 125:
+ ! e2020JG005677. doi:10.1029/2020JG005677.
+ !
+ ! -----------------
+ ! Input arguments
+ ! -----------------
+ ! d -- Diameter at breast height [ cm]
+ ! h -- Total tree height [ m]
+ ! dhdd -- Height derivative with dbh [ m/cm]
+ ! p1 -- Parameter 1 (log-intercept) [ --]
+ ! p2 -- Parameter 2 (power, or log-slope) [ --]
+ ! p3 -- Parameter 3 (power, or log-slope) [ --]
+ ! slatop -- Top-of-canopy specific leaf area [ m2/gC]
+ ! dbh_maxh -- DBH at maximum height [ cm]
+ ! c2b -- Carbon to biomass multiplier ~ 2 [ kg/kgC]
+ !
+ ! ------------------
+ ! Output arguments
+ ! ------------------
+ ! blmax -- Plant leaf biomass [ kgC]
+ ! dblmaxdd -- Plant leaf biomass derivative [ kgC/cm]
+ !
+ ! ------------------
+ ! Suggested first guess for parameters, based on Longo et al. (2020) and
+ ! corrected to FATES units (first guess based on a very limited leaf area
+ ! data set).
+ ! ------------------
+ ! p1 = 0.000468
+ ! p2 = 0.641
+ ! p3 = -1.000
+ !--------------------------------------------------------------------------
+
+
+ !--- Arguments
+ real(r8), intent(in) :: d ! plant diameter [ cm]
+ real(r8), intent(in) :: h ! plant height [ m]
+ real(r8), intent(in) :: dhdd ! Height derivative wrt diameter [ m/cm]
+ real(r8), intent(in) :: p1 ! Log-intercept parameter [ -]
+ real(r8), intent(in) :: p2 ! Log-slope parameter for size [ -]
+ real(r8), intent(in) :: p3 ! Log-slope parameter for SLA [ -]
+ real(r8), intent(in) :: slatop ! Top canopy specific leaf area [ m2/gC]
+ real(r8), intent(in) :: c2b ! Carbon to biomass multiplier [kg/kgC]
+ real(r8), intent(in) :: dbh_maxh ! dbh at maximum height [ cm]
+ real(r8), intent(out) :: blmax ! Leaf biomass [ kgC]
+ real(r8), intent(out), optional :: dblmaxdd ! Leaf biomass derivative [kgC/cm]
+ !--- Local variables
+ real(r8) :: duse
+ !---~---
+
+
+
+ !--- Cap DBH
+ duse = min(d,dbh_maxh)
+ !---~---
+
+
+ !--- Find leaf biomass
+ blmax = p1 * (duse*duse*h)**p2 * slatop**p3 / c2b
+ !---~---
+
+
+ !---~---
+ ! Compute the leaf biomass derivative with DBH if needed.
+ !---~---
+ if (present(dblmaxdd)) then
+ if (d >= dbh_maxh) then
+ !---~---
+ ! Leaf area is capped at the maximum DBH. This may be removed in the
+ ! future.
+ !---~---
+ dblmaxdd = 0._r8
+ !---~---
+ else
+ !---~---
+ ! Find the leaf biomass derivative, noting that height is actually
+ ! a function of DBH.
+ !---~---
+ dblmaxdd = p2 * blmax * ( 2._r8 / duse + dhdd / h )
+ !---~---
+ end if
+ end if
+ !---~---
+
+ return
+ end subroutine dh2blmax_3pwr
+
+
! =========================================================================
! Diameter to height (D2H) functions
! =========================================================================
@@ -1507,7 +1636,7 @@ subroutine d2h_chave2014(d,p1,p2,p3,dbh_maxh,h,dhdd)
! "d to height via Chave et al. 2014"
! This function calculates tree height based on tree diameter and the
- ! environmental stress factor "E", as per Chave et al. 2015 GCB
+ ! environmental stress factor "E", as per Chave et al. 2014 GCB
! As opposed to previous allometric models in ED, in this formulation
! we do not impose a hard cap on tree height. But, maximum_height
! is an important parameter, but instead of imposing a hard limit, in
@@ -1516,7 +1645,7 @@ subroutine d2h_chave2014(d,p1,p2,p3,dbh_maxh,h,dhdd)
! begin to route available NPP into seed and defense respiration.
!
! The stress function is based on the geographic location of the site. If
- ! a user decides to use Chave2015 allometry, the E factor will be read in
+ ! a user decides to use Chave2014 allometry, the E factor will be read in
! from a global gridded dataset and assigned for each ED patch (note it
! will be the same for each ED patch, but this distinction will help in
! porting ED into different models (patches are pure ED). It
@@ -1754,7 +1883,7 @@ subroutine dh2bagw_chave2014(d,h,dhdd,p1,p2,wood_density,c2b,bagw,dbagwdd)
! height and wood density.
!
! Chave et al. Improved allometric models to estimate the abovegroud
- ! biomass of tropical trees. Global Change Biology. V20, p3177-3190. 2015.
+ ! biomass of tropical trees. Global Change Biology. V20, p3177-3190. 2014.
!
! Input arguments:
! d: Diameter at breast height [cm]
@@ -1798,6 +1927,89 @@ subroutine dh2bagw_chave2014(d,h,dhdd,p1,p2,wood_density,c2b,bagw,dbagwdd)
return
end subroutine dh2bagw_chave2014
+ ! ============================================================================
+
+
+
+ subroutine dh2bagw_3pwr(d,h,dhdd,p1,p2,p3,wood_density,c2b,bagw,dbagwdd)
+ !--------------------------------------------------------------------------
+ !
+ ! This function calculates the maximum above-ground biomass from
+ ! reference diameter, plant height and wood density. This functional form
+ ! is an intermediate between Saldarriaga et al. (1988) and Chave et al.
+ ! (2014), because the wood-density exponent is independent on the
+ ! plant size (DBH^2 * Height) but the diameter and height are scaled
+ ! together through the size function.
+ !
+ ! -----------------
+ ! References
+ ! -----------------
+ ! Chave J, Rejou-Mechain M, Burquez A, Chidumayo E, Colgan MS, Delitti WB,
+ ! Duque A, Eid T, Fearnside PM, Goodman RC et al. 2014. Improved
+ ! allometric models to estimate the aboveground biomass of tropical
+ ! trees. Glob. Change Biol. 20: 3177-3190. doi:10.1111/gcb.12629.
+ !
+ ! Saldarriaga JG, West DC, Tharp ML , Uhl C. 1988. Long-term
+ ! chronosequence of forest succession in the upper Rio Negro of
+ ! Colombia and Venezuela. J. Ecol. 76: 938-958.
+ ! doi:10.2307/2260625.
+ !
+ ! -----------------
+ ! Input arguments
+ ! -----------------
+ ! d -- Diameter at breast height [ cm]
+ ! h -- Total tree height [ m]
+ ! dhdd -- Height derivative with dbh [ m/cm]
+ ! p1 -- Parameter 1 (log-intercept) [ --]
+ ! p2 -- Parameter 2 (power, or log-slope) [ --]
+ ! p3 -- Parameter 3 (power, or log-slope) [ --]
+ ! wood_density -- Wood density [ g/cm3]
+ ! c2b -- Carbon to biomass multiplier ~ 2 [ kg/kgC]
+ !
+ ! ------------------
+ ! Output arguments
+ ! ------------------
+ ! bagw -- Above-ground biomass per individual [ kgC]
+ ! dbagwdd -- Above-ground biomass derivative [ kgC/cm]
+ !
+ !--------------------------------------------------------------------------
+
+
+ !--- Arguments
+ real(r8), intent(in) :: d ! plant diameter [ cm]
+ real(r8), intent(in) :: h ! plant height [ m]
+ real(r8), intent(in) :: dhdd ! Height deriv. wrt diameter [ m/cm]
+ real(r8), intent(in) :: p1 ! Log-intercept parameter [ -]
+ real(r8), intent(in) :: p2 ! Log-slope parameter (size) [ -]
+ real(r8), intent(in) :: p3 ! Log-slope parameter (WD) [ -]
+ real(r8), intent(in) :: wood_density ! Wood density [ g/cm3]
+ real(r8), intent(in) :: c2b ! Carbon to biomass factor [kg/kgC]
+ real(r8), intent(out) :: bagw ! Above-ground biomass [ kgC]
+ real(r8), intent(out), optional :: dbagwdd ! AG biomass derivative [kgC/cm]
+ !---~---
+
+
+ !--- Find above-ground biomass
+ bagw = p1 * (d*d*h)**p2 * wood_density**p3 / c2b
+ !---~---
+
+
+ !---~---
+ ! Compute the above-ground biomass derivative with DBH if needed, noting that
+ ! height is actually a function of DBH.
+ !---~---
+ if (present(dbagwdd)) then
+ dbagwdd = p2 * bagw * ( 2._r8 / d + dhdd / h )
+ end if
+ !---~---
+
+ return
+ end subroutine dh2bagw_3pwr
+
+
+ ! ============================================================================
+
+
subroutine d2bagw_2pwr(d,p1,p2,c2b,bagw,dbagwdd)
! =========================================================================
@@ -2084,36 +2296,62 @@ subroutine h2d_martcano(h,p1,p2,p3,d,dddh)
return
end subroutine h2d_martcano
- ! =====================================================================================
+ ! =====================================================================================
- subroutine CrownDepth(height,ft,crown_depth)
- ! -----------------------------------------------------------------------------------
- ! This routine returns the depth of a plant's crown. Which is the length
- ! from the bottom of the crown to the top in the vertical dimension.
- !
- ! This code may be used as a wrapper if different hypotheses are wished to be
- ! optioned.
- ! -----------------------------------------------------------------------------------
-
- real(r8),intent(in) :: height ! The height of the plant [m]
- integer,intent(in) :: ft ! functional type index
- real(r8),intent(out) :: crown_depth ! The depth of the crown [m]
+ subroutine CrownDepth(height,ipft,crown_depth)
- ! Alternative Hypothesis:
- ! crown depth from Poorter, Bongers & Bongers
- ! crown_depth = exp(-1.169_r8)*cCohort%height**1.098_r8
+ !--------------------------------------------------------------------------
+ ! This routine returns the depth of a plant's crown. Which is the
+ ! length from the bottom of the crown to the top in the vertical dimension.
+ !
+ ! The original mode (now allom_dmode = 1) used only a fraction of the
+ ! plant's height. Alternatively, allom_dmode = 2 uses the same functional
+ ! form as Poorter et al. (2006), with an additional constraint to prevent
+ ! crown depth to exceed the plant's height.
+ !
+ ! -----------------
+ ! References
+ ! -----------------
+ ! Poorter L, Bongers L , Bongers F. 2006. Architecture of 54 moist-forest
+ ! tree species: traits, trade-offs, and functional groups. Ecology 87:
+ ! 1289-1301. doi:10.1890/0012-9658(2006)87[1289:AOMTST]2.0.CO;2.
+ !
+ !--------------------------------------------------------------------------
+
+ real(r8),intent(in) :: height ! The height of the plant [m]
+ integer ,intent(in) :: ipft ! functional type index
+ real(r8),intent(out) :: crown_depth ! The depth of the crown [m]
+
+ associate( p1 => prt_params%allom_h2cd1(ipft), &
+ p2 => prt_params%allom_h2cd2(ipft), &
+ allom_dmode => prt_params%allom_dmode(ipft))
+
+ select case (allom_dmode)
+ case (1) ! Default, linear relationship with height
+ crown_depth = p1 * height
+ case (2) ! Power law, akin to Poorter et al. (2006).
+ !---~---
+ ! Apply the two coefficients, but make sure crown depth does not exceed
+ ! the plant's height.
+ !---~---
+ crown_depth = min(height, p1 * height ** p2)
+ !---~---
+ case default
+ write(fates_log(),*) 'Invalid settings for crown depth mode for PFT ',ipft,'.'
+ write(fates_log(),*) 'Current allom_dmode: ',allom_dmode,'.'
+ write(fates_log(),*) 'Valid allom_dmode values: 1 or 2.'
+ write(fates_log(),*) 'Aborting'
+ call endrun(msg=errMsg(sourcefile, __LINE__))
+ end select
+ end associate
- ! Alternative Hypothesis:
- ! Original FATES crown depth heigh used for hydraulics
- ! crown_depth = min(height,0.1_r8)
+ return
+ end subroutine CrownDepth
+ ! =====================================================================================
- crown_depth = prt_params%crown_depth_frac(ft) * height
-
- return
- end subroutine CrownDepth
@@ -2180,7 +2418,99 @@ subroutine carea_2pwr(dbh,spread,d2bl_p2,d2bl_ediff,d2ca_min, &
endif
end subroutine carea_2pwr
-
+
+
+ ! =============================================================================
+
+
+ subroutine carea_3pwr(dbh,height,ipft,dbh_maxh,spread,dh2bl_p2,dh2bl_ediff, &
+ dh2ca_min,dh2ca_max,crowndamage,c_area,inverse)
+ !---~---
+ ! Calculate area of ground covered by entire cohort. (m2)
+ ! Function of DBH (cm), height (m), canopy spread (m/cm) and number of
+ ! individuals.
+ !---~---
+
+ !--- List of arguments
+ real(r8) , intent(inout) :: dbh ! Diameter at breast/ref/ height [ cm]
+ real(r8) , intent(inout) :: height ! Height [ m]
+ integer(i4), intent(in) :: ipft ! PFT index
+ real(r8) , intent(in) :: dbh_maxh ! Minimum DBH at maximum height [ cm]
+ real(r8) , intent(in) :: spread ! site level relative spread score [ 0-1]
+ real(r8) , intent(in) :: dh2bl_p2 ! Exponent for size (bleaf) [ -]
+ real(r8) , intent(in) :: dh2bl_ediff ! Difference in size exponent [ -]
+ ! between crown area and bleaf
+ real(r8) , intent(in) :: dh2ca_min ! Minimum (closed forest) scaling [ -]
+ ! coefficient for crown area
+ real(r8) , intent(in) :: dh2ca_max ! Maximum (savannah) scaling [ -]
+ ! coefficient for crown area
+ integer , intent(in) :: crowndamage ! Crown damage class [ -]
+ ! [1: undamaged, >1: damaged]
+ real(r8) , intent(inout) :: c_area ! crown area for one plant [ m2]
+ logical , intent(in) :: inverse ! If true, calculate dbh from crown
+ ! area rather than its reverse
+ !--- Local variables
+ real(r8) :: size ! Size (Diameter^2 * Height) [cm2 m]
+ real(r8) :: dh2ca_p1 ! Effective scaling factor (crown area) [ -]
+ real(r8) :: dh2ca_p2 ! Effective exponent (crown area) [ -]
+ real(r8) :: crown_reduction ! Crown area reduction due to damage. [ -]
+ !---~---
+
+
+ !---~---
+ ! Define the scaling (log-intercept) and exponent (log-slope) parameters for
+ ! crown area. The scaling parameter accounts for the site-level spread elasticity.
+ ! The exponent is defined in terms of the leaf biomass exponent plus an offset
+ ! parameter (allom_blca_expnt_diff). This is done because the default in FATES is
+ ! for both exponents to be same (i.e., allom_blca_expnt_diff = 0.) so the per-plant
+ ! canopy area remains invariant during growth. However, allometric models in general
+ ! predict that leaf area grows faster than crown area.
+ !---~---
+ dh2ca_p1 = spread * dh2ca_max + (1._r8 - spread) * dh2ca_min
+ dh2ca_p2 = dh2bl_p2 + dh2bl_ediff
+ !---~---
+
+
+
+ !---~---
+ ! Decide whether to use DBH and height to find crown area (default) or the
+ ! other way round.
+ !---~---
+ select case (inverse)
+ case (.false.)
+ !--- Find the maximum area
+ size = dbh * dbh * height
+ c_area = dh2ca_p1 * size ** dh2ca_p2
+ !---~---
+
+ !--- Reduce area if the crown is damaged.
+ if (crowndamage > 1) then
+ call GetCrownReduction(crowndamage, crown_reduction)
+ c_area = c_area * (1.0_r8 - crown_reduction)
+ end if
+ !---~---
+ case (.true.)
+ !--- Reduce area if the crown is damaged.
+ if (crowndamage > 1) then
+ call GetCrownReduction(crowndamage, crown_reduction)
+ c_area = c_area * (1.0_r8 - crown_reduction)
+ end if
+ !---~---
+
+
+ !---~---
+ ! Find the size, then use a root-finding algorithm to find DBH.
+ !---~---
+ size = ( c_area / dh2ca_p1 ) ** ( 1.0_r8 / dh2ca_p2 )
+ call size2dbh(size,ipft,dbh,dbh_maxh)
+ !---~---
+ end select
+ !---~---
+
+ return
+ end subroutine carea_3pwr
+
+
! =========================================================================
subroutine set_root_fraction(root_fraction, ft, zi, max_nlevroot)
@@ -2622,6 +2952,8 @@ subroutine VegAreaLayer(tree_lai,tree_sai,tree_height,iv,nv,pft,snow_depth, &
! [m2 of leaf in bin / m2 crown footprint]
real(r8) :: tree_vai ! the in-crown veg area index for the plant
+ real(r8) :: crown_depth ! crown depth of the plant [m]
+ real(r8) :: frac_crown_depth ! fraction of the crown depth (relative to plant height)
real(r8) :: fraction_exposed ! fraction of the veg media that is above snow
real(r8) :: layer_top_height ! Physical height of the layer top relative to ground [m]
real(r8) :: layer_bot_height ! Physical height of the layer bottom relative to ground [m]
@@ -2634,6 +2966,10 @@ subroutine VegAreaLayer(tree_lai,tree_sai,tree_height,iv,nv,pft,snow_depth, &
tree_vai = tree_lai + tree_sai
+ ! Ratio between crown depth and plant height
+ call CrownDepth(tree_height,pft,crown_depth)
+ frac_crown_depth = crown_depth / tree_height
+
if_any_vai: if(tree_vai>0._r8)then
if(iv==0)then
@@ -2657,14 +2993,14 @@ subroutine VegAreaLayer(tree_lai,tree_sai,tree_height,iv,nv,pft,snow_depth, &
if(layer_height_method .eq. layer_height_const_depth)then
if(iv==0)then
layer_top_height = tree_height
- layer_bot_height = tree_height*(1._r8 - prt_params%crown_depth_frac(pft))
+ layer_bot_height = tree_height*(1._r8 - frac_crown_depth)
else
- layer_top_height = tree_height*(1._r8 - real(iv-1,r8)/real(nv,r8)*prt_params%crown_depth_frac(pft))
- layer_bot_height = tree_height*(1._r8 - real(iv,r8)/real(nv,r8)*prt_params%crown_depth_frac(pft))
+ layer_top_height = tree_height*(1._r8 - real(iv-1,r8)/real(nv,r8)*frac_crown_depth)
+ layer_bot_height = tree_height*(1._r8 - real(iv,r8)/real(nv,r8)*frac_crown_depth)
end if
else
- layer_top_height = tree_height*(1._r8 - prt_params%crown_depth_frac(pft)*vai_top/tree_vai)
- layer_bot_height = tree_height*(1._r8 - prt_params%crown_depth_frac(pft)*vai_bot/tree_vai)
+ layer_top_height = tree_height*(1._r8 - frac_crown_depth*vai_top/tree_vai)
+ layer_bot_height = tree_height*(1._r8 - frac_crown_depth*vai_bot/tree_vai)
end if
fraction_exposed = 1._r8 - max(0._r8,(min(1._r8, (snow_depth-layer_bot_height)/(layer_top_height-layer_bot_height))))
@@ -2738,7 +3074,265 @@ subroutine cspline(x1,x2,y1,y2,dydx1,dydx2,x,y,dydx)
dydx = (y2-y1)/(x2-x1) + (1.0_r8-2.0_r8*t)*(a*(1.0_r8-t)+b*t)/(x2-x1) + t*(1.0_r8-t)*(b-a)/(x2-x1)
return
end subroutine cspline
-
+ ! ============================================================================
+
+
+
+ ! ============================================================================
+ ! This function finds the DBH when size (DBH^2 * Height) is known but we
+ ! cannot find DBH analytically due to the non-linear relationship between DBH
+ ! and height. This is borrowed from the same approach applied in ED2 for
+ ! root finding. It starts with the Newton's method, which should quickly
+ ! converge to the solution. In the unlikely case of failure, we use the
+ ! Regula Falsi (Illinois) method as a back-up.
+ ! ============================================================================
+ subroutine size2dbh(size,ipft,dbh,dbh_maxh)
+ !--- Arguments.
+ real(r8) , intent(in) :: size ! Size (DBH^2 * Height) [cm2 m]
+ integer(i4), intent(in) :: ipft ! PFT index [ -]
+ real(r8) , intent(inout) :: dbh ! Diameter at breast height [ cm]
+ real(r8) , intent(in) :: dbh_maxh ! Minimum DBH at maximum height [ cm]
+ !--- Local variables
+ real(r8) :: hgt ! Height [ m]
+ real(r8) :: dhgtddbh ! Height derivative [ m/cm]
+ real(r8) :: size_maxh ! Minimum size at maximum height [cm2 m]
+ real(r8) :: deriv ! Function derivative [ cm m]
+ real(r8) :: afun ! Function value (lower guess) [cm2 m]
+ real(r8) :: rfun ! Function value (RF new guess) [cm2 m]
+ real(r8) :: zfun ! Function value (upper guess) [cm2 m]
+ real(r8) :: adbh ! DBH: lower guess [ cm]
+ real(r8) :: rdbh ! DBH: updated guess (Reg. Falsi) [ cm]
+ real(r8) :: zdbh ! DBH: upper guess [ cm]
+ real(r8) :: delta ! Second guess for the RF method [ cm]
+ integer :: itn ! Iteration counter -- Newton [ -]
+ integer :: iti ! Iteration counter -- Reg. Falsi [ -]
+ logical :: converged ! Has the solution converged? [ T|F]
+ logical :: zside ! Converging on the upper size? [ T|F]
+ !--- Local constants.
+ real(r8) , parameter :: toler =1.0e-12_r8 ! Relative tolerance [ --]
+ integer , parameter :: maxit_newt = 10 ! Cap in iterations -- Newton [ --]
+ integer , parameter :: maxit_rf = 100 ! Cap in iterations -- Reg. Falsi [ --]
+ !---~---
+
+
+ !---~---
+ ! Find the maximum size beyond which the height is assumed constant. In this
+ ! case, DBH can be determined without the iterative approach.
+ !---~---
+ call h_allom(dbh_maxh,ipft,hgt)
+ size_maxh = dbh_maxh * dbh_maxh * hgt
+ if (size >= size_maxh) then
+ dbh = sqrt(size/hgt)
+ return
+ end if
+ !---~---
+
+
+ !--- First guess: use current DBH.
+ adbh = dbh
+ call h_allom(adbh,ipft,hgt,dhgtddbh)
+ afun = adbh * adbh * hgt - size
+ deriv = 2.0_r8 * adbh * hgt + adbh * adbh * dhgtddbh
+ !---~---
+
+
+ !--- Copy just in case it fails at the first iteration.
+ zdbh = adbh
+ zfun = afun
+ !---~---
+
+
+ !---~---
+ ! Enter the Newton's method loop
+ !---~---
+ converged = .false.
+ newton_loop: do itn = 1, maxit_newt
+ !--- If derivative is too flat, go to Regula Falsi
+ if ( abs(deriv) < toler) exit newton_loop
+ !---~---
+
+
+ !--- Copy the previous guess.
+ adbh = zdbh
+ afun = zfun
+ !---~---
+
+
+ !--- Find the new guess, and evaluate the function and derivative.
+ zdbh = adbh - afun / deriv
+ call h_allom(zdbh,ipft,hgt,dhgtddbh)
+ zfun = zdbh * zdbh * hgt - size
+ deriv = 2.0_r8 * zdbh * hgt + zdbh * zdbh * dhgtddbh
+ !---~---
+
+ !--- Check convergence.
+ converged = abs(adbh - zdbh) < toler * zdbh
+ if (converged) then
+ !--- Convergence by iterations.
+ dbh = 0.5_r8 * (adbh + zdbh)
+ return
+ !---~---
+ else if (abs(zfun) < nearzero) then
+ !--- Convergence by luck.
+ dbh = zdbh
+ return
+ !---~---
+ end if
+ !---~---
+ end do newton_loop
+ !---~---
+
+
+
+ !---~---
+ ! If we have reached this point, then Newton's method has failed. Use Regula
+ ! Falsi instead. For this, we must have two guesses whose function evaluation has
+ ! opposite signs.
+ !---~---
+ if (afun * zfun <= -nearzero) then
+ !--- We already have two guesses with opposite signs.
+ zside = .true.
+ !---~---
+ else
+ !--- Look for another guess with opposite sign.
+ if (abs(zfun-afun) < 100._r8 * toler * adbh) then
+ delta = 100._r8 * toler * adbh
+ else
+ delta = max( abs( afun * (zdbh-adbh) / (zfun-afun) ),100._r8 * toler * adbh )
+ end if
+ !---~---
+
+
+ !---~---
+ ! Try guesses on both sides of the first guess, sending guesses increasingly
+ ! further away until we find a good guess.
+ !---~---
+ zdbh = adbh + delta
+ zside = .false.
+ zguess_loop: do iti=1,maxit_rf
+ zdbh = adbh + real((-1)**iti * (iti+3)/2,r8) * delta
+ call h_allom(zdbh,ipft,hgt)
+ zfun = zdbh * zdbh * hgt - size
+ zside = afun * zfun < -nearzero
+ if (zside) exit zguess_loop
+ end do zguess_loop
+
+ !---~---
+ ! Issue an error in case the function failed finding a second guess.
+ !---~---
+ if (.not. zside) then
+ write (unit=*,fmt='(a)') '---~---'
+ write (unit=*,fmt='(a)') ' Failed finding the second guess:'
+ write (unit=*,fmt='(a)') '---~---'
+ write (unit=*,fmt='(a)') ' '
+ write (unit=*,fmt='(a)') ' Input: '
+ write (unit=*,fmt='(a,1x,es14.7)') ' + size =',size
+ write (unit=*,fmt='(a,1x,es14.7)') ' + dbh =',dbh
+ write (unit=*,fmt='(a)') ' '
+ write (unit=*,fmt='(a)') ' Current guesses and evaluations:'
+ write (unit=*,fmt='(a,1x,es14.7)') ' + adbh =',adbh
+ write (unit=*,fmt='(a,1x,es14.7)') ' + afun =',afun
+ write (unit=*,fmt='(a,1x,es14.7)') ' + zdbh =',zdbh
+ write (unit=*,fmt='(a,1x,es14.7)') ' + zfun =',zfun
+ write (unit=*,fmt='(a)') ' '
+ write (unit=*,fmt='(a)') '---~---'
+ write(fates_log(),*) 'Second guess for Regula Falsi method not found.'
+ call endrun(msg=errMsg(sourcefile, __LINE__))
+ end if
+ !---~---
+ end if
+ !---~---
+
+ !---~---
+ ! Proceed to the regula falsi loop.
+ !---~---
+ regfalsi_loop: do iti=1,maxit_rf
+
+ !--- Update solution.
+ rdbh = ( zfun * adbh - afun * zdbh ) / ( zfun - afun)
+ !---~---
+
+
+ !---~---
+ ! Check for convergence. In case it converged, we can exit the sub-routine.
+ !---~---
+ converged = abs(rdbh - adbh) < toler * max(rdbh,adbh)
+ if (converged) exit regfalsi_loop
+ !---~---
+
+
+ !--- Find the new function evaluation.
+ call h_allom(rdbh,ipft,hgt)
+ rfun = rdbh * rdbh * hgt - size
+ !---~---
+
+
+ !---~---
+ ! Define the new searching interval based on the intermediate value theorem.
+ !---~---
+ if (abs(rfun) < nearzero) then
+ !--- Converged by luck.
+ converged = .true.
+ exit regfalsi_loop
+ !---~---
+ else if (rfun * afun <= -nearzero ) then
+ !--- Guess is between lower and current guess.
+ zdbh = rdbh
+ zfun = rfun
+ !--- If we are updating the upper side again, halve afun (Regula Falsi method).
+ if (zside) afun = afun * 0.5_r8
+ !--- Flag that we have just updated the upper side.
+ zside = .true.
+ !---~---
+ else
+ !--- Guess is between current and upper guess.
+ adbh = rdbh
+ afun = rfun
+ !--- If we are updating the lower side again, halve zfun (Regula Falsi method).
+ if (.not. zside) zfun = zfun * 0.5_r8
+ !--- Flag that we have just updated the lower side.
+ zside = .false.
+ end if
+ end do regfalsi_loop
+ !---~---
+
+
+ !---~---
+ ! Check that the Regula Falsi method indeed converged.
+ !---~---
+ if (converged) then
+ !--- Yes, return the last guess
+ dbh = rdbh
+ !---~---
+ else
+ !--- No, report the bad news
+ write (unit=*,fmt='(a)') '---~---'
+ write (unit=*,fmt='(a)') ' Failed finding the solution:'
+ write (unit=*,fmt='(a)') '---~---'
+ write (unit=*,fmt='(a)') ' '
+ write (unit=*,fmt='(a)') ' Input: '
+ write (unit=*,fmt='(a,1x,es14.7)') ' + size =',size
+ write (unit=*,fmt='(a,1x,es14.7)') ' + dbh =',dbh
+ write (unit=*,fmt='(a)') ' '
+ write (unit=*,fmt='(a)') ' Current guesses and evaluations:'
+ write (unit=*,fmt='(a,1x,es14.7)') ' + adbh =',adbh
+ write (unit=*,fmt='(a,1x,es14.7)') ' + afun =',afun
+ write (unit=*,fmt='(a,1x,es14.7)') ' + rdbh =',rdbh
+ write (unit=*,fmt='(a,1x,es14.7)') ' + rfun =',rfun
+ write (unit=*,fmt='(a,1x,es14.7)') ' + zdbh =',zdbh
+ write (unit=*,fmt='(a,1x,es14.7)') ' + zfun =',zfun
+ write (unit=*,fmt='(a)') ' '
+ write (unit=*,fmt='(a)') '---~---'
+ write(fates_log(),*) 'Size to DBH routine failed to converge!'
+ call endrun(msg=errMsg(sourcefile, __LINE__))
+ !---~---
+ end if
+ !---~---
+
+ return
+ end subroutine size2dbh
+ ! ============================================================================
+
end module FatesAllometryMod
diff --git a/main/EDParamsMod.F90 b/main/EDParamsMod.F90
index 71cc21af73..e3454f430c 100644
--- a/main/EDParamsMod.F90
+++ b/main/EDParamsMod.F90
@@ -77,6 +77,7 @@ module EDParamsMod
real(r8),protected, public :: ED_val_patch_fusion_tol ! minimum fraction in difference in profiles between patches
real(r8),protected, public :: ED_val_canopy_closure_thresh ! site-level canopy closure point where trees take on forest (narrow) versus savannah (wide) crown allometry
integer,protected, public :: stomatal_model ! switch for choosing between stomatal conductance models, 1 for Ball-Berry, 2 for Medlyn
+ integer,protected, public :: dayl_switch ! switch for turning on or off day length factor scaling for photosynthetic parameters
integer,protected, public :: regeneration_model ! Switch for choosing between regeneration models:
! (1) for Fates default
! (2) for the Tree Recruitment Scheme (Hanbury-Brown et al., 2022)
@@ -166,6 +167,7 @@ module EDParamsMod
character(len=param_string_length),parameter,public :: ED_name_patch_fusion_tol= "fates_patch_fusion_tol"
character(len=param_string_length),parameter,public :: ED_name_canopy_closure_thresh= "fates_canopy_closure_thresh"
character(len=param_string_length),parameter,public :: ED_name_stomatal_model= "fates_leaf_stomatal_model"
+ character(len=param_string_length),parameter,public :: ED_name_dayl_switch= "fates_daylength_factor_switch"
character(len=param_string_length),parameter,public :: ED_name_regeneration_model= "fates_regeneration_model"
character(len=param_string_length),parameter,public :: name_theta_cj_c3 = "fates_leaf_theta_cj_c3"
@@ -338,6 +340,7 @@ subroutine FatesParamsInit()
ED_val_patch_fusion_tol = nan
ED_val_canopy_closure_thresh = nan
stomatal_model = -9
+ dayl_switch = -9
regeneration_model = -9
stomatal_assim_model = -9
max_cohort_per_patch = -9
@@ -430,9 +433,8 @@ subroutine FatesRegisterParams(fates_params)
call fates_params%RegisterParameter(name=ED_name_mort_disturb_frac, dimension_shape=dimension_shape_scalar, &
dimension_names=dim_names_scalar)
- ! Temporary until we add parameter to file
- !call fates_params%RegisterParameter(name=ED_name_mort_cstarvation_model, dimension_shape=dimension_shape_scalar, &
- ! dimension_names=dim_names_scalar)
+ call fates_params%RegisterParameter(name=ED_name_mort_cstarvation_model, dimension_shape=dimension_shape_scalar, &
+ dimension_names=dim_names_scalar)
call fates_params%RegisterParameter(name=ED_name_comp_excln, dimension_shape=dimension_shape_scalar, &
dimension_names=dim_names_scalar)
@@ -493,7 +495,10 @@ subroutine FatesRegisterParams(fates_params)
call fates_params%RegisterParameter(name=ED_name_stomatal_model, dimension_shape=dimension_shape_scalar, &
dimension_names=dim_names_scalar)
-
+
+ call fates_params%RegisterParameter(name=ED_name_dayl_switch, dimension_shape=dimension_shape_scalar, &
+ dimension_names=dim_names_scalar)
+
call fates_params%RegisterParameter(name=ED_name_regeneration_model, dimension_shape=dimension_shape_scalar, &
dimension_names=dim_names_scalar)
@@ -648,12 +653,10 @@ subroutine FatesReceiveParams(fates_params)
call fates_params%RetrieveParameter(name=ED_name_mort_disturb_frac, &
data=fates_mortality_disturbance_fraction)
- ! Temporary until we add parameter to file
- !call fates_params%RetrieveParameter(name=ED_name_mort_cstarvation_model, &
- ! data=tmpreal)
- ! mort_cstarvation_model = nint(tmpreal)
- mort_cstarvation_model = cstarvation_model_lin
-
+ call fates_params%RetrieveParameter(name=ED_name_mort_cstarvation_model, &
+ data=tmpreal)
+ mort_cstarvation_model = nint(tmpreal)
+
call fates_params%RetrieveParameter(name=ED_name_comp_excln, &
data=ED_val_comp_excln)
@@ -715,6 +718,10 @@ subroutine FatesReceiveParams(fates_params)
data=tmpreal)
stomatal_model = nint(tmpreal)
+ call fates_params%RetrieveParameter(name=ED_name_dayl_switch, &
+ data=tmpreal)
+ dayl_switch = nint(tmpreal)
+
call fates_params%RetrieveParameter(name=ED_name_regeneration_model, &
data=tmpreal)
regeneration_model = nint(tmpreal)
@@ -884,6 +891,7 @@ subroutine FatesReportParams(is_master)
write(fates_log(),fmt0) 'ED_val_canopy_closure_thresh = ',ED_val_canopy_closure_thresh
write(fates_log(),fmt0) 'regeneration_model = ',regeneration_model
write(fates_log(),fmt0) 'stomatal_model = ',stomatal_model
+ write(fates_log(),fmt0) 'dayl_switch = ',dayl_switch
write(fates_log(),fmt0) 'stomatal_assim_model = ',stomatal_assim_model
write(fates_log(),fmt0) 'hydro_kmax_rsurf1 = ',hydr_kmax_rsurf1
write(fates_log(),fmt0) 'hydro_kmax_rsurf2 = ',hydr_kmax_rsurf2
diff --git a/main/EDPftvarcon.F90 b/main/EDPftvarcon.F90
index 5745141c70..bc821c0204 100644
--- a/main/EDPftvarcon.F90
+++ b/main/EDPftvarcon.F90
@@ -92,6 +92,13 @@ module EDPftvarcon
real(r8), allocatable :: maintresp_leaf_ryan1991_baserate(:) ! leaf maintenance respiration per Ryan et al 1991
+ real(r8), allocatable :: leafn_vert_scaler_coeff1(:) ! Coefficient one for decrease of leaf N through the canopy
+ real(r8), allocatable :: leafn_vert_scaler_coeff2(:) ! Coefficient two for decrease of leaf N through the canopy
+
+ real(r8), allocatable :: maintresp_leaf_vert_scaler_coeff1(:) ! leaf maintenance respiration decrease through the canopy param 1
+ ! only with Atkin et al. 2017 respiration model
+ real(r8), allocatable :: maintresp_leaf_vert_scaler_coeff2(:) ! leaf maintenance respiration decrease through the canopy param 2
+ ! only with Atkin et al. 2017 respiraiton model
real(r8), allocatable :: bmort(:)
real(r8), allocatable :: mort_ip_size_senescence(:) ! inflection point of dbh dependent senescence
real(r8), allocatable :: mort_r_size_senescence(:) ! rate of change in mortality with dbh
@@ -471,6 +478,22 @@ subroutine Register_PFT(this, fates_params)
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
+ name = 'fates_leafn_vert_scaler_coeff1'
+ call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
+ dimension_names=dim_names, lower_bounds=dim_lower_bound)
+
+ name = 'fates_leafn_vert_scaler_coeff2'
+ call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
+ dimension_names=dim_names, lower_bounds=dim_lower_bound)
+
+ name = 'fates_maintresp_leaf_vert_scaler_coeff1'
+ call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
+ dimension_names=dim_names, lower_bounds=dim_lower_bound)
+
+ name = 'fates_maintresp_leaf_vert_scaler_coeff2'
+ call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
+ dimension_names=dim_names, lower_bounds=dim_lower_bound)
+
name = 'fates_prescribed_npp_canopy'
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
@@ -912,6 +935,22 @@ subroutine Receive_PFT(this, fates_params)
call fates_params%RetrieveParameterAllocate(name=name, &
data=this%maintresp_leaf_ryan1991_baserate)
+ name = 'fates_leafn_vert_scaler_coeff1'
+ call fates_params%RetrieveParameterAllocate(name=name, &
+ data=this%leafn_vert_scaler_coeff1)
+
+ name = 'fates_leafn_vert_scaler_coeff2'
+ call fates_params%RetrieveParameterAllocate(name=name, &
+ data=this%leafn_vert_scaler_coeff2)
+
+ name = 'fates_maintresp_leaf_vert_scaler_coeff1'
+ call fates_params%RetrieveParameterAllocate(name=name, &
+ data=this%maintresp_leaf_vert_scaler_coeff1)
+
+ name = 'fates_maintresp_leaf_vert_scaler_coeff2'
+ call fates_params%RetrieveParameterAllocate(name=name, &
+ data=this%maintresp_leaf_vert_scaler_coeff2)
+
name = 'fates_prescribed_npp_canopy'
call fates_params%RetrieveParameterAllocate(name=name, &
data=this%prescribed_npp_canopy)
@@ -1737,6 +1776,10 @@ subroutine FatesReportPFTParams(is_master)
write(fates_log(),fmt0) 'hydro_vg_alpha_node = ',EDPftvarcon_inst%hydr_vg_alpha_node
write(fates_log(),fmt0) 'hydro_vg_m_node = ',EDPftvarcon_inst%hydr_vg_m_node
write(fates_log(),fmt0) 'hydro_vg_n_node = ',EDPftvarcon_inst%hydr_vg_n_node
+ write(fates_log(),fmt0) 'leafn_vert_scaler_coeff1 = ',EDPftvarcon_inst%leafn_vert_scaler_coeff1
+ write(fates_log(),fmt0) 'leafn_vert_scaler_coeff2 = ',EDPftvarcon_inst%leafn_vert_scaler_coeff2
+ write(fates_log(),fmt0) 'maintresp_leaf_vert_scaler_coeff1 = ',EDPftvarcon_inst%maintresp_leaf_vert_scaler_coeff1
+ write(fates_log(),fmt0) 'maintresp_leaf_vert_scaler_coeff2 = ',EDPftvarcon_inst%maintresp_leaf_vert_scaler_coeff2
write(fates_log(),*) '-------------------------------------------------'
end if
@@ -1845,7 +1888,6 @@ subroutine FatesCheckParams(is_master)
call endrun(msg=errMsg(sourcefile, __LINE__))
end if
end if
-
end if
end if
@@ -1871,7 +1913,25 @@ subroutine FatesCheckParams(is_master)
call endrun(msg=errMsg(sourcefile, __LINE__))
end if
end if
-
+
+ ! We are using a simple phosphatase model right now. There is
+ ! no critical value (lambda) , and there is no preferential uptake (alpha).
+ ! Make sure these parameters are both set to 0.
+
+ if ((hlm_phosphorus_spec>0) .and. (trim(hlm_nu_com).eq.'ECA')) then
+ if (any(abs(EDPftvarcon_inst%eca_lambda_ptase(:)) > nearzero ) ) then
+ write(fates_log(),*) 'Critical Values for phosphatase in ECA are not'
+ write(fates_log(),*) 'enabled right now. Please set fates_eca_lambda_ptase = 0'
+ write(fates_log(),*) ' Aborting'
+ call endrun(msg=errMsg(sourcefile, __LINE__))
+ end if
+ if (any(abs(EDPftvarcon_inst%eca_alpha_ptase(:)) > nearzero ) ) then
+ write(fates_log(),*) 'There is no preferential plant uptake of P from phosphatase'
+ write(fates_log(),*) 'enabled right now. Please set fates_eca_alpha_ptase = 0'
+ write(fates_log(),*) ' Aborting'
+ call endrun(msg=errMsg(sourcefile, __LINE__))
+ end if
+ end if
case (prt_carbon_allom_hyp)
! No additional checks needed for now.
@@ -1915,6 +1975,9 @@ subroutine FatesCheckParams(is_master)
end if
end if
+
+
+
do ipft = 1,npft
! xl must be between -0.4 and 0.6 according to Bonan (2019) doi:10.1017/9781107339217 pg. 238
diff --git a/parameter_files/archive/api34.0.0_032624_params_default.cdl b/parameter_files/archive/api34.0.0_032624_params_default.cdl
new file mode 100644
index 0000000000..02bd77b647
--- /dev/null
+++ b/parameter_files/archive/api34.0.0_032624_params_default.cdl
@@ -0,0 +1,1743 @@
+netcdf tmp {
+dimensions:
+ fates_NCWD = 4 ;
+ fates_history_age_bins = 7 ;
+ fates_history_coage_bins = 2 ;
+ fates_history_damage_bins = 2 ;
+ fates_history_height_bins = 6 ;
+ fates_history_size_bins = 13 ;
+ fates_hlm_pftno = 14 ;
+ fates_hydr_organs = 4 ;
+ fates_leafage_class = 1 ;
+ fates_litterclass = 6 ;
+ fates_pft = 12 ;
+ fates_plant_organs = 4 ;
+ fates_string_length = 60 ;
+ fates_landuseclass = 5 ;
+variables:
+ double fates_history_ageclass_bin_edges(fates_history_age_bins) ;
+ fates_history_ageclass_bin_edges:units = "yr" ;
+ fates_history_ageclass_bin_edges:long_name = "Lower edges for age class bins used in age-resolved patch history output" ;
+ double fates_history_coageclass_bin_edges(fates_history_coage_bins) ;
+ fates_history_coageclass_bin_edges:units = "years" ;
+ fates_history_coageclass_bin_edges:long_name = "Lower edges for cohort age class bins used in cohort age resolved history output" ;
+ double fates_history_height_bin_edges(fates_history_height_bins) ;
+ fates_history_height_bin_edges:units = "m" ;
+ fates_history_height_bin_edges:long_name = "Lower edges for height bins used in height-resolved history output" ;
+ double fates_history_damage_bin_edges(fates_history_damage_bins) ;
+ fates_history_damage_bin_edges:units = "% crown loss" ;
+ fates_history_damage_bin_edges:long_name = "Lower edges for damage class bins used in cohort history output" ;
+ double fates_history_sizeclass_bin_edges(fates_history_size_bins) ;
+ fates_history_sizeclass_bin_edges:units = "cm" ;
+ fates_history_sizeclass_bin_edges:long_name = "Lower edges for DBH size class bins used in size-resolved cohort history output" ;
+ double fates_alloc_organ_id(fates_plant_organs) ;
+ fates_alloc_organ_id:units = "unitless" ;
+ fates_alloc_organ_id:long_name = "This is the global index that the organ in this file is associated with, values match those in parteh/PRTGenericMod.F90" ;
+ double fates_hydro_htftype_node(fates_hydr_organs) ;
+ fates_hydro_htftype_node:units = "unitless" ;
+ fates_hydro_htftype_node:long_name = "Switch that defines the hydraulic transfer functions for each organ." ;
+ char fates_pftname(fates_pft, fates_string_length) ;
+ fates_pftname:units = "unitless - string" ;
+ fates_pftname:long_name = "Description of plant type" ;
+ char fates_hydro_organ_name(fates_hydr_organs, fates_string_length) ;
+ fates_hydro_organ_name:units = "unitless - string" ;
+ fates_hydro_organ_name:long_name = "Name of plant hydraulics organs (DONT CHANGE, order matches media list in FatesHydraulicsMemMod.F90)" ;
+ char fates_alloc_organ_name(fates_plant_organs, fates_string_length) ;
+ fates_alloc_organ_name:units = "unitless - string" ;
+ fates_alloc_organ_name:long_name = "Name of plant organs (with alloc_organ_id, must match PRTGenericMod.F90)" ;
+ char fates_landuseclass_name(fates_landuseclass, fates_string_length) ;
+ fates_landuseclass_name:units = "unitless - string" ;
+ fates_landuseclass_name:long_name = "Name of the land use classes, for variables associated with dimension fates_landuseclass" ;
+ char fates_litterclass_name(fates_litterclass, fates_string_length) ;
+ fates_litterclass_name:units = "unitless - string" ;
+ fates_litterclass_name:long_name = "Name of the litter classes, for variables associated with dimension fates_litterclass" ;
+ double fates_alloc_organ_priority(fates_plant_organs, fates_pft) ;
+ fates_alloc_organ_priority:units = "index" ;
+ fates_alloc_organ_priority:long_name = "Priority level for allocation, 1: replaces turnover from storage, 2: same priority as storage use/replacement, 3: ascending in order of least importance" ;
+ double fates_alloc_storage_cushion(fates_pft) ;
+ fates_alloc_storage_cushion:units = "fraction" ;
+ fates_alloc_storage_cushion:long_name = "maximum size of storage C pool, relative to maximum size of leaf C pool" ;
+ double fates_alloc_store_priority_frac(fates_pft) ;
+ fates_alloc_store_priority_frac:units = "unitless" ;
+ fates_alloc_store_priority_frac:long_name = "for high-priority organs, the fraction of their turnover demand that is gauranteed to be replaced, and if need-be by storage" ;
+ double fates_allom_agb1(fates_pft) ;
+ fates_allom_agb1:units = "variable" ;
+ fates_allom_agb1:long_name = "Parameter 1 for agb allometry" ;
+ double fates_allom_agb2(fates_pft) ;
+ fates_allom_agb2:units = "variable" ;
+ fates_allom_agb2:long_name = "Parameter 2 for agb allometry" ;
+ double fates_allom_agb3(fates_pft) ;
+ fates_allom_agb3:units = "variable" ;
+ fates_allom_agb3:long_name = "Parameter 3 for agb allometry" ;
+ double fates_allom_agb4(fates_pft) ;
+ fates_allom_agb4:units = "variable" ;
+ fates_allom_agb4:long_name = "Parameter 4 for agb allometry" ;
+ double fates_allom_agb_frac(fates_pft) ;
+ fates_allom_agb_frac:units = "fraction" ;
+ fates_allom_agb_frac:long_name = "Fraction of woody biomass that is above ground" ;
+ double fates_allom_amode(fates_pft) ;
+ fates_allom_amode:units = "index" ;
+ fates_allom_amode:long_name = "AGB allometry function index." ;
+ double fates_allom_blca_expnt_diff(fates_pft) ;
+ fates_allom_blca_expnt_diff:units = "unitless" ;
+ fates_allom_blca_expnt_diff:long_name = "difference between allometric DBH:bleaf and DBH:crown area exponents" ;
+ double fates_allom_cmode(fates_pft) ;
+ fates_allom_cmode:units = "index" ;
+ fates_allom_cmode:long_name = "coarse root biomass allometry function index." ;
+ double fates_allom_crown_depth_frac(fates_pft) ;
+ fates_allom_crown_depth_frac:units = "fraction" ;
+ fates_allom_crown_depth_frac:long_name = "the depth of a cohort crown as a fraction of its height" ;
+ double fates_allom_d2bl1(fates_pft) ;
+ fates_allom_d2bl1:units = "variable" ;
+ fates_allom_d2bl1:long_name = "Parameter 1 for d2bl allometry" ;
+ double fates_allom_d2bl2(fates_pft) ;
+ fates_allom_d2bl2:units = "variable" ;
+ fates_allom_d2bl2:long_name = "Parameter 2 for d2bl allometry" ;
+ double fates_allom_d2bl3(fates_pft) ;
+ fates_allom_d2bl3:units = "unitless" ;
+ fates_allom_d2bl3:long_name = "Parameter 3 for d2bl allometry" ;
+ double fates_allom_d2ca_coefficient_max(fates_pft) ;
+ fates_allom_d2ca_coefficient_max:units = "m2 cm^(-1/beta)" ;
+ fates_allom_d2ca_coefficient_max:long_name = "max (savanna) dbh to area multiplier factor where: area = n*d2ca_coeff*dbh^beta" ;
+ double fates_allom_d2ca_coefficient_min(fates_pft) ;
+ fates_allom_d2ca_coefficient_min:units = "m2 cm^(-1/beta)" ;
+ fates_allom_d2ca_coefficient_min:long_name = "min (forest) dbh to area multiplier factor where: area = n*d2ca_coeff*dbh^beta" ;
+ double fates_allom_d2h1(fates_pft) ;
+ fates_allom_d2h1:units = "variable" ;
+ fates_allom_d2h1:long_name = "Parameter 1 for d2h allometry (intercept, or c)" ;
+ double fates_allom_d2h2(fates_pft) ;
+ fates_allom_d2h2:units = "variable" ;
+ fates_allom_d2h2:long_name = "Parameter 2 for d2h allometry (slope, or m)" ;
+ double fates_allom_d2h3(fates_pft) ;
+ fates_allom_d2h3:units = "variable" ;
+ fates_allom_d2h3:long_name = "Parameter 3 for d2h allometry (optional)" ;
+ double fates_allom_dbh_maxheight(fates_pft) ;
+ fates_allom_dbh_maxheight:units = "cm" ;
+ fates_allom_dbh_maxheight:long_name = "the diameter (if any) corresponding to maximum height, diameters may increase beyond this" ;
+ double fates_allom_fmode(fates_pft) ;
+ fates_allom_fmode:units = "index" ;
+ fates_allom_fmode:long_name = "fine root biomass allometry function index." ;
+ double fates_allom_fnrt_prof_a(fates_pft) ;
+ fates_allom_fnrt_prof_a:units = "unitless" ;
+ fates_allom_fnrt_prof_a:long_name = "Fine root profile function, parameter a" ;
+ double fates_allom_fnrt_prof_b(fates_pft) ;
+ fates_allom_fnrt_prof_b:units = "unitless" ;
+ fates_allom_fnrt_prof_b:long_name = "Fine root profile function, parameter b" ;
+ double fates_allom_fnrt_prof_mode(fates_pft) ;
+ fates_allom_fnrt_prof_mode:units = "index" ;
+ fates_allom_fnrt_prof_mode:long_name = "Index to select fine root profile function: 1) Jackson Beta, 2) 1-param exponential 3) 2-param exponential" ;
+ double fates_allom_frbstor_repro(fates_pft) ;
+ fates_allom_frbstor_repro:units = "fraction" ;
+ fates_allom_frbstor_repro:long_name = "fraction of bstore goes to reproduction after plant dies" ;
+ double fates_allom_hmode(fates_pft) ;
+ fates_allom_hmode:units = "index" ;
+ fates_allom_hmode:long_name = "height allometry function index." ;
+ double fates_allom_l2fr(fates_pft) ;
+ fates_allom_l2fr:units = "gC/gC" ;
+ fates_allom_l2fr:long_name = "Allocation parameter: fine root C per leaf C" ;
+ double fates_allom_la_per_sa_int(fates_pft) ;
+ fates_allom_la_per_sa_int:units = "m2/cm2" ;
+ fates_allom_la_per_sa_int:long_name = "Leaf area per sapwood area, intercept" ;
+ double fates_allom_la_per_sa_slp(fates_pft) ;
+ fates_allom_la_per_sa_slp:units = "m2/cm2/m" ;
+ fates_allom_la_per_sa_slp:long_name = "Leaf area per sapwood area rate of change with height, slope (optional)" ;
+ double fates_allom_lmode(fates_pft) ;
+ fates_allom_lmode:units = "index" ;
+ fates_allom_lmode:long_name = "leaf biomass allometry function index." ;
+ double fates_allom_sai_scaler(fates_pft) ;
+ fates_allom_sai_scaler:units = "m2/m2" ;
+ fates_allom_sai_scaler:long_name = "allometric ratio of SAI per LAI" ;
+ double fates_allom_smode(fates_pft) ;
+ fates_allom_smode:units = "index" ;
+ fates_allom_smode:long_name = "sapwood allometry function index." ;
+ double fates_allom_stmode(fates_pft) ;
+ fates_allom_stmode:units = "index" ;
+ fates_allom_stmode:long_name = "storage allometry function index: 1) Storage proportional to leaf biomass (with trimming), 2) Storage proportional to maximum leaf biomass (not trimmed)" ;
+ double fates_allom_zroot_k(fates_pft) ;
+ fates_allom_zroot_k:units = "unitless" ;
+ fates_allom_zroot_k:long_name = "scale coefficient of logistic rooting depth model" ;
+ double fates_allom_zroot_max_dbh(fates_pft) ;
+ fates_allom_zroot_max_dbh:units = "cm" ;
+ fates_allom_zroot_max_dbh:long_name = "dbh at which a plant reaches the maximum value for its maximum rooting depth" ;
+ double fates_allom_zroot_max_z(fates_pft) ;
+ fates_allom_zroot_max_z:units = "m" ;
+ fates_allom_zroot_max_z:long_name = "the maximum rooting depth defined at dbh = fates_allom_zroot_max_dbh. note: max_z=min_z=large, sets rooting depth to soil depth" ;
+ double fates_allom_zroot_min_dbh(fates_pft) ;
+ fates_allom_zroot_min_dbh:units = "cm" ;
+ fates_allom_zroot_min_dbh:long_name = "dbh at which the maximum rooting depth for a recruit is defined" ;
+ double fates_allom_zroot_min_z(fates_pft) ;
+ fates_allom_zroot_min_z:units = "m" ;
+ fates_allom_zroot_min_z:long_name = "the maximum rooting depth defined at dbh = fates_allom_zroot_min_dbh. note: max_z=min_z=large, sets rooting depth to soil depth" ;
+ double fates_c2b(fates_pft) ;
+ fates_c2b:units = "ratio" ;
+ fates_c2b:long_name = "Carbon to biomass multiplier of bulk structural tissues" ;
+ double fates_cnp_eca_alpha_ptase(fates_pft) ;
+ fates_cnp_eca_alpha_ptase:units = "g/m3" ;
+ fates_cnp_eca_alpha_ptase:long_name = "fraction of P from ptase activity sent directly to plant (ECA)" ;
+ double fates_cnp_eca_decompmicc(fates_pft) ;
+ fates_cnp_eca_decompmicc:units = "gC/m3" ;
+ fates_cnp_eca_decompmicc:long_name = "maximum soil microbial decomposer biomass found over depth (will be applied at a reference depth w/ exponential attenuation) (ECA)" ;
+ double fates_cnp_eca_km_nh4(fates_pft) ;
+ fates_cnp_eca_km_nh4:units = "gN/m3" ;
+ fates_cnp_eca_km_nh4:long_name = "half-saturation constant for plant nh4 uptake (ECA)" ;
+ double fates_cnp_eca_km_no3(fates_pft) ;
+ fates_cnp_eca_km_no3:units = "gN/m3" ;
+ fates_cnp_eca_km_no3:long_name = "half-saturation constant for plant no3 uptake (ECA)" ;
+ double fates_cnp_eca_km_p(fates_pft) ;
+ fates_cnp_eca_km_p:units = "gP/m3" ;
+ fates_cnp_eca_km_p:long_name = "half-saturation constant for plant p uptake (ECA)" ;
+ double fates_cnp_eca_km_ptase(fates_pft) ;
+ fates_cnp_eca_km_ptase:units = "gP/m3" ;
+ fates_cnp_eca_km_ptase:long_name = "half-saturation constant for biochemical P (ECA)" ;
+ double fates_cnp_eca_lambda_ptase(fates_pft) ;
+ fates_cnp_eca_lambda_ptase:units = "g/m3" ;
+ fates_cnp_eca_lambda_ptase:long_name = "critical value for biochemical production (ECA)" ;
+ double fates_cnp_eca_vmax_ptase(fates_pft) ;
+ fates_cnp_eca_vmax_ptase:units = "gP/m2/s" ;
+ fates_cnp_eca_vmax_ptase:long_name = "maximum production rate for biochemical P (per m2) (ECA)" ;
+ double fates_cnp_nfix1(fates_pft) ;
+ fates_cnp_nfix1:units = "fraction" ;
+ fates_cnp_nfix1:long_name = "fractional surcharge added to maintenance respiration that drives symbiotic fixation" ;
+ double fates_cnp_nitr_store_ratio(fates_pft) ;
+ fates_cnp_nitr_store_ratio:units = "(gN/gN)" ;
+ fates_cnp_nitr_store_ratio:long_name = "storeable (labile) N, as a ratio compared to the N bound in cell structures of other organs (see code)" ;
+ double fates_cnp_phos_store_ratio(fates_pft) ;
+ fates_cnp_phos_store_ratio:units = "(gP/gP)" ;
+ fates_cnp_phos_store_ratio:long_name = "storeable (labile) P, as a ratio compared to the P bound in cell structures of other organs (see code)" ;
+ double fates_cnp_pid_kd(fates_pft) ;
+ fates_cnp_pid_kd:units = "unknown" ;
+ fates_cnp_pid_kd:long_name = "derivative constant of the PID controller on adaptive fine-root biomass" ;
+ double fates_cnp_pid_ki(fates_pft) ;
+ fates_cnp_pid_ki:units = "unknown" ;
+ fates_cnp_pid_ki:long_name = "integral constant of the PID controller on adaptive fine-root biomass" ;
+ double fates_cnp_pid_kp(fates_pft) ;
+ fates_cnp_pid_kp:units = "unknown" ;
+ fates_cnp_pid_kp:long_name = "proportional constant of the PID controller on adaptive fine-root biomass" ;
+ double fates_cnp_prescribed_nuptake(fates_pft) ;
+ fates_cnp_prescribed_nuptake:units = "fraction" ;
+ fates_cnp_prescribed_nuptake:long_name = "Prescribed N uptake flux. 0=fully coupled simulation >0=prescribed (experimental)" ;
+ double fates_cnp_prescribed_puptake(fates_pft) ;
+ fates_cnp_prescribed_puptake:units = "fraction" ;
+ fates_cnp_prescribed_puptake:long_name = "Prescribed P uptake flux. 0=fully coupled simulation, >0=prescribed (experimental)" ;
+ double fates_cnp_store_ovrflw_frac(fates_pft) ;
+ fates_cnp_store_ovrflw_frac:units = "fraction" ;
+ fates_cnp_store_ovrflw_frac:long_name = "size of overflow storage (for excess C,N or P) as a fraction of storage target" ;
+ double fates_cnp_turnover_nitr_retrans(fates_plant_organs, fates_pft) ;
+ fates_cnp_turnover_nitr_retrans:units = "fraction" ;
+ fates_cnp_turnover_nitr_retrans:long_name = "retranslocation (reabsorbtion) fraction of nitrogen in turnover of scenescing tissues" ;
+ double fates_cnp_turnover_phos_retrans(fates_plant_organs, fates_pft) ;
+ fates_cnp_turnover_phos_retrans:units = "fraction" ;
+ fates_cnp_turnover_phos_retrans:long_name = "retranslocation (reabsorbtion) fraction of phosphorus in turnover of scenescing tissues" ;
+ double fates_cnp_vmax_nh4(fates_pft) ;
+ fates_cnp_vmax_nh4:units = "gN/gC/s" ;
+ fates_cnp_vmax_nh4:long_name = "maximum (potential) uptake rate of NH4 per gC of fineroot biomass (see main/EDPftvarcon.F90 vmax_nh4 for usage)" ;
+ double fates_cnp_vmax_no3(fates_pft) ;
+ fates_cnp_vmax_no3:units = "gN/gC/s" ;
+ fates_cnp_vmax_no3:long_name = "maximum (potential) uptake rate of NO3 per gC of fineroot biomass (see main/EDPftvarcon.F90 vmax_no3 for usage)" ;
+ double fates_cnp_vmax_p(fates_pft) ;
+ fates_cnp_vmax_p:units = "gP/gC/s" ;
+ fates_cnp_vmax_p:long_name = "maximum production rate for phosphorus (ECA and RD)" ;
+ double fates_damage_frac(fates_pft) ;
+ fates_damage_frac:units = "fraction" ;
+ fates_damage_frac:long_name = "fraction of cohort damaged in each damage event (event frequency specified in the is_it_damage_time subroutine)" ;
+ double fates_damage_mort_p1(fates_pft) ;
+ fates_damage_mort_p1:units = "fraction" ;
+ fates_damage_mort_p1:long_name = "inflection point of damage mortality function, a value of 0.8 means 50% mortality with 80% loss of crown, turn off with a large number" ;
+ double fates_damage_mort_p2(fates_pft) ;
+ fates_damage_mort_p2:units = "unitless" ;
+ fates_damage_mort_p2:long_name = "rate of mortality increase with damage" ;
+ double fates_damage_recovery_scalar(fates_pft) ;
+ fates_damage_recovery_scalar:units = "unitless" ;
+ fates_damage_recovery_scalar:long_name = "fraction of the cohort that recovers from damage" ;
+ double fates_dev_arbitrary_pft(fates_pft) ;
+ fates_dev_arbitrary_pft:units = "unknown" ;
+ fates_dev_arbitrary_pft:long_name = "Unassociated pft dimensioned free parameter that developers can use for testing arbitrary new hypotheses" ;
+ double fates_fire_alpha_SH(fates_pft) ;
+ fates_fire_alpha_SH:units = "m / (kw/m)**(2/3)" ;
+ fates_fire_alpha_SH:long_name = "spitfire parameter, alpha scorch height, Equation 16 Thonicke et al 2010" ;
+ double fates_fire_bark_scaler(fates_pft) ;
+ fates_fire_bark_scaler:units = "fraction" ;
+ fates_fire_bark_scaler:long_name = "the thickness of a cohorts bark as a fraction of its dbh" ;
+ double fates_fire_crown_kill(fates_pft) ;
+ fates_fire_crown_kill:units = "NA" ;
+ fates_fire_crown_kill:long_name = "fire parameter, see equation 22 in Thonicke et al 2010" ;
+ double fates_frag_fnrt_fcel(fates_pft) ;
+ fates_frag_fnrt_fcel:units = "fraction" ;
+ fates_frag_fnrt_fcel:long_name = "Fine root litter cellulose fraction" ;
+ double fates_frag_fnrt_flab(fates_pft) ;
+ fates_frag_fnrt_flab:units = "fraction" ;
+ fates_frag_fnrt_flab:long_name = "Fine root litter labile fraction" ;
+ double fates_frag_fnrt_flig(fates_pft) ;
+ fates_frag_fnrt_flig:units = "fraction" ;
+ fates_frag_fnrt_flig:long_name = "Fine root litter lignin fraction" ;
+ double fates_frag_leaf_fcel(fates_pft) ;
+ fates_frag_leaf_fcel:units = "fraction" ;
+ fates_frag_leaf_fcel:long_name = "Leaf litter cellulose fraction" ;
+ double fates_frag_leaf_flab(fates_pft) ;
+ fates_frag_leaf_flab:units = "fraction" ;
+ fates_frag_leaf_flab:long_name = "Leaf litter labile fraction" ;
+ double fates_frag_leaf_flig(fates_pft) ;
+ fates_frag_leaf_flig:units = "fraction" ;
+ fates_frag_leaf_flig:long_name = "Leaf litter lignin fraction" ;
+ double fates_frag_seed_decay_rate(fates_pft) ;
+ fates_frag_seed_decay_rate:units = "yr-1" ;
+ fates_frag_seed_decay_rate:long_name = "fraction of seeds that decay per year" ;
+ double fates_grperc(fates_pft) ;
+ fates_grperc:units = "unitless" ;
+ fates_grperc:long_name = "Growth respiration factor" ;
+ double fates_hydro_avuln_gs(fates_pft) ;
+ fates_hydro_avuln_gs:units = "unitless" ;
+ fates_hydro_avuln_gs:long_name = "shape parameter for stomatal control of water vapor exiting leaf" ;
+ double fates_hydro_avuln_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_avuln_node:units = "unitless" ;
+ fates_hydro_avuln_node:long_name = "xylem vulnerability curve shape parameter" ;
+ double fates_hydro_epsil_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_epsil_node:units = "MPa" ;
+ fates_hydro_epsil_node:long_name = "bulk elastic modulus" ;
+ double fates_hydro_fcap_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_fcap_node:units = "unitless" ;
+ fates_hydro_fcap_node:long_name = "fraction of non-residual water that is capillary in source" ;
+ double fates_hydro_k_lwp(fates_pft) ;
+ fates_hydro_k_lwp:units = "unitless" ;
+ fates_hydro_k_lwp:long_name = "inner leaf humidity scaling coefficient" ;
+ double fates_hydro_kmax_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_kmax_node:units = "kg/MPa/m/s" ;
+ fates_hydro_kmax_node:long_name = "maximum xylem conductivity per unit conducting xylem area" ;
+ double fates_hydro_p50_gs(fates_pft) ;
+ fates_hydro_p50_gs:units = "MPa" ;
+ fates_hydro_p50_gs:long_name = "water potential at 50% loss of stomatal conductance" ;
+ double fates_hydro_p50_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_p50_node:units = "MPa" ;
+ fates_hydro_p50_node:long_name = "xylem water potential at 50% loss of conductivity" ;
+ double fates_hydro_p_taper(fates_pft) ;
+ fates_hydro_p_taper:units = "unitless" ;
+ fates_hydro_p_taper:long_name = "xylem taper exponent" ;
+ double fates_hydro_pinot_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_pinot_node:units = "MPa" ;
+ fates_hydro_pinot_node:long_name = "osmotic potential at full turgor" ;
+ double fates_hydro_pitlp_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_pitlp_node:units = "MPa" ;
+ fates_hydro_pitlp_node:long_name = "turgor loss point" ;
+ double fates_hydro_resid_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_resid_node:units = "cm3/cm3" ;
+ fates_hydro_resid_node:long_name = "residual water conent" ;
+ double fates_hydro_rfrac_stem(fates_pft) ;
+ fates_hydro_rfrac_stem:units = "fraction" ;
+ fates_hydro_rfrac_stem:long_name = "fraction of total tree resistance from troot to canopy" ;
+ double fates_hydro_rs2(fates_pft) ;
+ fates_hydro_rs2:units = "m" ;
+ fates_hydro_rs2:long_name = "absorbing root radius" ;
+ double fates_hydro_srl(fates_pft) ;
+ fates_hydro_srl:units = "m g-1" ;
+ fates_hydro_srl:long_name = "specific root length" ;
+ double fates_hydro_thetas_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_thetas_node:units = "cm3/cm3" ;
+ fates_hydro_thetas_node:long_name = "saturated water content" ;
+ double fates_hydro_vg_alpha_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_vg_alpha_node:units = "MPa-1" ;
+ fates_hydro_vg_alpha_node:long_name = "(used if hydr_htftype_node = 2), capillary length parameter in van Genuchten model" ;
+ double fates_hydro_vg_m_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_vg_m_node:units = "unitless" ;
+ fates_hydro_vg_m_node:long_name = "(used if hydr_htftype_node = 2),m in van Genuchten 1980 model, 2nd pore size distribution parameter" ;
+ double fates_hydro_vg_n_node(fates_hydr_organs, fates_pft) ;
+ fates_hydro_vg_n_node:units = "unitless" ;
+ fates_hydro_vg_n_node:long_name = "(used if hydr_htftype_node = 2),n in van Genuchten 1980 model, pore size distribution parameter" ;
+ double fates_leaf_c3psn(fates_pft) ;
+ fates_leaf_c3psn:units = "flag" ;
+ fates_leaf_c3psn:long_name = "Photosynthetic pathway (1=c3, 0=c4)" ;
+ double fates_leaf_jmaxha(fates_pft) ;
+ fates_leaf_jmaxha:units = "J/mol" ;
+ fates_leaf_jmaxha:long_name = "activation energy for jmax. NOTE: if fates_leaf_photo_tempsens_model=2 then these values are NOT USED" ;
+ double fates_leaf_jmaxhd(fates_pft) ;
+ fates_leaf_jmaxhd:units = "J/mol" ;
+ fates_leaf_jmaxhd:long_name = "deactivation energy for jmax. NOTE: if fates_leaf_photo_tempsens_model=2 then these values are NOT USED" ;
+ double fates_leaf_jmaxse(fates_pft) ;
+ fates_leaf_jmaxse:units = "J/mol/K" ;
+ fates_leaf_jmaxse:long_name = "entropy term for jmax. NOTE: if fates_leaf_photo_tempsens_model=2 then these values are NOT USED" ;
+ double fates_leaf_slamax(fates_pft) ;
+ fates_leaf_slamax:units = "m^2/gC" ;
+ fates_leaf_slamax:long_name = "Maximum Specific Leaf Area (SLA), even if under a dense canopy" ;
+ double fates_leaf_slatop(fates_pft) ;
+ fates_leaf_slatop:units = "m^2/gC" ;
+ fates_leaf_slatop:long_name = "Specific Leaf Area (SLA) at top of canopy, projected area basis" ;
+ double fates_leaf_stomatal_intercept(fates_pft) ;
+ fates_leaf_stomatal_intercept:units = "umol H2O/m**2/s" ;
+ fates_leaf_stomatal_intercept:long_name = "Minimum unstressed stomatal conductance for Ball-Berry model and Medlyn model" ;
+ double fates_leaf_stomatal_slope_ballberry(fates_pft) ;
+ fates_leaf_stomatal_slope_ballberry:units = "unitless" ;
+ fates_leaf_stomatal_slope_ballberry:long_name = "stomatal slope parameter, as per Ball-Berry" ;
+ double fates_leaf_stomatal_slope_medlyn(fates_pft) ;
+ fates_leaf_stomatal_slope_medlyn:units = "KPa**0.5" ;
+ fates_leaf_stomatal_slope_medlyn:long_name = "stomatal slope parameter, as per Medlyn" ;
+ double fates_leaf_vcmax25top(fates_leafage_class, fates_pft) ;
+ fates_leaf_vcmax25top:units = "umol CO2/m^2/s" ;
+ fates_leaf_vcmax25top:long_name = "maximum carboxylation rate of Rub. at 25C, canopy top" ;
+ double fates_leaf_vcmaxha(fates_pft) ;
+ fates_leaf_vcmaxha:units = "J/mol" ;
+ fates_leaf_vcmaxha:long_name = "activation energy for vcmax. NOTE: if fates_leaf_photo_tempsens_model=2 then these values are NOT USED" ;
+ double fates_leaf_vcmaxhd(fates_pft) ;
+ fates_leaf_vcmaxhd:units = "J/mol" ;
+ fates_leaf_vcmaxhd:long_name = "deactivation energy for vcmax. NOTE: if fates_leaf_photo_tempsens_model=2 then these values are NOT USED" ;
+ double fates_leaf_vcmaxse(fates_pft) ;
+ fates_leaf_vcmaxse:units = "J/mol/K" ;
+ fates_leaf_vcmaxse:long_name = "entropy term for vcmax. NOTE: if fates_leaf_photo_tempsens_model=2 then these values are NOT USED" ;
+ double fates_maintresp_leaf_atkin2017_baserate(fates_pft) ;
+ fates_maintresp_leaf_atkin2017_baserate:units = "umol CO2/m^2/s" ;
+ fates_maintresp_leaf_atkin2017_baserate:long_name = "Leaf maintenance respiration base rate parameter (r0) per Atkin et al 2017" ;
+ double fates_maintresp_leaf_ryan1991_baserate(fates_pft) ;
+ fates_maintresp_leaf_ryan1991_baserate:units = "gC/gN/s" ;
+ fates_maintresp_leaf_ryan1991_baserate:long_name = "Leaf maintenance respiration base rate per Ryan et al 1991" ;
+ double fates_maintresp_reduction_curvature(fates_pft) ;
+ fates_maintresp_reduction_curvature:units = "unitless (0-1)" ;
+ fates_maintresp_reduction_curvature:long_name = "curvature of MR reduction as f(carbon storage), 1=linear, 0=very curved" ;
+ double fates_maintresp_reduction_intercept(fates_pft) ;
+ fates_maintresp_reduction_intercept:units = "unitless (0-1)" ;
+ fates_maintresp_reduction_intercept:long_name = "intercept of MR reduction as f(carbon storage), 0=no throttling, 1=max throttling" ;
+ double fates_maintresp_reduction_upthresh(fates_pft) ;
+ fates_maintresp_reduction_upthresh:units = "unitless (0-1)" ;
+ fates_maintresp_reduction_upthresh:long_name = "upper threshold for storage biomass (relative to leaf biomass) above which MR is not reduced" ;
+ double fates_mort_bmort(fates_pft) ;
+ fates_mort_bmort:units = "1/yr" ;
+ fates_mort_bmort:long_name = "background mortality rate" ;
+ double fates_mort_freezetol(fates_pft) ;
+ fates_mort_freezetol:units = "degrees C" ;
+ fates_mort_freezetol:long_name = "minimum temperature tolerance" ;
+ double fates_mort_hf_flc_threshold(fates_pft) ;
+ fates_mort_hf_flc_threshold:units = "fraction" ;
+ fates_mort_hf_flc_threshold:long_name = "plant fractional loss of conductivity at which drought mortality begins for hydraulic model" ;
+ double fates_mort_hf_sm_threshold(fates_pft) ;
+ fates_mort_hf_sm_threshold:units = "unitless" ;
+ fates_mort_hf_sm_threshold:long_name = "soil moisture (btran units) at which drought mortality begins for non-hydraulic model" ;
+ double fates_mort_ip_age_senescence(fates_pft) ;
+ fates_mort_ip_age_senescence:units = "years" ;
+ fates_mort_ip_age_senescence:long_name = "Mortality cohort age senescence inflection point. If _ this mortality term is off. Setting this value turns on age dependent mortality. " ;
+ double fates_mort_ip_size_senescence(fates_pft) ;
+ fates_mort_ip_size_senescence:units = "dbh cm" ;
+ fates_mort_ip_size_senescence:long_name = "Mortality dbh senescence inflection point. If _ this mortality term is off. Setting this value turns on size dependent mortality" ;
+ double fates_mort_prescribed_canopy(fates_pft) ;
+ fates_mort_prescribed_canopy:units = "1/yr" ;
+ fates_mort_prescribed_canopy:long_name = "mortality rate of canopy trees for prescribed physiology mode" ;
+ double fates_mort_prescribed_understory(fates_pft) ;
+ fates_mort_prescribed_understory:units = "1/yr" ;
+ fates_mort_prescribed_understory:long_name = "mortality rate of understory trees for prescribed physiology mode" ;
+ double fates_mort_r_age_senescence(fates_pft) ;
+ fates_mort_r_age_senescence:units = "mortality rate year^-1" ;
+ fates_mort_r_age_senescence:long_name = "Mortality age senescence rate of change. Sensible range is around 0.03-0.06. Larger values givesteeper mortality curves." ;
+ double fates_mort_r_size_senescence(fates_pft) ;
+ fates_mort_r_size_senescence:units = "mortality rate dbh^-1" ;
+ fates_mort_r_size_senescence:long_name = "Mortality dbh senescence rate of change. Sensible range is around 0.03-0.06. Larger values give steeper mortality curves." ;
+ double fates_mort_scalar_coldstress(fates_pft) ;
+ fates_mort_scalar_coldstress:units = "1/yr" ;
+ fates_mort_scalar_coldstress:long_name = "maximum mortality rate from cold stress" ;
+ double fates_mort_scalar_cstarvation(fates_pft) ;
+ fates_mort_scalar_cstarvation:units = "1/yr" ;
+ fates_mort_scalar_cstarvation:long_name = "maximum mortality rate from carbon starvation" ;
+ double fates_mort_scalar_hydrfailure(fates_pft) ;
+ fates_mort_scalar_hydrfailure:units = "1/yr" ;
+ fates_mort_scalar_hydrfailure:long_name = "maximum mortality rate from hydraulic failure" ;
+ double fates_mort_upthresh_cstarvation(fates_pft) ;
+ fates_mort_upthresh_cstarvation:units = "unitless" ;
+ fates_mort_upthresh_cstarvation:long_name = "threshold for storage biomass (relative to target leaf biomass) above which carbon starvation is zero" ;
+ double fates_nonhydro_smpsc(fates_pft) ;
+ fates_nonhydro_smpsc:units = "mm" ;
+ fates_nonhydro_smpsc:long_name = "Soil water potential at full stomatal closure" ;
+ double fates_nonhydro_smpso(fates_pft) ;
+ fates_nonhydro_smpso:units = "mm" ;
+ fates_nonhydro_smpso:long_name = "Soil water potential at full stomatal opening" ;
+ double fates_phen_cold_size_threshold(fates_pft) ;
+ fates_phen_cold_size_threshold:units = "cm" ;
+ fates_phen_cold_size_threshold:long_name = "the dbh size above which will lead to phenology-related stem and leaf drop" ;
+ double fates_phen_drought_threshold(fates_pft) ;
+ fates_phen_drought_threshold:units = "m3/m3 or mm" ;
+ fates_phen_drought_threshold:long_name = "threshold for drought phenology (or lower threshold for semi-deciduous PFTs); the quantity depends on the sign: if positive, the threshold is volumetric soil moisture (m3/m3). If negative, the threshold is soil matric potentical (mm)" ;
+ double fates_phen_evergreen(fates_pft) ;
+ fates_phen_evergreen:units = "logical flag" ;
+ fates_phen_evergreen:long_name = "Binary flag for evergreen leaf habit" ;
+ double fates_phen_flush_fraction(fates_pft) ;
+ fates_phen_flush_fraction:units = "fraction" ;
+ fates_phen_flush_fraction:long_name = "Upon bud-burst, the maximum fraction of storage carbon used for flushing leaves" ;
+ double fates_phen_fnrt_drop_fraction(fates_pft) ;
+ fates_phen_fnrt_drop_fraction:units = "fraction" ;
+ fates_phen_fnrt_drop_fraction:long_name = "fraction of fine roots to drop during drought/cold" ;
+ double fates_phen_mindaysoff(fates_pft) ;
+ fates_phen_mindaysoff:units = "days" ;
+ fates_phen_mindaysoff:long_name = "day threshold compared against days since leaves abscised (shed)" ;
+ double fates_phen_moist_threshold(fates_pft) ;
+ fates_phen_moist_threshold:units = "m3/m3 or mm" ;
+ fates_phen_moist_threshold:long_name = "upper threshold for drought phenology (only for drought semi-deciduous PFTs); the quantity depends on the sign: if positive, the threshold is volumetric soil moisture (m3/m3). If negative, the threshold is soil matric potentical (mm)" ;
+ double fates_phen_season_decid(fates_pft) ;
+ fates_phen_season_decid:units = "logical flag" ;
+ fates_phen_season_decid:long_name = "Binary flag for seasonal-deciduous leaf habit" ;
+ double fates_phen_stem_drop_fraction(fates_pft) ;
+ fates_phen_stem_drop_fraction:units = "fraction" ;
+ fates_phen_stem_drop_fraction:long_name = "fraction of stems to drop for non-woody species during drought/cold" ;
+ double fates_phen_stress_decid(fates_pft) ;
+ fates_phen_stress_decid:units = "logical flag" ;
+ fates_phen_stress_decid:long_name = "Flag for stress/drought-deciduous leaf habit. 0 - not stress deciduous; 1 - default drought deciduous (two target states only, fully flushed or fully abscised); 2 - semi-deciduous" ;
+ double fates_prescribed_npp_canopy(fates_pft) ;
+ fates_prescribed_npp_canopy:units = "kgC / m^2 / yr" ;
+ fates_prescribed_npp_canopy:long_name = "NPP per unit crown area of canopy trees for prescribed physiology mode" ;
+ double fates_prescribed_npp_understory(fates_pft) ;
+ fates_prescribed_npp_understory:units = "kgC / m^2 / yr" ;
+ fates_prescribed_npp_understory:long_name = "NPP per unit crown area of understory trees for prescribed physiology mode" ;
+ double fates_rad_leaf_clumping_index(fates_pft) ;
+ fates_rad_leaf_clumping_index:units = "fraction (0-1)" ;
+ fates_rad_leaf_clumping_index:long_name = "factor describing how much self-occlusion of leaf scattering elements decreases light interception" ;
+ double fates_rad_leaf_rhonir(fates_pft) ;
+ fates_rad_leaf_rhonir:units = "fraction" ;
+ fates_rad_leaf_rhonir:long_name = "Leaf reflectance: near-IR" ;
+ double fates_rad_leaf_rhovis(fates_pft) ;
+ fates_rad_leaf_rhovis:units = "fraction" ;
+ fates_rad_leaf_rhovis:long_name = "Leaf reflectance: visible" ;
+ double fates_rad_leaf_taunir(fates_pft) ;
+ fates_rad_leaf_taunir:units = "fraction" ;
+ fates_rad_leaf_taunir:long_name = "Leaf transmittance: near-IR" ;
+ double fates_rad_leaf_tauvis(fates_pft) ;
+ fates_rad_leaf_tauvis:units = "fraction" ;
+ fates_rad_leaf_tauvis:long_name = "Leaf transmittance: visible" ;
+ double fates_rad_leaf_xl(fates_pft) ;
+ fates_rad_leaf_xl:units = "unitless" ;
+ fates_rad_leaf_xl:long_name = "Leaf/stem orientation index" ;
+ double fates_rad_stem_rhonir(fates_pft) ;
+ fates_rad_stem_rhonir:units = "fraction" ;
+ fates_rad_stem_rhonir:long_name = "Stem reflectance: near-IR" ;
+ double fates_rad_stem_rhovis(fates_pft) ;
+ fates_rad_stem_rhovis:units = "fraction" ;
+ fates_rad_stem_rhovis:long_name = "Stem reflectance: visible" ;
+ double fates_rad_stem_taunir(fates_pft) ;
+ fates_rad_stem_taunir:units = "fraction" ;
+ fates_rad_stem_taunir:long_name = "Stem transmittance: near-IR" ;
+ double fates_rad_stem_tauvis(fates_pft) ;
+ fates_rad_stem_tauvis:units = "fraction" ;
+ fates_rad_stem_tauvis:long_name = "Stem transmittance: visible" ;
+ double fates_recruit_height_min(fates_pft) ;
+ fates_recruit_height_min:units = "m" ;
+ fates_recruit_height_min:long_name = "the minimum height (ie starting height) of a newly recruited plant" ;
+ double fates_recruit_init_density(fates_pft) ;
+ fates_recruit_init_density:units = "stems/m2" ;
+ fates_recruit_init_density:long_name = "initial seedling density for a cold-start near-bare-ground simulation. If negative sets initial tree dbh - only to be used in nocomp mode" ;
+ double fates_recruit_prescribed_rate(fates_pft) ;
+ fates_recruit_prescribed_rate:units = "n/yr" ;
+ fates_recruit_prescribed_rate:long_name = "recruitment rate for prescribed physiology mode" ;
+ double fates_recruit_seed_alloc(fates_pft) ;
+ fates_recruit_seed_alloc:units = "fraction" ;
+ fates_recruit_seed_alloc:long_name = "fraction of available carbon balance allocated to seeds" ;
+ double fates_recruit_seed_alloc_mature(fates_pft) ;
+ fates_recruit_seed_alloc_mature:units = "fraction" ;
+ fates_recruit_seed_alloc_mature:long_name = "fraction of available carbon balance allocated to seeds in mature plants (adds to fates_seed_alloc)" ;
+ double fates_recruit_seed_dbh_repro_threshold(fates_pft) ;
+ fates_recruit_seed_dbh_repro_threshold:units = "cm" ;
+ fates_recruit_seed_dbh_repro_threshold:long_name = "the diameter where the plant will increase allocation to the seed pool by fraction: fates_recruit_seed_alloc_mature" ;
+ double fates_recruit_seed_germination_rate(fates_pft) ;
+ fates_recruit_seed_germination_rate:units = "yr-1" ;
+ fates_recruit_seed_germination_rate:long_name = "fraction of seeds that germinate per year" ;
+ double fates_recruit_seed_supplement(fates_pft) ;
+ fates_recruit_seed_supplement:units = "KgC/m2/yr" ;
+ fates_recruit_seed_supplement:long_name = "Supplemental external seed rain source term (non-mass conserving)" ;
+ double fates_seed_dispersal_fraction(fates_pft) ;
+ fates_seed_dispersal_fraction:units = "fraction" ;
+ fates_seed_dispersal_fraction:long_name = "fraction of seed rain to be dispersed to other grid cells" ;
+ double fates_seed_dispersal_max_dist(fates_pft) ;
+ fates_seed_dispersal_max_dist:units = "m" ;
+ fates_seed_dispersal_max_dist:long_name = "maximum seed dispersal distance for a given pft" ;
+ double fates_seed_dispersal_pdf_scale(fates_pft) ;
+ fates_seed_dispersal_pdf_scale:units = "unitless" ;
+ fates_seed_dispersal_pdf_scale:long_name = "seed dispersal probability density function scale parameter, A, Table 1 Bullock et al 2016" ;
+ double fates_seed_dispersal_pdf_shape(fates_pft) ;
+ fates_seed_dispersal_pdf_shape:units = "unitless" ;
+ fates_seed_dispersal_pdf_shape:long_name = "seed dispersal probability density function shape parameter, B, Table 1 Bullock et al 2016" ;
+ double fates_stoich_nitr(fates_plant_organs, fates_pft) ;
+ fates_stoich_nitr:units = "gN/gC" ;
+ fates_stoich_nitr:long_name = "target nitrogen concentration (ratio with carbon) of organs" ;
+ double fates_stoich_phos(fates_plant_organs, fates_pft) ;
+ fates_stoich_phos:units = "gP/gC" ;
+ fates_stoich_phos:long_name = "target phosphorus concentration (ratio with carbon) of organs" ;
+ double fates_trim_inc(fates_pft) ;
+ fates_trim_inc:units = "m2/m2" ;
+ fates_trim_inc:long_name = "Arbitrary incremental change in trimming function." ;
+ double fates_trim_limit(fates_pft) ;
+ fates_trim_limit:units = "m2/m2" ;
+ fates_trim_limit:long_name = "Arbitrary limit to reductions in leaf area with stress" ;
+ double fates_trs_repro_alloc_a(fates_pft) ;
+ fates_trs_repro_alloc_a:units = "fraction" ;
+ fates_trs_repro_alloc_a:long_name = "shape parameter for sigmoidal function relating dbh to reproductive allocation" ;
+ double fates_trs_repro_alloc_b(fates_pft) ;
+ fates_trs_repro_alloc_b:units = "fraction" ;
+ fates_trs_repro_alloc_b:long_name = "intercept parameter for sigmoidal function relating dbh to reproductive allocation" ;
+ double fates_trs_repro_frac_seed(fates_pft) ;
+ fates_trs_repro_frac_seed:units = "fraction" ;
+ fates_trs_repro_frac_seed:long_name = "fraction of reproductive mass that is seed" ;
+ double fates_trs_seedling_a_emerg(fates_pft) ;
+ fates_trs_seedling_a_emerg:units = "day -1" ;
+ fates_trs_seedling_a_emerg:long_name = "mean fraction of seed bank emerging" ;
+ double fates_trs_seedling_b_emerg(fates_pft) ;
+ fates_trs_seedling_b_emerg:units = "day -1" ;
+ fates_trs_seedling_b_emerg:long_name = "seedling emergence sensitivity to soil moisture" ;
+ double fates_trs_seedling_background_mort(fates_pft) ;
+ fates_trs_seedling_background_mort:units = "yr-1" ;
+ fates_trs_seedling_background_mort:long_name = "background seedling mortality rate" ;
+ double fates_trs_seedling_h2o_mort_a(fates_pft) ;
+ fates_trs_seedling_h2o_mort_a:units = "-" ;
+ fates_trs_seedling_h2o_mort_a:long_name = "coefficient in moisture-based seedling mortality" ;
+ double fates_trs_seedling_h2o_mort_b(fates_pft) ;
+ fates_trs_seedling_h2o_mort_b:units = "-" ;
+ fates_trs_seedling_h2o_mort_b:long_name = "coefficient in moisture-based seedling mortality" ;
+ double fates_trs_seedling_h2o_mort_c(fates_pft) ;
+ fates_trs_seedling_h2o_mort_c:units = "-" ;
+ fates_trs_seedling_h2o_mort_c:long_name = "coefficient in moisture-based seedling mortality" ;
+ double fates_trs_seedling_light_mort_a(fates_pft) ;
+ fates_trs_seedling_light_mort_a:units = "-" ;
+ fates_trs_seedling_light_mort_a:long_name = "light-based seedling mortality coefficient" ;
+ double fates_trs_seedling_light_mort_b(fates_pft) ;
+ fates_trs_seedling_light_mort_b:units = "-" ;
+ fates_trs_seedling_light_mort_b:long_name = "light-based seedling mortality coefficient" ;
+ double fates_trs_seedling_light_rec_a(fates_pft) ;
+ fates_trs_seedling_light_rec_a:units = "-" ;
+ fates_trs_seedling_light_rec_a:long_name = "coefficient in light-based seedling to sapling transition" ;
+ double fates_trs_seedling_light_rec_b(fates_pft) ;
+ fates_trs_seedling_light_rec_b:units = "-" ;
+ fates_trs_seedling_light_rec_b:long_name = "coefficient in light-based seedling to sapling transition" ;
+ double fates_trs_seedling_mdd_crit(fates_pft) ;
+ fates_trs_seedling_mdd_crit:units = "mm H2O day" ;
+ fates_trs_seedling_mdd_crit:long_name = "critical moisture deficit (suction) day accumulation for seedling moisture-based seedling mortality to begin" ;
+ double fates_trs_seedling_par_crit_germ(fates_pft) ;
+ fates_trs_seedling_par_crit_germ:units = "MJ m-2 day-1" ;
+ fates_trs_seedling_par_crit_germ:long_name = "critical light level for germination" ;
+ double fates_trs_seedling_psi_crit(fates_pft) ;
+ fates_trs_seedling_psi_crit:units = "mm H2O" ;
+ fates_trs_seedling_psi_crit:long_name = "critical soil moisture (suction) for seedling stress" ;
+ double fates_trs_seedling_psi_emerg(fates_pft) ;
+ fates_trs_seedling_psi_emerg:units = "mm h20 suction" ;
+ fates_trs_seedling_psi_emerg:long_name = "critical soil moisture for seedling emergence" ;
+ double fates_trs_seedling_root_depth(fates_pft) ;
+ fates_trs_seedling_root_depth:units = "m" ;
+ fates_trs_seedling_root_depth:long_name = "rooting depth of seedlings" ;
+ double fates_turb_displar(fates_pft) ;
+ fates_turb_displar:units = "unitless" ;
+ fates_turb_displar:long_name = "Ratio of displacement height to canopy top height" ;
+ double fates_turb_leaf_diameter(fates_pft) ;
+ fates_turb_leaf_diameter:units = "m" ;
+ fates_turb_leaf_diameter:long_name = "Characteristic leaf dimension" ;
+ double fates_turb_z0mr(fates_pft) ;
+ fates_turb_z0mr:units = "unitless" ;
+ fates_turb_z0mr:long_name = "Ratio of momentum roughness length to canopy top height" ;
+ double fates_turnover_branch(fates_pft) ;
+ fates_turnover_branch:units = "yr" ;
+ fates_turnover_branch:long_name = "turnover time of branches" ;
+ double fates_turnover_fnrt(fates_pft) ;
+ fates_turnover_fnrt:units = "yr" ;
+ fates_turnover_fnrt:long_name = "root longevity (alternatively, turnover time)" ;
+ double fates_turnover_leaf(fates_leafage_class, fates_pft) ;
+ fates_turnover_leaf:units = "yr" ;
+ fates_turnover_leaf:long_name = "Leaf longevity (ie turnover timescale). For drought-deciduous PFTs, this also indicates the maximum length of the growing (i.e., leaves on) season." ;
+ double fates_turnover_senleaf_fdrought(fates_pft) ;
+ fates_turnover_senleaf_fdrought:units = "unitless[0-1]" ;
+ fates_turnover_senleaf_fdrought:long_name = "multiplication factor for leaf longevity of senescent leaves during drought" ;
+ double fates_wood_density(fates_pft) ;
+ fates_wood_density:units = "g/cm3" ;
+ fates_wood_density:long_name = "mean density of woody tissue in plant" ;
+ double fates_woody(fates_pft) ;
+ fates_woody:units = "logical flag" ;
+ fates_woody:long_name = "Binary woody lifeform flag" ;
+ double fates_hlm_pft_map(fates_hlm_pftno, fates_pft) ;
+ fates_hlm_pft_map:units = "area fraction" ;
+ fates_hlm_pft_map:long_name = "In fixed biogeog mode, fraction of HLM area associated with each FATES PFT" ;
+ double fates_fire_FBD(fates_litterclass) ;
+ fates_fire_FBD:units = "kg Biomass/m3" ;
+ fates_fire_FBD:long_name = "fuel bulk density" ;
+ double fates_fire_low_moisture_Coeff(fates_litterclass) ;
+ fates_fire_low_moisture_Coeff:units = "NA" ;
+ fates_fire_low_moisture_Coeff:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ;
+ double fates_fire_low_moisture_Slope(fates_litterclass) ;
+ fates_fire_low_moisture_Slope:units = "NA" ;
+ fates_fire_low_moisture_Slope:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ;
+ double fates_fire_mid_moisture(fates_litterclass) ;
+ fates_fire_mid_moisture:units = "NA" ;
+ fates_fire_mid_moisture:long_name = "spitfire litter moisture threshold to be considered medium dry" ;
+ double fates_fire_mid_moisture_Coeff(fates_litterclass) ;
+ fates_fire_mid_moisture_Coeff:units = "NA" ;
+ fates_fire_mid_moisture_Coeff:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ;
+ double fates_fire_mid_moisture_Slope(fates_litterclass) ;
+ fates_fire_mid_moisture_Slope:units = "NA" ;
+ fates_fire_mid_moisture_Slope:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ;
+ double fates_fire_min_moisture(fates_litterclass) ;
+ fates_fire_min_moisture:units = "NA" ;
+ fates_fire_min_moisture:long_name = "spitfire litter moisture threshold to be considered very dry" ;
+ double fates_fire_SAV(fates_litterclass) ;
+ fates_fire_SAV:units = "cm-1" ;
+ fates_fire_SAV:long_name = "fuel surface area to volume ratio" ;
+ double fates_frag_maxdecomp(fates_litterclass) ;
+ fates_frag_maxdecomp:units = "yr-1" ;
+ fates_frag_maxdecomp:long_name = "maximum rate of litter & CWD transfer from non-decomposing class into decomposing class" ;
+ double fates_frag_cwd_frac(fates_NCWD) ;
+ fates_frag_cwd_frac:units = "fraction" ;
+ fates_frag_cwd_frac:long_name = "fraction of woody (bdead+bsw) biomass destined for CWD pool" ;
+ double fates_maxpatches_by_landuse(fates_landuseclass) ;
+ fates_maxpatches_by_landuse:units = "count" ;
+ fates_maxpatches_by_landuse:long_name = "maximum number of patches per site on each land use type" ;
+ double fates_canopy_closure_thresh ;
+ fates_canopy_closure_thresh:units = "unitless" ;
+ fates_canopy_closure_thresh:long_name = "tree canopy coverage at which crown area allometry changes from savanna to forest value" ;
+ double fates_cnp_eca_plant_escalar ;
+ fates_cnp_eca_plant_escalar:units = "" ;
+ fates_cnp_eca_plant_escalar:long_name = "scaling factor for plant fine root biomass to calculate nutrient carrier enzyme abundance (ECA)" ;
+ double fates_cohort_age_fusion_tol ;
+ fates_cohort_age_fusion_tol:units = "unitless" ;
+ fates_cohort_age_fusion_tol:long_name = "minimum fraction in differece in cohort age between cohorts." ;
+ double fates_cohort_size_fusion_tol ;
+ fates_cohort_size_fusion_tol:units = "unitless" ;
+ fates_cohort_size_fusion_tol:long_name = "minimum fraction in difference in dbh between cohorts" ;
+ double fates_comp_excln ;
+ fates_comp_excln:units = "none" ;
+ fates_comp_excln:long_name = "IF POSITIVE: weighting factor (exponent on dbh) for canopy layer exclusion and promotion, IF NEGATIVE: switch to use deterministic height sorting" ;
+ double fates_damage_canopy_layer_code ;
+ fates_damage_canopy_layer_code:units = "unitless" ;
+ fates_damage_canopy_layer_code:long_name = "Integer code that decides whether damage affects canopy trees (1), understory trees (2)" ;
+ double fates_damage_event_code ;
+ fates_damage_event_code:units = "unitless" ;
+ fates_damage_event_code:long_name = "Integer code that options how damage events are structured" ;
+ double fates_dev_arbitrary ;
+ fates_dev_arbitrary:units = "unknown" ;
+ fates_dev_arbitrary:long_name = "Unassociated free parameter that developers can use for testing arbitrary new hypotheses" ;
+ double fates_fire_active_crown_fire ;
+ fates_fire_active_crown_fire:units = "0 or 1" ;
+ fates_fire_active_crown_fire:long_name = "flag, 1=active crown fire 0=no active crown fire" ;
+ double fates_fire_cg_strikes ;
+ fates_fire_cg_strikes:units = "fraction (0-1)" ;
+ fates_fire_cg_strikes:long_name = "fraction of cloud to ground lightning strikes" ;
+ double fates_fire_drying_ratio ;
+ fates_fire_drying_ratio:units = "NA" ;
+ fates_fire_drying_ratio:long_name = "spitfire parameter, fire drying ratio for fuel moisture, alpha_FMC EQ 6 Thonicke et al 2010" ;
+ double fates_fire_durat_slope ;
+ fates_fire_durat_slope:units = "NA" ;
+ fates_fire_durat_slope:long_name = "spitfire parameter, fire max duration slope, Equation 14 Thonicke et al 2010" ;
+ double fates_fire_fdi_a ;
+ fates_fire_fdi_a:units = "NA" ;
+ fates_fire_fdi_a:long_name = "spitfire parameter, fire danger index, EQ 5 Thonicke et al 2010" ;
+ double fates_fire_fdi_alpha ;
+ fates_fire_fdi_alpha:units = "NA" ;
+ fates_fire_fdi_alpha:long_name = "spitfire parameter, EQ 7 Venevsky et al. GCB 2002,(modified EQ 8 Thonicke et al. 2010) " ;
+ double fates_fire_fdi_b ;
+ fates_fire_fdi_b:units = "NA" ;
+ fates_fire_fdi_b:long_name = "spitfire parameter, fire danger index, EQ 5 Thonicke et al 2010 " ;
+ double fates_fire_fuel_energy ;
+ fates_fire_fuel_energy:units = "kJ/kg" ;
+ fates_fire_fuel_energy:long_name = "spitfire parameter, heat content of fuel" ;
+ double fates_fire_max_durat ;
+ fates_fire_max_durat:units = "minutes" ;
+ fates_fire_max_durat:long_name = "spitfire parameter, fire maximum duration, Equation 14 Thonicke et al 2010" ;
+ double fates_fire_miner_damp ;
+ fates_fire_miner_damp:units = "NA" ;
+ fates_fire_miner_damp:long_name = "spitfire parameter, mineral-dampening coefficient EQ A1 Thonicke et al 2010 " ;
+ double fates_fire_miner_total ;
+ fates_fire_miner_total:units = "fraction" ;
+ fates_fire_miner_total:long_name = "spitfire parameter, total mineral content, Table A1 Thonicke et al 2010" ;
+ double fates_fire_nignitions ;
+ fates_fire_nignitions:units = "ignitions per year per km2" ;
+ fates_fire_nignitions:long_name = "number of annual ignitions per square km" ;
+ double fates_fire_part_dens ;
+ fates_fire_part_dens:units = "kg/m2" ;
+ fates_fire_part_dens:long_name = "spitfire parameter, oven dry particle density, Table A1 Thonicke et al 2010" ;
+ double fates_fire_threshold ;
+ fates_fire_threshold:units = "kW/m" ;
+ fates_fire_threshold:long_name = "spitfire parameter, fire intensity threshold for tracking fires that spread" ;
+ double fates_frag_cwd_fcel ;
+ fates_frag_cwd_fcel:units = "unitless" ;
+ fates_frag_cwd_fcel:long_name = "Cellulose fraction for CWD" ;
+ double fates_frag_cwd_flig ;
+ fates_frag_cwd_flig:units = "unitless" ;
+ fates_frag_cwd_flig:long_name = "Lignin fraction of coarse woody debris" ;
+ double fates_hydro_kmax_rsurf1 ;
+ fates_hydro_kmax_rsurf1:units = "kg water/m2 root area/Mpa/s" ;
+ fates_hydro_kmax_rsurf1:long_name = "maximum conducitivity for unit root surface (into root)" ;
+ double fates_hydro_kmax_rsurf2 ;
+ fates_hydro_kmax_rsurf2:units = "kg water/m2 root area/Mpa/s" ;
+ fates_hydro_kmax_rsurf2:long_name = "maximum conducitivity for unit root surface (out of root)" ;
+ double fates_hydro_psi0 ;
+ fates_hydro_psi0:units = "MPa" ;
+ fates_hydro_psi0:long_name = "sapwood water potential at saturation" ;
+ double fates_hydro_psicap ;
+ fates_hydro_psicap:units = "MPa" ;
+ fates_hydro_psicap:long_name = "sapwood water potential at which capillary reserves exhausted" ;
+ double fates_hydro_solver ;
+ fates_hydro_solver:units = "unitless" ;
+ fates_hydro_solver:long_name = "switch designating which numerical solver for plant hydraulics, 1 = 1D taylor, 2 = 2D Picard, 3 = 2D Newton (deprecated)" ;
+ double fates_landuse_logging_coll_under_frac ;
+ fates_landuse_logging_coll_under_frac:units = "fraction" ;
+ fates_landuse_logging_coll_under_frac:long_name = "Fraction of stems killed in the understory when logging generates disturbance" ;
+ double fates_landuse_logging_collateral_frac ;
+ fates_landuse_logging_collateral_frac:units = "fraction" ;
+ fates_landuse_logging_collateral_frac:long_name = "Fraction of large stems in upperstory that die from logging collateral damage" ;
+ double fates_landuse_logging_dbhmax ;
+ fates_landuse_logging_dbhmax:units = "cm" ;
+ fates_landuse_logging_dbhmax:long_name = "Maximum dbh below which logging is applied (unset values flag this to be unused)" ;
+ double fates_landuse_logging_dbhmax_infra ;
+ fates_landuse_logging_dbhmax_infra:units = "cm" ;
+ fates_landuse_logging_dbhmax_infra:long_name = "Tree diameter, above which infrastructure from logging does not impact damage or mortality." ;
+ double fates_landuse_logging_dbhmin ;
+ fates_landuse_logging_dbhmin:units = "cm" ;
+ fates_landuse_logging_dbhmin:long_name = "Minimum dbh at which logging is applied" ;
+ double fates_landuse_logging_direct_frac ;
+ fates_landuse_logging_direct_frac:units = "fraction" ;
+ fates_landuse_logging_direct_frac:long_name = "Fraction of stems logged directly per event" ;
+ double fates_landuse_logging_event_code ;
+ fates_landuse_logging_event_code:units = "unitless" ;
+ fates_landuse_logging_event_code:long_name = "Integer code that options how logging events are structured" ;
+ double fates_landuse_logging_export_frac ;
+ fates_landuse_logging_export_frac:units = "fraction" ;
+ fates_landuse_logging_export_frac:long_name = "fraction of trunk product being shipped offsite, the leftovers will be left onsite as large CWD" ;
+ double fates_landuse_logging_mechanical_frac ;
+ fates_landuse_logging_mechanical_frac:units = "fraction" ;
+ fates_landuse_logging_mechanical_frac:long_name = "Fraction of stems killed due infrastructure an other mechanical means" ;
+ double fates_landuse_pprodharv10_forest_mean ;
+ fates_landuse_pprodharv10_forest_mean:units = "fraction" ;
+ fates_landuse_pprodharv10_forest_mean:long_name = "mean harvest mortality proportion of deadstem to 10-yr product (pprodharv10) of all woody PFT types" ;
+ double fates_leaf_photo_temp_acclim_thome_time ;
+ fates_leaf_photo_temp_acclim_thome_time:units = "years" ;
+ fates_leaf_photo_temp_acclim_thome_time:long_name = "Length of the window for the long-term (i.e. T_home in Kumarathunge et al 2019) exponential moving average (ema) of vegetation temperature used in photosynthesis temperature acclimation (used if fates_leaf_photo_tempsens_model = 2)" ;
+ double fates_leaf_photo_temp_acclim_timescale ;
+ fates_leaf_photo_temp_acclim_timescale:units = "days" ;
+ fates_leaf_photo_temp_acclim_timescale:long_name = "Length of the window for the exponential moving average (ema) of vegetation temperature used in photosynthesis temperature acclimation (used if fates_maintresp_leaf_model=2 or fates_leaf_photo_tempsens_model = 2)" ;
+ double fates_leaf_photo_tempsens_model ;
+ fates_leaf_photo_tempsens_model:units = "unitless" ;
+ fates_leaf_photo_tempsens_model:long_name = "switch for choosing the model that defines the temperature sensitivity of photosynthetic parameters (vcmax, jmax). 1=non-acclimating; 2=Kumarathunge et al 2019" ;
+ double fates_leaf_stomatal_assim_model ;
+ fates_leaf_stomatal_assim_model:units = "unitless" ;
+ fates_leaf_stomatal_assim_model:long_name = "a switch designating whether to use net (1) or gross (2) assimilation in the stomatal model" ;
+ double fates_leaf_stomatal_model ;
+ fates_leaf_stomatal_model:units = "unitless" ;
+ fates_leaf_stomatal_model:long_name = "switch for choosing between Ball-Berry (1) stomatal conductance model and Medlyn (2) model" ;
+ double fates_leaf_theta_cj_c3 ;
+ fates_leaf_theta_cj_c3:units = "unitless" ;
+ fates_leaf_theta_cj_c3:long_name = "Empirical curvature parameter for ac, aj photosynthesis co-limitation in c3 plants" ;
+ double fates_leaf_theta_cj_c4 ;
+ fates_leaf_theta_cj_c4:units = "unitless" ;
+ fates_leaf_theta_cj_c4:long_name = "Empirical curvature parameter for ac, aj photosynthesis co-limitation in c4 plants" ;
+ double fates_maintresp_leaf_model ;
+ fates_maintresp_leaf_model:units = "unitless" ;
+ fates_maintresp_leaf_model:long_name = "switch for choosing between maintenance respiration models. 1=Ryan (1991), 2=Atkin et al., (2017)" ;
+ double fates_maintresp_nonleaf_baserate ;
+ fates_maintresp_nonleaf_baserate:units = "gC/gN/s" ;
+ fates_maintresp_nonleaf_baserate:long_name = "Base maintenance respiration rate for plant tissues, using Ryan 1991" ;
+ double fates_maxcohort ;
+ fates_maxcohort:units = "count" ;
+ fates_maxcohort:long_name = "maximum number of cohorts per patch. Actual number of cohorts also depend on cohort fusion tolerances" ;
+ double fates_mort_disturb_frac ;
+ fates_mort_disturb_frac:units = "fraction" ;
+ fates_mort_disturb_frac:long_name = "fraction of canopy mortality that results in disturbance (i.e. transfer of area from new to old patch)" ;
+ double fates_mort_understorey_death ;
+ fates_mort_understorey_death:units = "fraction" ;
+ fates_mort_understorey_death:long_name = "fraction of plants in understorey cohort impacted by overstorey tree-fall" ;
+ double fates_patch_fusion_tol ;
+ fates_patch_fusion_tol:units = "unitless" ;
+ fates_patch_fusion_tol:long_name = "minimum fraction in difference in profiles between patches" ;
+ double fates_phen_chilltemp ;
+ fates_phen_chilltemp:units = "degrees C" ;
+ fates_phen_chilltemp:long_name = "chilling day counting threshold for vegetation" ;
+ double fates_phen_coldtemp ;
+ fates_phen_coldtemp:units = "degrees C" ;
+ fates_phen_coldtemp:long_name = "vegetation temperature exceedance that flags a cold-day for leaf-drop" ;
+ double fates_phen_gddthresh_a ;
+ fates_phen_gddthresh_a:units = "none" ;
+ fates_phen_gddthresh_a:long_name = "GDD accumulation function, intercept parameter: gdd_thesh = a + b exp(c*ncd)" ;
+ double fates_phen_gddthresh_b ;
+ fates_phen_gddthresh_b:units = "none" ;
+ fates_phen_gddthresh_b:long_name = "GDD accumulation function, multiplier parameter: gdd_thesh = a + b exp(c*ncd)" ;
+ double fates_phen_gddthresh_c ;
+ fates_phen_gddthresh_c:units = "none" ;
+ fates_phen_gddthresh_c:long_name = "GDD accumulation function, exponent parameter: gdd_thesh = a + b exp(c*ncd)" ;
+ double fates_phen_mindayson ;
+ fates_phen_mindayson:units = "days" ;
+ fates_phen_mindayson:long_name = "day threshold compared against days since leaves became on-allometry" ;
+ double fates_phen_ncolddayslim ;
+ fates_phen_ncolddayslim:units = "days" ;
+ fates_phen_ncolddayslim:long_name = "day threshold exceedance for temperature leaf-drop" ;
+ double fates_q10_froz ;
+ fates_q10_froz:units = "unitless" ;
+ fates_q10_froz:long_name = "Q10 for frozen-soil respiration rates" ;
+ double fates_q10_mr ;
+ fates_q10_mr:units = "unitless" ;
+ fates_q10_mr:long_name = "Q10 for maintenance respiration" ;
+ double fates_rad_model ;
+ fates_rad_model:units = "unitless" ;
+ fates_rad_model:long_name = "switch designating the model for canopy radiation, 1 = Norman, 2 = Two-stream (experimental)" ;
+ double fates_regeneration_model ;
+ fates_regeneration_model:units = "-" ;
+ fates_regeneration_model:long_name = "switch for choosing between FATES\'s: 1) default regeneration scheme , 2) the Tree Recruitment Scheme (Hanbury-Brown et al., 2022), or (3) the Tree Recruitment Scheme without seedling dynamics" ;
+ double fates_soil_salinity ;
+ fates_soil_salinity:units = "ppt" ;
+ fates_soil_salinity:long_name = "soil salinity used for model when not coupled to dynamic soil salinity" ;
+ double fates_trs_seedling2sap_par_timescale ;
+ fates_trs_seedling2sap_par_timescale:units = "days" ;
+ fates_trs_seedling2sap_par_timescale:long_name = "Length of the window for the exponential moving average of par at the seedling layer used to calculate seedling to sapling transition rates" ;
+ double fates_trs_seedling_emerg_h2o_timescale ;
+ fates_trs_seedling_emerg_h2o_timescale:units = "days" ;
+ fates_trs_seedling_emerg_h2o_timescale:long_name = "Length of the window for the exponential moving average of smp used to calculate seedling emergence" ;
+ double fates_trs_seedling_mdd_timescale ;
+ fates_trs_seedling_mdd_timescale:units = "days" ;
+ fates_trs_seedling_mdd_timescale:long_name = "Length of the window for the exponential moving average of moisture deficit days used to calculate seedling mortality" ;
+ double fates_trs_seedling_mort_par_timescale ;
+ fates_trs_seedling_mort_par_timescale:units = "days" ;
+ fates_trs_seedling_mort_par_timescale:long_name = "Length of the window for the exponential moving average of par at the seedling layer used to calculate seedling mortality" ;
+ double fates_vai_top_bin_width ;
+ fates_vai_top_bin_width:units = "m2/m2" ;
+ fates_vai_top_bin_width:long_name = "width in VAI units of uppermost leaf+stem layer scattering element in each canopy layer" ;
+ double fates_vai_width_increase_factor ;
+ fates_vai_width_increase_factor:units = "unitless" ;
+ fates_vai_width_increase_factor:long_name = "factor by which each leaf+stem scattering element increases in VAI width (1 = uniform spacing)" ;
+
+// global attributes:
+ :history = "This file was generated by BatchPatchParams.py:\nCDL Base File = archive/api24.1.0_101722_fates_params_default.cdl\nXML patch file = archive/api24.1.0_101722_patch_params.xml" ;
+data:
+
+ fates_history_ageclass_bin_edges = 0, 1, 2, 5, 10, 20, 50 ;
+
+ fates_history_coageclass_bin_edges = 0, 5 ;
+
+ fates_history_height_bin_edges = 0, 0.1, 0.3, 1, 3, 10 ;
+
+ fates_history_damage_bin_edges = 0, 80 ;
+
+ fates_history_sizeclass_bin_edges = 0, 5, 10, 15, 20, 30, 40, 50, 60, 70,
+ 80, 90, 100 ;
+
+ fates_alloc_organ_id = 1, 2, 3, 6 ;
+
+ fates_hydro_htftype_node = 1, 1, 1, 1 ;
+
+ fates_pftname =
+ "broadleaf_evergreen_tropical_tree ",
+ "needleleaf_evergreen_extratrop_tree ",
+ "needleleaf_colddecid_extratrop_tree ",
+ "broadleaf_evergreen_extratrop_tree ",
+ "broadleaf_hydrodecid_tropical_tree ",
+ "broadleaf_colddecid_extratrop_tree ",
+ "broadleaf_evergreen_extratrop_shrub ",
+ "broadleaf_hydrodecid_extratrop_shrub ",
+ "broadleaf_colddecid_extratrop_shrub ",
+ "arctic_c3_grass ",
+ "cool_c3_grass ",
+ "c4_grass " ;
+
+ fates_hydro_organ_name =
+ "leaf ",
+ "stem ",
+ "transporting root ",
+ "absorbing root " ;
+
+ fates_alloc_organ_name =
+ "leaf",
+ "fine root",
+ "sapwood",
+ "structure" ;
+
+ fates_landuseclass_name =
+ "primaryland",
+ "secondaryland",
+ "rangeland",
+ "pastureland",
+ "cropland" ;
+
+ fates_litterclass_name =
+ "twig ",
+ "small branch ",
+ "large branch ",
+ "trunk ",
+ "dead leaves ",
+ "live grass " ;
+
+ fates_alloc_organ_priority =
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ;
+
+ fates_alloc_storage_cushion = 1.2, 1.2, 1.2, 1.2, 2.4, 1.2, 1.2, 2.4, 1.2,
+ 1.2, 1.2, 1.2 ;
+
+ fates_alloc_store_priority_frac = 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8,
+ 0.8, 0.8, 0.8, 0.8 ;
+
+ fates_allom_agb1 = 0.0673, 0.1364012, 0.0393057, 0.2653695, 0.0673,
+ 0.0728698, 0.06896, 0.06896, 0.06896, 0.01, 0.01, 0.01 ;
+
+ fates_allom_agb2 = 0.976, 0.9449041, 1.087335, 0.8321321, 0.976, 1.0373211,
+ 0.572, 0.572, 0.572, 0.572, 0.572, 0.572 ;
+
+ fates_allom_agb3 = 1.94, 1.94, 1.94, 1.94, 1.94, 1.94, 1.94, 1.94, 1.94,
+ 1.94, 1.94, 1.94 ;
+
+ fates_allom_agb4 = 0.931, 0.931, 0.931, 0.931, 0.931, 0.931, 0.931, 0.931,
+ 0.931, 0.931, 0.931, 0.931 ;
+
+ fates_allom_agb_frac = 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6,
+ 0.6, 0.6 ;
+
+ fates_allom_amode = 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_blca_expnt_diff = -0.12, -0.34, -0.32, -0.22, -0.12, -0.35, 0,
+ 0, 0, 0, 0, 0 ;
+
+ fates_allom_cmode = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_crown_depth_frac = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.95, 0.95,
+ 0.95, 1, 1, 1 ;
+
+ fates_allom_d2bl1 = 0.04, 0.07, 0.07, 0.01, 0.04, 0.07, 0.07, 0.07, 0.07,
+ 0.07, 0.07, 0.07 ;
+
+ fates_allom_d2bl2 = 1.6019679, 1.5234373, 1.3051237, 1.9621397, 1.6019679,
+ 1.3998939, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3 ;
+
+ fates_allom_d2bl3 = 0.55, 0.55, 0.55, 0.55, 0.55, 0.55, 0.55, 0.55, 0.55,
+ 0.55, 0.55, 0.55 ;
+
+ fates_allom_d2ca_coefficient_max = 0.2715891, 0.3693718, 1.0787259,
+ 0.0579297, 0.2715891, 1.1553612, 0.6568464, 0.6568464, 0.6568464,
+ 0.6568464, 0.6568464, 0.6568464 ;
+
+ fates_allom_d2ca_coefficient_min = 0.2715891, 0.3693718, 1.0787259,
+ 0.0579297, 0.2715891, 1.1553612, 0.6568464, 0.6568464, 0.6568464,
+ 0.6568464, 0.6568464, 0.6568464 ;
+
+ fates_allom_d2h1 = 78.4087704, 306.842667, 106.8745821, 104.3586841,
+ 78.4087704, 31.4557047, 0.64, 0.64, 0.64, 0.64, 0.64, 0.64 ;
+
+ fates_allom_d2h2 = 0.8124383, 0.752377, 0.9471302, 1.1146973, 0.8124383,
+ 0.9734088, 0.37, 0.37, 0.37, 0.37, 0.37, 0.37 ;
+
+ fates_allom_d2h3 = 47.6666164, 196.6865691, 93.9790461, 160.6835089,
+ 47.6666164, 16.5928174, -999.9, -999.9, -999.9, -999.9, -999.9, -999.9 ;
+
+ fates_allom_dbh_maxheight = 1000, 1000, 1000, 1000, 1000, 1000, 3, 3, 2,
+ 0.35, 0.35, 0.35 ;
+
+ fates_allom_fmode = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_fnrt_prof_a = 7, 7, 7, 7, 6, 6, 7, 7, 7, 11, 11, 11 ;
+
+ fates_allom_fnrt_prof_b = 1, 2, 2, 1, 2, 2, 1.5, 1.5, 1.5, 2, 2, 2 ;
+
+ fates_allom_fnrt_prof_mode = 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ;
+
+ fates_allom_frbstor_repro = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_allom_hmode = 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_l2fr = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_la_per_sa_int = 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8,
+ 0.8, 0.8, 0.8 ;
+
+ fates_allom_la_per_sa_slp = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_allom_lmode = 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_sai_scaler = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,
+ 0.1, 0.1 ;
+
+ fates_allom_smode = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_stmode = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_allom_zroot_k = 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 ;
+
+ fates_allom_zroot_max_dbh = 100, 100, 100, 100, 100, 100, 2, 2, 2, 2, 2, 2 ;
+
+ fates_allom_zroot_max_z = 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 100 ;
+
+ fates_allom_zroot_min_dbh = 1, 1, 1, 2.5, 2.5, 2.5, 0.1, 0.1, 0.1, 0.1, 0.1,
+ 0.1 ;
+
+ fates_allom_zroot_min_z = 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 100 ;
+
+ fates_c2b = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;
+
+ fates_cnp_eca_alpha_ptase = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, 0.5 ;
+
+ fates_cnp_eca_decompmicc = 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
+ 280, 280 ;
+
+ fates_cnp_eca_km_nh4 = 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14, 0.14,
+ 0.14, 0.14, 0.14 ;
+
+ fates_cnp_eca_km_no3 = 0.27, 0.27, 0.27, 0.27, 0.27, 0.27, 0.27, 0.27, 0.27,
+ 0.27, 0.27, 0.27 ;
+
+ fates_cnp_eca_km_p = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,
+ 0.1 ;
+
+ fates_cnp_eca_km_ptase = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_cnp_eca_lambda_ptase = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_cnp_eca_vmax_ptase = 5e-09, 5e-09, 5e-09, 5e-09, 5e-09, 5e-09, 5e-09,
+ 5e-09, 5e-09, 5e-09, 5e-09, 5e-09 ;
+
+ fates_cnp_nfix1 = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_cnp_nitr_store_ratio = 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5,
+ 1.5, 1.5, 1.5 ;
+
+ fates_cnp_phos_store_ratio = 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5,
+ 1.5, 1.5, 1.5 ;
+
+ fates_cnp_pid_kd = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1 ;
+
+ fates_cnp_pid_ki = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_cnp_pid_kp = 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.0005,
+ 0.0005, 0.0005, 0.0005, 0.0005, 0.0005 ;
+
+ fates_cnp_prescribed_nuptake = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_cnp_prescribed_puptake = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_cnp_store_ovrflw_frac = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_cnp_turnover_nitr_retrans =
+ 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_cnp_turnover_phos_retrans =
+ 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_cnp_vmax_nh4 = 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09,
+ 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09 ;
+
+ fates_cnp_vmax_no3 = 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09,
+ 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09, 2.5e-09 ;
+
+ fates_cnp_vmax_p = 5e-10, 5e-10, 5e-10, 5e-10, 5e-10, 5e-10, 5e-10, 5e-10,
+ 5e-10, 5e-10, 5e-10, 5e-10 ;
+
+ fates_damage_frac = 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01,
+ 0.01, 0.01, 0.01 ;
+
+ fates_damage_mort_p1 = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 ;
+
+ fates_damage_mort_p2 = 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5,
+ 5.5, 5.5 ;
+
+ fates_damage_recovery_scalar = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_dev_arbitrary_pft = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_fire_alpha_SH = 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,
+ 0.2 ;
+
+ fates_fire_bark_scaler = 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07,
+ 0.07, 0.07, 0.07, 0.07 ;
+
+ fates_fire_crown_kill = 0.775, 0.775, 0.775, 0.775, 0.775, 0.775, 0.775,
+ 0.775, 0.775, 0.775, 0.775, 0.775 ;
+
+ fates_frag_fnrt_fcel = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5 ;
+
+ fates_frag_fnrt_flab = 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0.25, 0.25, 0.25 ;
+
+ fates_frag_fnrt_flig = 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0.25, 0.25, 0.25 ;
+
+ fates_frag_leaf_fcel = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5 ;
+
+ fates_frag_leaf_flab = 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0.25, 0.25, 0.25 ;
+
+ fates_frag_leaf_flig = 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
+ 0.25, 0.25, 0.25 ;
+
+ fates_frag_seed_decay_rate = 0.51, 0.51, 0.51, 0.51, 0.51, 0.51, 0.51, 0.51,
+ 0.51, 0.51, 0.51, 0.51 ;
+
+ fates_grperc = 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11,
+ 0.11, 0.11 ;
+
+ fates_hydro_avuln_gs = 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5,
+ 2.5, 2.5 ;
+
+ fates_hydro_avuln_node =
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;
+
+ fates_hydro_epsil_node =
+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 ;
+
+ fates_hydro_fcap_node =
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08,
+ 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08, 0.08,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_hydro_k_lwp = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_hydro_kmax_node =
+ -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, -999,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, -999,
+ -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, -999, -999 ;
+
+ fates_hydro_p50_gs = -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5, -1.5,
+ -1.5, -1.5, -1.5 ;
+
+ fates_hydro_p50_node =
+ -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25,
+ -2.25, -2.25,
+ -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25,
+ -2.25, -2.25,
+ -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25,
+ -2.25, -2.25,
+ -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25, -2.25,
+ -2.25, -2.25 ;
+
+ fates_hydro_p_taper = 0.333, 0.333, 0.333, 0.333, 0.333, 0.333, 0.333,
+ 0.333, 0.333, 0.333, 0.333, 0.333 ;
+
+ fates_hydro_pinot_node =
+ -1.465984, -1.465984, -1.465984, -1.465984, -1.465984, -1.465984,
+ -1.465984, -1.465984, -1.465984, -1.465984, -1.465984, -1.465984,
+ -1.22807, -1.22807, -1.22807, -1.22807, -1.22807, -1.22807, -1.22807,
+ -1.22807, -1.22807, -1.22807, -1.22807, -1.22807,
+ -1.22807, -1.22807, -1.22807, -1.22807, -1.22807, -1.22807, -1.22807,
+ -1.22807, -1.22807, -1.22807, -1.22807, -1.22807,
+ -1.043478, -1.043478, -1.043478, -1.043478, -1.043478, -1.043478,
+ -1.043478, -1.043478, -1.043478, -1.043478, -1.043478, -1.043478 ;
+
+ fates_hydro_pitlp_node =
+ -1.67, -1.67, -1.67, -1.67, -1.67, -1.67, -1.67, -1.67, -1.67, -1.67,
+ -1.67, -1.67,
+ -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4,
+ -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4, -1.4,
+ -1.2, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2, -1.2 ;
+
+ fates_hydro_resid_node =
+ 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16, 0.16,
+ 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21,
+ 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21, 0.21,
+ 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11, 0.11 ;
+
+ fates_hydro_rfrac_stem = 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625,
+ 0.625, 0.625, 0.625, 0.625, 0.625 ;
+
+ fates_hydro_rs2 = 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001, 0.0001,
+ 0.0001, 0.0001, 0.0001, 0.0001, 0.0001 ;
+
+ fates_hydro_srl = 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25 ;
+
+ fates_hydro_thetas_node =
+ 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65,
+ 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65,
+ 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65, 0.65,
+ 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75, 0.75 ;
+
+ fates_hydro_vg_alpha_node =
+ 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.005, 0.005, 0.005, 0.005, 0.005,
+ 0.005, 0.005,
+ 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.005, 0.005, 0.005, 0.005, 0.005,
+ 0.005, 0.005,
+ 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.005, 0.005, 0.005, 0.005, 0.005,
+ 0.005, 0.005,
+ 0.0005, 0.0005, 0.0005, 0.0005, 0.0005, 0.005, 0.005, 0.005, 0.005, 0.005,
+ 0.005, 0.005 ;
+
+ fates_hydro_vg_m_node =
+ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 ;
+
+ fates_hydro_vg_n_node =
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;
+
+ fates_leaf_c3psn = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 ;
+
+ fates_leaf_jmaxha = 43540, 43540, 43540, 43540, 43540, 43540, 43540, 43540,
+ 43540, 43540, 43540, 43540 ;
+
+ fates_leaf_jmaxhd = 152040, 152040, 152040, 152040, 152040, 152040, 152040,
+ 152040, 152040, 152040, 152040, 152040 ;
+
+ fates_leaf_jmaxse = 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495,
+ 495 ;
+
+ fates_leaf_slamax = 0.0954, 0.0954, 0.0954, 0.0954, 0.0954, 0.0954, 0.012,
+ 0.03, 0.03, 0.03, 0.03, 0.03 ;
+
+ fates_leaf_slatop = 0.012, 0.005, 0.024, 0.009, 0.03, 0.03, 0.012, 0.03,
+ 0.03, 0.03, 0.03, 0.03 ;
+
+ fates_leaf_stomatal_intercept = 10000, 10000, 10000, 10000, 10000, 10000,
+ 10000, 10000, 10000, 10000, 10000, 40000 ;
+
+ fates_leaf_stomatal_slope_ballberry = 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 ;
+
+ fates_leaf_stomatal_slope_medlyn = 4.1, 2.3, 2.3, 4.1, 4.4, 4.4, 4.7, 4.7,
+ 4.7, 2.2, 5.3, 1.6 ;
+
+ fates_leaf_vcmax25top =
+ 50, 62, 39, 61, 58, 58, 62, 54, 54, 78, 78, 78 ;
+
+ fates_leaf_vcmaxha = 65330, 65330, 65330, 65330, 65330, 65330, 65330, 65330,
+ 65330, 65330, 65330, 65330 ;
+
+ fates_leaf_vcmaxhd = 149250, 149250, 149250, 149250, 149250, 149250, 149250,
+ 149250, 149250, 149250, 149250, 149250 ;
+
+ fates_leaf_vcmaxse = 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485,
+ 485 ;
+
+ fates_maintresp_leaf_atkin2017_baserate = 1.756, 1.4995, 1.4995, 1.756,
+ 1.756, 1.756, 2.0749, 2.0749, 2.0749, 2.1956, 2.1956, 2.1956 ;
+
+ fates_maintresp_leaf_ryan1991_baserate = 2.525e-06, 2.525e-06, 2.525e-06,
+ 2.525e-06, 2.525e-06, 2.525e-06, 2.525e-06, 2.525e-06, 2.525e-06,
+ 2.525e-06, 2.525e-06, 2.525e-06 ;
+
+ fates_maintresp_reduction_curvature = 0.01, 0.01, 0.01, 0.01, 0.01, 0.01,
+ 0.01, 0.01, 0.01, 0.01, 0.01, 0.01 ;
+
+ fates_maintresp_reduction_intercept = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_maintresp_reduction_upthresh = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_mort_bmort = 0.014, 0.014, 0.014, 0.014, 0.014, 0.014, 0.014, 0.014,
+ 0.014, 0.014, 0.014, 0.014 ;
+
+ fates_mort_freezetol = 2.5, -55, -80, -30, 2.5, -80, -60, -10, -80, -80,
+ -20, 2.5 ;
+
+ fates_mort_hf_flc_threshold = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, 0.5 ;
+
+ fates_mort_hf_sm_threshold = 1e-06, 1e-06, 1e-06, 1e-06, 1e-06, 1e-06,
+ 1e-06, 1e-06, 1e-06, 1e-06, 1e-06, 1e-06 ;
+
+ fates_mort_ip_age_senescence = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_mort_ip_size_senescence = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_mort_prescribed_canopy = 0.0194, 0.0194, 0.0194, 0.0194, 0.0194,
+ 0.0194, 0.0194, 0.0194, 0.0194, 0.0194, 0.0194, 0.0194 ;
+
+ fates_mort_prescribed_understory = 0.025, 0.025, 0.025, 0.025, 0.025, 0.025,
+ 0.025, 0.025, 0.025, 0.025, 0.025, 0.025 ;
+
+ fates_mort_r_age_senescence = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_mort_r_size_senescence = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_mort_scalar_coldstress = 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ;
+
+ fates_mort_scalar_cstarvation = 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6,
+ 0.6, 0.6, 0.6 ;
+
+ fates_mort_scalar_hydrfailure = 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6,
+ 0.6, 0.6, 0.6 ;
+
+ fates_mort_upthresh_cstarvation = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_nonhydro_smpsc = -255000, -255000, -255000, -255000, -255000, -255000,
+ -255000, -255000, -255000, -255000, -255000, -255000 ;
+
+ fates_nonhydro_smpso = -66000, -66000, -66000, -66000, -66000, -66000,
+ -66000, -66000, -66000, -66000, -66000, -66000 ;
+
+ fates_phen_cold_size_threshold = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_phen_drought_threshold = -152957.4, -152957.4, -152957.4, -152957.4,
+ -152957.4, -152957.4, -152957.4, -152957.4, -152957.4, -152957.4,
+ -152957.4, -152957.4 ;
+
+ fates_phen_evergreen = 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0 ;
+
+ fates_phen_flush_fraction = _, _, 0.5, _, 0.5, 0.5, _, 0.5, 0.5, 0.5, 0.5,
+ 0.5 ;
+
+ fates_phen_fnrt_drop_fraction = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_phen_mindaysoff = 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
+ 100, 100 ;
+
+ fates_phen_moist_threshold = -122365.9, -122365.9, -122365.9, -122365.9,
+ -122365.9, -122365.9, -122365.9, -122365.9, -122365.9, -122365.9,
+ -122365.9, -122365.9 ;
+
+ fates_phen_season_decid = 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0 ;
+
+ fates_phen_stem_drop_fraction = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_phen_stress_decid = 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1 ;
+
+ fates_prescribed_npp_canopy = 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4, 0.4,
+ 0.4, 0.4, 0.4 ;
+
+ fates_prescribed_npp_understory = 0.03125, 0.03125, 0.03125, 0.03125,
+ 0.03125, 0.03125, 0.03125, 0.03125, 0.03125, 0.03125, 0.03125, 0.03125 ;
+
+ fates_rad_leaf_clumping_index = 0.85, 0.85, 0.8, 0.85, 0.85, 0.9, 0.85, 0.9,
+ 0.9, 0.75, 0.75, 0.75 ;
+
+ fates_rad_leaf_rhonir = 0.46, 0.41, 0.39, 0.46, 0.41, 0.41, 0.46, 0.41,
+ 0.41, 0.28, 0.28, 0.28 ;
+
+ fates_rad_leaf_rhovis = 0.11, 0.09, 0.08, 0.11, 0.08, 0.08, 0.11, 0.08,
+ 0.08, 0.05, 0.05, 0.05 ;
+
+ fates_rad_leaf_taunir = 0.33, 0.32, 0.42, 0.33, 0.43, 0.43, 0.33, 0.43,
+ 0.43, 0.4, 0.4, 0.4 ;
+
+ fates_rad_leaf_tauvis = 0.06, 0.04, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06,
+ 0.06, 0.05, 0.05, 0.05 ;
+
+ fates_rad_leaf_xl = 0.32, 0.01, 0.01, 0.32, 0.2, 0.59, 0.32, 0.59, 0.59,
+ -0.23, -0.23, -0.23 ;
+
+ fates_rad_stem_rhonir = 0.49, 0.36, 0.36, 0.49, 0.49, 0.49, 0.49, 0.49,
+ 0.49, 0.53, 0.53, 0.53 ;
+
+ fates_rad_stem_rhovis = 0.21, 0.12, 0.12, 0.21, 0.21, 0.21, 0.21, 0.21,
+ 0.21, 0.31, 0.31, 0.31 ;
+
+ fates_rad_stem_taunir = 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
+ 0.001, 0.001, 0.25, 0.25, 0.25 ;
+
+ fates_rad_stem_tauvis = 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
+ 0.001, 0.001, 0.12, 0.12, 0.12 ;
+
+ fates_recruit_height_min = 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 0.2, 0.2, 0.2,
+ 0.125, 0.125, 0.125 ;
+
+ fates_recruit_init_density = 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2,
+ 0.2, 0.2, 0.2 ;
+
+ fates_recruit_prescribed_rate = 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02,
+ 0.02, 0.02, 0.02, 0.02, 0.02 ;
+
+ fates_recruit_seed_alloc = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,
+ 0.1, 0.1 ;
+
+ fates_recruit_seed_alloc_mature = 0, 0, 0, 0, 0, 0, 0.9, 0.9, 0.9, 0.9, 0.9,
+ 0.9 ;
+
+ fates_recruit_seed_dbh_repro_threshold = 90, 80, 80, 80, 90, 80, 3, 3, 2,
+ 0.35, 0.35, 0.35 ;
+
+ fates_recruit_seed_germination_rate = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
+ 0.5, 0.5, 0.5, 0.5, 0.5 ;
+
+ fates_recruit_seed_supplement = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+
+ fates_seed_dispersal_fraction = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_seed_dispersal_max_dist = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_seed_dispersal_pdf_scale = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_seed_dispersal_pdf_shape = _, _, _, _, _, _, _, _, _, _, _, _ ;
+
+ fates_stoich_nitr =
+ 0.033, 0.029, 0.04, 0.033, 0.04, 0.04, 0.033, 0.04, 0.04, 0.04, 0.04, 0.04,
+ 0.024, 0.024, 0.024, 0.024, 0.024, 0.024, 0.024, 0.024, 0.024, 0.024,
+ 0.024, 0.024,
+ 1e-08, 1e-08, 1e-08, 1e-08, 1e-08, 1e-08, 1e-08, 1e-08, 1e-08, 1e-08,
+ 1e-08, 1e-08,
+ 0.0047, 0.0047, 0.0047, 0.0047, 0.0047, 0.0047, 0.0047, 0.0047, 0.0047,
+ 0.0047, 0.0047, 0.0047 ;
+
+ fates_stoich_phos =
+ 0.0033, 0.0029, 0.004, 0.0033, 0.004, 0.004, 0.0033, 0.004, 0.004, 0.004,
+ 0.004, 0.004,
+ 0.0024, 0.0024, 0.0024, 0.0024, 0.0024, 0.0024, 0.0024, 0.0024, 0.0024,
+ 0.0024, 0.0024, 0.0024,
+ 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09, 1e-09,
+ 1e-09, 1e-09,
+ 0.00047, 0.00047, 0.00047, 0.00047, 0.00047, 0.00047, 0.00047, 0.00047,
+ 0.00047, 0.00047, 0.00047, 0.00047 ;
+
+ fates_trim_inc = 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03, 0.03,
+ 0.03, 0.03 ;
+
+ fates_trim_limit = 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 ;
+
+ fates_trs_repro_alloc_a = 0.0049, 0.0049, 0.0049, 0.0049, 0.0049, 0.0049,
+ 0.0049, 0.0049, 0.0049, 0.0049, 0.0049, 0.0049 ;
+
+ fates_trs_repro_alloc_b = -2.6171, -2.6171, -2.6171, -2.6171, -2.6171,
+ -2.6171, -2.6171, -2.6171, -2.6171, -2.6171, -2.6171, -2.6171 ;
+
+ fates_trs_repro_frac_seed = 0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.24,
+ 0.24, 0.24, 0.24, 0.24 ;
+
+ fates_trs_seedling_a_emerg = 0.0003, 0.0003, 0.0003, 0.0003, 0.0003, 0.0003,
+ 0.0003, 0.0003, 0.0003, 0.0003, 0.0003, 0.0003 ;
+
+ fates_trs_seedling_b_emerg = 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2,
+ 1.2, 1.2, 1.2 ;
+
+ fates_trs_seedling_background_mort = 0.1085371, 0.1085371, 0.1085371,
+ 0.1085371, 0.1085371, 0.1085371, 0.1085371, 0.1085371, 0.1085371,
+ 0.1085371, 0.1085371, 0.1085371 ;
+
+ fates_trs_seedling_h2o_mort_a = 4.070565e-17, 4.070565e-17, 4.070565e-17,
+ 4.070565e-17, 4.070565e-17, 4.070565e-17, 4.070565e-17, 4.070565e-17,
+ 4.070565e-17, 4.070565e-17, 4.070565e-17, 4.070565e-17 ;
+
+ fates_trs_seedling_h2o_mort_b = -6.390757e-11, -6.390757e-11, -6.390757e-11,
+ -6.390757e-11, -6.390757e-11, -6.390757e-11, -6.390757e-11,
+ -6.390757e-11, -6.390757e-11, -6.390757e-11, -6.390757e-11, -6.390757e-11 ;
+
+ fates_trs_seedling_h2o_mort_c = 1.268992e-05, 1.268992e-05, 1.268992e-05,
+ 1.268992e-05, 1.268992e-05, 1.268992e-05, 1.268992e-05, 1.268992e-05,
+ 1.268992e-05, 1.268992e-05, 1.268992e-05, 1.268992e-05 ;
+
+ fates_trs_seedling_light_mort_a = -0.009897694, -0.009897694, -0.009897694,
+ -0.009897694, -0.009897694, -0.009897694, -0.009897694, -0.009897694,
+ -0.009897694, -0.009897694, -0.009897694, -0.009897694 ;
+
+ fates_trs_seedling_light_mort_b = -7.154063, -7.154063, -7.154063,
+ -7.154063, -7.154063, -7.154063, -7.154063, -7.154063, -7.154063,
+ -7.154063, -7.154063, -7.154063 ;
+
+ fates_trs_seedling_light_rec_a = 0.007, 0.007, 0.007, 0.007, 0.007, 0.007,
+ 0.007, 0.007, 0.007, 0.007, 0.007, 0.007 ;
+
+ fates_trs_seedling_light_rec_b = 0.8615, 0.8615, 0.8615, 0.8615, 0.8615,
+ 0.8615, 0.8615, 0.8615, 0.8615, 0.8615, 0.8615, 0.8615 ;
+
+ fates_trs_seedling_mdd_crit = 1400000, 1400000, 1400000, 1400000, 1400000,
+ 1400000, 1400000, 1400000, 1400000, 1400000, 1400000, 1400000 ;
+
+ fates_trs_seedling_par_crit_germ = 0.656, 0.656, 0.656, 0.656, 0.656, 0.656,
+ 0.656, 0.656, 0.656, 0.656, 0.656, 0.656 ;
+
+ fates_trs_seedling_psi_crit = -251995.7, -251995.7, -251995.7, -251995.7,
+ -251995.7, -251995.7, -251995.7, -251995.7, -251995.7, -251995.7,
+ -251995.7, -251995.7 ;
+
+ fates_trs_seedling_psi_emerg = -15744.65, -15744.65, -15744.65, -15744.65,
+ -15744.65, -15744.65, -15744.65, -15744.65, -15744.65, -15744.65,
+ -15744.65, -15744.65 ;
+
+ fates_trs_seedling_root_depth = 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06,
+ 0.06, 0.06, 0.06, 0.06, 0.06 ;
+
+ fates_turb_displar = 0.67, 0.67, 0.67, 0.67, 0.67, 0.67, 0.67, 0.67, 0.67,
+ 0.67, 0.67, 0.67 ;
+
+ fates_turb_leaf_diameter = 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04,
+ 0.04, 0.04, 0.04, 0.04 ;
+
+ fates_turb_z0mr = 0.055, 0.055, 0.055, 0.055, 0.055, 0.055, 0.055, 0.055,
+ 0.055, 0.055, 0.055, 0.055 ;
+
+ fates_turnover_branch = 150, 150, 150, 150, 150, 150, 150, 150, 150, 0, 0, 0 ;
+
+ fates_turnover_fnrt = 1, 2, 1, 1.5, 1, 1, 1.5, 1, 1, 1, 1, 1 ;
+
+ fates_turnover_leaf =
+ 1.5, 4, 1, 1.5, 1, 1, 1.5, 1, 1, 1, 1, 1 ;
+
+ fates_turnover_senleaf_fdrought = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
+ fates_wood_density = 0.548327, 0.44235, 0.454845, 0.754336, 0.548327,
+ 0.566452, 0.7, 0.7, 0.7, 0.7, 0.7, 0.7 ;
+
+ fates_woody = 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 ;
+
+ fates_hlm_pft_map =
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ;
+
+ fates_fire_FBD = 15.4, 16.8, 19.6, 999, 4, 4 ;
+
+ fates_fire_low_moisture_Coeff = 1.12, 1.09, 0.98, 0.8, 1.15, 1.15 ;
+
+ fates_fire_low_moisture_Slope = 0.62, 0.72, 0.85, 0.8, 0.62, 0.62 ;
+
+ fates_fire_mid_moisture = 0.72, 0.51, 0.38, 1, 0.8, 0.8 ;
+
+ fates_fire_mid_moisture_Coeff = 2.35, 1.47, 1.06, 0.8, 3.2, 3.2 ;
+
+ fates_fire_mid_moisture_Slope = 2.35, 1.47, 1.06, 0.8, 3.2, 3.2 ;
+
+ fates_fire_min_moisture = 0.18, 0.12, 0, 0, 0.24, 0.24 ;
+
+ fates_fire_SAV = 13, 3.58, 0.98, 0.2, 66, 66 ;
+
+ fates_frag_maxdecomp = 0.52, 0.383, 0.383, 0.19, 1, 999 ;
+
+ fates_frag_cwd_frac = 0.045, 0.075, 0.21, 0.67 ;
+
+ fates_maxpatches_by_landuse = 9, 4, 1, 1, 1 ;
+
+ fates_canopy_closure_thresh = 0.8 ;
+
+ fates_cnp_eca_plant_escalar = 1.25e-05 ;
+
+ fates_cohort_age_fusion_tol = 0.08 ;
+
+ fates_cohort_size_fusion_tol = 0.08 ;
+
+ fates_comp_excln = 3 ;
+
+ fates_damage_canopy_layer_code = 1 ;
+
+ fates_damage_event_code = 1 ;
+
+ fates_dev_arbitrary = _ ;
+
+ fates_fire_active_crown_fire = 0 ;
+
+ fates_fire_cg_strikes = 0.2 ;
+
+ fates_fire_drying_ratio = 66000 ;
+
+ fates_fire_durat_slope = -11.06 ;
+
+ fates_fire_fdi_a = 17.62 ;
+
+ fates_fire_fdi_alpha = 0.00037 ;
+
+ fates_fire_fdi_b = 243.12 ;
+
+ fates_fire_fuel_energy = 18000 ;
+
+ fates_fire_max_durat = 240 ;
+
+ fates_fire_miner_damp = 0.41739 ;
+
+ fates_fire_miner_total = 0.055 ;
+
+ fates_fire_nignitions = 15 ;
+
+ fates_fire_part_dens = 513 ;
+
+ fates_fire_threshold = 50 ;
+
+ fates_frag_cwd_fcel = 0.76 ;
+
+ fates_frag_cwd_flig = 0.24 ;
+
+ fates_hydro_kmax_rsurf1 = 20 ;
+
+ fates_hydro_kmax_rsurf2 = 0.0001 ;
+
+ fates_hydro_psi0 = 0 ;
+
+ fates_hydro_psicap = -0.6 ;
+
+ fates_hydro_solver = 1 ;
+
+ fates_landuse_logging_coll_under_frac = 0.55983 ;
+
+ fates_landuse_logging_collateral_frac = 0.05 ;
+
+ fates_landuse_logging_dbhmax = _ ;
+
+ fates_landuse_logging_dbhmax_infra = 35 ;
+
+ fates_landuse_logging_dbhmin = 50 ;
+
+ fates_landuse_logging_direct_frac = 0.15 ;
+
+ fates_landuse_logging_event_code = -30 ;
+
+ fates_landuse_logging_export_frac = 0.8 ;
+
+ fates_landuse_logging_mechanical_frac = 0.05 ;
+
+ fates_landuse_pprodharv10_forest_mean = 0.8125 ;
+
+ fates_leaf_photo_temp_acclim_thome_time = 30 ;
+
+ fates_leaf_photo_temp_acclim_timescale = 30 ;
+
+ fates_leaf_photo_tempsens_model = 1 ;
+
+ fates_leaf_stomatal_assim_model = 1 ;
+
+ fates_leaf_stomatal_model = 1 ;
+
+ fates_leaf_theta_cj_c3 = 0.999 ;
+
+ fates_leaf_theta_cj_c4 = 0.999 ;
+
+ fates_maintresp_leaf_model = 1 ;
+
+ fates_maintresp_nonleaf_baserate = 2.525e-06 ;
+
+ fates_maxcohort = 100 ;
+
+ fates_mort_disturb_frac = 1 ;
+
+ fates_mort_understorey_death = 0.55983 ;
+
+ fates_patch_fusion_tol = 0.05 ;
+
+ fates_phen_chilltemp = 5 ;
+
+ fates_phen_coldtemp = 7.5 ;
+
+ fates_phen_gddthresh_a = -68 ;
+
+ fates_phen_gddthresh_b = 638 ;
+
+ fates_phen_gddthresh_c = -0.01 ;
+
+ fates_phen_mindayson = 90 ;
+
+ fates_phen_ncolddayslim = 5 ;
+
+ fates_q10_froz = 1.5 ;
+
+ fates_q10_mr = 1.5 ;
+
+ fates_rad_model = 1 ;
+
+ fates_regeneration_model = 1 ;
+
+ fates_soil_salinity = 0.4 ;
+
+ fates_trs_seedling2sap_par_timescale = 32 ;
+
+ fates_trs_seedling_emerg_h2o_timescale = 7 ;
+
+ fates_trs_seedling_mdd_timescale = 126 ;
+
+ fates_trs_seedling_mort_par_timescale = 32 ;
+
+ fates_vai_top_bin_width = 1 ;
+
+ fates_vai_width_increase_factor = 1 ;
+}
diff --git a/parameter_files/archive/api34.0.0_032624_patch_params.xml b/parameter_files/archive/api34.0.0_032624_patch_params.xml
new file mode 100644
index 0000000000..1d9f263da6
--- /dev/null
+++ b/parameter_files/archive/api34.0.0_032624_patch_params.xml
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ archive/api34.0.0_032624_params_default.cdl
+ fates_params_default.cdl
+ 1,2,3,4,5,6,7,8,9,10,11,12
+
+
+ fates_mort_upthresh_cstarvation
+
+
+ fates_mort_upthresh_cstarvation
+ fates_pft
+ unitless
+ threshold for storage biomass (relative to target leaf biomass) above which carbon starvation is zero
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+
+
+ fates_phen_stress_decid
+
+
+ fates_phen_stress_decid
+ fates_pft
+ logical flag
+ Flag for stress/drought-deciduous leaf habit. 0 - not stress deciduous; 1 - default drought deciduous (two target states only, fully flushed or fully abscised); 2 - semi-deciduous
+ 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1
+
+
+ fates_allom_crown_depth_frac
+
+
+ fates_allom_dmode
+ fates_pft
+ index
+ crown depth allometry function index
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+
+
+ fates_allom_h2cd1
+ fates_pft
+ variable
+ Parameter 1 for h2cd allometry (exp(log-intercept) or scaling). If allom_dmode=1; this is the same as former crown_depth_frac parameter
+ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.95, 0.95, 0.95, 1, 1, 1
+
+
+ fates_allom_h2cd2
+ fates_pft
+ variable
+ Parameter 2 for h2cd allometry (log-slope or exponent). If allom_dmode=1; this is not needed (as exponent is assumed 1)
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
+
+
+ fates_cnp_eca_alpha_ptase
+
+
+ fates_cnp_eca_lambda_ptase
+
+
+ fates_cnp_eca_alpha_ptase
+ fates_pft
+ g/m3
+ (INACTIVE, KEEP AT 0) fraction of P from ptase activity sent directly to plant (ECA)
+ 0,0,0,0,0,0,0,0,0,0,0,0
+
+
+ fates_cnp_eca_lambda_ptase
+ fates_pft
+ g/m3
+ (INACTIVE, KEEP AT 0) critical value for biochemical production (ECA)
+ 0,0,0,0,0,0,0,0,0,0,0,0
+
+
+ fates_leafn_vert_scaler_coeff1
+ fates_pft
+ unitless
+ Coefficient one for decrease in leaf nitrogen through the canopy, from Lloyd et al. 2010.
+ 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963
+
+
+ fates_leafn_vert_scaler_coeff2
+ fates_pft
+ unitless
+ Coefficient two for decrease in leaf nitrogen through the canopy, from Lloyd et al. 2010.
+ 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43
+
+
+ fates_maintresp_leaf_vert_scaler_coeff1
+ fates_pft
+ unitless
+ Leaf maintenance respiration decrease through the canopy. Only applies to Atkin et al. 2017. For proportionality between photosynthesis and respiration through the canopy, match with fates_leafn_vert_scaler_coeff1.
+ 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963
+
+
+ fates_maintresp_leaf_vert_scaler_coeff2
+ fates_pft
+ unitless
+ Leaf maintenance respiration decrease through the canopy. Only applies to Atkin et al. 2017. For proportionality between photosynthesis and respiration through the canopy, match with fates_leafn_vert_scaler_coeff2.
+ 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43
+
+
+ fates_daylength_factor_switch
+ scalar
+ unitless
+ user switch for turning on (1) or off (0) the day length factor scaling for photosynthetic parameters (ie scale vcmax and jmax)
+ 1
+
+
+ fates_mort_cstarvation_model
+ scalar
+ unitless
+ switch defining the carbon starvation model ( 1) Linear or 2) Exponential) in the mortality_rates function.
+ 1
+
+
+
+
+
diff --git a/parameter_files/fates_params_default.cdl b/parameter_files/fates_params_default.cdl
index 02bd77b647..2eaeb875fe 100644
--- a/parameter_files/fates_params_default.cdl
+++ b/parameter_files/fates_params_default.cdl
@@ -8,12 +8,12 @@ dimensions:
fates_history_size_bins = 13 ;
fates_hlm_pftno = 14 ;
fates_hydr_organs = 4 ;
+ fates_landuseclass = 5 ;
fates_leafage_class = 1 ;
fates_litterclass = 6 ;
fates_pft = 12 ;
fates_plant_organs = 4 ;
fates_string_length = 60 ;
- fates_landuseclass = 5 ;
variables:
double fates_history_ageclass_bin_edges(fates_history_age_bins) ;
fates_history_ageclass_bin_edges:units = "yr" ;
@@ -84,9 +84,6 @@ variables:
double fates_allom_cmode(fates_pft) ;
fates_allom_cmode:units = "index" ;
fates_allom_cmode:long_name = "coarse root biomass allometry function index." ;
- double fates_allom_crown_depth_frac(fates_pft) ;
- fates_allom_crown_depth_frac:units = "fraction" ;
- fates_allom_crown_depth_frac:long_name = "the depth of a cohort crown as a fraction of its height" ;
double fates_allom_d2bl1(fates_pft) ;
fates_allom_d2bl1:units = "variable" ;
fates_allom_d2bl1:long_name = "Parameter 1 for d2bl allometry" ;
@@ -114,6 +111,9 @@ variables:
double fates_allom_dbh_maxheight(fates_pft) ;
fates_allom_dbh_maxheight:units = "cm" ;
fates_allom_dbh_maxheight:long_name = "the diameter (if any) corresponding to maximum height, diameters may increase beyond this" ;
+ double fates_allom_dmode(fates_pft) ;
+ fates_allom_dmode:units = "index" ;
+ fates_allom_dmode:long_name = "crown depth allometry function index" ;
double fates_allom_fmode(fates_pft) ;
fates_allom_fmode:units = "index" ;
fates_allom_fmode:long_name = "fine root biomass allometry function index." ;
@@ -129,6 +129,12 @@ variables:
double fates_allom_frbstor_repro(fates_pft) ;
fates_allom_frbstor_repro:units = "fraction" ;
fates_allom_frbstor_repro:long_name = "fraction of bstore goes to reproduction after plant dies" ;
+ double fates_allom_h2cd1(fates_pft) ;
+ fates_allom_h2cd1:units = "variable" ;
+ fates_allom_h2cd1:long_name = "Parameter 1 for h2cd allometry (exp(log-intercept) or scaling). If allom_dmode=1; this is the same as former crown_depth_frac parameter" ;
+ double fates_allom_h2cd2(fates_pft) ;
+ fates_allom_h2cd2:units = "variable" ;
+ fates_allom_h2cd2:long_name = "Parameter 2 for h2cd allometry (log-slope or exponent). If allom_dmode=1; this is not needed (as exponent is assumed 1)" ;
double fates_allom_hmode(fates_pft) ;
fates_allom_hmode:units = "index" ;
fates_allom_hmode:long_name = "height allometry function index." ;
@@ -173,7 +179,7 @@ variables:
fates_c2b:long_name = "Carbon to biomass multiplier of bulk structural tissues" ;
double fates_cnp_eca_alpha_ptase(fates_pft) ;
fates_cnp_eca_alpha_ptase:units = "g/m3" ;
- fates_cnp_eca_alpha_ptase:long_name = "fraction of P from ptase activity sent directly to plant (ECA)" ;
+ fates_cnp_eca_alpha_ptase:long_name = "(INACTIVE, KEEP AT 0) fraction of P from ptase activity sent directly to plant (ECA)" ;
double fates_cnp_eca_decompmicc(fates_pft) ;
fates_cnp_eca_decompmicc:units = "gC/m3" ;
fates_cnp_eca_decompmicc:long_name = "maximum soil microbial decomposer biomass found over depth (will be applied at a reference depth w/ exponential attenuation) (ECA)" ;
@@ -191,7 +197,7 @@ variables:
fates_cnp_eca_km_ptase:long_name = "half-saturation constant for biochemical P (ECA)" ;
double fates_cnp_eca_lambda_ptase(fates_pft) ;
fates_cnp_eca_lambda_ptase:units = "g/m3" ;
- fates_cnp_eca_lambda_ptase:long_name = "critical value for biochemical production (ECA)" ;
+ fates_cnp_eca_lambda_ptase:long_name = "(INACTIVE, KEEP AT 0) critical value for biochemical production (ECA)" ;
double fates_cnp_eca_vmax_ptase(fates_pft) ;
fates_cnp_eca_vmax_ptase:units = "gP/m2/s" ;
fates_cnp_eca_vmax_ptase:long_name = "maximum production rate for biochemical P (per m2) (ECA)" ;
@@ -381,12 +387,24 @@ variables:
double fates_leaf_vcmaxse(fates_pft) ;
fates_leaf_vcmaxse:units = "J/mol/K" ;
fates_leaf_vcmaxse:long_name = "entropy term for vcmax. NOTE: if fates_leaf_photo_tempsens_model=2 then these values are NOT USED" ;
+ double fates_leafn_vert_scaler_coeff1(fates_pft) ;
+ fates_leafn_vert_scaler_coeff1:units = "unitless" ;
+ fates_leafn_vert_scaler_coeff1:long_name = "Coefficient one for decrease in leaf nitrogen through the canopy, from Lloyd et al. 2010." ;
+ double fates_leafn_vert_scaler_coeff2(fates_pft) ;
+ fates_leafn_vert_scaler_coeff2:units = "unitless" ;
+ fates_leafn_vert_scaler_coeff2:long_name = "Coefficient two for decrease in leaf nitrogen through the canopy, from Lloyd et al. 2010." ;
double fates_maintresp_leaf_atkin2017_baserate(fates_pft) ;
fates_maintresp_leaf_atkin2017_baserate:units = "umol CO2/m^2/s" ;
fates_maintresp_leaf_atkin2017_baserate:long_name = "Leaf maintenance respiration base rate parameter (r0) per Atkin et al 2017" ;
double fates_maintresp_leaf_ryan1991_baserate(fates_pft) ;
fates_maintresp_leaf_ryan1991_baserate:units = "gC/gN/s" ;
fates_maintresp_leaf_ryan1991_baserate:long_name = "Leaf maintenance respiration base rate per Ryan et al 1991" ;
+ double fates_maintresp_leaf_vert_scaler_coeff1(fates_pft) ;
+ fates_maintresp_leaf_vert_scaler_coeff1:units = "unitless" ;
+ fates_maintresp_leaf_vert_scaler_coeff1:long_name = "Leaf maintenance respiration decrease through the canopy. Only applies to Atkin et al. 2017. For proportionality between photosynthesis and respiration through the canopy, match with fates_leafn_vert_scaler_coeff1." ;
+ double fates_maintresp_leaf_vert_scaler_coeff2(fates_pft) ;
+ fates_maintresp_leaf_vert_scaler_coeff2:units = "unitless" ;
+ fates_maintresp_leaf_vert_scaler_coeff2:long_name = "Leaf maintenance respiration decrease through the canopy. Only applies to Atkin et al. 2017. For proportionality between photosynthesis and respiration through the canopy, match with fates_leafn_vert_scaler_coeff2." ;
double fates_maintresp_reduction_curvature(fates_pft) ;
fates_maintresp_reduction_curvature:units = "unitless (0-1)" ;
fates_maintresp_reduction_curvature:long_name = "curvature of MR reduction as f(carbon storage), 1=linear, 0=very curved" ;
@@ -696,6 +714,9 @@ variables:
double fates_damage_event_code ;
fates_damage_event_code:units = "unitless" ;
fates_damage_event_code:long_name = "Integer code that options how damage events are structured" ;
+ double fates_daylength_factor_switch ;
+ fates_daylength_factor_switch:units = "unitless" ;
+ fates_daylength_factor_switch:long_name = "user switch for turning on (1) or off (0) the day length factor scaling for photosynthetic parameters (ie scale vcmax and jmax)" ;
double fates_dev_arbitrary ;
fates_dev_arbitrary:units = "unknown" ;
fates_dev_arbitrary:long_name = "Unassociated free parameter that developers can use for testing arbitrary new hypotheses" ;
@@ -822,6 +843,9 @@ variables:
double fates_maxcohort ;
fates_maxcohort:units = "count" ;
fates_maxcohort:long_name = "maximum number of cohorts per patch. Actual number of cohorts also depend on cohort fusion tolerances" ;
+ double fates_mort_cstarvation_model ;
+ fates_mort_cstarvation_model:units = "unitless" ;
+ fates_mort_cstarvation_model:long_name = "switch defining the carbon starvation model ( 1) Linear or 2) Exponential) in the mortality_rates function." ;
double fates_mort_disturb_frac ;
fates_mort_disturb_frac:units = "fraction" ;
fates_mort_disturb_frac:long_name = "fraction of canopy mortality that results in disturbance (i.e. transfer of area from new to old patch)" ;
@@ -980,9 +1004,6 @@ data:
fates_allom_cmode = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
- fates_allom_crown_depth_frac = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.95, 0.95,
- 0.95, 1, 1, 1 ;
-
fates_allom_d2bl1 = 0.04, 0.07, 0.07, 0.01, 0.04, 0.07, 0.07, 0.07, 0.07,
0.07, 0.07, 0.07 ;
@@ -1012,6 +1033,8 @@ data:
fates_allom_dbh_maxheight = 1000, 1000, 1000, 1000, 1000, 1000, 3, 3, 2,
0.35, 0.35, 0.35 ;
+ fates_allom_dmode = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
fates_allom_fmode = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
fates_allom_fnrt_prof_a = 7, 7, 7, 7, 6, 6, 7, 7, 7, 11, 11, 11 ;
@@ -1022,6 +1045,10 @@ data:
fates_allom_frbstor_repro = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
+ fates_allom_h2cd1 = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.95, 0.95, 0.95, 1, 1, 1 ;
+
+ fates_allom_h2cd2 = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+
fates_allom_hmode = 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 1 ;
fates_allom_l2fr = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
@@ -1055,8 +1082,7 @@ data:
fates_c2b = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 ;
- fates_cnp_eca_alpha_ptase = 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
- 0.5, 0.5, 0.5 ;
+ fates_cnp_eca_alpha_ptase = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
fates_cnp_eca_decompmicc = 280, 280, 280, 280, 280, 280, 280, 280, 280, 280,
280, 280 ;
@@ -1072,7 +1098,7 @@ data:
fates_cnp_eca_km_ptase = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
- fates_cnp_eca_lambda_ptase = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ;
+ fates_cnp_eca_lambda_ptase = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;
fates_cnp_eca_vmax_ptase = 5e-09, 5e-09, 5e-09, 5e-09, 5e-09, 5e-09, 5e-09,
5e-09, 5e-09, 5e-09, 5e-09, 5e-09 ;
@@ -1305,6 +1331,12 @@ data:
fates_leaf_vcmaxse = 485, 485, 485, 485, 485, 485, 485, 485, 485, 485, 485,
485 ;
+ fates_leafn_vert_scaler_coeff1 = 0.00963, 0.00963, 0.00963, 0.00963,
+ 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963 ;
+
+ fates_leafn_vert_scaler_coeff2 = 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43,
+ 2.43, 2.43, 2.43, 2.43, 2.43 ;
+
fates_maintresp_leaf_atkin2017_baserate = 1.756, 1.4995, 1.4995, 1.756,
1.756, 1.756, 2.0749, 2.0749, 2.0749, 2.1956, 2.1956, 2.1956 ;
@@ -1312,6 +1344,13 @@ data:
2.525e-06, 2.525e-06, 2.525e-06, 2.525e-06, 2.525e-06, 2.525e-06,
2.525e-06, 2.525e-06, 2.525e-06 ;
+ fates_maintresp_leaf_vert_scaler_coeff1 = 0.00963, 0.00963, 0.00963,
+ 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963, 0.00963,
+ 0.00963 ;
+
+ fates_maintresp_leaf_vert_scaler_coeff2 = 2.43, 2.43, 2.43, 2.43, 2.43,
+ 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43 ;
+
fates_maintresp_reduction_curvature = 0.01, 0.01, 0.01, 0.01, 0.01, 0.01,
0.01, 0.01, 0.01, 0.01, 0.01, 0.01 ;
@@ -1615,6 +1654,8 @@ data:
fates_damage_event_code = 1 ;
+ fates_daylength_factor_switch = 1 ;
+
fates_dev_arbitrary = _ ;
fates_fire_active_crown_fire = 0 ;
@@ -1699,6 +1740,8 @@ data:
fates_maxcohort = 100 ;
+ fates_mort_cstarvation_model = 1 ;
+
fates_mort_disturb_frac = 1 ;
fates_mort_understorey_death = 0.55983 ;
diff --git a/parteh/PRTParametersMod.F90 b/parteh/PRTParametersMod.F90
index f2419c3334..bb3f98f6be 100644
--- a/parteh/PRTParametersMod.F90
+++ b/parteh/PRTParametersMod.F90
@@ -117,24 +117,24 @@ module PRTParametersMod
real(r8), allocatable :: c2b(:) ! Carbon to biomass multiplier [kg/kgC]
real(r8), allocatable :: wood_density(:) ! wood density g cm^-3 ...
- real(r8), allocatable :: crown_depth_frac(:) ! fraction of the height of the plant
integer , allocatable :: woody(:) ! Does the plant have wood? (1=yes, 0=no)
! that is occupied by crown
real(r8), allocatable :: slamax(:) ! Maximum specific leaf area of plant (at bottom) [m2/gC]
real(r8), allocatable :: slatop(:) ! Specific leaf area at canopy top [m2/gC]
real(r8), allocatable :: allom_sai_scaler(:) !
real(r8), allocatable :: allom_dbh_maxheight(:) ! dbh at which height growth ceases
- real(r8), allocatable :: allom_hmode(:) ! height allometry function type
- real(r8), allocatable :: allom_lmode(:) ! maximum leaf allometry function type
- real(r8), allocatable :: allom_fmode(:) ! maximum root allometry function type
- real(r8), allocatable :: allom_amode(:) ! AGB allometry function type
- real(r8), allocatable :: allom_cmode(:) ! Coarse root allometry function type
- real(r8), allocatable :: allom_smode(:) ! sapwood allometry function type
- real(r8), allocatable :: allom_stmode(:) ! storage allometry functional type
+ integer , allocatable :: allom_hmode(:) ! height allometry function type
+ integer , allocatable :: allom_lmode(:) ! maximum leaf allometry function type
+ integer , allocatable :: allom_fmode(:) ! maximum root allometry function type
+ integer , allocatable :: allom_amode(:) ! AGB allometry function type
+ integer , allocatable :: allom_cmode(:) ! Coarse root allometry function type
+ integer , allocatable :: allom_smode(:) ! sapwood allometry function type
+ integer , allocatable :: allom_stmode(:) ! storage allometry functional type
! 0 - storage is proportional to maximum leaf biomass
! (considering trimmed)
! 1 - storage is proportional to maximum leaf biomass
! (untrimmed)
+ integer , allocatable :: allom_dmode(:) ! crown depth allometry function type
! (HARD-CODED FOR TIME BEING, RGK 11-2017)
real(r8), allocatable :: allom_la_per_sa_int(:) ! Leaf area to sap area conversion, intercept
! (sapwood area / leaf area) [cm2/m2]
@@ -161,6 +161,12 @@ module PRTParametersMod
real(r8), allocatable :: allom_agb3(:) ! Parameter 3 for agb allometry
real(r8), allocatable :: allom_agb4(:) ! Parameter 3 for agb allometry
+ real(r8), allocatable :: allom_h2cd1(:) ! Parameter 1 for crown depth allometry. When allom_dmode=1
+ ! this is fraction of the height of the plant that is
+ ! considered crown (former parameter crown_depth_frac).
+ real(r8), allocatable :: allom_h2cd2(:) ! Exponent for crown depth allometry. Used only when
+ ! allom_dmode /= 1.
+
real(r8), allocatable :: allom_zroot_max_dbh(:) ! dbh at which maximum rooting depth saturates (largest possible) [cm]
real(r8), allocatable :: allom_zroot_max_z(:) ! the maximum rooting depth defined at dbh = fates_allom_zroot_max_dbh [m]
real(r8), allocatable :: allom_zroot_min_dbh(:) ! dbh at which the maximum rooting depth for a recruit is defined [cm]
diff --git a/parteh/PRTParamsFATESMod.F90 b/parteh/PRTParamsFATESMod.F90
index 098b1e3738..381546f1d9 100644
--- a/parteh/PRTParamsFATESMod.F90
+++ b/parteh/PRTParamsFATESMod.F90
@@ -201,10 +201,6 @@ subroutine PRTRegisterPFT(fates_params)
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
- name = 'fates_allom_crown_depth_frac'
- call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
- dimension_names=dim_names, lower_bounds=dim_lower_bound)
-
name = 'fates_wood_density'
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
@@ -321,6 +317,10 @@ subroutine PRTRegisterPFT(fates_params)
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
+ name = 'fates_allom_dmode'
+ call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
+ dimension_names=dim_names, lower_bounds=dim_lower_bound)
+
name = 'fates_allom_la_per_sa_int'
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
@@ -385,6 +385,14 @@ subroutine PRTRegisterPFT(fates_params)
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
+ name = 'fates_allom_h2cd1'
+ call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
+ dimension_names=dim_names, lower_bounds=dim_lower_bound)
+
+ name = 'fates_allom_h2cd2'
+ call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
+ dimension_names=dim_names, lower_bounds=dim_lower_bound)
+
name = 'fates_allom_zroot_max_dbh'
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)
@@ -501,10 +509,6 @@ subroutine PRTReceivePFT(fates_params)
call fates_params%RetrieveParameterAllocate(name=name, &
data=prt_params%fnrt_prof_mode)
- name = 'fates_allom_crown_depth_frac'
- call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%crown_depth_frac)
-
name = 'fates_woody'
call fates_params%RetrieveParameterAllocate(name=name, &
data=tmpreal)
@@ -566,31 +570,59 @@ subroutine PRTReceivePFT(fates_params)
name = 'fates_allom_hmode'
call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%allom_hmode)
+ data=tmpreal)
+ allocate(prt_params%allom_hmode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_hmode)
+ deallocate(tmpreal)
name = 'fates_allom_lmode'
call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%allom_lmode)
+ data=tmpreal)
+ allocate(prt_params%allom_lmode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_lmode)
+ deallocate(tmpreal)
name = 'fates_allom_fmode'
call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%allom_fmode)
+ data=tmpreal)
+ allocate(prt_params%allom_fmode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_fmode)
+ deallocate(tmpreal)
name = 'fates_allom_amode'
call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%allom_amode)
+ data=tmpreal)
+ allocate(prt_params%allom_amode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_amode)
+ deallocate(tmpreal)
name = 'fates_allom_stmode'
call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%allom_stmode)
+ data=tmpreal)
+ allocate(prt_params%allom_stmode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_stmode)
+ deallocate(tmpreal)
name = 'fates_allom_cmode'
call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%allom_cmode)
+ data=tmpreal)
+ allocate(prt_params%allom_cmode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_cmode)
+ deallocate(tmpreal)
name = 'fates_allom_smode'
call fates_params%RetrieveParameterAllocate(name=name, &
- data=prt_params%allom_smode)
+ data=tmpreal)
+ allocate(prt_params%allom_smode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_smode)
+ deallocate(tmpreal)
+
+ name = 'fates_allom_dmode'
+ call fates_params%RetrieveParameterAllocate(name=name, &
+ data=tmpreal)
+ allocate(prt_params%allom_dmode(size(tmpreal,dim=1)))
+ call ArrayNint(tmpreal,prt_params%allom_dmode)
+ deallocate(tmpreal)
name = 'fates_allom_la_per_sa_int'
call fates_params%RetrieveParameterAllocate(name=name, &
@@ -680,6 +712,14 @@ subroutine PRTReceivePFT(fates_params)
call fates_params%RetrieveParameterAllocate(name=name, &
data=prt_params%allom_agb4)
+ name = 'fates_allom_h2cd1'
+ call fates_params%RetrieveParameterAllocate(name=name, &
+ data=prt_params%allom_h2cd1)
+
+ name = 'fates_allom_h2cd2'
+ call fates_params%RetrieveParameterAllocate(name=name, &
+ data=prt_params%allom_h2cd2)
+
name = 'fates_allom_zroot_max_dbh'
call fates_params%RetrieveParameterAllocate(name=name, &
data=prt_params%allom_zroot_max_dbh)
@@ -979,6 +1019,8 @@ subroutine FatesReportPFTParams(is_master)
write(fates_log(),fmt0) 'allom_agb2 = ',prt_params%allom_agb2
write(fates_log(),fmt0) 'allom_agb3 = ',prt_params%allom_agb3
write(fates_log(),fmt0) 'allom_agb4 = ',prt_params%allom_agb4
+ write(fates_log(),fmt0) 'allom_h2cd1 = ',prt_params%allom_h2cd1
+ write(fates_log(),fmt0) 'allom_h2cd2 = ',prt_params%allom_h2cd2
write(fates_log(),fmt0) 'allom_zroot_max_dbh = ',prt_params%allom_zroot_max_dbh
write(fates_log(),fmt0) 'allom_zroot_max_z = ',prt_params%allom_zroot_max_z
@@ -990,7 +1032,6 @@ subroutine FatesReportPFTParams(is_master)
write(fates_log(),fmt0) 'stoich_phos = ',prt_params%phos_stoich_p1
write(fates_log(),fmt0) 'alloc_organ_priority = ',prt_params%alloc_priority
write(fates_log(),fmt0) 'woody = ',prt_params%woody
- write(fates_log(),fmt0) 'crown_depth_frac = ',prt_params%crown_depth_frac
write(fates_log(),fmt0) 'roota_par = ',prt_params%fnrt_prof_a
write(fates_log(),fmt0) 'rootb_par = ',prt_params%fnrt_prof_b
write(fates_log(),fmt0) 'fnrt_prof_mode = ',prt_params%fnrt_prof_mode
@@ -1060,6 +1101,9 @@ subroutine PRTCheckParams(is_master)
logical :: is_season_decid ! Is the PFT cold-deciduous?
logical :: is_stress_decid ! Is the PFT drought-deciduous?
logical :: is_semi_decid ! Is the PFT drought semi-deciduous?
+ integer :: nerror ! Count number of errors. If this is not
+ ! zero by theend of the subroutine, stop
+ ! the run.
npft = size(prt_params%evergreen,1)
@@ -1070,14 +1114,21 @@ subroutine PRTCheckParams(is_master)
if(.not.is_master) return
+ ! Initialise nerror with zero. If anything is incorrectly set, nerror will be
+ ! positive, but we will hold on until all checks are performed before stopping
+ ! the run.
+ nerror = 0
if( any(prt_params%organ_id(:)<1) .or. &
any(prt_params%organ_id(:)>num_organ_types) ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) 'prt_organ_ids should match the global ids'
write(fates_log(),*) 'of organ types found in PRTGenericMod.F90'
write(fates_log(),*) 'organ_ids: ',prt_params%organ_id(:)
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
! Check to make sure the organ ids are valid if this is the
@@ -1087,22 +1138,28 @@ subroutine PRTCheckParams(is_master)
do io = 1,norgans
if(prt_params%organ_id(io) == repro_organ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) 'with flexible cnp or c-only alloc hypotheses'
write(fates_log(),*) 'reproductive tissues are a special case'
write(fates_log(),*) 'and therefore should not be included in'
write(fates_log(),*) 'the parameter file organ list'
write(fates_log(),*) 'fates_prt_organ_id: ',prt_params%organ_id(:)
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
if(prt_params%organ_id(io) == store_organ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) 'with flexible cnp or c-only alloc hypotheses'
write(fates_log(),*) 'storage is a special case'
write(fates_log(),*) 'and therefore should not be included in'
write(fates_log(),*) 'the parameter file organ list'
write(fates_log(),*) 'fates_prt_organ_id: ',prt_params%organ_id(:)
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end do
@@ -1112,10 +1169,13 @@ subroutine PRTCheckParams(is_master)
! between 0 and 1
if (hlm_parteh_mode .eq. prt_cnp_flex_allom_hyp) then
if(any(prt_params%nfix_mresp_scfrac(:)<0._r8) .or. any(prt_params%nfix_mresp_scfrac(:)>1.0_r8)) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) 'The N fixation surcharge nfix_mresp_sfrac (fates_nfix1) must be between 0-1.'
write(fates_log(),*) 'here are the values: ',prt_params%nfix_mresp_scfrac(:)
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
@@ -1136,14 +1196,17 @@ subroutine PRTCheckParams(is_master)
( is_evergreen .and. is_stress_decid ) .or. &
( is_season_decid .and. is_stress_decid ) ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) 'PFT # ',ipft,' must be defined as having one of three'
write(fates_log(),*) 'phenology habits, ie, only one of the flags below should'
write(fates_log(),*) 'be different than ',ifalse
write(fates_log(),*) 'stress_decid: ',prt_params%stress_decid(ipft)
write(fates_log(),*) 'season_decid: ',prt_params%season_decid(ipft)
write(fates_log(),*) 'evergreen: ',prt_params%evergreen(ipft)
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
@@ -1155,6 +1218,7 @@ subroutine PRTCheckParams(is_master)
! In case the product of the lower and upper thresholds is negative, the
! thresholds are inconsistent as both should be defined using the same
! quantity.
+ write(fates_log(),*) '---~---'
write(fates_log(),*) ' When using drought semi-deciduous phenology,'
write(fates_log(),*) ' the moist threshold must have the same sign as'
write(fates_log(),*) ' the dry threshold. Positive = soil water content [m3/m3],'
@@ -1163,10 +1227,13 @@ subroutine PRTCheckParams(is_master)
write(fates_log(),*) ' Stress_decid = ',prt_params%stress_decid(ipft)
write(fates_log(),*) ' fates_phen_drought_threshold = ',prt_params%phen_drought_threshold(ipft)
write(fates_log(),*) ' fates_phen_moist_threshold = ',prt_params%phen_moist_threshold (ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
elseif ( prt_params%phen_drought_threshold(ipft) >= prt_params%phen_moist_threshold(ipft) ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) ' When using drought semi-deciduous phenology,'
write(fates_log(),*) ' the moist threshold must be greater than the dry threshold.'
write(fates_log(),*) ' By greater we mean more positive or less negative, and'
@@ -1175,8 +1242,10 @@ subroutine PRTCheckParams(is_master)
write(fates_log(),*) ' Stress_decid = ',prt_params%stress_decid(ipft)
write(fates_log(),*) ' fates_phen_drought_threshold = ',prt_params%phen_drought_threshold(ipft)
write(fates_log(),*) ' fates_phen_moist_threshold = ',prt_params%phen_moist_threshold (ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
@@ -1186,13 +1255,16 @@ subroutine PRTCheckParams(is_master)
! is bounded between 0 and 1 (exactly 0 and 1 are acceptable).
if ( ( prt_params%phen_fnrt_drop_fraction(ipft) < 0.0_r8 ) .or. &
( prt_params%phen_fnrt_drop_fraction(ipft) > 1.0_r8 ) ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) ' Abscission rate for fine roots must be between 0 and 1 for '
write(fates_log(),*) ' deciduous PFTs.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' evergreen flag: (should be 0):',prt_params%evergreen(ipft)
write(fates_log(),*) ' phen_fnrt_drop_fraction: ', prt_params%phen_fnrt_drop_fraction(ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
@@ -1203,21 +1275,27 @@ subroutine PRTCheckParams(is_master)
if ( ( prt_params%woody(ipft) == itrue ) .and. &
( ( prt_params%phen_stem_drop_fraction(ipft) < 0.0_r8 ) .or. &
( prt_params%phen_stem_drop_fraction(ipft) > nearzero ) ) ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) ' Non-zero stem-drop fractions are not allowed for woody plants'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' part_params%woody:',prt_params%woody(ipft)
write(fates_log(),*) ' phen_stem_drop_fraction: ', prt_params%phen_stem_drop_fraction(ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
elseif ( ( prt_params%phen_stem_drop_fraction(ipft) < 0.0_r8 ) .or. &
( prt_params%phen_stem_drop_fraction(ipft) > 1.0_r8 ) ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) ' Deciduous non-wood plants must keep 0-100% of their stems'
write(fates_log(),*) ' during the deciduous period.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' evergreen flag: (should be 0):',prt_params%evergreen(ipft)
write(fates_log(),*) ' phen_stem_drop_fraction: ', prt_params%phen_stem_drop_fraction(ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
@@ -1229,14 +1307,16 @@ subroutine PRTCheckParams(is_master)
if ( ( prt_params%seed_alloc(ipft) + &
prt_params%seed_alloc_mature(ipft)) > 1.0_r8 ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) 'The sum of seed allocation from base and mature trees may'
write(fates_log(),*) ' not exceed 1.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' seed_alloc: ',prt_params%seed_alloc(ipft)
write(fates_log(),*) ' seed_alloc_mature: ',prt_params%seed_alloc_mature(ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
-
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
! Check if woody plants have a structural biomass (agb) intercept
@@ -1244,21 +1324,46 @@ subroutine PRTCheckParams(is_master)
if ( ( prt_params%allom_agb1(ipft) <= tiny(prt_params%allom_agb1(ipft)) ) .and. &
( prt_params%woody(ipft) .eq. 1 ) ) then
+ write(fates_log(),*) '---~---'
write(fates_log(),*) 'Woody plants are expected to have a non-zero intercept'
write(fates_log(),*) ' in the diameter to AGB allometry equations'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' allom_agb1: ',prt_params%allom_agb1(ipft)
write(fates_log(),*) ' woody: ',prt_params%woody(ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) '---~---'
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
+ ! Check if parameter 2 for dbh -> height is negative when allom_hmode is 2
+ ! (Weibull function / Poorter et al. (2006)
+ ! ML: FATES definition for parameter 2 is a bit unusual, which is why I added
+ ! the check. Normally the minus sign is left outside the parameter for
+ ! Weibull functions.
+ ! ----------------------------------------------------------------------------------
+ if ( ( prt_params%allom_hmode(ipft) == 2 ) .and. &
+ ( prt_params%allom_d2h2 (ipft) > 0._r8 ) ) then
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) " Incorrect settings for height allometry."
+ write(fates_log(),*) ' PFT index: ',ipft
+ write(fates_log(),*) ' allom_hmode: ',prt_params%allom_hmode(ipft)
+ write(fates_log(),*) ' allom_d2h2: ',prt_params%allom_d2h2 (ipft)
+ write(fates_log(),*) " Parameter ""allom_d2h2"" must be negative when using"
+ write(fates_log(),*) " allom_hmode = 2."
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
+ end if
+
! Check if non-woody plants have structural biomass (agb) intercept
! ----------------------------------------------------------------------------------
! if ( ( prt_params%allom_agb1(ipft) > tiny(prt_params%allom_agb1(ipft)) ) .and. &
! ( iprt_params%woody(ipft) .ne. 1 ) ) then
!
+! write(fates_log(),*) "---~---"
! write(fates_log(),*) 'Non-woody plants are expected to have a zero intercept'
! write(fates_log(),*) ' in the diameter to AGB allometry equations'
! write(fates_log(),*) ' This is because the definition of AGB (as far as allometry)'
@@ -1267,8 +1372,10 @@ subroutine PRTCheckParams(is_master)
! write(fates_log(),*) ' PFT#: ',ipft
! write(fates_log(),*) ' allom_agb1: ',prt_params%allom_agb1(ipft)
! write(fates_log(),*) ' woody: ',prt_params%woody(ipft)
-! write(fates_log(),*) ' Aborting'
-! call endrun(msg=errMsg(sourcefile, __LINE__))
+! write(fates_log(),*) "---~---"
+! write(fates_log(),*) ''
+! write(fates_log(),*) ''
+! nerror = nerror + 1
!
! end if
@@ -1278,13 +1385,16 @@ subroutine PRTCheckParams(is_master)
if ( ( prt_params%leaf_stor_priority(ipft) < 0.0_r8 ) .or. &
( prt_params%leaf_stor_priority(ipft) > 1.0_r8 ) ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'Prioritization of carbon allocation to leaf'
write(fates_log(),*) ' and root turnover replacement, must be between'
write(fates_log(),*) ' 0 and 1'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) 'leaf_stor_priority: ',prt_params%leaf_stor_priority(ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
@@ -1293,18 +1403,26 @@ subroutine PRTCheckParams(is_master)
! Make sure nutrient storage fractions are positive
if( prt_params%nitr_store_ratio(ipft) < 0._r8 ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'With parteh allometric CNP hypothesis'
write(fates_log(),*) 'nitr_store_ratio must be > 0'
write(fates_log(),*) 'PFT#: ',ipft
write(fates_log(),*) 'nitr_store_ratio = ',prt_params%nitr_store_ratio(ipft)
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
if( prt_params%phos_store_ratio(ipft) < 0._r8 ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'With parteh allometric CNP hypothesis'
write(fates_log(),*) 'phos_store_ratio must be > 0'
write(fates_log(),*) 'PFT#: ',ipft
write(fates_log(),*) 'nitr_store_ratio = ',prt_params%phos_store_ratio(ipft)
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
do i = 1,norgans
@@ -1312,33 +1430,45 @@ subroutine PRTCheckParams(is_master)
if(io == sapw_organ) then
if ((prt_params%turnover_nitr_retrans(ipft,i) > nearzero)) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' Retranslocation of sapwood tissues should be zero.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' nitrogen retrans: ',prt_params%turnover_nitr_retrans(ipft,i)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
if ((prt_params%turnover_phos_retrans(ipft,i) > nearzero)) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' Retranslocation of sapwood tissues should be zero.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' phosphorus retrans: ',prt_params%turnover_nitr_retrans(ipft,i)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
elseif(io == struct_organ) then
if ((prt_params%turnover_nitr_retrans(ipft,i) > nearzero)) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' Retranslocation of structural tissues should be zero.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' carbon retrans: ',prt_params%turnover_nitr_retrans(ipft,i)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
if ((prt_params%turnover_phos_retrans(ipft,i) > nearzero)) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' Retranslocation of structural tissues should be zero.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' phosphorus retrans: ',prt_params%turnover_nitr_retrans(ipft,i)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
@@ -1347,13 +1477,16 @@ subroutine PRTCheckParams(is_master)
(prt_params%turnover_phos_retrans(ipft,i) > 1.0_r8) .or. &
(prt_params%turnover_nitr_retrans(ipft,i) < 0.0_r8) .or. &
(prt_params%turnover_phos_retrans(ipft,i) < 0.0_r8)) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' Retranslocation should range from 0 to 1.'
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' parameter file organ index: ',i,' global index: ',io
write(fates_log(),*) ' nitr: ',prt_params%turnover_nitr_retrans(ipft,i)
write(fates_log(),*) ' phos: ',prt_params%turnover_phos_retrans(ipft,i)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end do
@@ -1365,18 +1498,24 @@ subroutine PRTCheckParams(is_master)
! if (parteh_mode .eq. prt_carbon_allom_hyp) then
if ( ( prt_params%grperc(ipft) < 0.0_r8) .or. &
( prt_params%grperc(ipft) > 1.0_r8 ) ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' Growth respiration must be between 0 and 1: ',prt_params%grperc(ipft)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
! elseif(parteh_mode .eq. prt_cnp_flex_allom_hyp) then
! if ( ( any(prt_params%grperc_organ(ipft,:) < 0.0_r8)) .or. &
! ( any(prt_params%grperc_organ(ipft,:) >= 1.0_r8)) ) then
+! write(fates_log(),*) "---~---"
! write(fates_log(),*) ' PFT#: ',ipft
! write(fates_log(),*) ' Growth respiration must be between 0 and 1: ',prt_params%grperc_organ(ipft,:)
-! write(fates_log(),*) ' Aborting'
-! call endrun(msg=errMsg(sourcefile, __LINE__))
+! write(fates_log(),*) "---~---"
+! write(fates_log(),*) ''
+! write(fates_log(),*) ''
+! nerror = nerror + 1
! end if
! end if
@@ -1385,11 +1524,14 @@ subroutine PRTCheckParams(is_master)
! The first nitrogen stoichiometry is used in all cases
if ( (any(prt_params%nitr_stoich_p1(ipft,:) < 0.0_r8)) .or. &
(any(prt_params%nitr_stoich_p1(ipft,:) >= 1.0_r8))) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' N per C stoichiometry must bet between 0-1'
write(fates_log(),*) prt_params%nitr_stoich_p1(ipft,:)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end select
@@ -1401,6 +1543,7 @@ subroutine PRTCheckParams(is_master)
(prt_params%phos_stoich_p1(ipft,i) < 0._r8) .or. &
(prt_params%nitr_stoich_p1(ipft,i) > 1._r8) .or. &
(prt_params%phos_stoich_p1(ipft,i) > 1._r8) ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'When the C,N,P allocation hypothesis with flexible'
write(fates_log(),*) 'stoichiometry is turned on (prt_cnp_flex_allom_hyp),'
write(fates_log(),*) 'all stoichiometries must be greater than or equal to zero,'
@@ -1410,18 +1553,23 @@ subroutine PRTCheckParams(is_master)
write(fates_log(),*) 'organ index (see head of PRTGenericMod): ',io
write(fates_log(),*) 'nitr_stoich: ',prt_params%nitr_stoich_p1(ipft,i)
write(fates_log(),*) 'phos_stoich: ',prt_params%phos_stoich_p1(ipft,i)
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end do
if ( any(prt_params%alloc_priority(ipft,:) < 0) .or. &
any(prt_params%alloc_priority(ipft,:) > 6) ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) ' PFT#: ',ipft
write(fates_log(),*) ' Allocation priorities should be 0-6 for CNP flex hypothesis'
write(fates_log(),*) prt_params%alloc_priority(ipft,:)
- write(fates_log(),*) ' Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end select
@@ -1437,35 +1585,45 @@ subroutine PRTCheckParams(is_master)
! Check that leaf turnover doesn't exeed 1 day
if ( (years_per_day / prt_params%leaf_long(ipft,iage)) > 1._r8 ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'Leaf turnover time-scale is greater than 1 day!'
write(fates_log(),*) 'ipft: ',ipft,' iage: ',iage
write(fates_log(),*) 'leaf_long(ipft,iage): ',prt_params%leaf_long(ipft,iage),' [years]'
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
! Check to make sure that all other age-classes for this PFT also
! have non-zero entries, it wouldn't make sense otherwise
if ( any(prt_params%leaf_long(ipft,:) <= nearzero) ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'You specified a leaf_long that is zero or'
write(fates_log(),*) 'invalid for a particular age class.'
write(fates_log(),*) 'Yet, other age classes for this PFT are non-zero.'
write(fates_log(),*) 'this doesnt make sense.'
write(fates_log(),*) 'ipft = ',ipft
write(fates_log(),*) 'leaf_long(ipft,:) = ',prt_params%leaf_long(ipft,:)
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
else
if (prt_params%evergreen(ipft) .eq. itrue) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'You specified zero leaf turnover: '
write(fates_log(),*) 'ipft: ',ipft,' iage: ',iage
write(fates_log(),*) 'leaf_long(ipft,iage): ',prt_params%leaf_long(ipft,iage)
write(fates_log(),*) 'yet this is an evergreen PFT, and it only makes sense'
write(fates_log(),*) 'that an evergreen would have leaf maintenance turnover'
write(fates_log(),*) 'disable this error if you are ok with this'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
@@ -1478,23 +1636,30 @@ subroutine PRTCheckParams(is_master)
if ( (years_per_day / &
(prt_params%leaf_long(ipft,nleafage) * &
prt_params%senleaf_long_fdrought(ipft))) > 1._r8 ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'Drought-senescent turnover time-scale is greater than 1 day!'
write(fates_log(),*) 'ipft: ',ipft
write(fates_log(),*) 'leaf_long(ipft,nleafage)*senleaf_long_fdrought: ', &
prt_params%leaf_long(ipft,nleafage)*prt_params%senleaf_long_fdrought(ipft),' [years]'
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
if ( prt_params%senleaf_long_fdrought(ipft)1._r8 ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'senleaf_long_fdrought(ipft) must be greater than 0 '
write(fates_log(),*) 'or less than or equal to 1.'
write(fates_log(),*) 'Set this to 1 if you want no accelerated senescence turnover'
write(fates_log(),*) 'ipft = ',ipft
write(fates_log(),*) 'senleaf_long_fdrought(ipft) = ',prt_params%senleaf_long_fdrought(ipft)
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
@@ -1502,22 +1667,29 @@ subroutine PRTCheckParams(is_master)
! Check that root turnover doesn't exeed 1 day
if ( (years_per_day / prt_params%root_long(ipft)) > 1._r8 ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'Root turnover time-scale is greater than 1 day!'
write(fates_log(),*) 'ipft: ',ipft
write(fates_log(),*) 'root_long(ipft): ',prt_params%root_long(ipft),' [years]'
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
else
if (prt_params%evergreen(ipft) .eq. itrue) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'You specified zero root turnover: '
write(fates_log(),*) 'ipft: ',ipft
write(fates_log(),*) 'root_long(ipft): ',prt_params%root_long(ipft)
write(fates_log(),*) 'yet this is an evergreen PFT, and it only makes sense'
write(fates_log(),*) 'that an evergreen would have root maintenance turnover'
write(fates_log(),*) 'disable this error if you are ok with this'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
@@ -1526,11 +1698,14 @@ subroutine PRTCheckParams(is_master)
! Check that branch turnover doesn't exeed 1 day
if ( (years_per_day / prt_params%branch_long(ipft)) > 1._r8 ) then
+ write(fates_log(),*) "---~---"
write(fates_log(),*) 'Branch turnover time-scale is greater than 1 day!'
write(fates_log(),*) 'ipft: ',ipft
write(fates_log(),*) 'branch_long(ipft): ',prt_params%branch_long(ipft),' [years]'
- write(fates_log(),*) 'Aborting'
- call endrun(msg=errMsg(sourcefile, __LINE__))
+ write(fates_log(),*) "---~---"
+ write(fates_log(),*) ''
+ write(fates_log(),*) ''
+ nerror = nerror + 1
end if
end if
@@ -1538,6 +1713,14 @@ subroutine PRTCheckParams(is_master)
end do pftloop
+ ! If any error was found, abort. We add a single point to abort the run after all
+ ! checks so users can get all the errors and address them in one go (as opposed to
+ ! multiple submissions).
+ if (nerror > 0) then
+ write(fates_log(),*) 'One or more parameter errors found. Aborting.'
+ call endrun(msg=errMsg(sourcefile, __LINE__))
+ end if
+
return
end subroutine PRTCheckParams