Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SUPERSEDED [Fang summer '24 PR 2] More improvements to fire model #2615

Closed
wants to merge 7 commits into from
Closed
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
26 changes: 21 additions & 5 deletions bld/namelist_files/namelist_defaults_ctsm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -308,17 +308,33 @@ attributes from the config_cache.xml file (with keys converted to upper-case).
<rh_hgh fire_method="li2021gswpfrc" >80.0d00</rh_hgh>
<bt_min fire_method="li2021gswpfrc" >0.85d00</bt_min>
<bt_max fire_method="li2021gswpfrc" >0.98d00</bt_max>
<cli_scale fire_method="li2021gswpfrc" >0.025d00</cli_scale>
<boreal_peatfire_c fire_method="li2021gswpfrc" >0.09d-4</boreal_peatfire_c>
<cli_scale fire_method="li2021gswpfrc" >0.01d00</cli_scale>
<boreal_peatfire_c fire_method="li2021gswpfrc" >0.28d-4</boreal_peatfire_c>
<pot_hmn_ign_counts_alpha fire_method="li2021gswpfrc" >0.010d00</pot_hmn_ign_counts_alpha>
<non_boreal_peatfire_c fire_method="li2021gswpfrc" >0.17d-3</non_boreal_peatfire_c>
<cropfire_a1 fire_method="li2021gswpfrc" >1.6d-4</cropfire_a1>
<non_boreal_peatfire_c fire_method="li2021gswpfrc" >0.71d-4</non_boreal_peatfire_c>
<cropfire_a1 fire_method="li2021gswpfrc" >0.3d00</cropfire_a1>
<occur_hi_gdp_tree fire_method="li2021gswpfrc" >0.33d00</occur_hi_gdp_tree>
<lfuel fire_method="li2021gswpfrc" >75.d00</lfuel>
<ufuel fire_method="li2021gswpfrc" >1050.d00</ufuel>
<ufuel fire_method="li2021gswpfrc" >825.d00</ufuel>
<cmb_cmplt_fact_litter fire_method="li2021gswpfrc" >0.5d00</cmb_cmplt_fact_litter>
<cmb_cmplt_fact_cwd fire_method="li2021gswpfrc" >0.28d00</cmb_cmplt_fact_cwd>

<rh_low fire_method="li2021crujra" >30.0d00</rh_low>
<rh_hgh fire_method="li2021crujra" >85.0d00</rh_hgh>
<bt_min fire_method="li2021crujra" >0.85d00</bt_min>
<bt_max fire_method="li2021crujra" >0.98d00</bt_max>
<cli_scale fire_method="li2021crujra" >0.01d00</cli_scale>
<boreal_peatfire_c fire_method="li2021crujra" >0.28d-4</boreal_peatfire_c>
<pot_hmn_ign_counts_alpha fire_method="li2021crujra" >0.010d00</pot_hmn_ign_counts_alpha>
<non_boreal_peatfire_c fire_method="li2021crujra" >0.71d-4</non_boreal_peatfire_c>
<cropfire_a1 fire_method="li2021crujra" >0.3d00</cropfire_a1>
<occur_hi_gdp_tree fire_method="li2021crujra" >0.33d00</occur_hi_gdp_tree>
<lfuel fire_method="li2021crujra" >75.d00</lfuel>
<ufuel fire_method="li2021crujra" >825.d00</ufuel>
<cmb_cmplt_fact_litter fire_method="li2021crujra" >0.5d00</cmb_cmplt_fact_litter>
<cmb_cmplt_fact_cwd fire_method="li2021crujra" >0.28d00</cmb_cmplt_fact_cwd>


<!-- Canopy fluxes namelist defaults -->
<use_undercanopy_stability >.false.</use_undercanopy_stability>
<use_undercanopy_stability phys="clm4_5" >.true.</use_undercanopy_stability>
Expand Down
2 changes: 1 addition & 1 deletion src/biogeochem/CNDriverMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -936,7 +936,7 @@ subroutine CNDriverNoLeaching(bounds,
num_exposedvegp, filter_exposedvegp, num_noexposedvegp, filter_noexposedvegp, &
atm2lnd_inst, energyflux_inst, saturated_excess_runoff_inst, waterdiagnosticbulk_inst, wateratm2lndbulk_inst, &
waterstatebulk_inst, soilstate_inst, soil_water_retention_curve, &
cnveg_state_inst, cnveg_carbonstate_inst, &
crop_inst, cnveg_state_inst, cnveg_carbonstate_inst, &
totlitc_col=soilbiogeochem_carbonstate_inst%totlitc_col(begc:endc), &
decomp_cpools_vr_col=soilbiogeochem_carbonstate_inst%decomp_cpools_vr_col(begc:endc,1:nlevdecomp_full,1:ndecomp_pools), &
t_soi17cm_col=temperature_inst%t_soi17cm_col(begc:endc))
Expand Down
4 changes: 3 additions & 1 deletion src/biogeochem/CNFireLi2014Mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
num_exposedvegp, filter_exposedvegp, num_noexposedvegp, filter_noexposedvegp, &
atm2lnd_inst, energyflux_inst, saturated_excess_runoff_inst, waterdiagnosticbulk_inst, &
wateratm2lndbulk_inst, waterstatebulk_inst, soilstate_inst, soil_water_retention_curve, &
cnveg_state_inst, cnveg_carbonstate_inst, totlitc_col, decomp_cpools_vr_col, t_soi17cm_col)
crop_inst, cnveg_state_inst, cnveg_carbonstate_inst, totlitc_col, decomp_cpools_vr_col, t_soi17cm_col)
!
! !DESCRIPTION:
! Computes column-level burned area
Expand All @@ -98,6 +98,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
use pftconMod , only: nc4_grass, nc3crop, ndllf_evr_tmp_tree
use pftconMod , only: nbrdlf_evr_trp_tree, nbrdlf_dcd_trp_tree, nbrdlf_evr_shrub
use dynSubgridControlMod , only: run_has_transient_landcover
use CropType , only: crop_type
!
! !ARGUMENTS:
class(cnfire_li2014_type) :: this
Expand All @@ -120,6 +121,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
class(soil_water_retention_curve_type), intent(in) :: soil_water_retention_curve
type(cnveg_state_type) , intent(inout) :: cnveg_state_inst
type(cnveg_carbonstate_type) , intent(inout) :: cnveg_carbonstate_inst
type(crop_type) , intent(in) :: crop_inst
real(r8) , intent(in) :: totlitc_col(bounds%begc:)
real(r8) , intent(in) :: decomp_cpools_vr_col(bounds%begc:,1:,1:)
real(r8) , intent(in) :: t_soi17cm_col(bounds%begc:)
Expand Down
4 changes: 3 additions & 1 deletion src/biogeochem/CNFireLi2016Mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
num_exposedvegp, filter_exposedvegp, num_noexposedvegp, filter_noexposedvegp, &
atm2lnd_inst, energyflux_inst, saturated_excess_runoff_inst, waterdiagnosticbulk_inst, &
wateratm2lndbulk_inst, waterstatebulk_inst, soilstate_inst, soil_water_retention_curve, &
cnveg_state_inst, cnveg_carbonstate_inst, totlitc_col, decomp_cpools_vr_col, t_soi17cm_col)
crop_inst, cnveg_state_inst, cnveg_carbonstate_inst, totlitc_col, decomp_cpools_vr_col, t_soi17cm_col)
!
! !DESCRIPTION:
! Computes column-level burned area
Expand All @@ -101,6 +101,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
use pftconMod , only: nc4_grass, nc3crop, ndllf_evr_tmp_tree
use pftconMod , only: nbrdlf_evr_trp_tree, nbrdlf_dcd_trp_tree, nbrdlf_evr_shrub
use dynSubgridControlMod , only : run_has_transient_landcover
use CropType , only: crop_type
!
! !ARGUMENTS:
class(cnfire_li2016_type) :: this
Expand All @@ -123,6 +124,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
class(soil_water_retention_curve_type), intent(in) :: soil_water_retention_curve
type(cnveg_state_type) , intent(inout) :: cnveg_state_inst
type(cnveg_carbonstate_type) , intent(inout) :: cnveg_carbonstate_inst
type(crop_type) , intent(in) :: crop_inst
real(r8) , intent(in) :: totlitc_col(bounds%begc:)
real(r8) , intent(in) :: decomp_cpools_vr_col(bounds%begc:,1:,1:)
real(r8) , intent(in) :: t_soi17cm_col(bounds%begc:)
Expand Down
88 changes: 44 additions & 44 deletions src/biogeochem/CNFireLi2021Mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -89,18 +89,19 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
num_exposedvegp, filter_exposedvegp, num_noexposedvegp, filter_noexposedvegp, &
atm2lnd_inst, energyflux_inst, saturated_excess_runoff_inst, waterdiagnosticbulk_inst, &
wateratm2lndbulk_inst, waterstatebulk_inst, soilstate_inst, soil_water_retention_curve, &
cnveg_state_inst, cnveg_carbonstate_inst, totlitc_col, decomp_cpools_vr_col, t_soi17cm_col)
crop_inst, cnveg_state_inst, cnveg_carbonstate_inst, totlitc_col, decomp_cpools_vr_col, t_soi17cm_col)
!
! !DESCRIPTION:
! Computes column-level burned area
!
! !USES:
use clm_time_manager , only: get_step_size_real, get_curr_days_per_year, get_curr_date, get_nstep
use clm_varcon , only: secspday, secsphr
use clm_varctl , only: spinup_state
use clm_varctl , only: spinup_state, use_crop
use pftconMod , only: nc4_grass, nc3crop, ndllf_evr_tmp_tree
use pftconMod , only: nbrdlf_evr_trp_tree, nbrdlf_dcd_trp_tree, nbrdlf_evr_shrub
use dynSubgridControlMod , only : run_has_transient_landcover
use CropType , only: crop_type
!
! !ARGUMENTS:
class(cnfire_li2021_type) :: this
Expand All @@ -123,6 +124,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
class(soil_water_retention_curve_type), intent(in) :: soil_water_retention_curve
type(cnveg_state_type) , intent(inout) :: cnveg_state_inst
type(cnveg_carbonstate_type) , intent(inout) :: cnveg_carbonstate_inst
type(crop_type) , intent(in) :: crop_inst
real(r8) , intent(in) :: totlitc_col(bounds%begc:)
real(r8) , intent(in) :: decomp_cpools_vr_col(bounds%begc:,1:,1:)
real(r8) , intent(in) :: t_soi17cm_col(bounds%begc:)
Expand All @@ -149,11 +151,9 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
real(r8) :: afuel !weight for arh and arh30
real(r8) :: btran_col(bounds%begc:bounds%endc)
logical :: transient_landcover ! whether this run has any prescribed transient landcover
real(r8), target :: prec60_col_target(bounds%begc:bounds%endc)
real(r8), target :: prec10_col_target(bounds%begc:bounds%endc)
real(r8), target :: prec30_col_target(bounds%begc:bounds%endc)
real(r8), target :: rh30_col_target(bounds%begc:bounds%endc)
real(r8), pointer :: prec60_col(:)
real(r8), pointer :: prec10_col(:)
real(r8), pointer :: prec30_col(:)
real(r8), pointer :: rh30_col(:)
!-----------------------------------------------------------------------

