diff --git a/biogeochem/EDCohortDynamicsMod.F90 b/biogeochem/EDCohortDynamicsMod.F90 index c88e83c1c6..3e3e25334b 100644 --- a/biogeochem/EDCohortDynamicsMod.F90 +++ b/biogeochem/EDCohortDynamicsMod.F90 @@ -64,7 +64,6 @@ module EDCohortDynamicsMod use FatesAllometryMod , only : carea_allom use FatesAllometryMod , only : ForceDBH use FatesAllometryMod , only : tree_lai, tree_sai - use FatesAllometryMod , only : i_biomass_rootprof_context use FatesAllometryMod , only : set_root_fraction use PRTGenericMod, only : prt_carbon_allom_hyp use PRTGenericMod, only : prt_cnp_flex_allom_hyp @@ -847,8 +846,7 @@ subroutine SendCohortToLitter(csite,cpatch,ccohort,nplant) plant_dens = nplant/cpatch%area - call set_root_fraction(csite%rootfrac_scr, pft, csite%zi_soil, & - icontext = i_biomass_rootprof_context) + call set_root_fraction(csite%rootfrac_scr, pft, csite%zi_soil) do el=1,num_elements diff --git a/biogeochem/EDLoggingMortalityMod.F90 b/biogeochem/EDLoggingMortalityMod.F90 index 060a156f39..83294dfb28 100644 --- a/biogeochem/EDLoggingMortalityMod.F90 +++ b/biogeochem/EDLoggingMortalityMod.F90 @@ -55,7 +55,6 @@ module EDLoggingMortalityMod use PRTGenericMod , only : sapw_organ, struct_organ, leaf_organ use PRTGenericMod , only : fnrt_organ, store_organ, repro_organ use FatesAllometryMod , only : set_root_fraction - use FatesAllometryMod , only : i_biomass_rootprof_context implicit none private @@ -409,9 +408,7 @@ subroutine logging_litter_fluxes(currentSite, currentPatch, newPatch, patch_site ! derived from the current patch, so we need to multiply by patch_areadis/np%area ! ---------------------------------------------------------------------------------------- - call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil, & - icontext = i_biomass_rootprof_context) - + call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil) ag_wood = (direct_dead+indirect_dead) * (struct_m + sapw_m ) * & EDPftvarcon_inst%allom_agb_frac(currentCohort%pft) diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 2998fd85d8..fa2ac315af 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -53,7 +53,6 @@ module EDPatchDynamicsMod use EDParamsMod , only : fates_mortality_disturbance_fraction use FatesAllometryMod , only : carea_allom use FatesAllometryMod , only : set_root_fraction - use FatesAllometryMod , only : i_biomass_rootprof_context use FatesConstantsMod , only : g_per_kg use FatesConstantsMod , only : ha_per_m2 use FatesConstantsMod , only : days_per_sec @@ -1531,8 +1530,7 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, newPatch, patch_site_ar site_mass%burn_flux_to_atm = site_mass%burn_flux_to_atm + burned_mass - call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil, & - icontext = i_biomass_rootprof_context) + call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil) ! Contribution of dead trees to root litter (no root burn flux to atm) do dcmpy=1,ndcmpy @@ -1741,8 +1739,8 @@ subroutine mortality_litter_fluxes(currentSite, currentPatch, newPatch, patch_si ag_wood = num_dead * (struct_m + sapw_m) * EDPftvarcon_inst%allom_agb_frac(pft) bg_wood = num_dead * (struct_m + sapw_m) * (1.0_r8-EDPftvarcon_inst%allom_agb_frac(pft)) - call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil, & - icontext = i_biomass_rootprof_context) + call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil) + do c=1,ncwd diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 57e5837a0a..b51d7e269f 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -81,7 +81,6 @@ module EDPhysiologyMod use FatesAllometryMod , only : carea_allom use FatesAllometryMod , only : CheckIntegratedAllometries use FatesAllometryMod, only : set_root_fraction - use FatesAllometryMod, only : i_biomass_rootprof_context use PRTGenericMod, only : prt_carbon_allom_hyp use PRTGenericMod, only : prt_cnp_flex_allom_hyp @@ -1797,8 +1796,7 @@ subroutine CWDInput( currentSite, currentPatch, litt) do while(associated(currentCohort)) pft = currentCohort%pft - call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil, & - icontext = i_biomass_rootprof_context) + call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil) leaf_m_turnover = currentCohort%prt%GetTurnover(leaf_organ,element_id) store_m_turnover = currentCohort%prt%GetTurnover(store_organ,element_id) diff --git a/biogeochem/FatesAllometryMod.F90 b/biogeochem/FatesAllometryMod.F90 index d43b1e7769..21bcbcd7c5 100644 --- a/biogeochem/FatesAllometryMod.F90 +++ b/biogeochem/FatesAllometryMod.F90 @@ -128,22 +128,6 @@ module FatesAllometryMod character(len=*), parameter :: sourcefile = __FILE__ - ! The code will call the wrapper routine "set_root_fraction" - ! in at least two different context. In one context it will query - ! set_root_fraction to describe the depth profile of hydraulicly - ! active roots. In the other context, it will ask the wrapper - ! to define the profile of roots as litter. We allow these - ! two contexts to differ. While not fully implemented, the use - ! will have control parameters to choose from different relationships - ! in these two contexts. The calling function, therefore - ! has to tell the wrapper function which context (water or biomass) - ! is being querried. So that we don't have to do messy string - ! parsing, we have two pre-defined flags. - - integer, parameter, public :: i_hydro_rootprof_context = 1 - integer, parameter, public :: i_biomass_rootprof_context = 2 - - ! If testing b4b with older versions, do not remove sapwood ! Our old methods with saldarriaga did not remove sapwood from the ! bdead pool. But newer allometries are providing total agb @@ -1977,7 +1961,8 @@ end subroutine carea_2pwr ! ========================================================================= - subroutine set_root_fraction(root_fraction, ft, zi, icontext ) + subroutine set_root_fraction(root_fraction, ft, zi) + ! ! !DESCRIPTION: ! Calculates the fractions of the root biomass in each layer for each pft. @@ -1992,7 +1977,6 @@ subroutine set_root_fraction(root_fraction, ft, zi, icontext ) real(r8),intent(inout) :: root_fraction(:) ! Normalized profile integer, intent(in) :: ft ! functional typpe real(r8),intent(in) :: zi(0:) ! Center of depth [m] - integer,intent(in) :: icontext ! Parameters ! @@ -2009,8 +1993,8 @@ subroutine set_root_fraction(root_fraction, ft, zi, icontext ) ! exponential. ! All methods return a normalized profile. - integer, parameter :: exponential_1p_profile_type = 1 - integer, parameter :: jackson_beta_profile_type = 2 + integer, parameter :: jackson_beta_profile_type = 1 + integer, parameter :: exponential_1p_profile_type = 2 integer, parameter :: exponential_2p_profile_type = 3 integer :: root_profile_type @@ -2027,40 +2011,21 @@ subroutine set_root_fraction(root_fraction, ft, zi, icontext ) call endrun(msg=errMsg(sourcefile, __LINE__)) end if - if(icontext == i_hydro_rootprof_context) then - - root_profile_type = exponential_2p_profile_type - - else if(icontext == i_biomass_rootprof_context) then - - root_profile_type = jackson_beta_profile_type - - else - write(fates_log(),*) 'An undefined context for calculating root profiles was provided' - write(fates_log(),*) 'There are only two contexts, hydraulic and biomass, pick one.' - write(fates_log(),*) 'Aborting' - call endrun(msg=errMsg(sourcefile, __LINE__)) - end if - - select case(root_profile_type) + select case(nint(EDPftvarcon_inst%fnrt_prof_mode(ft))) case ( exponential_1p_profile_type ) - call exponential_1p_root_profile(root_fraction, ft, zi) + call exponential_1p_root_profile(root_fraction, ft, zi, EDPftvarcon_inst%fnrt_prof_a(ft)) case ( jackson_beta_profile_type ) - call jackson_beta_root_profile(root_fraction, ft, zi) + call jackson_beta_root_profile(root_fraction, ft, zi, EDPftvarcon_inst%fnrt_prof_a(ft)) case ( exponential_2p_profile_type ) - call exponential_2p_root_profile(root_fraction, ft, zi) + call exponential_2p_root_profile(root_fraction, ft, zi, & + EDPftvarcon_inst%fnrt_prof_a(ft),EDPftvarcon_inst%fnrt_prof_b(ft)) case default write(fates_log(),*) 'An undefined root profile type was specified' write(fates_log(),*) 'Aborting' call endrun(msg=errMsg(sourcefile, __LINE__)) end select -! if( abs(sum(root_fraction)-1.0_r8) > 1.e-9_r8 ) then -! write(fates_log(),*) 'Root fractions should add up to 1' -! write(fates_log(),*) root_fraction -! call endrun(msg=errMsg(sourcefile, __LINE__)) -! end if correction = 1._r8 - sum(root_fraction) corr_id = maxloc(root_fraction) @@ -2073,27 +2038,49 @@ end subroutine set_root_fraction ! ===================================================================================== - subroutine exponential_2p_root_profile(root_fraction, ft, zi ) + subroutine exponential_2p_root_profile(root_fraction, ft, zi, a, b) ! ! !ARGUMENTS real(r8),intent(out) :: root_fraction(:) integer,intent(in) :: ft real(r8),intent(in) :: zi(0:) + real(r8),intent(in) :: a ! Exponential shape parameter a + real(r8),intent(in) :: b ! Exponential shape parameter b ! Locals integer :: nlevsoil ! Number of soil layers integer :: lev ! soil layer index real(r8) :: sum_rootfr ! sum of root fraction for normalization - + + + ! Original default parameters: + ! + ! 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 + ! + ! a = 7, 7, 7, 7, 6, 6, 7, 7, 7, 11, 11, 11 ; + ! b = 1, 2, 2, 1, 2, 2, 1.5, 1.5, 1.5, 2, 2, 2 ; + + nlevsoil = ubound(zi,1) sum_rootfr = 0.0_r8 do lev = 1, nlevsoil root_fraction(lev) = .5_r8*( & - exp(-EDPftvarcon_inst%roota_par(ft) * zi(lev-1)) & - + exp(-EDPftvarcon_inst%rootb_par(ft) * zi(lev-1)) & - - exp(-EDPftvarcon_inst%roota_par(ft) * zi(lev)) & - - exp(-EDPftvarcon_inst%rootb_par(ft) * zi(lev))) + exp(-a * zi(lev-1)) & + + exp(-b * zi(lev-1)) & + - exp(-a * zi(lev)) & + - exp(-b * zi(lev))) sum_rootfr = sum_rootfr + root_fraction(lev) end do @@ -2106,14 +2093,15 @@ end subroutine exponential_2p_root_profile ! ===================================================================================== - subroutine exponential_1p_root_profile(root_fraction, ft, zi) + subroutine exponential_1p_root_profile(root_fraction, ft, zi, a) ! ! !ARGUMENTS real(r8),intent(out) :: root_fraction(:) integer,intent(in) :: ft real(r8),intent(in) :: zi(0:) - + real(r8),intent(in) :: a ! Exponential shape parameter a + ! ! LOCAL VARIABLES: integer :: lev ! soil depth layer index @@ -2121,7 +2109,8 @@ subroutine exponential_1p_root_profile(root_fraction, ft, zi) real(r8) :: depth ! Depth to middle of layer [m] real(r8) :: sum_rootfr ! sum of rooting profile for normalization - real(r8), parameter :: rootprof_exp = 3. ! how steep profile is + ! Typical default parameter is a = 3. + ! how steep profile is ! for root C inputs (1/ e-folding depth) (1/m) nlevsoil = ubound(zi,1) @@ -2129,7 +2118,7 @@ subroutine exponential_1p_root_profile(root_fraction, ft, zi) ! define rooting profile from exponential parameters sum_rootfr = 0.0_r8 do lev = 1, nlevsoil - root_fraction(lev) = exp(-rootprof_exp * 0.5*(zi(lev)+zi(lev-1)) ) + root_fraction(lev) = exp(-a * 0.5*(zi(lev)+zi(lev-1)) ) sum_rootfr = sum_rootfr + root_fraction(lev) end do @@ -2142,33 +2131,32 @@ end subroutine exponential_1p_root_profile ! ===================================================================================== - subroutine jackson_beta_root_profile(root_fraction, ft, zi) + subroutine jackson_beta_root_profile(root_fraction, ft, zi, a) + + ! ----------------------------------------------------------------------------------- + ! use beta distribution parameter from Jackson et al., 1996 + ! ----------------------------------------------------------------------------------- - ! !ARGUMENTS real(r8),intent(out) :: root_fraction(:) ! fraction of root mass in each soil layer integer,intent(in) :: ft ! functional type real(r8),intent(in) :: zi(0:) ! depth of layer interfaces 0-nlevsoil - + real(r8),intent(in) :: a ! Exponential shape parameter a + ! ! LOCAL VARIABLES: integer :: lev ! soil depth layer index integer :: nlevsoil ! number of soil layers real(r8) :: sum_rootfr ! sum of rooting profile, for normalization - ! Note cdk 2016/08 we actually want to use the carbon index here rather than the water index. - ! Doing so will be answer changing though so perhaps easiest to do this in steps. - integer, parameter :: rooting_profile_varindex_water = 1 + ! Original defaults in fates, a = 0.976 (all Pfts) nlevsoil = ubound(zi,1) - ! use beta distribution parameter from Jackson et al., 1996 + sum_rootfr = 0.0_r8 do lev = 1, nlevsoil root_fraction(lev) = & - ( EDPftvarcon_inst%rootprof_beta(ft, rooting_profile_varindex_water) ** & - ( zi(lev-1)*100._r8) - & - EDPftvarcon_inst%rootprof_beta(ft, rooting_profile_varindex_water) ** & - ( zi(lev)*100._r8) ) + ( a ** ( zi(lev-1)*100._r8) - a ** ( zi(lev)*100._r8) ) sum_rootfr = sum_rootfr + root_fraction(lev) end do diff --git a/biogeophys/EDBtranMod.F90 b/biogeophys/EDBtranMod.F90 index 76bd1425c1..e7faac9cc3 100644 --- a/biogeophys/EDBtranMod.F90 +++ b/biogeophys/EDBtranMod.F90 @@ -19,7 +19,6 @@ module EDBtranMod use FatesInterfaceTypesMod , only : hlm_use_planthydro use FatesGlobals , only : fates_log use FatesAllometryMod , only : set_root_fraction - use FatesAllometryMod , only : i_hydro_rootprof_context ! implicit none @@ -140,8 +139,7 @@ subroutine btran_ed( nsites, sites, bc_in, bc_out) do ft = 1,numpft - call set_root_fraction(sites(s)%rootfrac_scr, ft, sites(s)%zi_soil, & - icontext = i_hydro_rootprof_context) + call set_root_fraction(sites(s)%rootfrac_scr, ft, sites(s)%zi_soil ) cpatch%btran_ft(ft) = 0.0_r8 do j = 1,bc_in(s)%nlevsoil diff --git a/biogeophys/FatesBstressMod.F90 b/biogeophys/FatesBstressMod.F90 index b4e81adcdc..46f30f434b 100644 --- a/biogeophys/FatesBstressMod.F90 +++ b/biogeophys/FatesBstressMod.F90 @@ -19,7 +19,6 @@ module FatesBstressMod use FatesGlobals , only : fates_log use EDBtranMod , only : check_layer_water use FatesAllometryMod , only : set_root_fraction - use FatesAllometryMod , only : i_hydro_rootprof_context implicit none private @@ -69,8 +68,7 @@ subroutine btran_sal_stress_fates( nsites, sites, bc_in) do ft = 1,numpft cpatch%bstress_sal_ft(ft) = 0.0_r8 - call set_root_fraction(sites(s)%rootfrac_scr, ft, sites(s)%zi_soil, & - icontext = i_hydro_rootprof_context) + call set_root_fraction(sites(s)%rootfrac_scr, ft, sites(s)%zi_soil ) do j = 1,bc_in(s)%nlevsoil diff --git a/biogeophys/FatesPlantHydraulicsMod.F90 b/biogeophys/FatesPlantHydraulicsMod.F90 index ca984d16da..d67d346f89 100644 --- a/biogeophys/FatesPlantHydraulicsMod.F90 +++ b/biogeophys/FatesPlantHydraulicsMod.F90 @@ -66,7 +66,6 @@ module FatesPlantHydraulicsMod use FatesAllometryMod, only : bsap_allom use FatesAllometryMod, only : CrownDepth use FatesAllometryMod , only : set_root_fraction - use FatesAllometryMod , only : i_hydro_rootprof_context use FatesHydraulicsMemMod, only: use_2d_hydrosolve use FatesHydraulicsMemMod, only: ed_site_hydr_type use FatesHydraulicsMemMod, only: ed_cohort_hydr_type @@ -656,9 +655,8 @@ subroutine UpdatePlantHydrNodes(ccohort_hydr,ft,plant_height,csite_hydr) ! Crown Nodes ! in special case where n_hypool_leaf = 1, the node height of the canopy ! water pool is 1/2 the distance from the bottom of the canopy to the top of the tree - - roota = EDPftvarcon_inst%roota_par(ft) - rootb = EDPftvarcon_inst%rootb_par(ft) + roota = EDPftvarcon_inst%fnrt_prof_a(ft) + rootb = EDPftvarcon_inst%fnrt_prof_b(ft) nlevrhiz = csite_hydr%nlevrhiz call CrownDepth(plant_height,crown_depth) @@ -820,8 +818,8 @@ subroutine UpdatePlantHydrLenVol(ccohort,site_hydr) fnrt_c = ccohort%prt%GetState(fnrt_organ, all_carbon_elements) struct_c = ccohort%prt%GetState(struct_organ, all_carbon_elements) - roota = EDPftvarcon_inst%roota_par(ft) - rootb = EDPftvarcon_inst%rootb_par(ft) + roota = EDPftvarcon_inst%fnrt_prof_a(ft) + rootb = EDPftvarcon_inst%fnrt_prof_b(ft) ! Leaf Volumes ! ----------------------------------------------------------------------------------- @@ -1523,8 +1521,6 @@ subroutine RecruitWUptake(nsites,sites,bc_in,dtime,recruitflag) type(ed_site_hydr_type), pointer :: csite_hydr integer :: s, j, ft integer :: nstep !number of time steps - real(r8) :: roota !root distriubiton parameter a - real(r8) :: rootb !root distriubiton parameter b real(r8) :: rootfr !fraction of root in different soil layer real(r8) :: recruitw !water for newly recruited cohorts (kg water/m2/s) real(r8) :: recruitw_total ! total water for newly recruited cohorts (kg water/m2/s) @@ -1546,8 +1542,6 @@ subroutine RecruitWUptake(nsites,sites,bc_in,dtime,recruitflag) ! recruitment water uptake if(ccohort_hydr%is_newly_recruited) then recruitflag = .true. - roota = EDPftvarcon_inst%roota_par(ft) - rootb = EDPftvarcon_inst%rootb_par(ft) recruitw = (sum(ccohort_hydr%th_ag(:)*ccohort_hydr%v_ag(:)) + & ccohort_hydr%th_troot*ccohort_hydr%v_troot + & sum(ccohort_hydr%th_aroot(:)*ccohort_hydr%v_aroot_layer(:)))* & @@ -1604,17 +1598,12 @@ subroutine ConstrainRecruitNumber(csite,ccohort, bc_in) real(r8) :: watres_local !minum water content [m3/m3] real(r8) :: total_water !total water in rhizosphere at a specific layer (m^3 ha-1) real(r8) :: total_water_min !total minimum water in rhizosphere at a specific layer (m^3) - real(r8) :: roota !root distriubiton parameter a - real(r8) :: rootb !root distriubiton parameter b real(r8) :: rootfr !fraction of root in different soil layer real(r8) :: recruitw !water for newly recruited cohorts (kg water/m2/individual) real(r8) :: n, nmin !number of individuals in cohorts real(r8) :: sum_l_aroot integer :: s, j, ft - roota = EDPftvarcon_inst%roota_par(ccohort%pft) - rootb = EDPftvarcon_inst%rootb_par(ccohort%pft) - csite_hydr => csite%si_hydr ccohort_hydr =>ccohort%co_hydr recruitw = (sum(ccohort_hydr%th_ag(:)*ccohort_hydr%v_ag(:)) + & @@ -2696,8 +2685,6 @@ subroutine UpdatePlantKmax(ccohort_hydr,ccohort,csite_hydr) ! and absorbing root node in each layer [kg s-1 MPa-1] real(r8) :: surfarea_aroot_layer ! Surface area of absorbing roots in each ! soil layer [m2] - real(r8) :: roota ! root profile parameter a zeng2001_crootfr - real(r8) :: rootb ! root profile parameter b zeng2001_crootfr real(r8) :: sum_l_aroot ! sum of plant's total root length real(r8),parameter :: taper_exponent = 1._r8/3._r8 ! Savage et al. (2010) xylem taper exponent [-] real(r8),parameter :: min_pet_stem_dz = 0.00001_r8 ! Force at least a small difference @@ -2705,8 +2692,6 @@ subroutine UpdatePlantKmax(ccohort_hydr,ccohort,csite_hydr) pft = ccohort%pft - roota = EDPftvarcon_inst%roota_par(pft) - rootb = EDPftvarcon_inst%rootb_par(pft) ! Get the cross-section of the plant's sapwood area [m2] call bsap_allom(ccohort%dbh,pft,ccohort%canopy_trim,a_sapwood,c_sap_dummy) @@ -3091,7 +3076,6 @@ subroutine ImTaylorSolve1D(site_hydr,cohort,cohort_hydr,dtime,q_top, & integer :: error_code ! flag that specifies which check tripped a failed solution integer :: ft ! plant functional type real(r8) :: q_flow ! flow diagnostic [kg] - real(r8) :: roota, rootb ! rooting depth parameters (used for diagnostics) real(r8) :: rootfr ! rooting fraction of this layer (used for diagnostics) ! out of the total absorbing roots from the whole community of plants integer :: iter ! iteration count for sub-step loops diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index dca06bb988..5ca03537be 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -109,7 +109,6 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) use FatesAllometryMod, only : bleaf use FatesAllometryMod, only : storage_fraction_of_target use FatesAllometryMod, only : set_root_fraction - use FatesAllometryMod, only : i_hydro_rootprof_context use FatesAllometryMod, only : decay_coeff_kn ! ARGUMENTS: @@ -168,7 +167,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) real(r8) :: mm_kco2 ! Michaelis-Menten constant for CO2 (Pa) real(r8) :: mm_ko2 ! Michaelis-Menten constant for O2 (Pa) real(r8) :: co2_cpoint ! CO2 compensation point (Pa) - real(r8) :: btran_eff ! effective transpiration wetness factor (0 to 1) + real(r8) :: btran_eff ! effective transpiration wetness factor (0 to 1) real(r8) :: stomatal_intercept_btran ! water-stressed minimum stomatal conductance (umol H2O/m**2/s) real(r8) :: kn ! leaf nitrogen decay coefficient real(r8) :: cf ! s m**2/umol -> s/m (ideal gas conversion) [umol/m3] @@ -247,11 +246,6 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) ! Bonan et al (2011) JGR, 116, doi:10.1029/2010JG001593 ! ----------------------------------------------------------------------------------- - ! Ball-Berry minimum leaf conductance, unstressed (umol H2O/m**2/s) - ! For C3 and C4 plants - ! ----------------------------------------------------------------------------------- - - associate( & c3psn => EDPftvarcon_inst%c3psn , & slatop => EDPftvarcon_inst%slatop , & ! specific leaf area at top of canopy, @@ -259,9 +253,6 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) woody => EDPftvarcon_inst%woody , & ! Is vegetation woody or not? stomatal_intercept => EDPftvarcon_inst%stomatal_intercept ) !Unstressed minimum stomatal conductance - - - do s = 1,nsites ! Multi-layer parameters scaled by leaf nitrogen profile. @@ -278,7 +269,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) do ft = 1,numpft call set_root_fraction(rootfr_ft(ft,:), ft, & - bc_in(s)%zi_sisl,icontext = i_hydro_rootprof_context) + bc_in(s)%zi_sisl) end do @@ -421,6 +412,7 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) else stomatal_intercept_btran = max( cf/rsmax0,stomatal_intercept(ft)*currentPatch%btran_ft(ft) ) + btran_eff = currentPatch%btran_ft(ft) ! For consistency sake, we use total LAI here, and not exposed ! if the plant is under-snow, it will be effectively dormant for @@ -926,10 +918,10 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in real(r8) :: ai ! intermediate co-limited photosynthesis (umol CO2/m**2/s) real(r8) :: leaf_co2_ppress ! CO2 partial pressure at leaf surface (Pa) real(r8) :: init_co2_inter_c ! First guess intercellular co2 specific to C path - real(r8) :: term ! intermediate variable in Medlyn stomatal conductance model real(r8) :: vpd ! water vapor deficit in Medlyn stomatal model (KPa) + ! Parameters ! ------------------------------------------------------------------------ ! Fraction of light absorbed by non-photosynthetic pigments @@ -958,17 +950,13 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in ! empirical curvature parameter for ap photosynthesis co-limitation real(r8),parameter :: theta_ip = 0.999_r8 - - associate( bb_slope => EDPftvarcon_inst%BB_slope ,& ! slope of BB relationship, unitless + associate( bb_slope => EDPftvarcon_inst%bb_slope ,& ! slope of BB relationship, unitless medlyn_slope=> EDPftvarcon_inst%medlyn_slope , & ! Slope for Medlyn stomatal conductance model method, the unit is KPa^0.5 stomatal_intercept=> EDPftvarcon_inst%stomatal_intercept ) !Unstressed minimum stomatal conductance, the unit is umol/m**2/s - - ! photosynthetic pathway: 0. = c4, 1. = c3 c3c4_path_index = nint(EDPftvarcon_inst%c3psn(ft)) - if (c3c4_path_index == 1) then init_co2_inter_c = init_a2l_co2_c3 * can_co2_ppress else @@ -1220,6 +1208,7 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in psn_out = 0._r8 anet_av_out = 0._r8 + rstoma_out = min(rsmax0,cf/(stem_cuticle_loss_frac*stomatal_intercept(ft))) c13disc_z = 0.0_r8 diff --git a/fire/SFMainMod.F90 b/fire/SFMainMod.F90 index ac4f672608..df5f999426 100644 --- a/fire/SFMainMod.F90 +++ b/fire/SFMainMod.F90 @@ -21,7 +21,6 @@ module SFMainMod use EDtypesMod , only : ed_cohort_type use EDtypesMod , only : AREA use EDtypesMod , only : DL_SF - use EDtypesMod , only : FIRE_THRESHOLD use EDTypesMod , only : TW_SF use EDtypesMod , only : LB_SF use EDtypesMod , only : LG_SF @@ -667,7 +666,7 @@ subroutine area_burnt_intensity ( currentSite ) use EDParamsMod, only : cg_strikes ! fraction of cloud-to-ground ligtning strikes use FatesConstantsMod, only : years_per_day use SFParamsMod, only : SF_val_fdi_alpha,SF_val_fuel_energy, & - SF_val_max_durat, SF_val_durat_slope + SF_val_max_durat, SF_val_durat_slope, SF_val_fire_threshold type(ed_site_type), intent(inout), target :: currentSite type(ed_patch_type), pointer :: currentPatch @@ -774,7 +773,7 @@ subroutine area_burnt_intensity ( currentSite ) endif !'decide_fire' subroutine - if (currentPatch%FI > fire_threshold) then !track fires greater than kW/m2 energy threshold + if (currentPatch%FI > SF_val_fire_threshold) then !track fires greater than kW/m energy threshold currentPatch%fire = 1 ! Fire... :D else diff --git a/fire/SFParamsMod.F90 b/fire/SFParamsMod.F90 index 1c9f278c1e..02c0ce7756 100644 --- a/fire/SFParamsMod.F90 +++ b/fire/SFParamsMod.F90 @@ -3,6 +3,7 @@ module SFParamsMod ! module that deals with reading the SF parameter file ! use FatesConstantsMod , only: r8 => fates_r8 + use FatesConstantsMod , only: fates_check_param_set use EDtypesMod , only: NFSC use FatesLitterMod , only: ncwd use FatesParametersInterface, only : param_string_length @@ -28,6 +29,7 @@ module SFParamsMod real(r8),protected, public :: SF_val_max_durat real(r8),protected, public :: SF_val_durat_slope real(r8),protected, public :: SF_val_drying_ratio + real(r8),protected, public :: SF_val_fire_threshold ! threshold for fires that spread or go out. kW/m (Pyne 1996) real(r8),protected, public :: SF_val_CWD_frac(ncwd) real(r8),protected, public :: SF_val_max_decomp(NFSC) real(r8),protected, public :: SF_val_SAV(NFSC) @@ -49,6 +51,7 @@ module SFParamsMod character(len=param_string_length),parameter :: SF_name_max_durat = "fates_fire_max_durat" character(len=param_string_length),parameter :: SF_name_durat_slope = "fates_fire_durat_slope" character(len=param_string_length),parameter :: SF_name_drying_ratio = "fates_fire_drying_ratio" + character(len=param_string_length),parameter :: SF_name_fire_threshold = "fates_fire_threshold" character(len=param_string_length),parameter :: SF_name_CWD_frac = "fates_CWD_frac" character(len=param_string_length),parameter :: SF_name_max_decomp = "fates_max_decomp" character(len=param_string_length),parameter :: SF_name_SAV = "fates_fire_SAV" @@ -63,6 +66,10 @@ module SFParamsMod character(len=*), parameter, private :: sourcefile = & __FILE__ + + real(r8), parameter,private :: min_fire_threshold = 0.0001_r8 ! The minimum reasonable fire intensity threshold [kW/m] + + public :: SpitFireRegisterParams public :: SpitFireReceiveParams public :: SpitFireCheckParams @@ -119,6 +126,15 @@ subroutine SpitFireCheckParams(is_master) SF_val_CWD_frac(corr_id(1)) = SF_val_CWD_frac(corr_id(1)) + correction end if + ! Check to see if the fire threshold is above the minimum and set at all + if(SF_val_fire_threshold < min_fire_threshold .or. & + SF_val_fire_threshold > fates_check_param_set ) then + write(fates_log(),*) 'The fates_fire_threshold parameter must be set, and > ',min_fire_threshold + write(fates_log(),*) 'The value is set at :',SF_val_fire_threshold + write(fates_log(),*) 'Please provide a reasonable value, aborting.' + call endrun(msg=errMsg(sourcefile, __LINE__)) + end if + return end subroutine SpitFireCheckParams @@ -142,11 +158,9 @@ subroutine SpitFireParamsInit() SF_val_max_durat = nan SF_val_durat_slope = nan SF_val_drying_ratio = nan - + SF_val_fire_threshold = nan SF_val_CWD_frac(:) = nan - SF_val_max_decomp(:) = nan - SF_val_SAV(:) = nan SF_val_FBD(:) = nan SF_val_min_moisture(:) = nan @@ -230,6 +244,9 @@ subroutine SpitFireRegisterScalars(fates_params) call fates_params%RegisterParameter(name=SF_name_drying_ratio, dimension_shape=dimension_shape_scalar, & dimension_names=dim_names_scalar) + call fates_params%RegisterParameter(name=SF_name_fire_threshold, dimension_shape=dimension_shape_scalar, & + dimension_names=dim_names_scalar) + end subroutine SpitFireRegisterScalars !----------------------------------------------------------------------- @@ -240,6 +257,8 @@ subroutine SpitFireReceiveScalars(fates_params) implicit none class(fates_parameters_type), intent(inout) :: fates_params + real(r8) :: tmp_real + call fates_params%RetreiveParameter(name=SF_name_fdi_a, & data=SF_val_fdi_a) @@ -271,6 +290,12 @@ subroutine SpitFireReceiveScalars(fates_params) call fates_params%RetreiveParameter(name=SF_name_drying_ratio, & data=SF_val_drying_ratio) + call fates_params%RetreiveParameter(name=SF_name_fire_threshold, & + data=SF_val_fire_threshold) + + + + end subroutine SpitFireReceiveScalars !----------------------------------------------------------------------- diff --git a/main/EDParamsMod.F90 b/main/EDParamsMod.F90 index 67095aeca7..8b3bb97d8b 100644 --- a/main/EDParamsMod.F90 +++ b/main/EDParamsMod.F90 @@ -41,9 +41,8 @@ module EDParamsMod real(r8),protected, public :: ED_val_cohort_size_fusion_tol real(r8),protected, public :: ED_val_cohort_age_fusion_tol real(r8),protected, public :: ED_val_patch_fusion_tol - real(r8),protected, public :: ED_val_canopy_closure_thresh ! site-level canopy closure point where trees take on forest (narrow) versus savannah (wide) crown allometriy - real(r8),protected, public :: stomatal_model !switch for choosing between stomatal conductance models, 1 for Ball-Berry, 2 for Medlyn - + 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 logical,protected, public :: active_crown_fire ! flag, 1=active crown fire 0=no active crown fire character(len=param_string_length),parameter :: fates_name_active_crown_fire = "fates_fire_active_crown_fire" @@ -81,7 +80,7 @@ module EDParamsMod character(len=param_string_length),parameter,public :: ED_name_cohort_age_fusion_tol = "fates_cohort_age_fusion_tol" 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= "stomatal_model" + character(len=param_string_length),parameter,public :: ED_name_stomatal_model= "fates_leaf_stomatal_model" ! Resistance to active crown fire @@ -121,8 +120,15 @@ module EDParamsMod ! ---------------------------------------------------------------------------------------------- real(r8),protected,public :: logging_dbhmin ! Minimum dbh at which logging is applied (cm) + ! Typically associated with harvesting character(len=param_string_length),parameter,public :: logging_name_dbhmin = "fates_logging_dbhmin" + real(r8),protected,public :: logging_dbhmax ! Maximum dbh at which logging is applied (cm) + ! Typically associated with fire suppression + ! (THIS PARAMETER IS NOT USED YET) + character(len=param_string_length),parameter,public :: logging_name_dbhmax = "fates_logging_dbhmax" + + real(r8),protected,public :: logging_collateral_frac ! Ratio of collateral mortality to direct logging mortality character(len=param_string_length),parameter,public :: logging_name_collateral_frac = "fates_logging_collateral_frac" @@ -182,17 +188,15 @@ subroutine FatesParamsInit() ED_val_cohort_size_fusion_tol = nan ED_val_cohort_age_fusion_tol = nan ED_val_patch_fusion_tol = nan - ED_val_canopy_closure_thresh = nan + ED_val_canopy_closure_thresh = nan + stomatal_model = -9 hydr_kmax_rsurf1 = nan hydr_kmax_rsurf2 = nan - stomatal_model = nan - hydr_psi0 = nan hydr_psicap = nan - bgc_soil_salinity = nan - logging_dbhmin = nan + logging_dbhmax = nan logging_collateral_frac = nan logging_direct_frac = nan logging_mechanical_frac = nan @@ -227,6 +231,7 @@ subroutine FatesRegisterParams(fates_params) character(len=param_string_length), parameter :: dim_names_height(1) = (/dimension_name_history_height_bins/) character(len=param_string_length), parameter :: dim_names_coageclass(1) = (/dimension_name_history_coage_bins/) + call FatesParamsInit() call fates_params%RegisterParameter(name=ED_name_mort_disturb_frac, dimension_shape=dimension_shape_scalar, & @@ -291,7 +296,7 @@ subroutine FatesRegisterParams(fates_params) call fates_params%RegisterParameter(name=ED_name_canopy_closure_thresh, dimension_shape=dimension_shape_scalar, & dimension_names=dim_names_scalar) - + call fates_params%RegisterParameter(name=ED_name_stomatal_model, dimension_shape=dimension_shape_scalar, & dimension_names=dim_names_scalar) @@ -313,6 +318,9 @@ subroutine FatesRegisterParams(fates_params) call fates_params%RegisterParameter(name=logging_name_dbhmin, dimension_shape=dimension_shape_scalar, & dimension_names=dim_names_scalar) + call fates_params%RegisterParameter(name=logging_name_dbhmax, dimension_shape=dimension_shape_scalar, & + dimension_names=dim_names_scalar) + call fates_params%RegisterParameter(name=logging_name_collateral_frac, dimension_shape=dimension_shape_scalar, & dimension_names=dim_names_scalar) @@ -372,8 +380,8 @@ subroutine FatesReceiveParams(fates_params) class(fates_parameters_type), intent(inout) :: fates_params - real(r8) :: active_crown_fire_real !Local temp to transfer real data in file - + real(r8) :: tmpreal ! local real variable for changing type on read + call fates_params%RetreiveParameter(name=ED_name_mort_disturb_frac, & data=fates_mortality_disturbance_fraction) @@ -438,7 +446,8 @@ subroutine FatesReceiveParams(fates_params) data=ED_val_canopy_closure_thresh) call fates_params%RetreiveParameter(name=ED_name_stomatal_model, & - data=stomatal_model) + data=tmpreal) + stomatal_model = nint(tmpreal) call fates_params%RetreiveParameter(name=hydr_name_kmax_rsurf1, & data=hydr_kmax_rsurf1) @@ -457,7 +466,10 @@ subroutine FatesReceiveParams(fates_params) call fates_params%RetreiveParameter(name=logging_name_dbhmin, & data=logging_dbhmin) - + + call fates_params%RetreiveParameter(name=logging_name_dbhmax, & + data=logging_dbhmax) + call fates_params%RetreiveParameter(name=logging_name_collateral_frac, & data=logging_collateral_frac) @@ -486,8 +498,8 @@ subroutine FatesReceiveParams(fates_params) data=q10_froz) call fates_params%RetreiveParameter(name=fates_name_active_crown_fire, & - data=active_crown_fire_real) - active_crown_fire = (abs(active_crown_fire_real-1.0_r8) fates_check_param_set) then + write(fates_log(),*) 'Rooting profile parameter b must have a meaningful value' + write(fates_log(),*) 'when using the 2 parameter exponential mode:' + write(fates_log(),*) 'pft: ',ipft,' fnrt_prof_b(ipft): ',EDPftvarcon_inst%fnrt_prof_b(ipft) + write(fates_log(),*) 'Aborting' + call endrun(msg=errMsg(sourcefile, __LINE__)) + end if + end if + ! Check that parameter ranges for age-dependent mortality make sense !----------------------------------------------------------------------------------- diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 5cb4480e4f..b0cd68ca3b 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -147,8 +147,6 @@ module EDTypesMod integer, parameter, public :: dl_sf = 5 ! array index of dead leaf pool for spitfire (dead grass and dead leaves) integer, parameter, public :: lg_sf = 6 ! array index of live grass pool for spitfire - real(r8), parameter, public :: fire_threshold = 50.0_r8 ! threshold for fires that spread or go out. KWm-2 (Pyne 1986) - ! PATCH FUSION real(r8), parameter, public :: force_patchfuse_min_biomass = 0.005_r8 ! min biomass (kg / m2 patch area) below which to force-fuse patches integer , parameter, public :: N_DBH_BINS = 6 ! no. of dbh bins used when comparing patches diff --git a/parameter_files/fates_params_default.cdl b/parameter_files/fates_params_default.cdl index 033fafb3f4..d17d4f6030 100644 --- a/parameter_files/fates_params_default.cdl +++ b/parameter_files/fates_params_default.cdl @@ -97,7 +97,7 @@ variables: double fates_allom_hmode(fates_pft) ; fates_allom_hmode:units = "index" ; fates_allom_hmode:long_name = "height allometry function index." ; - fates_allom_hmode:possible_values = "1: O'Brien 1995; 2: Poorter 2006; 3: 2 parameter power law; 4: Chave 2014; 5: Martinez-Cano 2019." ; + fates_allom_hmode:possible_values = "1: OBrien 1995; 2: Poorter 2006; 3: 2 parameter power law; 4: Chave 2014; 5: Martinez-Cano 2019." ; 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" ; @@ -176,6 +176,15 @@ variables: 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_fnrt_prof_a(fates_pft) ; + fates_fnrt_prof_a:units = "unitless" ; + fates_fnrt_prof_a:long_name = "Fine root profile function, parameter a" ; + double fates_fnrt_prof_b(fates_pft) ; + fates_fnrt_prof_b:units = "unitless" ; + fates_fnrt_prof_b:long_name = "Fine root profile function, parameter b" ; + double fates_fnrt_prof_mode(fates_pft) ; + fates_fnrt_prof_mode:units = "index" ; + fates_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_fr_fcel(fates_pft) ; fates_fr_fcel:units = "fraction" ; fates_fr_fcel:long_name = "Fine root litter cellulose fraction" ; @@ -260,7 +269,7 @@ variables: 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) ; + 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) ; @@ -334,7 +343,7 @@ variables: 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." ; + 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" ; @@ -425,15 +434,6 @@ variables: double fates_root_long(fates_pft) ; fates_root_long:units = "yr" ; fates_root_long:long_name = "root longevity (alternatively, turnover time)" ; - double fates_roota_par(fates_pft) ; - fates_roota_par:units = "1/m" ; - fates_roota_par:long_name = "CLM rooting distribution parameter" ; - double fates_rootb_par(fates_pft) ; - fates_rootb_par:units = "1/m" ; - fates_rootb_par:long_name = "CLM rooting distribution parameter" ; - double fates_rootprof_beta(fates_variants, fates_pft) ; - fates_rootprof_beta:units = "unitless" ; - fates_rootprof_beta:long_name = "Rooting beta parameter, for C and N vertical discretization (NOT USED BY DEFAULT)" ; double fates_seed_alloc(fates_pft) ; fates_seed_alloc:units = "fraction" ; fates_seed_alloc:long_name = "fraction of available carbon balance allocated to seeds" ; @@ -591,6 +591,9 @@ variables: 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_hydr_kmax_rsurf1 ; fates_hydr_kmax_rsurf1:units = "kg water/m2 root area/Mpa/s" ; fates_hydr_kmax_rsurf1:long_name = "maximum conducitivity for unit root surface (into root)" ; @@ -606,12 +609,18 @@ variables: double fates_init_litter ; fates_init_litter:units = "NA" ; fates_init_litter:long_name = "Initialization value for litter pool in cold-start (NOT USED)" ; + 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_logging_coll_under_frac ; fates_logging_coll_under_frac:units = "fraction" ; fates_logging_coll_under_frac:long_name = "Fraction of stems killed in the understory when logging generates disturbance" ; double fates_logging_collateral_frac ; fates_logging_collateral_frac:units = "fraction" ; fates_logging_collateral_frac:long_name = "Fraction of large stems in upperstory that die from logging collateral damage" ; + double fates_logging_dbhmax ; + fates_logging_dbhmax:units = "cm" ; + fates_logging_dbhmax:long_name = "Maximum dbh below which logging is applied (unset values flag this to be unused)" ; double fates_logging_dbhmax_infra ; fates_logging_dbhmax_infra:units = "cm" ; fates_logging_dbhmax_infra:long_name = "Tree diameter, above which infrastructure from logging does not impact damage or mortality." ; @@ -650,10 +659,10 @@ variables: fates_phen_c:long_name = "GDD accumulation function, exponent parameter: gdd_thesh = a + b exp(c*ncd)" ; double fates_phen_chiltemp ; fates_phen_chiltemp:units = "degrees C" ; - fates_phen_chiltemp:long_name = "chilling day counting threshold" ; + fates_phen_chiltemp:long_name = "chilling day counting threshold for vegetation" ; double fates_phen_coldtemp ; fates_phen_coldtemp:units = "degrees C" ; - fates_phen_coldtemp:long_name = "temperature exceedance to flag a cold-day for temperature leaf drop" ; + fates_phen_coldtemp:long_name = "vegetation temperature exceedance that flags a cold-day for leaf-drop" ; double fates_phen_doff_time ; fates_phen_doff_time:units = "days" ; fates_phen_doff_time:long_name = "day threshold compared against days since leaves became off-allometry" ; @@ -675,15 +684,9 @@ variables: 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" ; - int stomatal_model ; - stomatal_model:units = "flag" ; - stomatal_model:long_name = "switch for choosing between Ball-Berry stomatal conductance model (1) and Medlyn model (2)" ; - + // global attributes: - :history = "This parameter file is maintained in version control\n", - "See https://github.com/NGEET/fates/blob/master/parameter_files/fates_params_default.cdl \n", - "For changes, use git blame \n", - "" ; + :history = "This parameter file is maintained in version control\nSee https://github.com/NGEET/fates/blob/master/parameter_files/fates_params_default.cdl \nFor changes, use git blame \n" ; data: fates_history_ageclass_bin_edges = 0, 1, 2, 5, 10, 20, 50 ; @@ -695,7 +698,6 @@ data: fates_history_sizeclass_bin_edges = 0, 5, 10, 15, 20, 30, 40, 50, 60, 70, 80, 90, 100 ; - fates_pftname = "broadleaf_evergreen_tropical_tree ", "needleleaf_evergreen_extratrop_tree ", @@ -833,6 +835,12 @@ data: 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_fnrt_prof_a = 7, 7, 7, 7, 6, 6, 7, 7, 7, 11, 11, 11 ; + + fates_fnrt_prof_b = 1, 2, 2, 1, 2, 2, 1.5, 1.5, 1.5, 2, 2, 2 ; + + fates_fnrt_prof_mode = 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ; + fates_fr_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_fr_flab = 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, @@ -906,10 +914,8 @@ data: fates_hydr_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.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_hydr_rfrac_stem = 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, 0.625, @@ -952,8 +958,8 @@ data: fates_leaf_slatop = 0.012, 0.01, 0.024, 0.012, 0.03, 0.03, 0.012, 0.03, 0.03, 0.03, 0.03, 0.03 ; - fates_leaf_stomatal_intercept = 1000, 1000, 1000, 1000, 1000, 1000, 1000, - 1000, 1000, 1000, 1000, 1000 ; + 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 ; @@ -1130,15 +1136,6 @@ data: fates_root_long = 1, 2, 1, 1.5, 1, 1, 1.5, 1, 1, 1, 1, 1 ; - fates_roota_par = 7, 7, 7, 7, 6, 6, 7, 7, 7, 11, 11, 11 ; - - fates_rootb_par = 1, 2, 2, 1, 2, 2, 1.5, 1.5, 1.5, 2, 2, 2 ; - - fates_rootprof_beta = - 0.976, 0.976, 0.976, 0.976, 0.976, 0.976, 0.976, 0.976, 0.976, 0.976, - 0.976, 0.976, - _, _, _, _, _, _, _, _, _, _, _, _ ; - fates_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_seed_alloc_mature = 0, 0, 0, 0, 0, 0, 0.9, 0.9, 0.9, 0.9, 0.9, 0.9 ; @@ -1154,7 +1151,6 @@ data: fates_seed_suppl = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; - fates_senleaf_long_fdrought = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ; fates_smpsc = -255000, -255000, -255000, -255000, -255000, -255000, -255000, @@ -1275,6 +1271,8 @@ data: fates_fire_part_dens = 513 ; + fates_fire_threshold = 50 ; + fates_hydr_kmax_rsurf1 = 20 ; fates_hydr_kmax_rsurf2 = 0.0001 ; @@ -1285,10 +1283,14 @@ data: fates_init_litter = 0.05 ; + fates_leaf_stomatal_model = 1 ; + fates_logging_coll_under_frac = 0.55983 ; fates_logging_collateral_frac = 0.05 ; + fates_logging_dbhmax = _ ; + fates_logging_dbhmax_infra = 35 ; fates_logging_dbhmin = 50 ; @@ -1330,6 +1332,4 @@ data: fates_q10_mr = 1.5 ; fates_soil_salinity = 0.4 ; - - stomatal_model = 2 ; }