Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 18 additions & 12 deletions biogeochem/EDCanopyStructureMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ module EDCanopyStructureMod
use FatesInterfaceTypesMod , only : hlm_use_planthydro
use FatesInterfaceTypesMod , only : hlm_use_cohort_age_tracking
use FatesInterfaceTypesMod , only : hlm_use_sp
use FatesInterfaceTypesMod , only : hlm_use_interstitial_bareground
use FatesInterfaceTypesMod , only : numpft
use FatesInterfaceTypesMod, only : bc_in_type
use FatesPlantHydraulicsMod, only : UpdateH2OVeg,InitHydrCohort, RecruitWaterStorage
Expand Down Expand Up @@ -1352,15 +1353,14 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out)
type (fates_patch_type) , pointer :: currentPatch
real(r8) :: bare_frac_area
real(r8) :: total_patch_area
real(r8) :: total_canopy_area
real(r8) :: total_patch_leaf_stem_area
real(r8) :: weight ! Weighting for cohort variables in patch

do s = 1,nsites

total_patch_area = 0._r8
total_canopy_area = 0._r8
bc_out(s)%canopy_fraction_pa(:) = 0._r8
local_patch_fraction = 0._r8
bc_out(s)%patch_fraction(:) = 0._r8
bc_out(s)%dleaf_pa(:) = 0._r8
bc_out(s)%z0m_pa(:) = 0._r8
bc_out(s)%displa_pa(:) = 0._r8
Expand Down Expand Up @@ -1445,19 +1445,25 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out)
! currentPatch%total_canopy_area/currentPatch%area is fraction of this patch cover by plants
! currentPatch%area/AREA is the fraction of the soil covered by this patch.

! If we are accounting for the interstitial bareground within the HLM bareground patch
! we use the projected total canopy area fraction as the output boundary condition.
! Otherwise we simply use the fraction of the area that the patch contributes to the given site.
if (hlm_use_interstitial_bareground == itrue) then
local_patch_fraction = min(1.0_r8,currentPatch%total_canopy_area/currentPatch%area)
else
local_patch_fraction = 1.0_r8
end if

if(currentPatch%area.gt.0.0_r8)then
bc_out(s)%canopy_fraction_pa(ifp) = &
min(1.0_r8,currentPatch%total_canopy_area/currentPatch%area)*(currentPatch%area/AREA)
bc_out(s)%patch_fraction(ifp) = local_patch_fraction*(currentPatch%area/AREA)
else
bc_out(s)%canopy_fraction_pa(ifp) = 0.0_r8
bc_out(s)%patch_fraction(ifp) = 0.0_r8
endif

bare_frac_area = (1.0_r8 - min(1.0_r8,currentPatch%total_canopy_area/currentPatch%area)) * &
bare_frac_area = (1.0_r8 - local_patch_fraction) * &
(currentPatch%area/AREA)

total_patch_area = total_patch_area + bc_out(s)%canopy_fraction_pa(ifp) + bare_frac_area

@glemieux glemieux Jun 14, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that this is dead code being removed (total_patch_area). It wasn't being used downstream.


total_canopy_area = total_canopy_area + bc_out(s)%canopy_fraction_pa(ifp)
total_patch_area = total_patch_area + bc_out(s)%patch_fraction(ifp) + bare_frac_area

bc_out(s)%nocomp_pft_label_pa(ifp) = currentPatch%nocomp_pft_label

Expand All @@ -1484,7 +1490,7 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out)
bc_out(s)%frac_veg_nosno_alb_pa(ifp) = 0.0_r8
end if