Expand Down Expand Up @@ -192,8 +192,7 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
forc_t => atm2lnd_inst%forc_t_downscaled_col , & ! Input: [real(r8) (:) ] downscaled atmospheric temperature (Kelvin)
forc_rain => wateratm2lndbulk_inst%forc_rain_downscaled_col , & ! Input: [real(r8) (:) ] downscaled rain
forc_snow => wateratm2lndbulk_inst%forc_snow_downscaled_col , & ! Input: [real(r8) (:) ] downscaled snow
prec60 => wateratm2lndbulk_inst%prec60_patch , & ! Input: [real(r8) (:) ] 60-day running mean of tot. precipitation
prec10 => wateratm2lndbulk_inst%prec10_patch , & ! Input: [real(r8) (:) ] 10-day running mean of tot. precipitation
prec30 => wateratm2lndbulk_inst%prec30_patch , &
rh30 => wateratm2lndbulk_inst%rh30_patch , & ! Input: [real(r8) (:) ] 10-day running mean of tot. precipitation
dwt_smoothed => cnveg_state_inst%dwt_smoothed_patch , & ! Input: [real(r8) (:) ] change in patch weight (-1 to 1) on the gridcell, smoothed over the year
cropf_col => cnveg_state_inst%cropf_col , & ! Input: [real(r8) (:) ] cropland fraction in veg column
Expand Down Expand Up @@ -237,21 +236,18 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
leafc_col => cnveg_carbonstate_inst%leafc_col , & ! Output: [real(r8) (:) ] leaf carbon at column level
deadstemc_col => cnveg_carbonstate_inst%deadstemc_col , & ! Output: [real(r8) (:) ] deadstem carbon at column level
fuelc => cnveg_carbonstate_inst%fuelc_col , & ! Output: [real(r8) (:) ] fuel load coutside cropland
fuelc_crop => cnveg_carbonstate_inst%fuelc_crop_col & ! Output: [real(r8) (:) ] fuel load for cropland
fuelc_crop => cnveg_carbonstate_inst%fuelc_crop_col , & ! Output: [real(r8) (:) ] fuel load for cropland
croplive => crop_inst%croplive_patch & ! Input: [logical (:) ] flag, true if planted, not harvested
)

