Skip to content

Commit

Permalink
Merge pull request #891 from ZacharyRobbins/master
Browse files Browse the repository at this point in the history
Grass PFT only creates leaves not cwd
  • Loading branch information
glemieux authored Nov 16, 2022
2 parents 74b939b + 1a8a24b commit c7cf553
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 30 deletions.
24 changes: 24 additions & 0 deletions biogeochem/CMIP data.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
.
CMIP6.CMIP.NCAR.CESM2.historical.r11i1p1f1.day.rlds.gn'



CF Standard Name | Unit | AMIP

---------------- | ---- | ----

specific_humidity | 1 | hus

precipitation_flux | kg m-2 s-1 | pr

surface_air_pressure | Pa | ps

surface_downwelling_longwave_flux_in_air | W/m2 | rlds

surface_downwelling_shortwave_flux_in_air | W/m2 | rsds

air_temperature | K | ta

eastward_wind | ms-1 | ua

northward_wind | ms-1 | va
14 changes: 11 additions & 3 deletions biogeochem/EDCohortDynamicsMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -960,12 +960,20 @@ subroutine SendCohortToLitter(csite,cpatch,ccohort,nplant,bc_in)

do el=1,num_elements

leaf_m = ccohort%prt%GetState(leaf_organ, element_list(el))
store_m = ccohort%prt%GetState(store_organ, element_list(el))
sapw_m = ccohort%prt%GetState(sapw_organ, element_list(el))
fnrt_m = ccohort%prt%GetState(fnrt_organ, element_list(el))
struct_m = ccohort%prt%GetState(struct_organ, element_list(el))
repro_m = ccohort%prt%GetState(repro_organ, element_list(el))
if (prt_params%woody(ccohort%pft) == itrue) then
leaf_m = ccohort%prt%GetState(leaf_organ, element_list(el))
sapw_m = ccohort%prt%GetState(sapw_organ, element_list(el))
struct_m = ccohort%prt%GetState(struct_organ, element_list(el))
else
leaf_m = ccohort%prt%GetState(leaf_organ, element_list(el)) + &
ccohort%prt%GetState(sapw_organ, element_list(el)) + &
ccohort%prt%GetState(struct_organ, element_list(el))
sapw_m = 0._r8
struct_m = 0._r8
endif

litt => cpatch%litter(el)
flux_diags => csite%flux_diags(el)
Expand Down
74 changes: 58 additions & 16 deletions biogeochem/EDPatchDynamicsMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -868,6 +868,18 @@ subroutine spawn_patches( currentSite, bc_in)
do el = 1,num_elements

leaf_m = nc%prt%GetState(leaf_organ, element_list(el))
! for woody plants burn only leaves
if(int(prt_params%woody(currentCohort%pft)) == itrue)then

leaf_m = nc%prt%GetState(leaf_organ, element_list(el))

else
! for grasses burn all aboveground tissues
leaf_m = nc%prt%GetState(leaf_organ, element_list(el)) + &
nc%prt%GetState(sapw_organ, element_list(el)) + &
nc%prt%GetState(struct_organ, element_list(el))

endif

currentSite%mass_balance(el)%burn_flux_to_atm = &
currentSite%mass_balance(el)%burn_flux_to_atm + &
Expand All @@ -876,7 +888,14 @@ subroutine spawn_patches( currentSite, bc_in)

! Here the mass is removed from the plant

call PRTBurnLosses(nc%prt, leaf_organ, leaf_burn_frac)
if(int(prt_params%woody(currentCohort%pft)) == itrue)then
call PRTBurnLosses(nc%prt, leaf_organ, leaf_burn_frac)
else
call PRTBurnLosses(nc%prt, leaf_organ, leaf_burn_frac)
call PRTBurnLosses(nc%prt, sapw_organ, leaf_burn_frac)
call PRTBurnLosses(nc%prt, struct_organ, leaf_burn_frac)
endif

currentCohort%fraction_crown_burned = 0.0_r8
nc%fraction_crown_burned = 0.0_r8

Expand Down Expand Up @@ -1643,19 +1662,31 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, &
do while(associated(currentCohort))

pft = currentCohort%pft

! Number of trees that died because of the fire, per m2 of ground.
! Divide their litter into the four litter streams, and spread
! across ground surface.
! -----------------------------------------------------------------------

sapw_m = currentCohort%prt%GetState(sapw_organ, element_id)
struct_m = currentCohort%prt%GetState(struct_organ, element_id)
leaf_m = currentCohort%prt%GetState(leaf_organ, element_id)

fnrt_m = currentCohort%prt%GetState(fnrt_organ, element_id)
store_m = currentCohort%prt%GetState(store_organ, element_id)
repro_m = currentCohort%prt%GetState(repro_organ, element_id)