else ! nocomp or SP, and currentPatch%nocomp_pft_label .eq. 0
else ! nocomp or SP, (i.e.currentPatch%nocomp_pft_label .eq. 0

total_patch_area = total_patch_area + currentPatch%area/AREA

Expand All @@ -1511,7 +1517,7 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out)
do while(associated(currentPatch))
ifp = currentPatch%patchno
if(currentPatch%nocomp_pft_label.ne.nocomp_bareground)then ! for vegetated patches only
bc_out(s)%canopy_fraction_pa(ifp) = bc_out(s)%canopy_fraction_pa(ifp)/total_patch_area
bc_out(s)%patch_fraction(ifp) = bc_out(s)%patch_fraction(ifp)/total_patch_area
endif ! veg patch
currentPatch => currentPatch%younger
end do
Expand Down
11 changes: 9 additions & 2 deletions main/FatesInterfaceMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ subroutine zero_bcs(fates,s)
fates%bc_out(s)%dleaf_pa(:) = 0.0_r8
fates%bc_out(s)%nocomp_pft_label_pa(:) = 0

fates%bc_out(s)%canopy_fraction_pa(:) = 0.0_r8
fates%bc_out(s)%patch_fraction(:) = 0.0_r8
fates%bc_out(s)%frac_veg_nosno_alb_pa(:) = 0.0_r8

if (hlm_use_planthydro.eq.itrue) then
Expand Down Expand Up @@ -744,7 +744,7 @@ subroutine allocate_bcout(bc_out, nlevsoil_in, nlevdecomp_in)
allocate(bc_out%displa_pa(maxpatch_total))
allocate(bc_out%z0m_pa(maxpatch_total))

allocate(bc_out%canopy_fraction_pa(maxpatch_total))
allocate(bc_out%patch_fraction(maxpatch_total))
allocate(bc_out%frac_veg_nosno_alb_pa(maxpatch_total))

allocate(bc_out%nocomp_pft_label_pa(maxpatch_total))
Expand Down Expand Up @@ -1574,6 +1574,7 @@ subroutine set_fates_ctrlparms(tag,ival,rval,cval)
hlm_use_fixed_biogeog = unset_int
hlm_use_nocomp = unset_int
hlm_use_sp = unset_int
hlm_use_interstitial_bareground = unset_int
hlm_use_inventory_init = unset_int
hlm_use_dbh_init = unset_int
hlm_inventory_ctrl_file = 'unset'
Expand Down Expand Up @@ -2050,6 +2051,12 @@ subroutine set_fates_ctrlparms(tag,ival,rval,cval)
write(fates_log(),*) 'Transfering hlm_use_sp= ',ival,' to FATES'
end if

case('use_interstitial_bareground')
hlm_use_interstitial_bareground = ival
if (fates_global_verbose()) then
write(fates_log(),*) 'Transfering hlm_use_interstitial_bareground= ',ival,' to FATES'
end if

case('use_planthydro')
hlm_use_planthydro = ival
if (fates_global_verbose()) then
Expand Down
13 changes: 9 additions & 4 deletions main/FatesInterfaceTypesMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,9 @@ module FatesInterfaceTypesMod
integer, public :: hlm_use_sp ! Flag to use FATES satellite phenology (LAI) mode
! 1 = TRUE, 0 = FALSE

integer, public :: hlm_use_interstitial_bareground ! Flag to use count the FATES interstitial bareground area
! with the HLM bareground patch
! 1 = TRUE, 0 = FALSE

! Flag specifying what types of history fields to allocate and prepare
! The "_dynam" refers to history fields that can be updated on the dynamics (daily) step
Expand Down Expand Up @@ -766,10 +769,12 @@ module FatesInterfaceTypesMod
real(r8), allocatable :: displa_pa(:) ! displacement height [m]
real(r8), allocatable :: dleaf_pa(:) ! leaf characteristic dimension/width/diameter [m]

real(r8), allocatable :: canopy_fraction_pa(:) ! Area fraction of each patch in the site
! Use most likely for weighting
! This is currently the projected canopy
! area of each patch [0-1]
real(r8), allocatable :: patch_fraction(:) ! Area fraction of each patch in the site
! Use most likely for weighting
! This is either the projected canopy
! area of each patch [0-1] or the actual
! are fraction that each patch contributes
! to the site

real(r8), allocatable :: frac_veg_nosno_alb_pa(:) ! This is not really a fraction
! this is actually binary based on if any
Expand Down