diff --git a/biogeochem/EDMortalityFunctionsMod.F90 b/biogeochem/EDMortalityFunctionsMod.F90 index 927af71205..603d6e5227 100644 --- a/biogeochem/EDMortalityFunctionsMod.F90 +++ b/biogeochem/EDMortalityFunctionsMod.F90 @@ -60,10 +60,9 @@ subroutine mortality_rates( cohort_in,bc_in,cmort,hmort,bmort,frmort ) real(r8) :: frac ! relativised stored carbohydrate real(r8) :: b_leaf ! target leaf biomass kgC real(r8) :: hf_sm_threshold ! hydraulic failure soil moisture threshold - real(r8) :: temp_dep ! Temp. function (freezing mortality) + real(r8) :: temp_dep_fraction ! Temp. function (freezing mortality) real(r8) :: temp_in_C ! Daily averaged temperature in Celcius - real(r8),parameter :: frost_mort_buffer = 5.0_r8 ! 5deg buffer for freezing mortality - + real(r8), parameter :: frost_mort_buffer = 5.0_r8 ! 5deg buffer for freezing mortality logical, parameter :: test_zero_mortality = .false. ! Developer test which ! may help to debug carbon imbalances ! and the like @@ -107,9 +106,9 @@ subroutine mortality_rates( cohort_in,bc_in,cmort,hmort,bmort,frmort ) ! doi: 10.1111/j.1365-2486.2006.01254.x temp_in_C = bc_in%t_veg24_si - tfrz - temp_dep = max(0.0,min(1.0,1.0 - (temp_in_C - & - EDPftvarcon_inst%freezetol(cohort_in%pft))/frost_mort_buffer) ) - frmort = EDPftvarcon_inst%mort_scalar_coldstress(cohort_in%pft) * temp_dep + temp_dep_fraction = max(0.0_r8, min(1.0_r8, 1.0_r8 - (temp_in_C - & + EDPftvarcon_inst%freezetol(cohort_in%pft))/frost_mort_buffer) ) + frmort = EDPftvarcon_inst%mort_scalar_coldstress(cohort_in%pft) * temp_dep_fraction !mortality_rates = bmort + hmort + cmort diff --git a/biogeochem/EDPhysiologyMod.F90 b/biogeochem/EDPhysiologyMod.F90 index 50e2c9548e..1cdf698be7 100644 --- a/biogeochem/EDPhysiologyMod.F90 +++ b/biogeochem/EDPhysiologyMod.F90 @@ -888,7 +888,7 @@ subroutine PlantGrowth( currentSite, currentCohort, bc_in ) real(r8), parameter :: cbal_prec = 1.0e-15_r8 ! Desired precision in carbon balance ! non-integrator part integer , parameter :: max_substeps = 300 - real(r8), parameter :: max_trunc_error = 1.0_r8 + real(r8), parameter :: max_trunc_error = 1.0_r8 integer, parameter :: ODESolve = 2 ! 1=RKF45, 2=Euler ipft = currentCohort%pft @@ -1283,11 +1283,11 @@ subroutine PlantGrowth( currentSite, currentCohort, bc_in ) write(fates_log(),*) 'carbon_balance',carbon_balance write(fates_log(),*) 'deltaC',deltaC write(fates_log(),*) 'totalC',totalC - write(fates_log(),*) 'leaf:',grow_leaf,bt_leaf,bt_leaf-currentCohort%bl - write(fates_log(),*) 'froot:',grow_froot,bt_fineroot,bt_fineroot-currentCohort%br - write(fates_log(),*) 'sap:',grow_sap,bt_sap,bt_sap-currentCohort%bsw - write(fates_log(),*) 'store:',grow_store,bt_store,bt_store-currentCohort%bstore - write(fates_log(),*) 'dead:',bt_dead,bt_dead-currentCohort%bdead + write(fates_log(),*) 'leaf:',grow_leaf,c_pool_out(i_cleaf),bt_leaf,bt_leaf-currentCohort%bl + write(fates_log(),*) 'froot:',grow_froot,c_pool_out(i_cfroot),bt_fineroot,currentCohort%br + write(fates_log(),*) 'sap:',grow_sap,c_pool_out(i_csap),bt_sap,currentCohort%bsw + write(fates_log(),*) 'store:',grow_store, c_pool_out(i_cstore),bt_store,currentCohort%bstore + write(fates_log(),*) 'dead:',c_pool_out(i_cdead),bt_dead,currentCohort%bdead call dump_cohort(currentCohort) call endrun(msg=errMsg(sourcefile, __LINE__)) end if diff --git a/biogeochem/FatesAllometryMod.F90 b/biogeochem/FatesAllometryMod.F90 index c09274b985..a90b726751 100644 --- a/biogeochem/FatesAllometryMod.F90 +++ b/biogeochem/FatesAllometryMod.F90 @@ -43,8 +43,8 @@ ! The following parameters (traits) are used ! ! wood_density, mean stem wood specific gravity (heart,sap,bark) -! allom_latosa_int, leaf area to sap area ratio, intercept [m2/cm2] -! allom_latosa_slp, leaf area to sap area ratio, slope on diameter [m2/cm2/cm] +! allom_latosa_int, sapwood area per leaf area, intercept [cm2/m2] +! allom_latosa_slp, sapwood area per leaf area, slope on diameter [cm2/m2/cm] ! c2b, real, carbon to biomass multiplier (~2.0) ! allom_l2fr, fine root biomass per leaf biomass ratio [kgC/kgC] ! allom_agb_frac, the fraction of stem above ground [-] @@ -956,12 +956,6 @@ subroutine bsap_deprecated(d,h,dhdd,bleaf,dbleafdd,ipft,bsap,dbsapdd) c2b => EDPftvarcon_inst%c2b(ipft), & agb_fraction => EDPftvarcon_inst%allom_agb_frac(ipft) ) - ! notes: - ! latosa_int units of [/m] - ! (1/latosa)* slatop* gtokg * cm2tom2 / c2b * mg2kg * dens - ! density (g/cm3 == Mg/m3 b/c 1e6 = 100^3) - ! [cm2/m2] * [m2/gC]*[1000gC/1kgC]*[1m2/10000cm2] /[kg/kgC]*[kg/Mg]*[Mg/m3] = [/m] - ! 0.012 * 1000 * (1/10000) / 2 * 1000 * 0.7 bsap = bleaf * latosa_int * h diff --git a/biogeophys/FatesPlantRespPhotosynthMod.F90 b/biogeophys/FatesPlantRespPhotosynthMod.F90 index 7493492195..7a0950689b 100644 --- a/biogeophys/FatesPlantRespPhotosynthMod.F90 +++ b/biogeophys/FatesPlantRespPhotosynthMod.F90 @@ -808,8 +808,8 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in real(r8) :: qabs ! PAR absorbed by PS II (umol photons/m**2/s) real(r8) :: aquad,bquad,cquad ! terms for quadratic equations real(r8) :: r1,r2 ! roots of quadratic equation - real(r8) :: co2_intra_c ! intracellular leaf CO2 (Pa) - real(r8) :: co2_intra_c_old ! intracellular leaf CO2 (Pa) (previous iteration) + real(r8) :: co2_inter_c ! intercellular leaf CO2 (Pa) + real(r8) :: co2_inter_c_old ! intercellular leaf CO2 (Pa) (previous iteration) logical :: loop_continue ! Loop control variable integer :: niter ! iteration loop index real(r8) :: gs_mol ! leaf stomatal conductance (umol H2O/m**2/s) @@ -822,7 +822,7 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in ! (C4) gross photosynthesis (umol CO2/m**2/s) 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_intra_c ! First guess intracellular co2 specific to C path + real(r8) :: init_co2_inter_c ! First guess intercellular co2 specific to C path ! Parameters ! ------------------------------------------------------------------------ ! Fraction of light absorbed by non-photosynthetic pigments @@ -831,7 +831,7 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in ! empirical curvature parameter for electron transport rate real(r8),parameter :: theta_psii = 0.7_r8 - ! First guess on ratio between intracellular co2 and the atmosphere + ! First guess on ratio between intercellular co2 and the atmosphere ! an iterator converges on actual real(r8),parameter :: init_a2l_co2_c3 = 0.7_r8 real(r8),parameter :: init_a2l_co2_c4 = 0.4_r8 @@ -851,9 +851,9 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in c3c4_path_index = nint(EDPftvarcon_inst%c3psn(ft)) if (c3c4_path_index == 1) then - init_co2_intra_c = init_a2l_co2_c3 * can_co2_ppress + init_co2_inter_c = init_a2l_co2_c3 * can_co2_ppress else - init_co2_intra_c = init_a2l_co2_c4 * can_co2_ppress + init_co2_inter_c = init_a2l_co2_c4 * can_co2_ppress end if ! Part III: Photosynthesis and Conductance @@ -911,8 +911,8 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in call quadratic_f (aquad, bquad, cquad, r1, r2) je = min(r1,r2) - ! Initialize intracellular co2 - co2_intra_c = init_co2_intra_c + ! Initialize intercellular co2 + co2_inter_c = init_co2_inter_c niter = 0 loop_continue = .true. @@ -920,19 +920,19 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in ! Increment iteration counter. Stop if too many iterations niter = niter + 1 - ! Save old co2_intra_c - co2_intra_c_old = co2_intra_c + ! Save old co2_inter_c + co2_inter_c_old = co2_inter_c ! Photosynthesis limitation rate calculations if (c3c4_path_index == 1)then ! C3: Rubisco-limited photosynthesis - ac = vcmax * max(co2_intra_c-co2_cpoint, 0._r8) / & - (co2_intra_c+mm_kco2 * (1._r8+can_o2_ppress / mm_ko2 )) + ac = vcmax * max(co2_inter_c-co2_cpoint, 0._r8) / & + (co2_inter_c+mm_kco2 * (1._r8+can_o2_ppress / mm_ko2 )) ! C3: RuBP-limited photosynthesis - aj = je * max(co2_intra_c-co2_cpoint, 0._r8) / & - (4._r8*co2_intra_c+8._r8*co2_cpoint) + aj = je * max(co2_inter_c-co2_cpoint, 0._r8) / & + (4._r8*co2_inter_c+8._r8*co2_cpoint) ! C3: Product-limited photosynthesis ap = 3._r8 * tpu @@ -958,7 +958,7 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in end if ! C4: PEP carboxylase-limited (CO2-limited) - ap = co2_rcurve_islope * max(co2_intra_c, 0._r8) / can_press + ap = co2_rcurve_islope * max(co2_inter_c, 0._r8) / can_press end if @@ -994,31 +994,31 @@ subroutine LeafLayerPhotosynthesis(f_sun_lsl, & ! in call quadratic_f (aquad, bquad, cquad, r1, r2) gs_mol = max(r1,r2) - ! Derive new estimate for co2_intra_c - co2_intra_c = can_co2_ppress - anet * can_press * & + ! Derive new estimate for co2_inter_c + co2_inter_c = can_co2_ppress - anet * can_press * & (1.4_r8*gs_mol+1.6_r8*gb_mol) / (gb_mol*gs_mol) - ! Check for co2_intra_c convergence. Delta co2_intra_c/pair = mol/mol. + ! Check for co2_inter_c convergence. Delta co2_inter_c/pair = mol/mol. ! Multiply by 10**6 to convert to umol/mol (ppm). Exit iteration if ! convergence criteria of +/- 1 x 10**-6 ppm is met OR if at least ten ! iterations (niter=10) are completed - if ((abs(co2_intra_c-co2_intra_c_old)/can_press*1.e06_r8 <= 2.e-06_r8) & + if ((abs(co2_inter_c-co2_inter_c_old)/can_press*1.e06_r8 <= 2.e-06_r8) & .or. niter == 5) then loop_continue = .false. end if end do !iteration loop - ! End of co2_intra_c iteration. Check for an < 0, in which case gs_mol = bbb + ! End of co2_inter_c iteration. Check for an < 0, in which case gs_mol = bbb if (anet < 0._r8) then gs_mol = bbb end if - ! Final estimates for leaf_co2_ppress and co2_intra_c - ! (needed for early exit of co2_intra_c iteration when an < 0) + ! Final estimates for leaf_co2_ppress and co2_inter_c + ! (needed for early exit of co2_inter_c iteration when an < 0) leaf_co2_ppress = can_co2_ppress - 1.4_r8/gb_mol * anet * can_press leaf_co2_ppress = max(leaf_co2_ppress,1.e-06_r8) - co2_intra_c = can_co2_ppress - anet * can_press * & + co2_inter_c = can_co2_ppress - anet * can_press * & (1.4_r8*gs_mol+1.6_r8*gb_mol) / (gb_mol*gs_mol) ! Convert gs_mol (umol /m**2/s) to gs (m/s) and then to rs (s/m) diff --git a/main/EDPftvarcon.F90 b/main/EDPftvarcon.F90 index 0a47fccd90..c1f98bf061 100644 --- a/main/EDPftvarcon.F90 +++ b/main/EDPftvarcon.F90 @@ -118,9 +118,10 @@ module EDPftvarcon real(r8), allocatable :: allom_smode(:) ! sapwood allometry function type real(r8), allocatable :: allom_stmode(:) ! storage allometry functional type ! (HARD-CODED FOR TIME BEING, RGK 11-2017) - real(r8), allocatable :: allom_latosa_int(:) ! Leaf area to sap area ratio, intercept [m2/cm2] - real(r8), allocatable :: allom_latosa_slp(:) ! Leaf area to sap area ratio, slope on diameter - ! [m2/cm2/cm] + real(r8), allocatable :: allom_latosa_int(:) ! Leaf area to sap area conversion, intercept + ! (sapwood area / leaf area) [cm2/m2] + real(r8), allocatable :: allom_latosa_slp(:) ! Leaf area to sap area conversion, slope + ! (sapwood area / leaf area / diameter) [cm2/m2/cm] real(r8), allocatable :: allom_l2fr(:) ! Fine root biomass per leaf biomass ratio [kgC/kgC] real(r8), allocatable :: allom_agb_frac(:) ! Fraction of stem above ground [-] real(r8), allocatable :: allom_d2h1(:) ! Parameter 1 for d2h allometry (intercept, or "c") diff --git a/parameter_files/fates_params_14pfts.cdl b/parameter_files/fates_params_14pfts.cdl index d649fa6fe5..6ac2539a26 100644 --- a/parameter_files/fates_params_14pfts.cdl +++ b/parameter_files/fates_params_14pfts.cdl @@ -183,11 +183,11 @@ variables: 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]" ; + fates_allom_latosa_int:units = "cm2/m2" ; + fates_allom_latosa_int:long_name = "Leaf area to sap area conversion, intercept (sapwood area/leaf area)" ; 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)" ; + fates_allom_latosa_slp:units = "cm2/m2/cm" ; + fates_allom_latosa_slp:long_name = "Leaf area to sap area conversion, slope (sapwood area/ leaf area / diameter) (optional)" ; float fates_allom_lmode(fates_pft) ; fates_allom_lmode:units = "index" ; fates_allom_lmode:long_name = "leaf biomass allometry function index" ; diff --git a/parameter_files/fates_params_default.cdl b/parameter_files/fates_params_default.cdl index 29a95d573d..3d30509506 100644 --- a/parameter_files/fates_params_default.cdl +++ b/parameter_files/fates_params_default.cdl @@ -150,11 +150,11 @@ variables: 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]" ; + fates_allom_latosa_int:units = "cm2/m2" ; + fates_allom_latosa_int:long_name = "Leaf area to sap area conversion, intercept (sapwood area/leaf area)" ; 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)" ; + fates_allom_latosa_slp:units = "cm2/m2/cm" ; + fates_allom_latosa_slp:long_name = "Leaf area to sap area conversion, slope (sapwood area/ leaf area / diameter) (optional)" ; float fates_allom_lmode(fates_pft) ; fates_allom_lmode:units = "index" ; fates_allom_lmode:long_name = "leaf biomass allometry function index" ;