Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
53 changes: 44 additions & 9 deletions biogeochem/EDPatchDynamicsMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,7 @@ subroutine spawn_patches( currentSite, bc_in )
integer :: n_pfts_by_landuse
integer :: which_pft_allowed
logical :: buffer_patch_used
logical :: clear_all
!---------------------------------------------------------------------

if (hlm_use_nocomp .eq. itrue) then
Expand Down Expand Up @@ -772,9 +773,17 @@ subroutine spawn_patches( currentSite, bc_in )
call mortality_litter_fluxes(currentSite, currentPatch, &
newPatch, patch_site_areadis,bc_in)
case (dtype_ilandusechange)
! If we are clearing to make crops, then kill everything
if (i_landusechange_receiverpatchlabel .eq. end_receiver_lulabel) then
clear_all = itrue
else ! otherwise kill a fraction of the cohort determined by the clearing mortality param
clear_all = ifalse
end if

call landusechange_litter_fluxes(currentSite, currentPatch, &
newPatch, patch_site_areadis,bc_in, &
clearing_matrix(i_donorpatch_landuse_type,i_landusechange_receiverpatchlabel))
clearing_matrix(i_donorpatch_landuse_type,i_landusechange_receiverpatchlabel), &
clear_all)

! if land use change, then may need to change nocomp pft, so tag as having transitioned LU
newPatch%changed_landuse_this_ts = .true.
Expand Down Expand Up @@ -1300,8 +1309,17 @@ subroutine spawn_patches( currentSite, bc_in )

! now apply survivorship based on the type of landuse transition
if ( clearing_matrix(i_donorpatch_landuse_type,i_landusechange_receiverpatchlabel) ) then
! kill everything
nc%n = 0._r8


! If we are clearing for crops then kill everything
! Note crops needs to be last lu class for this logic to work
Copy link
Contributor

Choose a reason for hiding this comment

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

Could this use the 'cropland' index from

integer, parameter, public :: cropland = 5
?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes, good idea. I've updated.

if (i_landusechange_receiverpatchlabel == end_receiver_lulabel ) then
nc%n = 0._r8
else
! Otherwise kill some proportion of the PFT based on the PFT-level clearing mortality parameter
nc%n = nc%n * (1.0_r8 - EDPftvarcon_inst%landuse_clearing_mortality(currentCohort%pft) )
end if

end if

case default
Expand Down Expand Up @@ -2615,12 +2633,15 @@ end subroutine mortality_litter_fluxes