transient_landcover = run_has_transient_landcover()

!pft to column average
prec10_col =>prec10_col_target
prec30_col =>prec30_col_target
call p2c(bounds, num_soilc, filter_soilc, &
prec10(bounds%begp:bounds%endp), &
prec10_col(bounds%begc:bounds%endc))
prec30(bounds%begp:bounds%endp), &
prec30_col(bounds%begc:bounds%endc))

prec60_col =>prec60_col_target
call p2c(bounds, num_soilc, filter_soilc, &
prec60(bounds%begp:bounds%endp), &
prec60_col(bounds%begc:bounds%endc))

rh30_col =>rh30_col_target
call p2c(bounds, num_soilc, filter_soilc, &
Expand Down Expand Up @@ -301,9 +297,9 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
if( patch%itype(p) > nc4_grass )then
cropf_col(c) = cropf_col(c) + patch%wtcol(p)
end if
! For natural vegetation (non-crop and non-bare-soil)
if( patch%itype(p) >= ndllf_evr_tmp_tree .and. patch%itype(p) <= nc4_grass )then
lfwt(c) = lfwt(c) + patch%wtcol(p)
! For natural vegetation
if(patch%itype(p) <= nc4_grass )then
lfwt(c) = lfwt(c) + patch%wtgcell(p)
end if
end do
!
Expand Down Expand Up @@ -522,21 +518,18 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
hdmlf = this%forc_hdm(g)

! calculate human density impact on ag. fire
fhd = 0.04_r8+0.96_r8*exp(-1._r8*SHR_CONST_PI*(hdmlf/350._r8)**0.5_r8)
fhd = 0.2_r8+0.8_r8*exp(-1._r8*SHR_CONST_PI*(hdmlf/400._r8))

! calculate impact of GDP on ag. fire
fgdp = 0.01_r8+0.99_r8*exp(-1._r8*SHR_CONST_PI*(gdp_lf(c)/10._r8))
fgdp = 0.05_r8+0.95_r8*exp(-1._r8*SHR_CONST_PI*(gdp_lf(c)/20._r8))

! calculate burned area
fb = max(0.0_r8,min(1.0_r8,(fuelc_crop(c)-lfuel)/(ufuel-lfuel)))

! crop fire only for generic crop types at this time
! managed crops are treated as grasses if crop model is turned on
baf_crop(c) = baf_crop(c) + cropfire_a1/secsphr*fhd*fgdp*patch%wtcol(p)
if( fb*fhd*fgdp*patch%wtcol(p) > 0._r8)then
burndate(p)=kda
end if
end if
if((use_crop .and. (.not. croplive(p))) &
.or. (.not. use_crop)) then
burndate(p) = kda
baf_crop(c) = baf_crop(c)+cropfire_a1 / secsphr * fhd * fgdp * patch%wtcol(p)
end if
end if
end do
!
! calculate peatland fire
Expand All @@ -545,9 +538,12 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
c = filter_soilc(fc)
g= col%gridcell(c)
if(grc%latdeg(g) < cnfire_const%borealat )then
if((trotr1_col(c)+trotr2_col(c))*col%wtgcell(c)<=0.8_r8.and.trotr1_col(c)+trotr2_col(c)>0.0_r8) then
baf_peatf(c) = non_boreal_peatfire_c/secsphr*max(0._r8, &
min(1._r8,(4.0_r8-prec60_col(c)*secspday)/ &
4.0_r8))**2*peatf_lf(c)*(1._r8-fsat(c))
min(1._r8,(1._r8-prec30_col(c)*secspday/6._r8)))*peatf_lf(c)
else
baf_peatf(c)=0._r8
end if
else
baf_peatf(c) = boreal_peatfire_c/secsphr*exp(-SHR_CONST_PI*(max(wf2(c),0._r8)/0.3_r8))* &
max(0._r8,min(1._r8,(tsoi17(c)-SHR_CONST_TKFRZ)/10._r8))*peatf_lf(c)* &
Expand Down Expand Up @@ -593,7 +589,6 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
end if
fuelc(c) = fuelc(c)/(1._r8-cropf_col(c))
fb = max(0.0_r8,min(1.0_r8,(fuelc(c)-lfuel)/(ufuel-lfuel)))
if (trotr1_col(c)+trotr2_col(c)<=0.6_r8) then
afuel =min(1._r8,max(0._r8,(fuelc(c)-2500._r8)/(5000._r8-2500._r8)))
arh=1._r8-max(0._r8, min(1._r8,(forc_rh(g)-rh_low)/(rh_hgh-rh_low)))
arh30=1._r8-max(cnfire_params%prh30, min(1._r8,rh30_col(c)/90._r8))
Expand All @@ -605,19 +600,24 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
end if
lh = pot_hmn_ign_counts_alpha*6.8_r8*hdmlf**(0.43_r8)/30._r8/24._r8
fs = 1._r8-(0.01_r8+0.98_r8*exp(-0.025_r8*hdmlf))
if (trotr1_col(c)+trotr2_col(c)<=0.6_r8) then
ig = (lh+this%forc_lnfm(g)/(5.16_r8+2.16_r8* &
cos(SHR_CONST_PI/180._r8*3*min(60._r8,abs(grc%latdeg(g)))))* &
cnfire_params%ignition_efficiency)*(1._r8-fs)*(1._r8-cropf_col(c))
cnfire_params%ignition_efficiency)*(1._r8-fs)* &
(lfwt(c)**0.5)
else
ig = this%forc_lnfm(g)/(5.16_r8+2.16_r8* &
cos(SHR_CONST_PI/180._r8*3*min(60._r8,abs(grc%latdeg(g)))))* &
cnfire_params%ignition_efficiency*(1._r8-fs)* &
(lfwt(c)**0.5)
end if
nfire(c) = ig/secsphr*fb*fire_m*lgdp_col(c) !fire counts/km2/sec
Lb_lf = 1._r8+10._r8*(1._r8-EXP(-0.06_r8*forc_wind(g)))
spread_m = fire_m**0.5_r8
fd_col(c)=(lfwt(c)*lgdp1_col(c)*lpop_col(c))**0.5_r8 * fd_col(c)
farea_burned(c) = min(1._r8,(cnfire_const%g0*spread_m*fsr_col(c)* &
fd_col(c)/1000._r8)**2*lgdp1_col(c)* &
lpop_col(c)*nfire(c)*SHR_CONST_PI*Lb_lf+ &
fd_col(c)/1000._r8)**2*nfire(c)*SHR_CONST_PI*Lb_lf+ &
baf_crop(c)+baf_peatf(c)) ! fraction (0-1) per sec
else
farea_burned(c)=min(1._r8,baf_crop(c)+baf_peatf(c))
end if
!
! if landuse change data is used, calculate deforestation fires and
! add it in the total of burned area fraction
Expand All @@ -629,17 +629,17 @@ subroutine CNFireArea (this, bounds, num_soilc, filter_soilc, num_soilp, filter_
fbac1(c) = 0._r8
farea_burned(c) = baf_crop(c)+baf_peatf(c)
else
cri = (4.0_r8*trotr1_col(c)+1.8_r8*trotr2_col(c))/(trotr1_col(c)+trotr2_col(c))
cli = (max(0._r8,min(1._r8,(cri-prec60_col(c)*secspday)/cri))**0.5)* &
(max(0._r8,min(1._r8,(cri-prec10_col(c)*secspday)/cri))**0.5)* &
cri = (1.4_r8*trotr1_col(c)+0.5_r8*trotr2_col(c))/(trotr1_col(c)+trotr2_col(c))
cli = max(0._r8,min(1._r8,1._r8-prec30_col(c)*secspday/cri))* &
(15._r8*min(0.0016_r8,dtrotr_col(c)/dt*dayspyr*secspday)+0.009_r8)* &
max(0._r8,min(1._r8,(0.25_r8-(forc_rain(c)+forc_snow(c))*secsphr)/0.25_r8))
farea_burned(c) = fb*cli*(cli_scale/secspday)+baf_crop(c)+baf_peatf(c)

farea_burned(c) = farea_burned(c)+fb*cli*(0.01_r8/secspday)
! burned area out of conversion region due to land use fire
fbac1(c) = max(0._r8,fb*cli*(cli_scale/secspday) - 2.0_r8*lfc(c)/dt)
end if
! total burned area out of conversion
fbac(c) = fbac1(c)+baf_crop(c)+baf_peatf(c)
fbac(c) = farea_burned(c) + fbac1(c)
else
fbac(c) = farea_burned(c)
end if
Expand Down
Loading
Loading