if (prt_params%woody(currentCohort%pft) == itrue) then
! Assumption: for woody plants fluxes from deadwood and sapwood go together in CWD pool
leaf_m = currentCohort%prt%GetState(leaf_organ,element_id)
sapw_m = currentCohort%prt%GetState(sapw_organ,element_id)
struct_m = currentCohort%prt%GetState(struct_organ,element_id)
else
! for non-woody plants all stem fluxes go into the same leaf litter pool
leaf_m = currentCohort%prt%GetState(leaf_organ,element_id) + &
currentCohort%prt%GetState(sapw_organ,element_id) + &
currentCohort%prt%GetState(struct_organ,element_id)
sapw_m = 0._r8
struct_m = 0._r8
end if


! Absolute number of dead trees being transfered in with the donated area
num_dead_trees = (currentCohort%fire_mort*currentCohort%n * &
patch_site_areadis/currentPatch%area)
Expand All @@ -1666,7 +1697,7 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, &

! Contribution of dead trees to leaf burn-flux
burned_mass = num_dead_trees * (leaf_m+repro_m) * currentCohort%fraction_crown_burned

do dcmpy=1,ndcmpy
dcmpy_frac = GetDecompyFrac(pft,leaf_organ,dcmpy)
new_litt%leaf_fines(dcmpy) = new_litt%leaf_fines(dcmpy) + &
Expand Down Expand Up @@ -1700,10 +1731,10 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, &
flux_diags%root_litter_input(pft) = &
flux_diags%root_litter_input(pft) + &
(fnrt_m + store_m) * num_dead_trees

! coarse root biomass per tree
bcroot = (sapw_m + struct_m) * (1.0_r8 - prt_params%allom_agb_frac(pft) )

