diff --git a/biogeochem/EDPatchDynamicsMod.F90 b/biogeochem/EDPatchDynamicsMod.F90 index 8acb6e6c48..98546557e3 100644 --- a/biogeochem/EDPatchDynamicsMod.F90 +++ b/biogeochem/EDPatchDynamicsMod.F90 @@ -1145,14 +1145,20 @@ subroutine mortality_litter_fluxes(currentSite, cp_target, new_patch_target, pat !not right to recalcualte dmort here. canopy_dead = currentCohort%n * min(1.0_r8,currentCohort%dmort * hlm_freq_day * fates_mortality_disturbance_fraction) - - canopy_mortality_woody_litter(p)= canopy_mortality_woody_litter(p) + & canopy_dead*(struct_c + sapw_c) canopy_mortality_leaf_litter(p) = canopy_mortality_leaf_litter(p) + & canopy_dead*leaf_c + + ! Some plants upon death will transfer storage carbon to seed production + ! Storage carbon that is not transferred to seeds goes to root litter flux + canopy_mortality_root_litter(p) = canopy_mortality_root_litter(p) + & - canopy_dead*(fnrt_c + store_c) + canopy_dead*(fnrt_c + store_c*(1.0_r8-EDPftvarcon_inst%allom_frbstor_repro(p)) ) + + currentSite%seed_bank(p) = currentSite%seed_bank(p) + & + canopy_dead * store_c * EDPftvarcon_inst%allom_frbstor_repro(p)/AREA + if( hlm_use_planthydro == itrue ) then call AccumulateMortalityWaterStorage(currentSite,currentCohort, canopy_dead) diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index d335afc4ae..65e94c036b 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -180,7 +180,7 @@ subroutine non_canopy_derivs( currentSite, currentPatch, bc_in ) ! update fragmenting pool fluxes call cwd_input( currentSite, currentPatch) call cwd_out( currentSite, currentPatch, bc_in) - + do p = 1,numpft currentSite%dseed_dt(p) = currentSite%dseed_dt(p) + & (currentPatch%seeds_in(p) - currentPatch%seed_decay(p) - & @@ -800,6 +800,7 @@ subroutine seeds_in( currentSite, cp_pnt ) type(ed_cohort_type), pointer :: currentCohort integer :: p logical :: pft_present(maxpft) + real(r8) :: store_c_to_repro ! carbon sent from storage to reproduction upon death [kg/plant] real(r8) :: npfts_present !---------------------------------------------------------------------- @@ -830,10 +831,18 @@ subroutine seeds_in( currentSite, cp_pnt ) currentPatch => cp_pnt currentCohort => currentPatch%tallest do while (associated(currentCohort)) + + ! a certain fraction of bstore goes to clonal reproduction when plants die + store_c_to_repro = currentCohort%prt%GetState(store_organ,all_carbon_elements) * & + EDPftvarcon_inst%allom_frbstor_repro(currentCohort%pft) + do p = 1, numpft if (pft_present(p)) then - currentPatch%seeds_in(p) = currentPatch%seeds_in(p) + currentCohort%seed_prod * currentCohort%n / & - (currentPatch%area * npfts_present) + + currentPatch%seeds_in(p) = currentPatch%seeds_in(p) + & + (currentCohort%seed_prod * currentCohort%n - & + currentCohort%dndt*store_c_to_repro) & + /(currentPatch%area * npfts_present) endif end do currentCohort => currentCohort%shorter @@ -844,8 +853,15 @@ subroutine seeds_in( currentSite, cp_pnt ) currentCohort => currentPatch%tallest do while (associated(currentCohort)) p = currentCohort%pft + + ! a certain fraction of bstore goes to clonal reproduction when plants die + store_c_to_repro = currentCohort%prt%GetState(store_organ,all_carbon_elements) * & + EDPftvarcon_inst%allom_frbstor_repro(p) + currentPatch%seeds_in(p) = currentPatch%seeds_in(p) + & - currentCohort%seed_prod * currentCohort%n/currentPatch%area + (currentCohort%seed_prod * currentCohort%n - & + currentCohort%dndt*store_c_to_repro)/currentPatch%area + currentCohort => currentCohort%shorter enddo !cohort loop @@ -921,13 +937,18 @@ subroutine seed_germination( currentSite, currentPatch ) do p = 1,numpft currentPatch%seed_germination(p) = min(currentSite%seed_bank(p) * & - EDPftvarcon_inst%germination_timescale(p),max_germination) + EDPftvarcon_inst%germination_timescale(p),max_germination) + !set the germination only under the growing season...c.xu + if (EDPftvarcon_inst%season_decid(p) == 1.and.currentSite%status == 1)then + currentPatch%seed_germination(p) = 0.0_r8 + endif + if (EDPftvarcon_inst%stress_decid(p) == 1.and.currentSite%dstatus == 1)then + currentPatch%seed_germination(p) = 0.0_r8 + endif enddo end subroutine seed_germination - ! ============================================================================ - subroutine recruitment( currentSite, currentPatch, bc_in ) ! ! !DESCRIPTION: @@ -1182,9 +1203,8 @@ subroutine CWD_Input( currentSite, currentPatch) ! the litter flux has already been counted since it captured ! the losses of live trees and those flagged for death - currentPatch%root_litter_in(pft) = currentPatch%root_litter_in(pft) + & - (fnrt_c + store_c ) * dead_n + (fnrt_c + store_c*(1._r8-EDPftvarcon_inst%allom_frbstor_repro(pft)) ) * dead_n ! Update diagnostics that track resource management currentSite%resources_management%delta_litter_stock = & diff --git a/biogeochem/FatesAllometryMod.F90 b/biogeochem/FatesAllometryMod.F90 index 45df34aebc..334486b566 100644 --- a/biogeochem/FatesAllometryMod.F90 +++ b/biogeochem/FatesAllometryMod.F90 @@ -2184,7 +2184,7 @@ subroutine StructureResetOfDH( bdead, ipft, canopy_trim, d, h ) ! of the diameter increment counter = 0 step_frac = step_frac0 - do while( (bdead-bt_dead) > calloc_abs_error ) + do while( (bdead-bt_dead) > calloc_abs_error .and. dbt_dead_dd>0.0_r8) ! vulnerable to div0 dd = step_frac*(bdead-bt_dead)/dbt_dead_dd diff --git a/biogeophys/EDBtranMod.F90 b/biogeophys/EDBtranMod.F90 index 1b095a87a5..2b10f18899 100644 --- a/biogeophys/EDBtranMod.F90 +++ b/biogeophys/EDBtranMod.F90 @@ -25,6 +25,7 @@ module EDBtranMod public :: btran_ed public :: get_active_suction_layers + public :: check_layer_water contains diff --git a/biogeophys/FatesBstressMod.F90 b/biogeophys/FatesBstressMod.F90 new file mode 100644 index 0000000000..88f7d44710 --- /dev/null +++ b/biogeophys/FatesBstressMod.F90 @@ -0,0 +1,99 @@ +module FatesBstressMod + + !------------------------------------------------------------------------------------- + ! Description: calculate the stress impact on transpiration from salinity and sulphide in soils + ! note that water stress is calculated in EDBtranMod or HYDRO + ! ------------------------------------------------------------------------------------ + ! + use FatesConstantsMod , only : tfrz => t_water_freeze_k_1atm + use FatesConstantsMod , only : itrue,ifalse + use EDTypesMod , only : ed_site_type, & + ed_patch_type, & + ed_cohort_type, & + maxpft + use shr_kind_mod , only : r8 => shr_kind_r8 + use FatesInterfaceMod , only : bc_in_type, & + bc_out_type, & + numpft + use FatesInterfaceMod , only : hlm_use_planthydro + use FatesGlobals , only : fates_log + use EDBtranMod , only : check_layer_water + + implicit none + private + + public :: btran_sal_stress_fates + +contains + ! ===================================================================================== + + subroutine btran_sal_stress_fates( nsites, sites, bc_in) + + + ! --------------------------------------------------------------------------------- + ! Calculate the transpiration wetness function (BTRAN) and the root uptake + ! distribution (ROOTR). + ! Boundary conditions in: bc_in(s)%salinity_sl(j) salinity concontration[ppm] + ! Boundary conditions in: bc_in(s)%sulphide_sl(j) sulphide concontration[ppm] + ! Output cpatch%bstress_sal_ft(ft) + ! Output cpatch%bstress_sul_ft(ft) + ! --------------------------------------------------------------------------------- + + ! Arguments + + integer,intent(in) :: nsites + type(ed_site_type),intent(inout),target :: sites(nsites) + type(bc_in_type),intent(in) :: bc_in(nsites) + + ! + ! !LOCAL VARIABLES: + type(ed_patch_type),pointer :: cpatch ! Current Patch Pointer + type(ed_cohort_type),pointer :: ccohort ! Current cohort pointer + integer :: s ! site + integer :: j ! soil layer + integer :: ft ! plant functional type index + real(r8) :: salinity_node ! salinity in the soil water [ppt] + real(r8) :: rresis ! salinity limitation to transpiration independent + !------------------------------------------------------------------------------ + + do s = 1,nsites + + cpatch => sites(s)%oldest_patch + do while (associated(cpatch)) + + ! THIS SHOULD REALLY BE A COHORT LOOP ONCE WE HAVE rootfr_ft FOR COHORTS (RGK) + + do ft = 1,numpft + cpatch%bstress_sal_ft(ft) = 0.0_r8 + do j = 1,bc_in(s)%nlevsoil + + ! Calculations are only relevant where liquid water exists + ! see clm_fates%wrap_btran for calculation with CLM/ELM + + if ( check_layer_water(bc_in(s)%h2o_liqvol_sl(j),bc_in(s)%tempk_sl(j)) ) then + + salinity_node = bc_in(s)%salinity_sl(j) + + rresis = min( 1.244_r8/(1+exp((0.186_r8-salinity_node)/(-0.132_r8))), 1._r8) + + cpatch%bstress_sal_ft(ft) = cpatch%bstress_sal_ft(ft)+ & + cpatch%rootfr_ft(ft,j)*rresis + + end if + + end do !j + + end do !PFT + + cpatch => cpatch%younger + + end do + + end do + + + end subroutine btran_sal_stress_fates + + ! ==================================================================================== + +end module FatesBstressMod diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index 56ca97ea23..2fae4eceb2 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -20,27 +20,27 @@ module FATESPlantRespPhotosynthMod ! !USES: - use FatesGlobals, only : endrun => fates_endrun - use FatesGlobals, only : fates_log + use FatesGlobals, only : endrun => fates_endrun + use FatesGlobals, only : fates_log use FatesConstantsMod, only : r8 => fates_r8 use FatesConstantsMod, only : itrue use FatesInterfaceMod, only : hlm_use_planthydro use FatesInterfaceMod, only : hlm_parteh_mode use FatesInterfaceMod, only : numpft - use EDTypesMod, only : maxpft - use EDTypesMod, only : nlevleaf - use EDTypesMod, only : nclmax - - use PRTGenericMod, only : prt_carbon_allom_hyp - use PRTGenericMod, only : prt_cnp_flex_allom_hyp - use PRTGenericMod, only : all_carbon_elements - use PRTGenericMod, only : nitrogen_element - use PRTGenericMod, only : leaf_organ - use PRTGenericMod, only : fnrt_organ - use PRTGenericMod, only : sapw_organ - use PRTGenericMod, only : store_organ - use PRTGenericMod, only : repro_organ - use PRTGenericMod, only : struct_organ + use EDTypesMod, only : maxpft + use EDTypesMod, only : nlevleaf + use EDTypesMod, only : nclmax + use EDTypesMod, only : do_fates_salinity + use PRTGenericMod, only : prt_carbon_allom_hyp + use PRTGenericMod, only : prt_cnp_flex_allom_hyp + use PRTGenericMod, only : all_carbon_elements + use PRTGenericMod, only : nitrogen_element + use PRTGenericMod, only : leaf_organ + use PRTGenericMod, only : fnrt_organ + use PRTGenericMod, only : sapw_organ + use PRTGenericMod, only : store_organ + use PRTGenericMod, only : repro_organ + use PRTGenericMod, only : struct_organ ! CIME Globals use shr_log_mod , only : errMsg => shr_log_errMsg @@ -423,7 +423,11 @@ subroutine FatesPlantRespPhotosynthDrive (nsites, sites,bc_in,bc_out,dtime) end if - + + if(do_fates_salinity)then + btran_eff = btran_eff*currentPatch%bstress_sal_ft(ft) + endif + ! Scale for leaf nitrogen profile nscaler = exp(-kn(ft) * cumulative_lai) diff --git a/main/EDParamsMod.F90 b/main/EDParamsMod.F90 index ca2d33096a..f94cdccad2 100644 --- a/main/EDParamsMod.F90 +++ b/main/EDParamsMod.F90 @@ -43,6 +43,7 @@ module EDParamsMod real(r8),protected :: ED_val_patch_fusion_tol real(r8),protected :: ED_val_canopy_closure_thresh ! site-level canopy closure point where trees take on forest (narrow) versus savannah (wide) crown allometry + ! two special parameters whose size is defined in the parameter file real(r8),protected,allocatable :: ED_val_history_sizeclass_bin_edges(:) real(r8),protected,allocatable :: ED_val_history_ageclass_bin_edges(:) @@ -87,7 +88,11 @@ module EDParamsMod real(r8),protected :: hydr_psicap ! sapwood water potential at which capillary reserves exhausted (MPa) character(len=param_string_length),parameter :: hydr_name_psicap = "fates_hydr_psicap" - + !Soil BGC parameters, mostly used for testing FATES when not coupled to the dynamics bgc hlm + ! ---------------------------------------------------------------------------------------------- + real(r8),protected :: bgc_soil_salinity ! site-level soil salinity for FATES when not coupled to dynamic soil BGC of salinity + character(len=param_string_length),parameter :: bgc_name_soil_salinity= "fates_soil_salinity" + ! Logging Control Parameters (ONLY RELEVANT WHEN USE_FATES_LOGGING = TRUE) ! ---------------------------------------------------------------------------------------------- @@ -155,6 +160,8 @@ subroutine FatesParamsInit() hydr_kmax_rsurf = nan hydr_psi0 = nan hydr_psicap = nan + + bgc_soil_salinity = nan logging_dbhmin = nan logging_collateral_frac = nan @@ -261,6 +268,9 @@ subroutine FatesRegisterParams(fates_params) call fates_params%RegisterParameter(name=hydr_name_psicap, dimension_shape=dimension_shape_1d, & dimension_names=dim_names) + call fates_params%RegisterParameter(name=bgc_name_soil_salinity, dimension_shape=dimension_shape_1d, & + dimension_names=dim_names) + call fates_params%RegisterParameter(name=logging_name_dbhmin, dimension_shape=dimension_shape_1d, & dimension_names=dim_names) @@ -378,6 +388,9 @@ subroutine FatesReceiveParams(fates_params) call fates_params%RetreiveParameter(name=hydr_name_psicap, & data=hydr_psicap) + + call fates_params%RetreiveParameter(name=bgc_name_soil_salinity, & + data=bgc_soil_salinity) call fates_params%RetreiveParameter(name=logging_name_dbhmin, & data=logging_dbhmin) @@ -450,6 +463,7 @@ subroutine FatesReportParams(is_master) write(fates_log(),fmt0) 'hydr_kmax_rsurf = ',hydr_kmax_rsurf write(fates_log(),fmt0) 'hydr_psi0 = ',hydr_psi0 write(fates_log(),fmt0) 'hydr_psicap = ',hydr_psicap + write(fates_log(),fmt0) 'bgc_soil_salinity = ', bgc_soil_salinity write(fates_log(),fmt0) 'logging_dbhmin = ',logging_dbhmin write(fates_log(),fmt0) 'logging_collateral_frac = ',logging_collateral_frac write(fates_log(),fmt0) 'logging_coll_under_frac = ',logging_coll_under_frac diff --git a/main/EDPftvarcon.F90 b/main/EDPftvarcon.F90 index 33070b16ab..03a1712e86 100644 --- a/main/EDPftvarcon.F90 +++ b/main/EDPftvarcon.F90 @@ -32,55 +32,67 @@ module EDPftvarcon !ED specific variables. type, public :: EDPftvarcon_type - real(r8), allocatable :: pft_used (:) ! Switch to turn on and off PFTs - - real(r8), allocatable :: freezetol (:) ! minimum temperature tolerance - real(r8), allocatable :: wood_density (:) ! wood density g cm^-3 ... - real(r8), allocatable :: hgt_min (:) ! sapling height m + + real(r8), allocatable :: pft_used(:) ! Switch to turn on and off PFTs + real(r8), allocatable :: freezetol(:) ! minimum temperature tolerance + real(r8), allocatable :: wood_density(:) ! wood density g cm^-3 ... + real(r8), allocatable :: hgt_min(:) ! sapling height m real(r8), allocatable :: dbh_repro_threshold(:) ! diameter at which mature plants shift allocation - real(r8), allocatable :: dleaf (:) ! leaf characteristic dimension length (m) - real(r8), allocatable :: z0mr (:) ! ratio of roughness length of vegetation to height (-) - real(r8), allocatable :: displar (:) ! ratio of displacement height to canopy top height (-) - real(r8), allocatable :: cushion (:) ! labile carbon storage target as multiple of leaf pool. - real(r8), allocatable :: leaf_stor_priority (:) ! leaf turnover vs labile carbon use prioritisation + real(r8), allocatable :: dleaf(:) ! leaf characteristic dimension length (m) + real(r8), allocatable :: z0mr(:) ! ratio of roughness length of vegetation to height (-) + real(r8), allocatable :: displar(:) ! ratio of displacement height to canopy top height (-) + real(r8), allocatable :: cushion(:) ! labile carbon storage target as multiple of leaf pool. + real(r8), allocatable :: leaf_stor_priority(:) ! leaf turnover vs labile carbon use prioritisation ! (1 = lose leaves, 0 = use store). - real(r8), allocatable :: crown (:) ! fraction of the height of the plant that is occupied by crown. For fire model. - real(r8), allocatable :: bark_scaler (:) ! scaler from dbh to bark thickness. For fire model. - real(r8), allocatable :: crown_kill (:) ! scaler on fire death. For fire model. - real(r8), allocatable :: initd (:) ! initial seedling density - real(r8), allocatable :: seed_rain (:) ! seeds that come from outside the gridbox. - real(r8), allocatable :: BB_slope (:) ! ball berry slope parameter - - real(r8), allocatable :: seed_alloc_mature (:) ! fraction of carbon balance allocated to clonal reproduction. - real(r8), allocatable :: seed_alloc (:) ! fraction of carbon balance allocated to seeds. - real(r8), allocatable :: c2b (:) ! Carbon to biomass multiplier [kg/kgC] - real(r8), allocatable :: woody(:) - real(r8), allocatable :: stress_decid(:) - real(r8), allocatable :: season_decid(:) - real(r8), allocatable :: evergreen(:) - real(r8), allocatable :: slamax(:) - real(r8), allocatable :: slatop(:) + real(r8), allocatable :: crown(:) ! fraction of the height of the plant + ! that is occupied by crown. For fire model. + real(r8), allocatable :: bark_scaler(:) ! scaler from dbh to bark thickness. For fire model. + real(r8), allocatable :: crown_kill(:) ! scaler on fire death. For fire model. + real(r8), allocatable :: initd(:) ! initial seedling density + real(r8), allocatable :: seed_rain(:) ! seeds that come from outside the gridbox. + real(r8), allocatable :: BB_slope(:) ! ball berry slope parameter - real(r8), allocatable :: roota_par(:) - real(r8), allocatable :: rootb_par(:) - real(r8), allocatable :: lf_flab(:) - real(r8), allocatable :: lf_fcel(:) - real(r8), allocatable :: lf_flig(:) - real(r8), allocatable :: fr_flab(:) - real(r8), allocatable :: fr_fcel(:) - real(r8), allocatable :: fr_flig(:) - real(r8), allocatable :: xl(:) - real(r8), allocatable :: clumping_index(:) ! factor describing how much self-occlusion - ! of leaf scattering elements decreases light interception - real(r8), allocatable :: c3psn(:) ! index defining the photosynthetic pathway C4 = 0, C3 = 1 - real(r8), allocatable :: vcmax25top(:) - real(r8), allocatable :: smpso(:) - real(r8), allocatable :: smpsc(:) + real(r8), allocatable :: seed_alloc_mature(:) ! fraction of carbon balance allocated to + ! clonal reproduction. + real(r8), allocatable :: seed_alloc(:) ! fraction of carbon balance allocated to seeds. + real(r8), allocatable :: c2b(:) ! Carbon to biomass multiplier [kg/kgC] + real(r8), allocatable :: woody(:) ! Does the plant have wood? (1=yes, 0=no) + + ! The following three PFT classes + ! are mutually exclusive + real(r8), allocatable :: stress_decid(:) ! Is the plant stress deciduous? (1=yes, 0=no) + real(r8), allocatable :: season_decid(:) ! Is the plant seasonally deciduous (1=yes, 0=no) + real(r8), allocatable :: evergreen(:) ! Is the plant an evergreen (1=yes, 0=no) + + 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 :: maintresp_reduction_curvature(:) ! curvature of MR reduction as f(carbon storage), - ! 1=linear, 0=very curved - real(r8), allocatable :: maintresp_reduction_intercept(:) ! intercept of MR reduction as f(carbon storage), - ! 0=no throttling, 1=max throttling + real(r8), allocatable :: roota_par(:) ! Normalized Root profile scaling parameter A + real(r8), allocatable :: rootb_par(:) ! Normalized root profile scaling parameter B + real(r8), allocatable :: lf_flab(:) ! Leaf litter labile fraction [-] + real(r8), allocatable :: lf_fcel(:) ! Leaf litter cellulose fraction [-] + real(r8), allocatable :: lf_flig(:) ! Leaf litter lignan fraction [-] + real(r8), allocatable :: fr_flab(:) ! Fine-root litter labile fraction [-] + real(r8), allocatable :: fr_fcel(:) ! Fine-root litter cellulose fraction [-] + real(r8), allocatable :: fr_flig(:) ! Fine-root litter lignatn fraction [-] + real(r8), allocatable :: xl(:) ! Leaf-stem orientation index + real(r8), allocatable :: clumping_index(:) ! factor describing how much self-occlusion + ! of leaf scattering elements + ! decreases light interception + real(r8), allocatable :: c3psn(:) ! index defining the photosynthetic + ! pathway C4 = 0, C3 = 1 + real(r8), allocatable :: vcmax25top(:) ! maximum carboxylation rate of Rub. at 25C, + ! canopy top [umol CO2/m^2/s] + real(r8), allocatable :: smpso(:) ! Soil water potential at full stomatal opening + ! (non-HYDRO mode only) [mm] + real(r8), allocatable :: smpsc(:) ! Soil water potential at full stomatal closure + ! (non-HYDRO mode only) [mm] + + + real(r8), allocatable :: maintresp_reduction_curvature(:) ! curvature of MR reduction as f(carbon storage), + ! 1=linear, 0=very curved + real(r8), allocatable :: maintresp_reduction_intercept(:) ! intercept of MR reduction as f(carbon storage), + ! 0=no throttling, 1=max throttling real(r8), allocatable :: bmort(:) real(r8), allocatable :: mort_scalar_coldstress(:) real(r8), allocatable :: mort_scalar_cstarvation(:) @@ -148,6 +160,8 @@ module EDPftvarcon real(r8), allocatable :: allom_agb2(:) ! Parameter 2 for agb allometry real(r8), allocatable :: allom_agb3(:) ! Parameter 3 for agb allometry real(r8), allocatable :: allom_agb4(:) ! Parameter 3 for agb allometry + + real(r8), allocatable :: allom_frbstor_repro(:) ! fraction of bstrore for reproduction after mortality ! Prescribed Physiology Mode Parameters real(r8), allocatable :: prescribed_npp_canopy(:) ! this is only for the special @@ -609,6 +623,10 @@ subroutine Register_PFT(this, fates_params) name = 'fates_allom_agb4' call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, & dimension_names=dim_names, lower_bounds=dim_lower_bound) + + name = 'fates_allom_frbstor_repro' + call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, & + dimension_names=dim_names, lower_bounds=dim_lower_bound) name = 'fates_hydr_p_taper' call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, & @@ -1044,6 +1062,10 @@ subroutine Receive_PFT(this, fates_params) name = 'fates_allom_agb4' call fates_params%RetreiveParameterAllocate(name=name, & data=this%allom_agb4) + + name = 'fates_allom_frbstor_repro' + call fates_params%RetreiveParameterAllocate(name=name, & + data=this%allom_frbstor_repro) name = 'fates_hydr_p_taper' call fates_params%RetreiveParameterAllocate(name=name, & @@ -1725,7 +1747,7 @@ subroutine FatesReportPFTParams(is_master) write(fates_log(),fmt0) 'allom_agb2 = ',EDPftvarcon_inst%allom_agb2 write(fates_log(),fmt0) 'allom_agb3 = ',EDPftvarcon_inst%allom_agb3 write(fates_log(),fmt0) 'allom_agb4 = ',EDPftvarcon_inst%allom_agb4 - + write(fates_log(),fmt0) 'allom_frbstor_repro = ',EDPftvarcon_inst%allom_frbstor_repro write(fates_log(),fmt0) 'hydr_p_taper = ',EDPftvarcon_inst%hydr_p_taper write(fates_log(),fmt0) 'hydr_rs2 = ',EDPftvarcon_inst%hydr_rs2 write(fates_log(),fmt0) 'hydr_srl = ',EDPftvarcon_inst%hydr_srl @@ -1949,6 +1971,22 @@ subroutine FatesCheckParams(is_master, parteh_mode) end if + ! Check if fraction of storage to reproduction is between 0-1 + ! ---------------------------------------------------------------------------------- + + if ( ( EDPftvarcon_inst%allom_frbstor_repro(ipft) < 0.0_r8 ) .or. & + ( EDPftvarcon_inst%allom_frbstor_repro(ipft) > 1.0_r8 ) ) then + + write(fates_log(),*) 'fraction of storage to reproduction' + write(fates_log(),*) ' after plants die, must be between' + write(fates_log(),*) ' 0 and 1' + write(fates_log(),*) ' PFT#: ',ipft + write(fates_log(),*) ' allom_frbstor_repro: ',EDPftvarcon_inst%allom_frbstor_repro(ipft) + write(fates_log(),*) ' Aborting' + call endrun(msg=errMsg(sourcefile, __LINE__)) + + end if + ! Check if photosynthetic pathway is neither C3/C4 ! ---------------------------------------------------------------------------------- diff --git a/main/EDTypesMod.F90 b/main/EDTypesMod.F90 index 901ad2f52c..f0d54dc90e 100644 --- a/main/EDTypesMod.F90 +++ b/main/EDTypesMod.F90 @@ -1,6 +1,8 @@ module EDTypesMod use FatesConstantsMod, only : r8 => fates_r8 + use FatesConstantsMod, only : ifalse + use FatesConstantsMod, only : itrue use FatesGlobals, only : fates_log use shr_infnan_mod, only : nan => shr_infnan_nan, assignment(=) use FatesHydraulicsMemMod, only : ed_cohort_hydr_type @@ -79,7 +81,14 @@ module EDTypesMod ! TO-DO: THESE SHOULD BE PARAMETERS IN THE FILE OR NAMELIST - ADDING THESE ! WAS OUTSIDE THE SCOPE OF THE VERY LARGE CHANGESET WHERE THESE WERE FIRST ! INTRODUCED (RGK 03-2017) - logical, parameter :: do_ed_phenology = .false. + + logical, parameter :: do_ed_phenology = .true. + + + ! Flag to turn on/off salinity effects on the effective "btran" + ! btran stress function. + + logical, parameter :: do_fates_salinity = .false. ! This is the community level amount of spread expected in nearly-bare-ground @@ -416,7 +425,9 @@ module EDTypesMod ! ROOTS real(r8), allocatable :: rootfr_ft(:,:) ! root fraction of each PFT in each soil layer:- real(r8), allocatable :: rootr_ft(:,:) ! fraction of water taken from each PFT and soil layer:- - real(r8) :: btran_ft(maxpft) ! btran calculated seperately for each PFT:- + real(r8) :: btran_ft(maxpft) ! btran calculated seperately for each PFT:- + real(r8) :: bstress_sal_ft(maxpft) ! bstress from salinity calculated seperately for each PFT:- + ! DISTURBANCE real(r8) :: disturbance_rates(n_dist_types) ! disturbance rate from 1) mortality diff --git a/main/FatesHistoryInterfaceMod.F90 b/main/FatesHistoryInterfaceMod.F90 index adc7000c01..760d180a51 100644 --- a/main/FatesHistoryInterfaceMod.F90 +++ b/main/FatesHistoryInterfaceMod.F90 @@ -1518,12 +1518,7 @@ subroutine update_history_dyn(this,nc,nsites,sites) hio_ddbh_canopy_si_scag => this%hvars(ih_ddbh_canopy_si_scag)%r82d, & hio_ddbh_understory_si_scag => this%hvars(ih_ddbh_understory_si_scag)%r82d, & hio_mortality_canopy_si_scag => this%hvars(ih_mortality_canopy_si_scag)%r82d, & - hio_mortality_understory_si_scag => this%hvars(ih_mortality_understory_si_scag)%r82d, & - hio_h2oveg_dead_si => this%hvars(ih_h2oveg_dead_si)%r81d, & - hio_h2oveg_recruit_si => this%hvars(ih_h2oveg_recruit_si)%r81d, & - hio_h2oveg_growturn_err_si => this%hvars(ih_h2oveg_growturn_err_si)%r81d, & - hio_h2oveg_pheno_err_si => this%hvars(ih_h2oveg_pheno_err_si)%r81d,& - hio_h2oveg_hydro_err_si => this%hvars(ih_h2oveg_hydro_err_si)%r81d) + hio_mortality_understory_si_scag => this%hvars(ih_mortality_understory_si_scag)%r82d) ! --------------------------------------------------------------------------------- @@ -1534,7 +1529,7 @@ subroutine update_history_dyn(this,nc,nsites,sites) ! If we don't have dynamics turned on, we just abort these diagnostics - !if (hlm_use_ed_st3.eq.itrue) return + if (hlm_use_ed_st3.eq.itrue) return ! --------------------------------------------------------------------------------- ! Loop through the FATES scale hierarchy and fill the history IO arrays @@ -1553,6 +1548,18 @@ subroutine update_history_dyn(this,nc,nsites,sites) hio_seed_bank_si(io_si) = sum(sites(s)%seed_bank) * g_per_kg hio_canopy_spread_si(io_si) = sites(s)%spread + + + ! If hydraulics are turned on, track the error terms + ! associated with dynamics + + if(hlm_use_planthydro.eq.itrue)then + this%hvars(ih_h2oveg_dead_si)%r81d(io_si) = sites(s)%si_hydr%h2oveg_dead + this%hvars(ih_h2oveg_recruit_si)%r81d(io_si) = sites(s)%si_hydr%h2oveg_recruit + this%hvars(ih_h2oveg_growturn_err_si)%r81d(io_si) = sites(s)%si_hydr%h2oveg_growturn_err + this%hvars(ih_h2oveg_pheno_err_si)%r81d(io_si) = sites(s)%si_hydr%h2oveg_pheno_err + end if + ipa = 0 cpatch => sites(s)%oldest_patch @@ -1858,8 +1865,10 @@ subroutine update_history_dyn(this,nc,nsites,sites) hio_nplant_canopy_si_scpf(io_si,scpf) = hio_nplant_canopy_si_scpf(io_si,scpf) + ccohort%n hio_nplant_canopy_si_scls(io_si,scls) = hio_nplant_canopy_si_scls(io_si,scls) + ccohort%n - hio_lai_canopy_si_scls(io_si,scls) = hio_lai_canopy_si_scls(io_si,scls) + ccohort%n * ccohort%treelai - hio_sai_canopy_si_scls(io_si,scls) = hio_sai_canopy_si_scls(io_si,scls) + ccohort%n * ccohort%treesai + hio_lai_canopy_si_scls(io_si,scls) = hio_lai_canopy_si_scls(io_si,scls) + & + ccohort%treelai*ccohort%c_area * AREA_INV + hio_sai_canopy_si_scls(io_si,scls) = hio_sai_canopy_si_scls(io_si,scls) + & + ccohort%treesai*ccohort%c_area * AREA_INV hio_trimming_canopy_si_scls(io_si,scls) = hio_trimming_canopy_si_scls(io_si,scls) + & ccohort%n * ccohort%canopy_trim hio_crown_area_canopy_si_scls(io_si,scls) = hio_crown_area_canopy_si_scls(io_si,scls) + & @@ -1940,8 +1949,10 @@ subroutine update_history_dyn(this,nc,nsites,sites) hio_nplant_understory_si_scpf(io_si,scpf) = hio_nplant_understory_si_scpf(io_si,scpf) + ccohort%n hio_nplant_understory_si_scls(io_si,scls) = hio_nplant_understory_si_scls(io_si,scls) + ccohort%n - hio_lai_understory_si_scls(io_si,scls) = hio_lai_understory_si_scls(io_si,scls) + ccohort%n * ccohort%treelai - hio_sai_understory_si_scls(io_si,scls) = hio_sai_understory_si_scls(io_si,scls) + ccohort%n * ccohort%treesai + hio_lai_understory_si_scls(io_si,scls) = hio_lai_understory_si_scls(io_si,scls) + & + ccohort%treelai*ccohort%c_area * AREA_INV + hio_sai_understory_si_scls(io_si,scls) = hio_sai_understory_si_scls(io_si,scls) + & + ccohort%treelai*ccohort%c_area * AREA_INV hio_trimming_understory_si_scls(io_si,scls) = hio_trimming_understory_si_scls(io_si,scls) + & ccohort%n * ccohort%canopy_trim hio_crown_area_understory_si_scls(io_si,scls) = hio_crown_area_understory_si_scls(io_si,scls) + & @@ -2233,14 +2244,6 @@ subroutine update_history_dyn(this,nc,nsites,sites) sites(s)%leaf_litter_diagnostic_input_carbonflux(:) = 0._r8 sites(s)%root_litter_diagnostic_input_carbonflux(:) = 0._r8 - if(hlm_use_planthydro==itrue)then - hio_h2oveg_dead_si(io_si) = sites(s)%si_hydr%h2oveg_dead - hio_h2oveg_recruit_si(io_si) = sites(s)%si_hydr%h2oveg_recruit - hio_h2oveg_growturn_err_si(io_si) = sites(s)%si_hydr%h2oveg_growturn_err - hio_h2oveg_pheno_err_si(io_si) = sites(s)%si_hydr%h2oveg_pheno_err - hio_h2oveg_hydro_err_si(io_si) = sites(s)%si_hydr%h2oveg_hydro_err - endif - enddo ! site loop end associate @@ -2776,7 +2779,8 @@ subroutine update_history_hydraulics(this,nc,nsites,sites,dt_tstep) hio_lflc_scpf => this%hvars(ih_lflc_scpf)%r82d, & hio_btran_scpf => this%hvars(ih_btran_scpf)%r82d, & hio_h2oveg_si => this%hvars(ih_h2oveg_si)%r81d, & - hio_nplant_si_scpf => this%hvars(ih_nplant_si_scpf)%r82d ) + hio_nplant_si_scpf => this%hvars(ih_nplant_si_scpf)%r82d, & + hio_h2oveg_hydro_err_si => this%hvars(ih_h2oveg_hydro_err_si)%r81d ) ! Flush the relevant history variables call this%flush_hvars(nc,upfreq_in=4) @@ -2786,6 +2790,9 @@ subroutine update_history_hydraulics(this,nc,nsites,sites,dt_tstep) io_si = this%iovar_map(nc)%site_index(s) io_pa1 = this%iovar_map(nc)%patch1_index(s) + hio_h2oveg_si(io_si) = sites(s)%si_hydr%h2oveg + hio_h2oveg_hydro_err_si(io_si) = sites(s)%si_hydr%h2oveg_hydro_err + ncohort_scpf(:) = 0.0_r8 ! Counter for normalizing weighting ! factors for cohort mean propoerties ! This is actually used as a check @@ -3027,8 +3034,6 @@ subroutine update_history_hydraulics(this,nc,nsites,sites,dt_tstep) end do end if - hio_h2oveg_si(io_si) = sites(s)%si_hydr%h2oveg - enddo ! site loop end associate @@ -4051,13 +4056,13 @@ subroutine define_history_vars(this, initialize_variables) avgflag='A', vtype=site_size_r8, hlms='CLM:ALM', flushval=0.0_r8, & upfreq=1, ivar=ivar, initialize=initialize_variables, index = ih_nplant_canopy_si_scls ) - call this%set_history_var(vname='LAI_CANOPY_SCLS', units = 'indiv/ha', & - long='number of canopy plants by size class', use_default='active', & + call this%set_history_var(vname='LAI_CANOPY_SCLS', units = 'm2/m2', & + long='Leaf are index (LAI) by size class', use_default='active', & avgflag='A', vtype=site_size_r8, hlms='CLM:ALM', flushval=0.0_r8, & upfreq=1, ivar=ivar, initialize=initialize_variables, index = ih_lai_canopy_si_scls ) - call this%set_history_var(vname='SAI_CANOPY_SCLS', units = 'indiv/ha', & - long='number of canopy plants by size class', use_default='inactive', & + call this%set_history_var(vname='SAI_CANOPY_SCLS', units = 'm2/m2', & + long='stem area index(SAI) by size class', use_default='inactive', & avgflag='A', vtype=site_size_r8, hlms='CLM:ALM', flushval=0.0_r8, & upfreq=1, ivar=ivar, initialize=initialize_variables, index = ih_sai_canopy_si_scls ) @@ -4635,7 +4640,7 @@ subroutine define_history_vars(this, initialize_variables) call this%set_history_var(vname='H2OVEG_HYDRO_ERR', units = 'kg/m2', & long='cumulative net borrowed (+) from plant_stored_h2o due to plant hydrodynamics', use_default='inactive', & avgflag='A', vtype=site_r8, hlms='CLM:ALM', flushval=0.0_r8, & - upfreq=1, ivar=ivar, initialize=initialize_variables, index = ih_h2oveg_hydro_err_si ) + upfreq=4, ivar=ivar, initialize=initialize_variables, index = ih_h2oveg_hydro_err_si ) end if ! Must be last thing before return diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index c49831e918..fb5002d2ac 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -18,6 +18,7 @@ module FatesInterfaceMod use EDTypesMod , only : nclmax use EDTypesMod , only : nlevleaf use EDTypesMod , only : maxpft + use EDTypesMod , only : do_fates_salinity use EDTypesMod , only : ncwd use EDTypesMod , only : numWaterMem use FatesConstantsMod , only : r8 => fates_r8 @@ -29,11 +30,13 @@ module FatesInterfaceMod use EDPftvarcon , only : FatesCheckParams use EDPftvarcon , only : EDPftvarcon_inst use EDParamsMod , only : FatesReportParams + use EDParamsMod , only : bgc_soil_salinity use PRTGenericMod , only : prt_carbon_allom_hyp use PRTGenericMod , only : prt_cnp_flex_allom_hyp use PRTAllometricCarbonMod, only : InitPRTGlobalAllometricCarbon ! use PRTAllometricCNPMod, only : InitPRTGlobalAllometricCNP + ! CIME Globals use shr_log_mod , only : errMsg => shr_log_errMsg use shr_infnan_mod , only : nan => shr_infnan_nan, assignment(=) @@ -405,6 +408,9 @@ module FatesInterfaceMod ! Soil suction potential of layers in each site, negative, [mm] real(r8), allocatable :: smp_sl(:) + + !soil salinity of layers in each site [ppt] + real(r8), allocatable :: salinity_sl(:) ! Effective porosity = porosity - vol_ic, of layers in each site [-] real(r8), allocatable :: eff_porosity_sl(:) @@ -583,6 +589,7 @@ module FatesInterfaceMod contains procedure, public :: zero_bcs + procedure, public :: set_bcs end type fates_interface_type @@ -669,6 +676,11 @@ subroutine allocate_bcin(bc_in, nlevsoil_in, nlevdecomp_in) allocate(bc_in%watsat_sl(nlevsoil_in)) allocate(bc_in%tempk_sl(nlevsoil_in)) allocate(bc_in%h2o_liqvol_sl(nlevsoil_in)) + + !BGC + if(do_fates_salinity) then + allocate(bc_in%salinity_sl(nlevsoil_in)) + endif ! Photosynthesis allocate(bc_in%filter_photo_pa(maxPatchesPerSite)) @@ -809,6 +821,10 @@ subroutine zero_bcs(this,s) this%bc_in(s)%tot_litc = 0.0_r8 this%bc_in(s)%snow_depth_si = 0.0_r8 this%bc_in(s)%frac_sno_eff_si = 0.0_r8 + + if(do_fates_salinity)then + this%bc_in(s)%salinity_sl(:) = 0.0_r8 + endif if (hlm_use_planthydro.eq.itrue) then @@ -866,6 +882,34 @@ subroutine zero_bcs(this,s) return end subroutine zero_bcs + + subroutine set_bcs(this,s) + + ! -------------------------------------------------------------------------------- + ! + ! This subroutine is called directly from the HLM to set boundary condition not yet + ! functional from hlm. This allows flexibility for model testing. + ! + ! This subroutine MUST BE CALLED AFTER the FATES PFT parameter file has been read in, + ! and the EDPftvarcon_inst structure has been made. + ! This subroutine must ALSO BE CALLED BEFORE the history file dimensions + ! are set. + ! + ! -------------------------------------------------------------------------------- + implicit none + class(fates_interface_type), intent(inout) :: this + integer, intent(in) :: s + + ! Input boundaries + ! Warning: these "z" type variables + ! are written only once at the beginning + ! so THIS ROUTINE SHOULD NOT BE CALLED AFTER + ! INITIALIZATION + if(do_fates_salinity)then + this%bc_in(s)%salinity_sl(:) = bgc_soil_salinity + endif + + end subroutine set_bcs ! =================================================================================== diff --git a/main/FatesRestartInterfaceMod.F90 b/main/FatesRestartInterfaceMod.F90 index fa851b32fc..c108be8757 100644 --- a/main/FatesRestartInterfaceMod.F90 +++ b/main/FatesRestartInterfaceMod.F90 @@ -1372,13 +1372,7 @@ subroutine set_restart_vectors(this,nc,nsites,sites) rio_livegrass_pa => this%rvars(ir_livegrass_pa)%r81d, & rio_age_pa => this%rvars(ir_age_pa)%r81d, & rio_area_pa => this%rvars(ir_area_pa)%r81d, & - rio_watermem_siwm => this%rvars(ir_watermem_siwm)%r81d, & - rio_hydro_liqvol_shell_si => this%rvars(ir_hydro_liqvol_shell_si)%r81d, & - rio_hydro_recruit_si => this%rvars(ir_hydro_recruit_si)%r81d, & - rio_hydro_dead_si => this%rvars(ir_hydro_dead_si)%r81d, & - rio_hydro_growturn_err_si => this%rvars(ir_hydro_growturn_err_si)%r81d, & - rio_hydro_pheno_err_si => this%rvars(ir_hydro_pheno_err_si)%r81d, & - rio_hydro_hydro_err_si => this%rvars(ir_hydro_hydro_err_si)%r81d) + rio_watermem_siwm => this%rvars(ir_watermem_siwm)%r81d) totalCohorts = 0 @@ -1655,17 +1649,20 @@ subroutine set_restart_vectors(this,nc,nsites,sites) if(hlm_use_planthydro==itrue)then - rio_hydro_recruit_si(io_idx_si) = sites(s)%si_hydr%h2oveg_recruit - rio_hydro_dead_si(io_idx_si) = sites(s)%si_hydr%h2oveg_dead - rio_hydro_growturn_err_si(io_idx_si) = sites(s)%si_hydr%h2oveg_growturn_err - rio_hydro_pheno_err_si(io_idx_si) = sites(s)%si_hydr%h2oveg_pheno_err - rio_hydro_hydro_err_si(io_idx_si) = sites(s)%si_hydr%h2oveg_hydro_err + ! No associate statements because there is no gaurantee these + ! are allocated + + this%rvars(ir_hydro_recruit_si)%r81d(io_idx_si) = sites(s)%si_hydr%h2oveg_recruit + this%rvars(ir_hydro_dead_si)%r81d(io_idx_si) = sites(s)%si_hydr%h2oveg_dead + this%rvars(ir_hydro_growturn_err_si)%r81d(io_idx_si) = sites(s)%si_hydr%h2oveg_growturn_err + this%rvars(ir_hydro_pheno_err_si)%r81d(io_idx_si) = sites(s)%si_hydr%h2oveg_pheno_err + this%rvars(ir_hydro_hydro_err_si)%r81d(io_idx_si) = sites(s)%si_hydr%h2oveg_hydro_err ! Hydraulics counters lyr = hydraulic layer, shell = rhizosphere shell do i = 1, sites(s)%si_hydr%nlevsoi_hyd ! Loop shells do k = 1, nshell - rio_hydro_liqvol_shell_si(io_idx_si_lyr_shell) = & + this%rvars(ir_hydro_liqvol_shell_si)%r81d(io_idx_si_lyr_shell) = & sites(s)%si_hydr%h2osoi_liqvol_shell(i,k) io_idx_si_lyr_shell = io_idx_si_lyr_shell + 1 end do @@ -2012,13 +2009,7 @@ subroutine get_restart_vectors(this, nc, nsites, sites) rio_livegrass_pa => this%rvars(ir_livegrass_pa)%r81d, & rio_age_pa => this%rvars(ir_age_pa)%r81d, & rio_area_pa => this%rvars(ir_area_pa)%r81d, & - rio_watermem_siwm => this%rvars(ir_watermem_siwm)%r81d, & - rio_hydro_liqvol_shell_si => this%rvars(ir_hydro_liqvol_shell_si)%r81d, & - rio_hydro_recruit_si => this%rvars(ir_hydro_recruit_si)%r81d, & - rio_hydro_dead_si => this%rvars(ir_hydro_dead_si)%r81d, & - rio_hydro_growturn_err_si => this%rvars(ir_hydro_growturn_err_si)%r81d, & - rio_hydro_pheno_err_si => this%rvars(ir_hydro_pheno_err_si)%r81d, & - rio_hydro_hydro_err_si => this%rvars(ir_hydro_hydro_err_si)%r81d) + rio_watermem_siwm => this%rvars(ir_watermem_siwm)%r81d) totalcohorts = 0 @@ -2259,18 +2250,18 @@ subroutine get_restart_vectors(this, nc, nsites, sites) if(hlm_use_planthydro==itrue)then - sites(s)%si_hydr%h2oveg_recruit = rio_hydro_recruit_si(io_idx_si) - sites(s)%si_hydr%h2oveg_dead = rio_hydro_dead_si(io_idx_si) - sites(s)%si_hydr%h2oveg_growturn_err = rio_hydro_growturn_err_si(io_idx_si) - sites(s)%si_hydr%h2oveg_pheno_err = rio_hydro_pheno_err_si(io_idx_si) - sites(s)%si_hydr%h2oveg_hydro_err = rio_hydro_hydro_err_si(io_idx_si) + sites(s)%si_hydr%h2oveg_recruit = this%rvars(ir_hydro_recruit_si)%r81d(io_idx_si) + sites(s)%si_hydr%h2oveg_dead = this%rvars(ir_hydro_dead_si)%r81d(io_idx_si) + sites(s)%si_hydr%h2oveg_growturn_err = this%rvars(ir_hydro_growturn_err_si)%r81d(io_idx_si) + sites(s)%si_hydr%h2oveg_pheno_err = this%rvars(ir_hydro_pheno_err_si)%r81d(io_idx_si) + sites(s)%si_hydr%h2oveg_hydro_err = this%rvars(ir_hydro_hydro_err_si)%r81d(io_idx_si) ! Hydraulics counters lyr = hydraulic layer, shell = rhizosphere shell do i = 1, sites(s)%si_hydr%nlevsoi_hyd ! Loop shells do k = 1, nshell sites(s)%si_hydr%h2osoi_liqvol_shell(i,k) = & - rio_hydro_liqvol_shell_si(io_idx_si_lyr_shell) + this%rvars(ir_hydro_liqvol_shell_si)%r81d(io_idx_si_lyr_shell) io_idx_si_lyr_shell = io_idx_si_lyr_shell + 1 end do end do @@ -2312,12 +2303,9 @@ subroutine get_restart_vectors(this, nc, nsites, sites) end associate end subroutine get_restart_vectors - ! ==================================================================================== - - - subroutine update_3dpatch_radiation(this, nsites, sites, bc_out) + subroutine update_3dpatch_radiation(this, nsites, sites, bc_out) ! ------------------------------------------------------------------------- ! This subroutine populates output boundary conditions related to radiation diff --git a/parameter_files/fates_params_14pfts.cdl b/parameter_files/fates_params_14pfts.cdl index ebbf1b46ac..80c469e6a0 100644 --- a/parameter_files/fates_params_14pfts.cdl +++ b/parameter_files/fates_params_14pfts.cdl @@ -126,6 +126,9 @@ variables: float 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" ; + float 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" ; float fates_allom_agb1(fates_pft) ; fates_allom_agb1:units = "variable" ; fates_allom_agb1:long_name = "Parameter 1 for agb allometry" ; @@ -587,6 +590,9 @@ variables: float fates_part_dens ; fates_part_dens:units = "kg/m2" ; fates_part_dens:long_name = "spitfire parameter, oven dry particle density, Table A1 Thonicke et al 2010" ; + float fates_soil_salinity(fates_scalar) ; + fates_soil_salinity:units = "ppt" ; + fates_soil_salinity:long_name = "soil salinity used for model when not coupled to dynamic soil salinity" ; // global attributes: :history = "This file was made from FatesPFTIndexSwapper.py \n", @@ -696,6 +702,8 @@ data: "reproduction ", "structure "; + fates_allom_frbstor_repro = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; + fates_alloc_storage_cushion = 2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2, 1.2 ; @@ -1198,4 +1206,6 @@ data: fates_miner_total = 0.055 ; fates_part_dens = 513 ; + + fates_soil_salinity = 0.4; } diff --git a/parameter_files/fates_params_coastal_veg.cdl b/parameter_files/fates_params_coastal_veg.cdl new file mode 100644 index 0000000000..dddcc9d159 --- /dev/null +++ b/parameter_files/fates_params_coastal_veg.cdl @@ -0,0 +1,963 @@ +netcdf fates_params.2trop { +dimensions: + fates_NCWD = 4 ; + fates_history_age_bins = 7 ; + fates_history_height_bins = 6 ; + fates_history_size_bins = 13 ; + fates_hydr_organs = 4 ; + fates_litterclass = 6 ; + fates_pft = 2 ; + fates_scalar = 1 ; + fates_string_length = 60 ; + fates_variants = 2 ; +variables: + float 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" ; + float 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" ; + float fates_FBD(fates_litterclass) ; + fates_FBD:units = "NA" ; + fates_FBD:long_name = "spitfire parameter related to fuel bulk density, see SFMain.F90" ; + float fates_SAV(fates_litterclass) ; + fates_SAV:units = "NA" ; + fates_SAV:long_name = "spitfire parameter related to surface area to volume ratio, see SFMain.F90" ; + float fates_alpha_FMC(fates_litterclass) ; + fates_alpha_FMC:units = "NA" ; + fates_alpha_FMC:long_name = "spitfire parameter related to fuel moisture content, Equation 6 Thonicke et al 2010" ; + float 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" ; + float fates_low_moisture_Coeff(fates_litterclass) ; + fates_low_moisture_Coeff:units = "NA" ; + fates_low_moisture_Coeff:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ; + float fates_low_moisture_Slope(fates_litterclass) ; + fates_low_moisture_Slope:units = "NA" ; + fates_low_moisture_Slope:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ; + float fates_max_decomp(fates_litterclass) ; + fates_max_decomp:units = "kgC/m2/yr ?" ; + fates_max_decomp:long_name = "maximum rate of litter & CWD transfer from non-decomposing class into decomposing class" ; + float fates_mid_moisture(fates_litterclass) ; + fates_mid_moisture:units = "NA" ; + fates_mid_moisture:long_name = "spitfire litter moisture threshold to be considered medium dry" ; + float fates_mid_moisture_Coeff(fates_litterclass) ; + fates_mid_moisture_Coeff:units = "NA" ; + fates_mid_moisture_Coeff:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ; + float fates_mid_moisture_Slope(fates_litterclass) ; + fates_mid_moisture_Slope:units = "NA" ; + fates_mid_moisture_Slope:long_name = "spitfire parameter, equation B1 Thonicke et al 2010" ; + float fates_min_moisture(fates_litterclass) ; + fates_min_moisture:units = "NA" ; + fates_min_moisture:long_name = "spitfire litter moisture threshold to be considered very dry" ; + float fates_hydr_avuln_node(fates_hydr_organs, fates_pft) ; + fates_hydr_avuln_node:units = "unitless" ; + fates_hydr_avuln_node:long_name = "xylem vulnerability curve shape parameter" ; + float fates_hydr_epsil_node(fates_hydr_organs, fates_pft) ; + fates_hydr_epsil_node:units = "MPa" ; + fates_hydr_epsil_node:long_name = "bulk elastic modulus" ; + float fates_hydr_fcap_node(fates_hydr_organs, fates_pft) ; + fates_hydr_fcap_node:units = "unitless" ; + fates_hydr_fcap_node:long_name = "fraction of (1-resid_node) that is capillary in source" ; + float fates_hydr_kmax_node(fates_hydr_organs, fates_pft) ; + fates_hydr_kmax_node:units = "kgMPa/m/s" ; + fates_hydr_kmax_node:long_name = "maximum xylem conductivity per unit conducting xylem area" ; + float fates_hydr_p50_node(fates_hydr_organs, fates_pft) ; + fates_hydr_p50_node:units = "MPa" ; + fates_hydr_p50_node:long_name = "xylem water potential at 50% loss of conductivity" ; + float fates_hydr_pinot_node(fates_hydr_organs, fates_pft) ; + fates_hydr_pinot_node:units = "MPa" ; + fates_hydr_pinot_node:long_name = "osmotic potential at full turgor" ; + float fates_hydr_pitlp_node(fates_hydr_organs, fates_pft) ; + fates_hydr_pitlp_node:units = "MPa" ; + fates_hydr_pitlp_node:long_name = "turgor loss point" ; + float fates_hydr_resid_node(fates_hydr_organs, fates_pft) ; + fates_hydr_resid_node:units = "fraction" ; + fates_hydr_resid_node:long_name = "residual fraction" ; + float fates_hydr_thetas_node(fates_hydr_organs, fates_pft) ; + fates_hydr_thetas_node:units = "cm3/cm3" ; + fates_hydr_thetas_node:long_name = "saturated water content" ; + float fates_CWD_frac(fates_NCWD) ; + fates_CWD_frac:units = "fraction" ; + fates_CWD_frac:long_name = "fraction of woody (bdead+bsw) biomass destined for CWD pool" ; + char fates_pftname(fates_pft, fates_string_length) ; + fates_pftname:units = "unitless - string" ; + fates_pftname:long_name = "Description of plant type" ; + float 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)" ; + float 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" ; + float fates_allom_agb1(fates_pft) ; + fates_allom_agb1:units = "variable" ; + fates_allom_agb1:long_name = "Parameter 1 for agb allometry" ; + float fates_allom_agb2(fates_pft) ; + fates_allom_agb2:units = "variable" ; + fates_allom_agb2:long_name = "Parameter 2 for agb allometry" ; + float fates_allom_agb3(fates_pft) ; + fates_allom_agb3:units = "variable" ; + fates_allom_agb3:long_name = "Parameter 3 for agb allometry" ; + float fates_allom_agb4(fates_pft) ; + fates_allom_agb4:units = "variable" ; + fates_allom_agb4:long_name = "Parameter 4 for agb allometry" ; + float 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" ; + float fates_allom_amode(fates_pft) ; + fates_allom_amode:units = "index" ; + fates_allom_amode:long_name = "AGB allometry function index" ; + float 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" ; + float fates_allom_cmode(fates_pft) ; + fates_allom_cmode:units = "index" ; + fates_allom_cmode:long_name = "coarse root biomass allometry function index" ; + float fates_allom_d2bl1(fates_pft) ; + fates_allom_d2bl1:units = "variable" ; + fates_allom_d2bl1:long_name = "Parameter 1 for d2bl allometry (intercept)" ; + float fates_allom_d2bl2(fates_pft) ; + fates_allom_d2bl2:units = "variable" ; + fates_allom_d2bl2:long_name = "Parameter 2 for d2bl allometry (slope)" ; + float fates_allom_d2bl3(fates_pft) ; + fates_allom_d2bl3:units = "unitless" ; + fates_allom_d2bl3:long_name = "Parameter 3 for d2bl allometry (optional)" ; + float 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" ; + float 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" ; + float fates_allom_d2h1(fates_pft) ; + fates_allom_d2h1:units = "variable" ; + fates_allom_d2h1:long_name = "Parameter 1 for d2h allometry (intercept, or c)" ; + float fates_allom_d2h2(fates_pft) ; + fates_allom_d2h2:units = "variable" ; + fates_allom_d2h2:long_name = "Parameter 2 for d2h allometry (slope, or m)" ; + float fates_allom_d2h3(fates_pft) ; + fates_allom_d2h3:units = "variable" ; + fates_allom_d2h3:long_name = "Parameter 3 for d2h allometry (optional)" ; + float 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" ; + float fates_allom_fmode(fates_pft) ; + fates_allom_fmode:units = "index" ; + fates_allom_fmode:long_name = "fine root biomass allometry function index" ; + float fates_allom_hmode(fates_pft) ; + fates_allom_hmode:units = "index" ; + fates_allom_hmode:long_name = "height allometry function index" ; + float fates_allom_l2fr(fates_pft) ; + fates_allom_l2fr:units = "gC/gC" ; + fates_allom_l2fr:long_name = "Allocation parameter: fine root C per leaf C" ; + float fates_allom_latosa_int(fates_pft) ; + fates_allom_latosa_int:units = "ratio" ; + fates_allom_latosa_int:long_name = "Leaf area to sap area ratio, intercept [m2/cm2]" ; + float fates_allom_latosa_slp(fates_pft) ; + fates_allom_latosa_slp:units = "unitless" ; + fates_allom_latosa_slp:long_name = "Leaf area to sap area ratio, slope (optional)" ; + float fates_allom_lmode(fates_pft) ; + fates_allom_lmode:units = "index" ; + fates_allom_lmode:long_name = "leaf biomass allometry function index" ; + float fates_allom_sai_scaler(fates_pft) ; + fates_allom_sai_scaler:units = "m2/gC" ; + fates_allom_sai_scaler:long_name = "allometric ratio of SAI to target bleaf" ; + float fates_allom_smode(fates_pft) ; + fates_allom_smode:units = "index" ; + fates_allom_smode:long_name = "sapwood allometry function index" ; + float fates_allom_stmode(fates_pft) ; + fates_allom_stmode:units = "index" ; + fates_allom_stmode:long_name = "storage allometry function index" ; + float 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" ; + float fates_branch_turnover(fates_pft) ; + fates_branch_turnover:units = "yr-1" ; + fates_branch_turnover:long_name = "turnover time of branches" ; + float fates_c2b(fates_pft) ; + fates_c2b:units = "ratio" ; + fates_c2b:long_name = "Carbon to biomass multiplier of bulk structural tissues" ; + float fates_displar(fates_pft) ; + fates_displar:units = "unitless" ; + fates_displar:long_name = "Ratio of displacement height to canopy top height" ; + float fates_fire_alpha_SH(fates_pft) ; + fates_fire_alpha_SH:units = "NA" ; + fates_fire_alpha_SH:long_name = "spitfire parameter, alpha scorch height, Equation 16 Thonicke et al 2010" ; + float 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" ; + float fates_fire_crown_depth_frac(fates_pft) ; + fates_fire_crown_depth_frac:units = "fraction" ; + fates_fire_crown_depth_frac:long_name = "the depth of a cohorts crown as a fraction of its height" ; + float 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" ; + float fates_fr_fcel(fates_pft) ; + fates_fr_fcel:units = "fraction" ; + fates_fr_fcel:long_name = "Fine root litter cellulose fraction" ; + float fates_fr_flab(fates_pft) ; + fates_fr_flab:units = "fraction" ; + fates_fr_flab:long_name = "Fine root litter labile fraction" ; + float fates_fr_flig(fates_pft) ; + fates_fr_flig:units = "fraction" ; + fates_fr_flig:long_name = "Fine root litter lignin fraction" ; + float fates_froot_cn_ratio(fates_pft) ; + fates_froot_cn_ratio:units = "gC/gN" ; + fates_froot_cn_ratio:long_name = "Fine root C:N" ; + float fates_grperc(fates_pft) ; + fates_grperc:units = "unitless" ; + fates_grperc:long_name = "Growth respiration factor" ; + float fates_hydr_avuln_gs(fates_pft) ; + fates_hydr_avuln_gs:units = "unitless" ; + fates_hydr_avuln_gs:long_name = "shape parameter for stomatal control of water vapor exiting leaf" ; + float fates_hydr_p50_gs(fates_pft) ; + fates_hydr_p50_gs:units = "MPa" ; + fates_hydr_p50_gs:long_name = "water potential at 50% loss of stomatal conductance" ; + float fates_hydr_p_taper(fates_pft) ; + fates_hydr_p_taper:units = "unitless" ; + fates_hydr_p_taper:long_name = "xylem taper exponent" ; + float fates_hydr_rfrac_stem(fates_pft) ; + fates_hydr_rfrac_stem:units = "fraction" ; + fates_hydr_rfrac_stem:long_name = "fraction of total tree resistance from troot to canopy" ; + float fates_hydr_rs2(fates_pft) ; + fates_hydr_rs2:units = "mm" ; + fates_hydr_rs2:long_name = "absorbing root radius" ; + float fates_hydr_srl(fates_pft) ; + fates_hydr_srl:units = "m g-1" ; + fates_hydr_srl:long_name = "specific root length" ; + float fates_leaf_BB_slope(fates_pft) ; + fates_leaf_BB_slope:units = "unitless" ; + fates_leaf_BB_slope:long_name = "stomatal slope parameter, as per Ball-Berry" ; + float fates_leaf_c3psn(fates_pft) ; + fates_leaf_c3psn:units = "flag" ; + fates_leaf_c3psn:long_name = "Photosynthetic pathway (1=c3, 0=c4)" ; + float fates_leaf_clumping_index(fates_pft) ; + fates_leaf_clumping_index:units = "fraction (0-1)" ; + fates_leaf_clumping_index:long_name = "factor describing how much self-occlusion of leaf scattering elements decreases light interception" ; + float fates_leaf_cn_ratio(fates_pft) ; + fates_leaf_cn_ratio:units = "gC/gN" ; + fates_leaf_cn_ratio:long_name = "Leaf C:N" ; + float fates_leaf_diameter(fates_pft) ; + fates_leaf_diameter:units = "m" ; + fates_leaf_diameter:long_name = "Characteristic leaf dimension" ; + float fates_leaf_jmaxha(fates_pft) ; + fates_leaf_jmaxha:units = "J/mol" ; + fates_leaf_jmaxha:long_name = "activation energy for jmax" ; + float fates_leaf_jmaxhd(fates_pft) ; + fates_leaf_jmaxhd:units = "J/mol" ; + fates_leaf_jmaxhd:long_name = "deactivation energy for jmax" ; + float fates_leaf_jmaxse(fates_pft) ; + fates_leaf_jmaxse:units = "J/mol/K" ; + fates_leaf_jmaxse:long_name = "entropy term for jmax" ; + float fates_leaf_long(fates_pft) ; + fates_leaf_long:units = "yr" ; + fates_leaf_long:long_name = "Leaf longevity (ie turnover timescale)" ; + float 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" ; + float fates_leaf_stor_priority(fates_pft) ; + fates_leaf_stor_priority:units = "unitless" ; + fates_leaf_stor_priority:long_name = "factor governing priority of replacing storage with NPP" ; + float fates_leaf_tpuha(fates_pft) ; + fates_leaf_tpuha:units = "J/mol" ; + fates_leaf_tpuha:long_name = "activation energy for tpu" ; + float fates_leaf_tpuhd(fates_pft) ; + fates_leaf_tpuhd:units = "J/mol" ; + fates_leaf_tpuhd:long_name = "deactivation energy for tpu" ; + float fates_leaf_tpuse(fates_pft) ; + fates_leaf_tpuse:units = "J/mol/K" ; + fates_leaf_tpuse:long_name = "entropy term for tpu" ; + float fates_leaf_vcmax25top(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" ; + float fates_leaf_vcmaxha(fates_pft) ; + fates_leaf_vcmaxha:units = "J/mol" ; + fates_leaf_vcmaxha:long_name = "activation energy for vcmax" ; + float fates_leaf_vcmaxhd(fates_pft) ; + fates_leaf_vcmaxhd:units = "J/mol" ; + fates_leaf_vcmaxhd:long_name = "deactivation energy for vcmax" ; + float fates_leaf_vcmaxse(fates_pft) ; + fates_leaf_vcmaxse:units = "J/mol/K" ; + fates_leaf_vcmaxse:long_name = "entropy term for vcmax" ; + float fates_leaf_xl(fates_pft) ; + fates_leaf_xl:units = "unitless" ; + fates_leaf_xl:long_name = "Leaf/stem orientation index" ; + float fates_lf_fcel(fates_pft) ; + fates_lf_fcel:units = "fraction" ; + fates_lf_fcel:long_name = "Leaf litter cellulose fraction" ; + float fates_lf_flab(fates_pft) ; + fates_lf_flab:units = "fraction" ; + fates_lf_flab:long_name = "Leaf litter labile fraction" ; + float fates_lf_flig(fates_pft) ; + fates_lf_flig:units = "fraction" ; + fates_lf_flig:long_name = "Leaf litter lignin fraction" ; + float 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" ; + float 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" ; + float fates_mort_bmort(fates_pft) ; + fates_mort_bmort:units = "1/yr" ; + fates_mort_bmort:long_name = "background mortality rate" ; + float fates_mort_freezetol(fates_pft) ; + fates_mort_freezetol:units = "NA" ; + fates_mort_freezetol:long_name = "minimum temperature tolerance (NOT USED)" ; + float 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" ; + float 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" ; + float 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" ; + float 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" ; + float fates_pft_used(fates_pft) ; + fates_pft_used:units = "0 = off (dont use), 1 = on (use)" ; + fates_pft_used:long_name = "Switch to turn on and off PFTs (also see fates_initd for cold-start)" ; + float fates_phen_evergreen(fates_pft) ; + fates_phen_evergreen:units = "logical flag" ; + fates_phen_evergreen:long_name = "Binary flag for evergreen leaf habit" ; + float 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" ; + float fates_phen_stress_decid(fates_pft) ; + fates_phen_stress_decid:units = "logical flag" ; + fates_phen_stress_decid:long_name = "Binary flag for stress-deciduous leaf habit" ; + float fates_prescribed_mortality_canopy(fates_pft) ; + fates_prescribed_mortality_canopy:units = "1/yr" ; + fates_prescribed_mortality_canopy:long_name = "mortality rate of canopy trees for prescribed physiology mode" ; + float fates_prescribed_mortality_understory(fates_pft) ; + fates_prescribed_mortality_understory:units = "1/yr" ; + fates_prescribed_mortality_understory:long_name = "mortality rate of understory trees for prescribed physiology mode" ; + float fates_prescribed_npp_canopy(fates_pft) ; + fates_prescribed_npp_canopy:units = "gC / m^2 / yr" ; + fates_prescribed_npp_canopy:long_name = "NPP per unit crown area of canopy trees for prescribed physiology mode" ; + float fates_prescribed_npp_understory(fates_pft) ; + fates_prescribed_npp_understory:units = "gC / m^2 / yr" ; + fates_prescribed_npp_understory:long_name = "NPP per unit crown area of understory trees for prescribed physiology mode" ; + float fates_prescribed_recruitment(fates_pft) ; + fates_prescribed_recruitment:units = "n/yr" ; + fates_prescribed_recruitment:long_name = "recruitment rate for prescribed physiology mode" ; + float fates_recruit_hgt_min(fates_pft) ; + fates_recruit_hgt_min:units = "m" ; + fates_recruit_hgt_min:long_name = "the minimum height (ie starting height) of a newly recruited plant" ; + float fates_recruit_initd(fates_pft) ; + fates_recruit_initd:units = "stems/m2" ; + fates_recruit_initd:long_name = "initial seedling density for a cold-start near-bare-ground simulation" ; + float fates_rholnir(fates_pft) ; + fates_rholnir:units = "fraction" ; + fates_rholnir:long_name = "Leaf reflectance: near-IR" ; + float fates_rholvis(fates_pft) ; + fates_rholvis:units = "fraction" ; + fates_rholvis:long_name = "Leaf reflectance: visible" ; + float fates_rhosnir(fates_pft) ; + fates_rhosnir:units = "fraction" ; + fates_rhosnir:long_name = "Stem reflectance: near-IR" ; + float fates_rhosvis(fates_pft) ; + fates_rhosvis:units = "fraction" ; + fates_rhosvis:long_name = "Stem reflectance: visible" ; + float fates_root_long(fates_pft) ; + fates_root_long:units = "yr" ; + fates_root_long:long_name = "root longevity (alternatively, turnover time)" ; + float fates_roota_par(fates_pft) ; + fates_roota_par:units = "1/m" ; + fates_roota_par:long_name = "CLM rooting distribution parameter" ; + float fates_rootb_par(fates_pft) ; + fates_rootb_par:units = "1/m" ; + fates_rootb_par:long_name = "CLM rooting distribution parameter" ; + float fates_seed_alloc(fates_pft) ; + fates_seed_alloc:units = "fraction" ; + fates_seed_alloc:long_name = "fraction of available carbon balance allocated to seeds" ; + float fates_seed_alloc_mature(fates_pft) ; + fates_seed_alloc_mature:units = "fraction" ; + fates_seed_alloc_mature:long_name = "fraction of available carbon balance allocated to seeds in mature plants (adds to fates_seed_alloc)" ; + float fates_seed_dbh_repro_threshold(fates_pft) ; + fates_seed_dbh_repro_threshold:units = "cm" ; + fates_seed_dbh_repro_threshold:long_name = "the diameter (if any) where the plant will start extra clonal allocation to the seed pool (NOT USED YET)" ; + float fates_seed_decay_turnover(fates_pft) ; + fates_seed_decay_turnover:units = "1/yr" ; + fates_seed_decay_turnover:long_name = "turnover time for seeds with respect to germination" ; + float fates_seed_germination_timescale(fates_pft) ; + fates_seed_germination_timescale:units = "1/yr" ; + fates_seed_germination_timescale:long_name = "turnover time for seeds with respect to decay" ; + float fates_seed_rain(fates_pft) ; + fates_seed_rain:units = "KgC/m2/yr" ; + fates_seed_rain:long_name = "External seed rain from outside site (non-mass conserving)" ; + float fates_smpsc(fates_pft) ; + fates_smpsc:units = "mm" ; + fates_smpsc:long_name = "Soil water potential at full stomatal closure" ; + float fates_smpso(fates_pft) ; + fates_smpso:units = "mm" ; + fates_smpso:long_name = "Soil water potential at full stomatal opening" ; + float fates_taulnir(fates_pft) ; + fates_taulnir:units = "fraction" ; + fates_taulnir:long_name = "Leaf transmittance: near-IR" ; + float fates_taulvis(fates_pft) ; + fates_taulvis:units = "fraction" ; + fates_taulvis:long_name = "Leaf transmittance: visible" ; + float fates_tausnir(fates_pft) ; + fates_tausnir:units = "fraction" ; + fates_tausnir:long_name = "Stem transmittance: near-IR" ; + float fates_tausvis(fates_pft) ; + fates_tausvis:units = "fraction" ; + fates_tausvis:long_name = "Stem transmittance: visible" ; + float fates_trim_inc(fates_pft) ; + fates_trim_inc:units = "m2/m2" ; + fates_trim_inc:long_name = "Arbitrary incremental change in trimming function." ; + float 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" ; + float fates_wood_density(fates_pft) ; + fates_wood_density:units = "g/cm3" ; + fates_wood_density:long_name = "mean density of woody tissue in plant" ; + float fates_woody(fates_pft) ; + fates_woody:units = "logical flag" ; + fates_woody:long_name = "Binary woody lifeform flag" ; + float fates_z0mr(fates_pft) ; + fates_z0mr:units = "unitless" ; + fates_z0mr:long_name = "Ratio of momentum roughness length to canopy top height" ; + float fates_base_mr_20(fates_scalar) ; + fates_base_mr_20:units = "gC/gN/s" ; + fates_base_mr_20:long_name = "Base maintenance respiration rate for plant tissues, using Ryan 1991" ; + float fates_bbopt_c3(fates_scalar) ; + fates_bbopt_c3:units = "umol H2O/m**2/s" ; + fates_bbopt_c3:long_name = "Ball-Berry minimum unstressed leaf conductance for C3" ; + float fates_bbopt_c4(fates_scalar) ; + fates_bbopt_c4:units = "umol H2O/m**2/s" ; + fates_bbopt_c4:long_name = "Ball-Berry minimum unstressed leaf conductance for C4" ; + float fates_canopy_closure_thresh(fates_scalar) ; + 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" ; + float fates_cohort_fusion_tol(fates_scalar) ; + fates_cohort_fusion_tol:units = "unitless" ; + fates_cohort_fusion_tol:long_name = "minimum fraction in difference in dbh between cohorts" ; + float fates_comp_excln(fates_scalar) ; + fates_comp_excln:units = "none" ; + fates_comp_excln:long_name = "weighting factor (exponent on dbh) for canopy layer exclusion and promotion" ; + float fates_cwd_fcel(fates_scalar) ; + fates_cwd_fcel:units = "unitless" ; + fates_cwd_fcel:long_name = "Cellulose fraction for CWD" ; + float fates_cwd_flig(fates_scalar) ; + fates_cwd_flig:units = "unitless" ; + fates_cwd_flig:long_name = "Lignin fraction of coarse woody debris" ; + float fates_fire_nignitions(fates_scalar) ; + fates_fire_nignitions:units = "/m2 (?)" ; + fates_fire_nignitions:long_name = "number of daily ignitions (nfires = nignitions*FDI*area_scaling)" ; + float fates_hydr_kmax_rsurf(fates_scalar) ; + fates_hydr_kmax_rsurf:units = "kg water/m2 root area/Mpa/s" ; + fates_hydr_kmax_rsurf:long_name = "maximum conducitivity for unit root surface" ; + float fates_hydr_psi0(fates_scalar) ; + fates_hydr_psi0:units = "MPa" ; + fates_hydr_psi0:long_name = "sapwood water potential at saturation" ; + float fates_hydr_psicap(fates_scalar) ; + fates_hydr_psicap:units = "MPa" ; + fates_hydr_psicap:long_name = "sapwood water potential at which capillary reserves exhausted" ; + float fates_init_litter(fates_scalar) ; + fates_init_litter:units = "NA" ; + fates_init_litter:long_name = "Initialization value for litter pool in cold-start (NOT USED)" ; + float fates_logging_coll_under_frac(fates_scalar) ; + 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" ; + float fates_logging_collateral_frac(fates_scalar) ; + fates_logging_collateral_frac:units = "fraction" ; + fates_logging_collateral_frac:long_name = "Fraction of large stems in upperstory that die from logging collateral damage" ; + float fates_logging_dbhmax_infra(fates_scalar) ; + 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." ; + float fates_logging_dbhmin(fates_scalar) ; + fates_logging_dbhmin:units = "cm" ; + fates_logging_dbhmin:long_name = "Minimum dbh at which logging is applied" ; + float fates_logging_direct_frac(fates_scalar) ; + fates_logging_direct_frac:units = "fraction" ; + fates_logging_direct_frac:long_name = "Fraction of stems logged directly per event" ; + float fates_logging_event_code(fates_scalar) ; + fates_logging_event_code:units = "unitless" ; + fates_logging_event_code:long_name = "Integer code that options how logging events are structured" ; + float fates_logging_mechanical_frac(fates_scalar) ; + fates_logging_mechanical_frac:units = "fraction" ; + fates_logging_mechanical_frac:long_name = "Fraction of stems killed due infrastructure an other mechanical means" ; + float fates_mort_disturb_frac(fates_scalar) ; + 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)" ; + float fates_mort_understorey_death(fates_scalar) ; + fates_mort_understorey_death:units = "fraction" ; + fates_mort_understorey_death:long_name = "fraction of plants in understorey cohort impacted by overstorey tree-fall" ; + float fates_patch_fusion_tol(fates_scalar) ; + fates_patch_fusion_tol:units = "unitless" ; + fates_patch_fusion_tol:long_name = "minimum fraction in difference in profiles between patches" ; + float fates_phen_a(fates_scalar) ; + fates_phen_a:units = "none" ; + fates_phen_a:long_name = "GDD accumulation function, intercept parameter: gdd_thesh = a + b exp(c*ncd)" ; + float fates_phen_b(fates_scalar) ; + fates_phen_b:units = "none" ; + fates_phen_b:long_name = "GDD accumulation function, multiplier parameter: gdd_thesh = a + b exp(c*ncd)" ; + float fates_phen_c(fates_scalar) ; + fates_phen_c:units = "none" ; + fates_phen_c:long_name = "GDD accumulation function, exponent parameter: gdd_thesh = a + b exp(c*ncd)" ; + float fates_phen_chiltemp(fates_scalar) ; + fates_phen_chiltemp:units = "degrees C" ; + fates_phen_chiltemp:long_name = "chilling day counting threshold" ; + float fates_phen_coldtemp(fates_scalar) ; + fates_phen_coldtemp:units = "degrees C" ; + fates_phen_coldtemp:long_name = "temperature exceedance to flag a cold-day for temperature leaf drop" ; + float fates_phen_doff_time(fates_scalar) ; + fates_phen_doff_time:units = "days" ; + fates_phen_doff_time:long_name = "day threshold compared against days since leaves became off-allometry" ; + float fates_phen_drought_threshold(fates_scalar) ; + fates_phen_drought_threshold:units = "m3/m3" ; + fates_phen_drought_threshold:long_name = "liquid volume in soil layer, threashold for drought phenology" ; + float fates_phen_mindayson(fates_scalar) ; + fates_phen_mindayson:units = "days" ; + fates_phen_mindayson:long_name = "day threshold compared against days since leaves became on-allometry" ; + float fates_phen_ncolddayslim(fates_scalar) ; + fates_phen_ncolddayslim:units = "days" ; + fates_phen_ncolddayslim:long_name = "day threshold exceedance for temperature leaf-drop" ; + float fates_durat_slope ; + fates_durat_slope:units = "NA" ; + fates_durat_slope:long_name = "spitfire parameter, fire max duration slope, Equation 14 Thonicke et al 2010" ; + float fates_fdi_a ; + fates_fdi_a:units = "NA" ; + fates_fdi_a:long_name = "spitfire parameter (unknown) " ; + float fates_fdi_alpha ; + fates_fdi_alpha:units = "NA" ; + fates_fdi_alpha:long_name = "spitfire parameter, EQ 7 Venevsky et al. GCB 2002,(modified EQ 8 Thonicke et al. 2010) " ; + float fates_fdi_b ; + fates_fdi_b:units = "NA" ; + fates_fdi_b:long_name = "spitfire parameter (unknown) " ; + float fates_fire_wind_max ; + fates_fire_wind_max:units = "m/min" ; + fates_fire_wind_max:long_name = "maximum wind speed expected by the fire model" ; + float fates_fuel_energy ; + fates_fuel_energy:units = "kJ/kg" ; + fates_fuel_energy:long_name = "pitfire parameter, heat content of fuel" ; + float fates_max_durat ; + fates_max_durat:units = "minutes" ; + fates_max_durat:long_name = "spitfire parameter, fire maximum duration, Equation 14 Thonicke et al 2010" ; + float fates_miner_damp ; + fates_miner_damp:units = "NA" ; + fates_miner_damp:long_name = "spitfire parameter, mineral-dampening coefficient EQ A1 Thonicke et al 2010 " ; + float fates_miner_total ; + fates_miner_total:units = "fraction" ; + fates_miner_total:long_name = "spitfire parameter, total mineral content, Table A1 Thonicke et al 2010" ; + float fates_part_dens ; + fates_part_dens:units = "kg/m2" ; + fates_part_dens:long_name = "spitfire parameter, oven dry particle density, Table A1 Thonicke et al 2010" ; + float fates_soil_salinity(fates_scalar) ; + fates_soil_salinity:units = "ppt" ; + fates_soil_salinity:long_name = "soil salinity used for model when not coupled to dynamic soil salinity" ; + +// global attributes: + :history = "This file was made from FatesPFTIndexSwapper.py \n", + " Input File = fates_params_13pfts.c180315.nc \n", + " Indices = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13] \n", + " Wed Feb 28 13:43:44 PST 2018 Values from Jennifer Holms 13pft test file fates_params.c170929_13pfts.nc were then manually converted over into positions 2-13, position 1 kept the tropical broadleaf evergreen. Wed Mar 7 15:53:33 PST 2018 (RGK) added fates_logging_dbhmax_infra, fates_maintresp_reduction_curvature, fates_maintresp_reduction_intercept, and fates_leaf_clumping_index. CHanged fates_clone_alloc to fates_seed_alloc_mature. Updated minimum grass sizes per J Shuman notes. Set grass AGB intercepts and latosa to zero. Updated clumping to have more substanteated starter values per suggestions by Shawn Serbin.\n", + " Thu Mar 15 13:48:11 PDT 2018 Added C4 plants via suggestions by @huitang_earth.\n", + " Mon Mar 19 19:05:44 EDT 2018 forced all plants to be evergreen till carbon-imbalances are fixed.\n", + " Mon Mar 19 19:05:44 EDT 2018 added entry for fates_history_height_bin_edges.\n", + " Thu Apr 12 14:18:46 PDT 2018 updated names on CN recruitment parameters. -- fates_params_14pft.c180412.nc -- \n", + " This file was made then modified wih FatesPFTIndexSwapper.py to reduce to 2 tropical pfts again. \n", + " Indices = [1, 1]" ; +data: + + fates_history_sizeclass_bin_edges = 0, 0.05, 0.1, 0.15, 0.20, 0.30, 0.40, 0.50, 0.60, 0.70, + 0.80, 0.90, 1.0 ; + + fates_history_ageclass_bin_edges = 0, 1, 2, 5, 10, 20, 50 ; + + fates_FBD = 4, 15.4, 16.8, 19.6, 999, 4 ; + + fates_SAV = 66, 13, 3.58, 0.98, 0.2, 66 ; + + fates_alpha_FMC = 0.0050769, 0.001, 0.0002754, 7.54e-05, 1.54e-05, 999 ; + + fates_history_height_bin_edges = 0, 0.1, 0.3, 0.5, 1, 2 ; + + fates_low_moisture_Coeff = 1.15, 1.12, 1.09, 0.98, 0.8, 1.15 ; + + fates_low_moisture_Slope = 0.62, 0.62, 0.72, 0.85, 0.8, 0.62 ; + + fates_max_decomp = 1, 0.52, 0.383, 0.383, 0.19, 999 ; + + fates_mid_moisture = 0.8, 0.72, 0.51, 0.38, 1, 0.8 ; + + fates_mid_moisture_Coeff = 3.2, 2.35, 1.47, 1.06, 0.8, 3.2 ; + + fates_mid_moisture_Slope = 3.2, 2.35, 1.47, 1.06, 0.8, 3.2 ; + + fates_min_moisture = 0.24, 0.18, 0.12, 0, 0, 0.24 ; + + fates_hydr_avuln_node = + 2, 2, + 2, 2, + 2, 2, + 2, 2 ; + + fates_hydr_epsil_node = + 12, 12, + 10, 10, + 10, 10, + 8, 8 ; + + fates_hydr_fcap_node = + 0, 0, + 0.08, 0.08, + 0.08, 0.08, + 0, 0 ; + + fates_hydr_kmax_node = + -999, -999, + 3, 3, + -999, -999, + -999, -999 ; + + fates_hydr_p50_node = + -2.25, -2.25, + -2.25, -2.25, + -2.25, -2.25, + -2.25, -2.25 ; + + fates_hydr_pinot_node = + -999, -999, + -999, -999, + -999, -999, + -999, -999 ; + + fates_hydr_pitlp_node = + -1.67, -1.67, + -1.4, -1.4, + -1.4, -1.4, + -1.2, -1.2 ; + + fates_hydr_resid_node = + 0.25, 0.25, + 0.325, 0.325, + 0.325, 0.325, + 0.15, 0.15 ; + + fates_hydr_thetas_node = + 0.65, 0.65, + 0.65, 0.65, + 0.65, 0.65, + 0.75, 0.75 ; + + fates_CWD_frac = 0.045, 0.075, 0.21, 0.67 ; + + fates_pftname = + "Spartina alterniflora (short form) ", + "Spartina alterniflora (tall form) " ; + + fates_rootprof_beta = + 0.976, 0.976, + _, _ ; + + fates_alloc_storage_cushion = 5.25, 3.75 ; + + fates_allom_agb1 = 0.001928, 0.001928; + + fates_allom_agb2 = 1.9492, 1.9492 ; + + fates_allom_agb3 = 0.0, 0.0 ; + + fates_allom_agb4 = 0.0, 0.0 ; + + fates_allom_agb_frac = 1.0, 1.0 ; + + fates_allom_amode = 1, 1; + + fates_allom_blca_expnt_diff = 0, 0 ; + + fates_allom_cmode = 1, 1 ; + + fates_allom_d2bl1 = 0.000964, 0.000964; + + fates_allom_d2bl2 = 1.9492, 1.9492; + + fates_allom_d2bl3 = 0.0, 0.0 ; + + fates_allom_d2ca_coefficient_max = 0.03, 0.03 ; + + fates_allom_d2ca_coefficient_min = 0.01, 0.01 ; + + fates_allom_d2h1 = 1.0, 1.0 ; + + fates_allom_d2h2 = 1.0, 1.0 ; + + fates_allom_d2h3 = -999.9, -999.9 ; + + fates_allom_dbh_maxheight = 1, 1 ; + + fates_allom_fmode = 1, 1 ; + + fates_allom_hmode = 3, 3 ; + + fates_allom_l2fr = 0.75, 1.25; + + fates_allom_latosa_int = 0.001, 0.001 ; + + fates_allom_latosa_slp = 0, 0 ; + + fates_allom_lmode = 1, 1 ; + + fates_allom_sai_scaler = 0.0012, 0.0012 ; + + fates_allom_smode = 1, 1 ; + + fates_allom_stmode = 1, 1 ; + + fates_allom_frbstor_repro = 1.0, 1.0; + + fates_branch_turnover = 50, 50 ; + + fates_c2b = 2, 2 ; + + fates_displar = 0.67, 0.67 ; + + fates_fire_alpha_SH = 0.2, 0.2 ; + + fates_fire_bark_scaler = 0.07, 0.07 ; + + fates_fire_crown_depth_frac = 0.5, 0.5 ; + + fates_fire_crown_kill = 0.775, 0.775 ; + + fates_fr_fcel = 0.5, 0.5 ; + + fates_fr_flab = 0.25, 0.25 ; + + fates_fr_flig = 0.25, 0.25 ; + + fates_froot_cn_ratio = 42, 42 ; + + fates_grperc = 0.11, 0.11 ; + + fates_hydr_avuln_gs = 2.5, 2.5 ; + + fates_hydr_p50_gs = -1.5, -1.5 ; + + fates_hydr_p_taper = 0.333, 0.333 ; + + fates_hydr_rfrac_stem = 0.625, 0.625 ; + + fates_hydr_rs2 = 0.0001, 0.0001 ; + + fates_hydr_srl = 25, 25 ; + + fates_leaf_BB_slope = 8, 8 ; + + fates_leaf_c3psn = 0, 0; + + fates_leaf_clumping_index = 0.85, 0.85 ; + + fates_leaf_cn_ratio = 30, 30 ; + + fates_leaf_diameter = 0.04, 0.04 ; + + fates_leaf_jmaxha = 43540, 43540 ; + + fates_leaf_jmaxhd = 152040, 152040 ; + + fates_leaf_jmaxse = 495, 495 ; + + fates_leaf_long = 1.0, 1.0 ; + + fates_leaf_slatop = 0.016, 0.016 ; + + fates_leaf_stor_priority = 0.8, 0.8 ; + + fates_leaf_tpuha = 53100, 53100 ; + + fates_leaf_tpuhd = 150650, 150650 ; + + fates_leaf_tpuse = 490, 490 ; + + fates_leaf_vcmax25top = 70, 40 ; + + fates_leaf_vcmaxha = 65330, 65330 ; + + fates_leaf_vcmaxhd = 149250, 149250 ; + + fates_leaf_vcmaxse = 485, 485 ; + + fates_leaf_xl = 0.1, 0.1 ; + + fates_lf_fcel = 0.5, 0.5 ; + + fates_lf_flab = 0.25, 0.25 ; + + fates_lf_flig = 0.25, 0.25 ; + + fates_maintresp_reduction_curvature = 0.01, 0.01 ; + + fates_maintresp_reduction_intercept = 1, 1 ; + + fates_mort_bmort = 0.9, 0.9 ; + + fates_mort_freezetol = -25, -25 ; + + fates_mort_hf_sm_threshold = 1e-06, 1e-06 ; + + fates_mort_scalar_coldstress = 3, 3 ; + + fates_mort_scalar_cstarvation = 0.6, 0.6 ; + + fates_mort_scalar_hydrfailure = 0.6, 0.6 ; + + fates_pft_used = 1, 0 ; + + fates_phen_evergreen = 0, 0; + + fates_phen_season_decid = 1, 1 ; + + fates_phen_stress_decid = 0, 0 ; + + fates_prescribed_mortality_canopy = 0.0194, 0.0194 ; + + fates_prescribed_mortality_understory = 0.025, 0.025 ; + + fates_prescribed_npp_canopy = 0.4, 0.4 ; + + fates_prescribed_npp_understory = 0.03125, 0.03125 ; + + fates_prescribed_recruitment = 0.02, 0.02 ; + + fates_recruit_hgt_min = 0.05, 0.05 ; + + fates_recruit_initd = 10000000, 0 ; + + fates_rholnir = 0.45, 0.45 ; + + fates_rholvis = 0.1, 0.1 ; + + fates_rhosnir = 0.39, 0.39 ; + + fates_rhosvis = 0.16, 0.16 ; + + fates_root_long = 0.5, 1 ; + + fates_roota_par = 7, 7 ; + + fates_rootb_par = 1, 1 ; + + fates_seed_alloc = 0.1, 0.1 ; + + fates_seed_alloc_mature = 0, 0 ; + + fates_seed_dbh_repro_threshold = 150, 150 ; + + fates_seed_decay_turnover = 0.51, 0.51 ; + + fates_seed_germination_timescale = 0.5, 0.5 ; + + fates_seed_rain = 0.28, 0.28 ; + + fates_smpsc = -255000, -255000 ; + + fates_smpso = -66000, -66000 ; + + fates_taulnir = 0.25, 0.25 ; + + fates_taulvis = 0.05, 0.05 ; + + fates_tausnir = 0.001, 0.001 ; + + fates_tausvis = 0.001, 0.001 ; + + fates_trim_inc = 0.03, 0.03 ; + + fates_trim_limit = 0.3, 0.3 ; + + fates_wood_density = 0.01, 0.01 ; + + fates_woody = 1, 1 ; + + fates_z0mr = 0.055, 0.055 ; + + fates_base_mr_20 = 2.52e-06 ; + + fates_bbopt_c3 = 10000 ; + + fates_bbopt_c4 = 40000 ; + + fates_canopy_closure_thresh = 0.8 ; + + fates_cohort_fusion_tol = 0.05 ; + + fates_comp_excln = 3 ; + + fates_cwd_fcel = 0.76 ; + + fates_cwd_flig = 0.24 ; + + fates_fire_nignitions = 15 ; + + fates_hydr_kmax_rsurf = 0.001; + + fates_hydr_psi0 = 0 ; + + fates_hydr_psicap = -0.6 ; + + fates_init_litter = 0.05 ; + + fates_logging_coll_under_frac = 0.55983 ; + + fates_logging_collateral_frac = 0.05 ; + + fates_logging_dbhmax_infra = 35 ; + + fates_logging_dbhmin = 50 ; + + fates_logging_direct_frac = 0.15 ; + + fates_logging_event_code = -30 ; + + fates_logging_mechanical_frac = 0.05 ; + + fates_mort_disturb_frac = 1 ; + + fates_mort_understorey_death = 0.09 ; + + fates_patch_fusion_tol = 0.05 ; + + fates_phen_a = -68 ; + + fates_phen_b = 638 ; + + fates_phen_c = -0.001 ; + + fates_phen_chiltemp = 5 ; + + fates_phen_coldtemp = 7.5 ; + + fates_phen_doff_time = 100 ; + + fates_phen_drought_threshold = 0.15 ; + + fates_phen_mindayson = 30 ; + + fates_phen_ncolddayslim = 5 ; + + fates_durat_slope = -11.06 ; + + fates_fdi_a = 17.62 ; + + fates_fdi_alpha = 0.00037 ; + + fates_fdi_b = 243.12 ; + + fates_fire_wind_max = 45.718 ; + + fates_fuel_energy = 18000 ; + + fates_max_durat = 240 ; + + fates_miner_damp = 0.41739 ; + + fates_miner_total = 0.055 ; + + fates_part_dens = 513 ; + + fates_soil_salinity = 0.0 ; +} diff --git a/parameter_files/fates_params_default.cdl b/parameter_files/fates_params_default.cdl index 20afac23ef..df152ce87b 100644 --- a/parameter_files/fates_params_default.cdl +++ b/parameter_files/fates_params_default.cdl @@ -171,6 +171,9 @@ variables: float fates_allom_stmode(fates_pft) ; fates_allom_stmode:units = "index" ; fates_allom_stmode:long_name = "storage allometry function index" ; + float 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" ; float fates_branch_turnover(fates_pft) ; fates_branch_turnover:units = "yr-1" ; fates_branch_turnover:long_name = "turnover time of branches" ; @@ -587,6 +590,9 @@ variables: float fates_part_dens ; fates_part_dens:units = "kg/m2" ; fates_part_dens:long_name = "spitfire parameter, oven dry particle density, Table A1 Thonicke et al 2010" ; + float fates_soil_salinity(fates_scalar) ; + fates_soil_salinity:units = "ppt" ; + fates_soil_salinity:long_name = "soil salinity used for model when not coupled to dynamic soil salinity" ; // global attributes: :history = "This file was made from FatesPFTIndexSwapper.py \n", @@ -754,6 +760,8 @@ data: fates_allom_smode = 1, 1 ; fates_allom_stmode = 1, 1 ; + + fates_allom_frbstor_repro = 0.0, 0.0; fates_branch_turnover = 50, 50 ; @@ -1074,4 +1082,6 @@ data: fates_miner_total = 0.055 ; fates_part_dens = 513 ; + + fates_soil_salinity = 0.4 ; } diff --git a/tools/FatesPFTIndexSwapper.py b/tools/FatesPFTIndexSwapper.py index aa6b25eb73..3ef7deb044 100755 --- a/tools/FatesPFTIndexSwapper.py +++ b/tools/FatesPFTIndexSwapper.py @@ -22,6 +22,7 @@ # ======================================================================================= pft_dim_name = 'fates_pft' +prt_dim_name = 'fates_prt_organs' class timetype: @@ -161,19 +162,23 @@ def main(argv): # Idenfity if this variable has pft dimension pft_dim_found = -1 + prt_dim_found = -1 pft_dim_len = len(fp_in.variables.get(key).dimensions) for idim, name in enumerate(fp_in.variables.get(key).dimensions): # Manipulate data if(name==pft_dim_name): pft_dim_found = idim - + if(name==prt_dim_name): + prt_dim_found = idim + + # Copy over the input data # Tedious, but I have to permute through all combinations of dimension position if( pft_dim_len == 0 ): out_var = fp_out.createVariable(key,'f',(fp_in.variables.get(key).dimensions)) out_var.assignValue(float(fp_in.variables.get(key).data)) - elif(pft_dim_found==-1): + elif( (pft_dim_found==-1) & (prt_dim_found==-1) ): out_var = fp_out.createVariable(key,'f',(fp_in.variables.get(key).dimensions)) out_var[:] = in_var[:] elif( (pft_dim_found==0) & (pft_dim_len==1) ): # 1D fates_pft @@ -183,8 +188,9 @@ def main(argv): tmp_out[id] = fp_in.variables.get(key).data[ipft-1] out_var[:] = tmp_out - - elif( (pft_dim_found==1) & (pft_dim_len==2) ): # 2D hdyro_organ - fate_pft + # 2D hydro_organ - fates_pft + # or.. prt_organ - fates_pft + elif( (pft_dim_found==1) & (pft_dim_len==2) ): out_var = fp_out.createVariable(key,'f',(fp_in.variables.get(key).dimensions)) dim2_len = fp_in.dimensions.get(fp_in.variables.get(key).dimensions[0]) tmp_out = np.zeros([dim2_len,num_pft_out]) @@ -200,6 +206,12 @@ def main(argv): for id,ipft in enumerate(donor_pft_indices): out_var[id] = fp_in.variables.get(key).data[ipft-1] + + elif( (prt_dim_found==0) & (pft_dim_len==2) ): # fates_prt_organs - string_length + out_var = fp_out.createVariable(key,'c',(fp_in.variables.get(key).dimensions)) + out_var[:] = in_var[:] + + else: print('This variable has a dimensioning that we have not considered yet.') print('Please add this condition to the logic above this statement.')