Skip to content

Commit

Permalink
Merge branch 'heat_storage_biomass' of github.com:swensosc/CTSM into …
Browse files Browse the repository at this point in the history
…heat_storage_biomass
  • Loading branch information
ekluzek committed Sep 29, 2020
2 parents 210f63a + 5da56d3 commit 80a6dc9
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 15 deletions.
28 changes: 18 additions & 10 deletions src/biogeophys/CanopyFluxesMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ subroutine CanopyFluxes(bounds, num_exposedvegp, filter_exposedvegp,
use clm_varcon , only : sb, cpair, hvap, vkc, grav, denice, c_to_b
use clm_varcon , only : denh2o, tfrz, tlsai_crit, alpha_aero
use clm_varcon , only : c14ratio
use clm_varcon , only : c_water, c_dry_biomass
use perf_mod , only : t_startf, t_stopf
use QSatMod , only : QSat
use CLMFatesInterfaceMod, only : hlm_fates_interface_type
Expand Down Expand Up @@ -420,7 +421,9 @@ subroutine CanopyFluxes(bounds, num_exposedvegp, filter_exposedvegp,
real(r8) :: uuc(bounds%begp:bounds%endp) ! undercanopy windspeed
real(r8) :: carea_stem !cross-sectional area of stem

! biomass parameters
! Biomass heat storage tuning parameters
! These parameters can be used to account for differences
! in vegetation shape.
real(r8), parameter :: k_vert = 0.1 !vertical distribution of stem
real(r8), parameter :: k_cyl_vol = 1.0 !departure from cylindrical volume
real(r8), parameter :: k_cyl_area = 1.0 !departure from cylindrical area
Expand Down Expand Up @@ -740,12 +743,13 @@ subroutine CanopyFluxes(bounds, num_exposedvegp, filter_exposedvegp,

! calculate specify heat capacity of vegetation
! as weighted averaged of dry biomass and water
! lma_dry has units of kg dry mass/m2 here (table 2 of bonan 2017)
! cdry_biomass = 1400 J/kg/K, cwater = 4188 J/kg/K
cp_leaf(p) = leaf_biomass(p) * (1400._r8*(1.-fbw(patch%itype(p))) + (fbw(patch%itype(p)))*4188._r8)
! lma_dry has units of kg dry mass/m2 here
! (Appendix B of Bonan et al., GMD, 2018)

cp_leaf(p) = leaf_biomass(p) * (c_dry_biomass*(1.-fbw(patch%itype(p))) + (fbw(patch%itype(p)))*c_water)

! cp-stem will have units J/k/ground_area
cp_stem(p) = stem_biomass(p) * (1400._r8*(1.-fbw(patch%itype(p))) + (fbw(patch%itype(p)))*4188._r8)
cp_stem(p) = stem_biomass(p) * (c_dry_biomass*(1.-fbw(patch%itype(p))) + (fbw(patch%itype(p)))*c_water)
! adjust for departure from cylindrical stem model
cp_stem(p) = k_cyl_vol * cp_stem(p)

Expand Down Expand Up @@ -1471,15 +1475,19 @@ subroutine CanopyFluxes(bounds, num_exposedvegp, filter_exposedvegp,

! Downward longwave radiation below the canopy

dlrad(p) = (1._r8-emv(p))*emg(c)*forc_lwrad(c) + &
emv(p)*emg(c)*sb*(tlbef(p)**3*(tlbef(p) + 4._r8*dt_veg(p))*(1.-frac_rad_abs_by_stem(p))+ts_ini(p)**3*(ts_ini(p) + 4._r8*dt_stem(p))*frac_rad_abs_by_stem(p))
dlrad(p) = (1._r8-emv(p))*emg(c)*forc_lwrad(c) &
+ emv(p)*emg(c)*sb*(tlbef(p)**3*(tlbef(p) + 4._r8*dt_veg(p)) &
*(1.-frac_rad_abs_by_stem(p))+ts_ini(p)**3*(ts_ini(p) &
+ 4._r8*dt_stem(p))*frac_rad_abs_by_stem(p))

! Upward longwave radiation above the canopy

ulrad(p) = ((1._r8-emg(c))*(1._r8-emv(p))*(1._r8-emv(p))*forc_lwrad(c) &
+ emv(p)*(1._r8+(1._r8-emg(c))*(1._r8-emv(p)))*sb*((1.-frac_rad_abs_by_stem(p)) &
*tlbef(p)**3*(tlbef(p) + 4._r8*dt_veg(p))+frac_rad_abs_by_stem(p)*ts_ini(p)**3*(ts_ini(p) &
+ 4._r8*dt_stem(p))) + emg(c)*(1._r8-emv(p))*sb*lw_grnd)
+ emv(p)*(1._r8+(1._r8-emg(c))*(1._r8-emv(p)))*sb &
*((1.-frac_rad_abs_by_stem(p))*tlbef(p)**3 &
*(tlbef(p) + 4._r8*dt_veg(p)) &
+frac_rad_abs_by_stem(p)*ts_ini(p)**3*(ts_ini(p)+ 4._r8*dt_stem(p))) &
+ emg(c)*(1._r8-emv(p))*sb*lw_grnd)


! Calculate the skin temperature as a weighted sum of all the ground and vegetated fraction
Expand Down
10 changes: 5 additions & 5 deletions src/biogeophys/EnergyFluxType.F90
Original file line number Diff line number Diff line change
Expand Up @@ -441,12 +441,12 @@ subroutine InitHistory(this, bounds, is_simple_buildtemp)
avgflag='A', long_name='sensible heat from veg', &
ptr_patch=this%eflx_sh_veg_patch, set_lake=0._r8, c2l_scale_type='urbanf')

this%eflx_sh_stem_patch(begp:endp) = spval
call hist_addfld1d (fname='FSH_STEM', units='W/m^2', &
avgflag='A', long_name='sensible heat from stem', &
ptr_patch=this%eflx_sh_stem_patch, c2l_scale_type='urbanf',default = 'inactive')

if (use_biomass_heat_storage) then
this%eflx_sh_stem_patch(begp:endp) = spval
call hist_addfld1d (fname='FSH_STEM', units='W/m^2', &
avgflag='A', long_name='sensible heat from stem', &
ptr_patch=this%eflx_sh_stem_patch, c2l_scale_type='urbanf',default = 'inactive')

this%dhsdt_canopy_patch(begp:endp) = spval
call hist_addfld1d (fname='DHSDT_CANOPY', units='W/m^2', &
avgflag='A', long_name='change in canopy heat storage', &
Expand Down
2 changes: 2 additions & 0 deletions src/main/clm_varcon.F90
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ module clm_varcon
real(r8), public :: alpha_aero = 1.0_r8 ! constant for aerodynamic parameter weighting
real(r8), public :: tlsai_crit = 2.0_r8 ! critical value of elai+esai for which aerodynamic parameters are maximum
real(r8), public :: watmin = 0.01_r8 ! minimum soil moisture (mm)
real(r8), public :: c_water = 4188_r8 ! specific heat of water [J/kg/K]
real(r8), public :: c_dry_biomass = 1400_r8 ! specific heat of dry biomass

real(r8), public :: re = SHR_CONST_REARTH*0.001_r8 ! radius of earth (km)

Expand Down

0 comments on commit 80a6dc9

Please sign in to comment.