! below ground coarse woody debris from burned trees
do c = 1,ncwd
do sl = 1,currentSite%nlevsoil
Expand Down Expand Up @@ -1731,15 +1762,15 @@ subroutine fire_litter_fluxes(currentSite, currentPatch, &
donatable_mass = num_dead_trees * SF_val_CWD_frac(c) * bstem
if (c == 1 .or. c == 2) then
donatable_mass = donatable_mass * (1.0_r8-currentCohort%fraction_crown_burned)
burned_mass = num_dead_trees * SF_val_CWD_frac(c) * bstem * &
burned_mass = num_dead_trees * SF_val_CWD_frac(c) * bstem * &
currentCohort%fraction_crown_burned
site_mass%burn_flux_to_atm = site_mass%burn_flux_to_atm + burned_mass
endif
new_litt%ag_cwd(c) = new_litt%ag_cwd(c) + donatable_mass * donate_m2
curr_litt%ag_cwd(c) = curr_litt%ag_cwd(c) + donatable_mass * retain_m2
flux_diags%cwd_ag_input(c) = flux_diags%cwd_ag_input(c) + donatable_mass
enddo
enddo


currentCohort => currentCohort%taller
enddo
Expand Down Expand Up @@ -1835,13 +1866,24 @@ subroutine mortality_litter_fluxes(currentSite, currentPatch, &

pft = currentCohort%pft

sapw_m = currentCohort%prt%GetState(sapw_organ, element_id)
struct_m = currentCohort%prt%GetState(struct_organ, element_id)
leaf_m = currentCohort%prt%GetState(leaf_organ, element_id)
fnrt_m = currentCohort%prt%GetState(fnrt_organ, element_id)
store_m = currentCohort%prt%GetState(store_organ, element_id)
repro_m = currentCohort%prt%GetState(repro_organ, element_id)

if (prt_params%woody(currentCohort%pft) == itrue) then
! Assumption: for woody plants fluxes from deadwood and sapwood go together in CWD pool
leaf_m = currentCohort%prt%GetState(leaf_organ,element_id)
sapw_m = currentCohort%prt%GetState(sapw_organ,element_id)
struct_m = currentCohort%prt%GetState(struct_organ,element_id)
else
! for non-woody plants all stem fluxes go into the same leaf litter pool
leaf_m = currentCohort%prt%GetState(leaf_organ,element_id) + &
currentCohort%prt%GetState(sapw_organ,element_id) + &
currentCohort%prt%GetState(struct_organ,element_id)
sapw_m = 0._r8
struct_m = 0._r8
end if

if(currentCohort%canopy_layer == 1)then

! Upper canopy trees. The total dead is based on their disturbance
Expand Down
33 changes: 25 additions & 8 deletions biogeochem/EDPhysiologyMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -2361,24 +2361,41 @@ subroutine CWDInput( currentSite, currentPatch, litt, bc_in)
currentCohort => currentPatch%shortest
do while(associated(currentCohort))
pft = currentCohort%pft

call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil, &
call set_root_fraction(currentSite%rootfrac_scr, pft, currentSite%zi_soil, &
bc_in%max_rooting_depth_index_col)

leaf_m_turnover = currentCohort%prt%GetTurnover(leaf_organ,element_id)
store_m_turnover = currentCohort%prt%GetTurnover(store_organ,element_id)
fnrt_m_turnover = currentCohort%prt%GetTurnover(fnrt_organ,element_id)
sapw_m_turnover = currentCohort%prt%GetTurnover(sapw_organ,element_id)
struct_m_turnover = currentCohort%prt%GetTurnover(struct_organ,element_id)
repro_m_turnover = currentCohort%prt%GetTurnover(repro_organ,element_id)

leaf_m = currentCohort%prt%GetState(leaf_organ,element_id)
store_m = currentCohort%prt%GetState(store_organ,element_id)
fnrt_m = currentCohort%prt%GetState(fnrt_organ,element_id)
sapw_m = currentCohort%prt%GetState(sapw_organ,element_id)
struct_m = currentCohort%prt%GetState(struct_organ,element_id)
repro_m = currentCohort%prt%GetState(repro_organ,element_id)

if (prt_params%woody(currentCohort%pft) == itrue) then
! Assumption: for woody plants fluxes from deadwood and sapwood go together in CWD pool
leaf_m_turnover = currentCohort%prt%GetTurnover(leaf_organ,element_id)
sapw_m_turnover = currentCohort%prt%GetTurnover(sapw_organ,element_id)
struct_m_turnover = currentCohort%prt%GetTurnover(struct_organ,element_id)

leaf_m = currentCohort%prt%GetState(leaf_organ,element_id)
sapw_m = currentCohort%prt%GetState(sapw_organ,element_id)
struct_m = currentCohort%prt%GetState(struct_organ,element_id)
else
! for non-woody plants all stem fluxes go into the same leaf litter pool
leaf_m_turnover = currentCohort%prt%GetTurnover(leaf_organ,element_id) + &
currentCohort%prt%GetTurnover(sapw_organ,element_id) + &
currentCohort%prt%GetTurnover(struct_organ,element_id)
sapw_m_turnover = 0._r8
struct_m_turnover = 0._r8

leaf_m = currentCohort%prt%GetState(leaf_organ,element_id) + &
currentCohort%prt%GetState(sapw_organ,element_id) + &
currentCohort%prt%GetState(struct_organ,element_id)
sapw_m = 0._r8
struct_m = 0._r8
end if

plant_dens = currentCohort%n/currentPatch%area

! ---------------------------------------------------------------------------------
Expand Down
9 changes: 6 additions & 3 deletions fire/SFMainMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -192,10 +192,13 @@ subroutine charecteristics_of_fuel ( currentSite )
currentPatch%livegrass = 0.0_r8
currentCohort => currentPatch%tallest
do while(associated(currentCohort))
if( prt_params%woody(currentCohort%pft) == ifalse)then
! for grasses sum all aboveground tissues
if( prt_params%woody(currentCohort%pft) == ifalse)then

currentPatch%livegrass = currentPatch%livegrass + &
currentCohort%prt%GetState(leaf_organ, all_carbon_elements) * &
( currentCohort%prt%GetState(leaf_organ, all_carbon_elements) + &
currentCohort%prt%GetState(sapw_organ, all_carbon_elements) + &
currentCohort%prt%GetState(struct_organ, all_carbon_elements) ) * &
currentCohort%n/currentPatch%area

endif
Expand Down Expand Up @@ -760,7 +763,7 @@ subroutine area_burnt_intensity ( currentSite, bc_in )
lb = (1.0_r8 + (8.729_r8 * &
((1.0_r8 -(exp(-0.03_r8 * m_per_min__to__km_per_hour * currentPatch%effect_wspeed)))**2.155_r8)))
else ! EQ 80 grass fuels (CFFBPS Ont.Inf.Rep. ST-X-3, 1992, but with a correction from an errata published within
! Information Report GLC-X-10 by Bottom et al., 2009 because there is a typo in CFFBPS Ont.Inf.Rep. ST-X-3, 1992)
! Information Report GLC-X-10 by Wotton et al., 2009 for a typo in CFFBPS Ont.Inf.Rep. ST-X-3, 1992)
lb = (1.1_r8*((m_per_min__to__km_per_hour * currentPatch%effect_wspeed)**0.464_r8))
endif
endif
Expand Down

0 comments on commit c7cf553

Please sign in to comment.