diff --git a/biogeochem/EDCanopyStructureMod.F90 b/biogeochem/EDCanopyStructureMod.F90 index d6ae9f52c8..083da05e37 100644 --- a/biogeochem/EDCanopyStructureMod.F90 +++ b/biogeochem/EDCanopyStructureMod.F90 @@ -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 @@ -1352,15 +1353,15 @@ 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 - + real(r8) :: weight ! Weighting for cohort variables in patch + real(r8) :: weighting_area ! Area to normalize against depending on insterstitial bareground handling + 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 @@ -1389,17 +1390,27 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out) bc_out(s)%hbot_pa(ifp) = max(0._r8, min(0.2_r8, bc_out(s)%htop_pa(ifp)- 1.0_r8)) - ! Use canopy-only crown area weighting for all cohorts in the patch to define the characteristic - ! Roughness length and displacement height used by the HLM - ! use total LAI + SAI to weight the leaft characteristic dimension + ! Define the characteristic roughness length and displacement height used by the HLM + ! Nominally, FATES uses canopy-only crown area weighting for all cohorts in the patch + ! when the interstitial bareground is being collapsed into the HLM bareground patch. + ! When we account for the bareground as part of the patch, the full area is accounted + ! for in the calculation. + ! If there is no canopy and we are considering the interstitial bareground we do + ! something else. + ! Use total LAI + SAI to weight the leaft characteristic dimension ! Avoid this if running in satellite phenology mode ! ---------------------------------------------------------------------------- if (currentPatch%total_canopy_area > nearzero) then + if (hlm_use_interstitial_bareground .eq. itrue) then + weighting_area = currentPatch%area + else + weighting_area = currentPatch%total_canopy_area + end if currentCohort => currentPatch%shortest do while(associated(currentCohort)) if (currentCohort%canopy_layer .eq. 1) then - weight = min(1.0_r8,currentCohort%c_area/currentPatch%total_canopy_area) + weight = min(1.0_r8,currentCohort%c_area/weighting_area) bc_out(s)%z0m_pa(ifp) = bc_out(s)%z0m_pa(ifp) + & EDPftvarcon_inst%z0mr(currentCohort%pft) * currentCohort%height * weight bc_out(s)%displa_pa(ifp) = bc_out(s)%displa_pa(ifp) + & @@ -1433,9 +1444,13 @@ subroutine update_hlm_dynamics(nsites,sites,fcolumn,bc_out) endif else ! if no canopy, then use dummy values (first PFT) of aerodynamic properties - bc_out(s)%z0m_pa(ifp) = EDPftvarcon_inst%z0mr(1) * bc_out(s)%htop_pa(ifp) - bc_out(s)%displa_pa(ifp) = EDPftvarcon_inst%displar(1) * bc_out(s)%htop_pa(ifp) - bc_out(s)%dleaf_pa(ifp) = EDPftvarcon_inst%dleaf(1) + if (hlm_use_interstitial_bareground .eq. itrue) then + ! do something else? + else + bc_out(s)%z0m_pa(ifp) = EDPftvarcon_inst%z0mr(1) * bc_out(s)%htop_pa(ifp) + bc_out(s)%displa_pa(ifp) = EDPftvarcon_inst%displar(1) * bc_out(s)%htop_pa(ifp) + bc_out(s)%dleaf_pa(ifp) = EDPftvarcon_inst%dleaf(1) + end if endif ! ----------------------------------------------------------------------------- @@ -1445,19 +1460,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 - - 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 @@ -1484,7 +1505,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 @@ -1511,7 +1532,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 diff --git a/main/FatesInterfaceMod.F90 b/main/FatesInterfaceMod.F90 index faf91b1da6..dfa64ea971 100644 --- a/main/FatesInterfaceMod.F90 +++ b/main/FatesInterfaceMod.F90 @@ -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 @@ -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)) @@ -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' @@ -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 diff --git a/main/FatesInterfaceTypesMod.F90 b/main/FatesInterfaceTypesMod.F90 index dcaf9cd972..0a3d92c1a2 100644 --- a/main/FatesInterfaceTypesMod.F90 +++ b/main/FatesInterfaceTypesMod.F90 @@ -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 @@ -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