subroutine landusechange_litter_fluxes(currentSite, currentPatch, &
newPatch, patch_site_areadis, bc_in, &
clearing_matrix_element)
clearing_matrix_element, clear_all)
!
! !DESCRIPTION:
! CWD pool from land use change.
! Carbon going from felled trees into CWD pool
! Either kill everything or nothing on disturbed land, depending on clearing matrix
! Whether or not to clear PFTs during transition from one land use class
! to another is based on the clearing logic matrix.
! If clearing occurs, the fraction of the PFT killed depends on the
! pft-level clearing mortality parameter
!
! !USES:
use SFParamsMod, only : SF_VAL_CWD_FRAC
Expand All @@ -2632,7 +2653,8 @@ subroutine landusechange_litter_fluxes(currentSite, currentPatch, &
real(r8) , intent(in) :: patch_site_areadis ! Area being donated
type(bc_in_type) , intent(in) :: bc_in
logical , intent(in) :: clearing_matrix_element ! whether or not to clear vegetation

logical , intent(in) :: clear_all ! should all vegetation be killed - applies to crops

!
! !LOCAL VARIABLES:

Expand Down Expand Up @@ -2679,7 +2701,13 @@ subroutine landusechange_litter_fluxes(currentSite, currentPatch, &
if (hlm_use_planthydro == itrue) then
currentCohort => currentPatch%shortest
do while(associated(currentCohort))
num_dead_trees = (currentCohort%n*patch_site_areadis/currentPatch%area)

if (clear_all) then
num_dead_trees = (currentCohort%n * patch_site_areadis/currentPatch%area)
else
num_dead_trees = (currentCohort%n*patch_site_areadis/currentPatch%area) * &
EDPftvarcon_inst%landuse_clearing_mortality(currentCohort%pft)
end if
call AccumulateMortalityWaterStorage(currentSite,currentCohort,num_dead_trees)
currentCohort => currentCohort%taller
end do
Expand Down Expand Up @@ -2750,8 +2778,15 @@ subroutine landusechange_litter_fluxes(currentSite, currentPatch, &


! Absolute number of dead trees being transfered in with the donated area
num_dead_trees = (currentCohort%n * &
patch_site_areadis/currentPatch%area)

if (clear_all) then
num_dead_trees = (currentCohort%n * &
patch_site_areadis/currentPatch%area)
else
num_dead_trees = (currentCohort%n * &
patch_site_areadis/currentPatch%area) * &
EDPftvarcon_inst%landuse_clearing_mortality(pft)
end if

! Contribution of dead trees to leaf litter
donatable_mass = num_dead_trees * (leaf_m+repro_m) * &
Expand Down
11 changes: 9 additions & 2 deletions biogeochem/FatesLandUseChangeMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ module FatesLandUseChangeMod
use FatesInterfaceTypesMod , only : hlm_num_luh2_states
use FatesInterfaceTypesMod , only : hlm_num_luh2_transitions
use FatesInterfaceTypesMod , only : hlm_use_potentialveg
use FatesInterfaceTypesMod , only : hlm_lu_transition_logic
use FatesUtilsMod , only : FindIndex
use EDTypesMod , only : area_site => area

Expand Down Expand Up @@ -178,13 +179,19 @@ subroutine GetLanduseChangeRules(clearing_matrix)
! the purpose of this is to define a ruleset for when to clear the vegetation in transitioning
! from one land use type to another


logical, intent(out) :: clearing_matrix(n_landuse_cats,n_landuse_cats)

! local variables
integer :: ruleset

! default value of ruleset 4 above means that plants are not cleared during land use change
! transitions to rangeland, whereas plants are cleared in transitions to pasturelands and croplands.
integer, parameter :: ruleset = 4 ! ruleset to apply from table 1 of Ma et al (2020)
! https://doi.org/10.5194/gmd-13-3203-2020

! ruleset to apply from table 1 of Ma et al (2020)
! https://doi.org/10.5194/gmd-13-3203-2020
ruleset = hlm_lu_transition_logic

! clearing matrix applies from the donor to the receiver land use type of the newly-transferred
! patch area values of clearing matrix: false => do not clear; true => clear

Expand Down
11 changes: 11 additions & 0 deletions main/EDPftvarcon.F90
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,9 @@ module EDPftvarcon
! Grazing
real(r8), allocatable :: landuse_grazing_palatability(:) ! Relative intensity of leaf grazing/browsing per PFT (unitless 0-1)

! Clearing mortality rate
real(r8), allocatable :: landuse_clearing_mortality(:) ! Fraction of cohort killed when patch is cleared during land use transitions

contains
procedure, public :: Init => EDpftconInit
procedure, public :: Register
Expand Down Expand Up @@ -738,6 +741,10 @@ subroutine Register_PFT(this, fates_params)
dimension_names=dim_names, lower_bounds=dim_lower_bound)

name = 'fates_landuse_grazing_palatability'
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)

name = 'fates_landuse_clearing_mortality'
call fates_params%RegisterParameter(name=name, dimension_shape=dimension_shape_1d, &
dimension_names=dim_names, lower_bounds=dim_lower_bound)

Expand Down Expand Up @@ -1169,6 +1176,10 @@ subroutine Receive_PFT(this, fates_params)
call fates_params%RetrieveParameterAllocate(name=name, &
data=this%landuse_grazing_palatability)

name = 'fates_landuse_clearing_mortality'
call fates_params%RetrieveParameterAllocate(name=name, &
data=this%landuse_clearing_mortality)

end subroutine Receive_PFT

!-----------------------------------------------------------------------
Expand Down
9 changes: 8 additions & 1 deletion main/FatesInterfaceMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1507,6 +1507,7 @@ subroutine set_fates_ctrlparms(tag,ival,rval,cval)
hlm_num_lu_harvest_cats = unset_int
hlm_num_luh2_states = unset_int
hlm_num_luh2_transitions = unset_int
hlm_lu_transition_logic = unset_int
hlm_use_cohort_age_tracking = unset_int
lb_params%dayl_switch = unset_int
lb_params%photo_tempsens_model = unset_int
Expand Down Expand Up @@ -2056,7 +2057,13 @@ subroutine set_fates_ctrlparms(tag,ival,rval,cval)
if (fates_global_verbose()) then
write(fates_log(),*) 'Transfering hlm_num_luh2_transitions= ',ival,' to FATES'
end if


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

case('use_cohort_age_tracking')
hlm_use_cohort_age_tracking = ival
if (fates_global_verbose()) then
Expand Down
4 changes: 4 additions & 0 deletions main/FatesInterfaceTypesMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,10 @@ module FatesInterfaceTypesMod
! If 1, it automatically sets
! hlm_use_logging to 1

integer, public :: hlm_lu_transition_logic ! This flag signals which logic to use in transitions between land use classes
! See the FATES user guide for full description of options


integer, public :: hlm_num_lu_harvest_cats ! number of hlm harvest categories (e.g. primary forest harvest, secondary young forest harvest, etc.)
! this is the first dimension of:
! harvest_rates in dynHarvestMod
Expand Down
7 changes: 6 additions & 1 deletion parameter_files/fates_params_default.cdl
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,10 @@ variables:
fates_hydro_vg_n_node:long_name = "(used if hydr_htftype_node = 2),n in van Genuchten 1980 model, pore size distribution parameter" ;
double fates_landuse_grazing_palatability(fates_pft) ;
fates_landuse_grazing_palatability:units = "unitless 0-1" ;
fates_landuse_grazing_palatability:long_name = "Relative intensity of leaf grazing/browsing per PFT" ;
fates_landuse_grazing_palatability:long_name = "Relative intensity of leaf grazing/browsing per PFT" ;
double fates_landuse_clearing_mortality(fates_pft) ;
fates_landuse_clearing_mortality:units = "fraction" ;
fates_landuse_clearing_mortality:long_name = "Fraction of cohort killed during land use clearing" ;
double fates_landuse_harvest_pprod10(fates_pft) ;
fates_landuse_harvest_pprod10:units = "fraction" ;
fates_landuse_harvest_pprod10:long_name = "fraction of harvest wood product that goes to 10-year product pool (remainder goes to 100-year pool)" ;
Expand Down Expand Up @@ -1362,6 +1365,8 @@ data:

fates_landuse_grazing_palatability = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ;

fates_landuse_clearing_mortality = 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 1, 1, 1, 1, 1, 1, 1, 1 ;

fates_landuse_harvest_pprod10 = 1, 0.75, 0.75, 0.75, 1, 0.75, 1, 1, 1, 1, 1,
1, 1, 1 ;

Expand Down