Skip to content
Open
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
1 change: 1 addition & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
| james-bruten-mo | James Bruten | Met Office | 2025-12-09 |
| ppharris | Phil Harris | UKCEH | 2025-12-18 |
| maggiehendry | Maggie Hendry | Met Office | 2026-01-26 |
| OliPerkins1987 | Ol Perkins | University of East Anglia / King's London | 2026-02-03 |
104 changes: 104 additions & 0 deletions src/control/shared/fire_vars_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,38 @@ MODULE fire_vars_mod
! The population density (ppl/km2)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wealth_index(:)
! The Human Develoment Index (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_arable_ba(:)
! WHAM! crop residue burning (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_pasture_ba(:)
! WHAM! pastoral burning (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_other_man(:)
! WHAM! vegetation management burning (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_other_ag(:)
! WHAM! other agricultural burning (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_ignitions(:)
! WHAM! unmanaged fire counts (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_escaped(:)
! Escaped prescribed fires (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_suppression(:)
! WHAM! fire suppression intensity (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: road_density(:)
! Road density (m / km-2)
REAL(KIND=real_jlslsm), ALLOCATABLE :: flammability_ft(:,:)
! PFT-specific flammability
REAL(KIND=real_jlslsm), ALLOCATABLE :: burnt_area(:)
! Gridbox mean burnt area fraction (/s)
REAL(KIND=real_jlslsm), ALLOCATABLE :: burnt_area_ft(:,:)
! PFT burnt area fraction (/s)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_ba(:)
! Gridbox mean BA from wham managed fires (/s) (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: wham_ba_ft(:,:)
! proportion of burnt area from managed fire (1)
REAL(KIND=real_jlslsm), ALLOCATABLE :: intensity_ft(:,:)
! PFT-specific fireline intensity
REAL(KIND=real_jlslsm), ALLOCATABLE :: intensity_clim(:,:)
! PFT-specific impact of climate on fireline intensity
REAL(KIND=real_jlslsm), ALLOCATABLE :: intensity_wham(:,:)
! PFT-specific impact of management on fireline intensity
REAL(KIND=real_jlslsm), ALLOCATABLE :: emitted_carbon(:)
! Gridbox mean emitted carbon (kgC/m2/s)
REAL(KIND=real_jlslsm), ALLOCATABLE :: emitted_carbon_ft(:,:)
Expand Down Expand Up @@ -176,9 +202,22 @@ MODULE fire_vars_mod
REAL(KIND=real_jlslsm), POINTER :: flash_rate(:)
REAL(KIND=real_jlslsm), POINTER :: pop_den(:)
REAL(KIND=real_jlslsm), POINTER :: wealth_index(:)
REAL(KIND=real_jlslsm), POINTER :: wham_arable_ba(:)
REAL(KIND=real_jlslsm), POINTER :: wham_pasture_ba(:)
REAL(KIND=real_jlslsm), POINTER :: wham_other_man(:)
REAL(KIND=real_jlslsm), POINTER :: wham_other_ag(:)
REAL(KIND=real_jlslsm), POINTER :: wham_ignitions(:)
REAL(KIND=real_jlslsm), POINTER :: wham_escaped(:)
REAL(KIND=real_jlslsm), POINTER :: wham_suppression(:)
REAL(KIND=real_jlslsm), POINTER :: road_density(:)
REAL(KIND=real_jlslsm), POINTER :: flammability_ft(:,:)
REAL(KIND=real_jlslsm), POINTER :: burnt_area(:)
REAL(KIND=real_jlslsm), POINTER :: burnt_area_ft(:,:)
REAL(KIND=real_jlslsm), POINTER :: wham_ba(:)
REAL(KIND=real_jlslsm), POINTER :: wham_ba_ft(:,:)
REAL(KIND=real_jlslsm), POINTER :: intensity_ft(:,:)
REAL(KIND=real_jlslsm), POINTER :: intensity_clim(:,:)
REAL(KIND=real_jlslsm), POINTER :: intensity_wham(:,:)
REAL(KIND=real_jlslsm), POINTER :: emitted_carbon(:)
REAL(KIND=real_jlslsm), POINTER :: emitted_carbon_ft(:,:)
REAL(KIND=real_jlslsm), POINTER :: emitted_carbon_DPM(:)
Expand Down Expand Up @@ -336,7 +375,20 @@ SUBROUTINE fire_vars_alloc(land_pts,npft, fire_vars_data)
ALLOCATE(fire_vars_data%pop_den(land_pts))
ALLOCATE(fire_vars_data%wealth_index(land_pts))
ALLOCATE(fire_vars_data%flash_rate(land_pts))
ALLOCATE(fire_vars_data%wham_arable_ba(land_pts))
ALLOCATE(fire_vars_data%wham_pasture_ba(land_pts))
ALLOCATE(fire_vars_data%wham_other_man(land_pts))
ALLOCATE(fire_vars_data%wham_other_ag(land_pts))
ALLOCATE(fire_vars_data%wham_ignitions(land_pts))
ALLOCATE(fire_vars_data%wham_escaped(land_pts))
ALLOCATE(fire_vars_data%wham_suppression(land_pts))
ALLOCATE(fire_vars_data%road_density(land_pts))
ALLOCATE(fire_vars_data%flammability_ft(land_pts,npft))
ALLOCATE(fire_vars_data%wham_ba(land_pts))
ALLOCATE(fire_vars_data%wham_ba_ft(land_pts,npft))
ALLOCATE(fire_vars_data%intensity_ft(land_pts,npft))
ALLOCATE(fire_vars_data%intensity_clim(land_pts,npft))
ALLOCATE(fire_vars_data%intensity_wham(land_pts,npft))

fire_vars_data%burnt_area(:) = 0.0
fire_vars_data%burnt_area_ft(:,:) = 0.0
Expand Down Expand Up @@ -402,8 +454,21 @@ SUBROUTINE fire_vars_alloc(land_pts,npft, fire_vars_data)
fire_vars_data%fire_em_DMS_RPM(:) = 0.0
fire_vars_data%pop_den(:) = 0.0
fire_vars_data%wealth_index(:) = 0.0
fire_vars_data%wham_arable_ba(:) = 0.0
fire_vars_data%wham_pasture_ba(:) = 0.0
fire_vars_data%wham_other_man(:) = 0.0
fire_vars_data%wham_other_ag(:) = 0.0
fire_vars_data%wham_ignitions(:) = 0.0
fire_vars_data%wham_escaped(:) = 0.0
fire_vars_data%wham_suppression(:) = 0.0
fire_vars_data%road_density(:) = 0.0
fire_vars_data%flash_rate(:) = 0.0
fire_vars_data%flammability_ft(:,:) = 0.0
fire_vars_data%wham_ba(:) = 0.0
fire_vars_data%wham_ba_ft(:,:) = 0.0
fire_vars_data%intensity_ft(:,:) = 0.0
fire_vars_data%intensity_clim(:,:) = 0.0
fire_vars_data%intensity_wham(:,:) = 0.0

IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle)
RETURN
Expand Down Expand Up @@ -499,8 +564,21 @@ SUBROUTINE fire_vars_dealloc(fire_vars_data)
DEALLOCATE(fire_vars_data%fire_em_DMS_RPM)
DEALLOCATE(fire_vars_data%pop_den)
DEALLOCATE(fire_vars_data%wealth_index)
DEALLOCATE(fire_vars_data%wham_arable_ba)
DEALLOCATE(fire_vars_data%wham_pasture_ba)
DEALLOCATE(fire_vars_data%wham_other_man)
DEALLOCATE(fire_vars_data%wham_other_ag)
DEALLOCATE(fire_vars_data%wham_ignitions)
DEALLOCATE(fire_vars_data%wham_escaped)
DEALLOCATE(fire_vars_data%wham_suppression)
DEALLOCATE(fire_vars_data%road_density)
DEALLOCATE(fire_vars_data%flash_rate)
DEALLOCATE(fire_vars_data%flammability_ft)
DEALLOCATE(fire_vars_data%wham_ba)
DEALLOCATE(fire_vars_data%wham_ba_ft)
DEALLOCATE(fire_vars_data%intensity_ft)
DEALLOCATE(fire_vars_data%intensity_clim)
DEALLOCATE(fire_vars_data%intensity_wham)

IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle)
RETURN
Expand Down Expand Up @@ -595,8 +673,21 @@ SUBROUTINE fire_vars_assoc(fire_vars, fire_vars_data)
fire_vars%fire_em_DMS_RPM => fire_vars_data%fire_em_DMS_RPM
fire_vars%pop_den => fire_vars_data%pop_den
fire_vars%wealth_index => fire_vars_data%wealth_index
fire_vars%wham_arable_ba => fire_vars_data%wham_arable_ba
fire_vars%wham_pasture_ba => fire_vars_data%wham_pasture_ba
fire_vars%wham_other_man => fire_vars_data%wham_other_man
fire_vars%wham_other_ag => fire_vars_data%wham_other_ag
fire_vars%wham_ignitions => fire_vars_data%wham_ignitions
fire_vars%wham_escaped => fire_vars_data%wham_escaped
fire_vars%wham_suppression => fire_vars_data%wham_suppression
fire_vars%road_density => fire_vars_data%road_density
fire_vars%flash_rate => fire_vars_data%flash_rate
fire_vars%flammability_ft => fire_vars_data%flammability_ft
fire_vars%wham_ba => fire_vars_data%wham_ba
fire_vars%wham_ba_ft => fire_vars_data%wham_ba_ft
fire_vars%intensity_ft => fire_vars_data%intensity_ft
fire_vars%intensity_clim => fire_vars_data%intensity_clim
fire_vars%intensity_wham => fire_vars_data%intensity_wham

IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle)
RETURN
Expand Down Expand Up @@ -688,8 +779,21 @@ SUBROUTINE fire_vars_nullify(fire_vars)
NULLIFY(fire_vars%fire_em_DMS_RPM)
NULLIFY(fire_vars%pop_den)
NULLIFY(fire_vars%wealth_index)
NULLIFY(fire_vars%wham_arable_ba)
NULLIFY(fire_vars%wham_pasture_ba)
NULLIFY(fire_vars%wham_other_man)
NULLIFY(fire_vars%wham_other_ag)
NULLIFY(fire_vars%wham_ignitions)
NULLIFY(fire_vars%wham_escaped)
NULLIFY(fire_vars%wham_suppression)
NULLIFY(fire_vars%road_density)
NULLIFY(fire_vars%flash_rate)
NULLIFY(fire_vars%flammability_ft)
NULLIFY(fire_vars%wham_ba)
NULLIFY(fire_vars%wham_ba_ft)
NULLIFY(fire_vars%intensity_ft)
NULLIFY(fire_vars%intensity_clim)
NULLIFY(fire_vars%intensity_wham)

IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle)
RETURN
Expand Down
41 changes: 32 additions & 9 deletions src/control/shared/jules_vegetation_mod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,19 @@ MODULE jules_vegetation_mod
l_trif_fire = .FALSE., &
! Switch used to control whether interactive fire is used
! T => if l_inferno is also true, g_burn is calculated in INFERNO
! and passed to TRIFFID to calculate emissions and vegetation
! dynamics
! T => if l_inferno is false, interactive fire is calculated via
! ancillary if provided, and is 0 if not provided
! F => g_burn is calculated via ancillary if provided, and is 0 if
! not provided
! and passed to TRIFFID to calculate emissions and vegetation
! dynamics
! T => if l_inferno is false, interactive fire is calculated via
! ancillary if provided, and is 0 if not provided
! F => g_burn is calculated via ancillary if provided, and is 0 if
! not provided
l_inferno_wham = .FALSE., &
! Switch used to control whether INFERNO is run using inputs from the
! WHAM! agent-based model of human fire use & mgmt.
! T => managed fire inputs, ignitions & suppression should come from
! WHAM!, and ignition_method should be set to 4 (int)
! F => managed fire is not included, and ignitions are derived from
! population density & HDI
l_use_pft_psi = .FALSE., &
! Switch used to control what parameters are used in the calculation
! of the soil moisture stress factor
Expand Down Expand Up @@ -239,6 +246,13 @@ MODULE jules_vegetation_mod
! IGNITION_METHOD=2:Constant (Human - 1.5 per km2 per s)
! Varying (Lightning - see Pechony and Shindell,2009)
! IGNITION_METHOD=3:Vary Human and Lightning (Pechony and Shindell,2009)
! IGNITION_METHOD=4:Use WHAM! ignitions (Perkins et al., 2024, GMD)
fire_mortality_method = 1, &
! Switch for the method of calculation for fire mortality
! fire_mortality_method = 1: uniform mortality per PFT (per Burton 2019)
! fire_mortality_method = 2: mortality per PFT adjusted for soil moisture
! fire_mortality_method = 3: explicit fireline intensity-based mortality
! (see Perkins et al., 2026)
fsmc_shape = 0, &
! shape of the soil moisture stress function fsmc
! 0: piece-wise linear in vol. soil moisture.
Expand All @@ -259,6 +273,7 @@ MODULE jules_vegetation_mod
INTEGER, PARAMETER :: ignition_constant = 1
INTEGER, PARAMETER :: ignition_vary_natural = 2
INTEGER, PARAMETER :: ignition_vary_natural_human = 3
INTEGER, PARAMETER :: ignition_wham = 4

INTEGER :: &
phenol_period = imdi, &
Expand Down Expand Up @@ -344,7 +359,8 @@ MODULE jules_vegetation_mod
l_bvoc_emis, l_o3_damage, can_model, can_rad_mod, ilayers, &
frac_min, frac_seed, pow, l_landuse, l_leaf_n_resp_fix, l_stem_resp_fix, &
l_nitrogen, l_vegcan_soilfx, l_trif_crop, l_trif_fire, &
l_inferno, ignition_method, l_vegdrag_pft, l_rsl_scalar, &
l_inferno, l_inferno_wham, ignition_method, fire_mortality_method, &
l_vegdrag_pft, l_rsl_scalar, &
cd_leaf, c1_usuh, c2_usuh, c3_usuh, dsj_coef, dsv_coef, jv25_coef, &
act_j_coef, act_v_coef, &
n_alloc_jmax, n_alloc_vcmax, n_day_photo_acclim, &
Expand Down Expand Up @@ -778,10 +794,11 @@ SUBROUTINE check_jules_vegetation()
! Check a suitable ignition_method was given
IF ( ignition_method /= ignition_constant .AND. &
ignition_method /= ignition_vary_natural .AND. &
ignition_method /= ignition_vary_natural_human ) THEN
ignition_method /= ignition_vary_natural_human .AND. &
ignition_method /= ignition_wham ) THEN
errcode = 101
CALL ereport("check_jules_vegetation", errcode, &
'ignition_method must be 1, 2 or 3')
'ignition_method must be 1, 2, 3 or 4')
END IF

IF ( fsmc_shape == 1 .AND. .NOT. l_use_pft_psi ) THEN
Expand Down Expand Up @@ -1029,6 +1046,7 @@ SUBROUTINE read_nml_jules_vegetation (unitnumber)
INTEGER :: can_rad_mod
INTEGER :: ilayers
INTEGER :: ignition_method
INTEGER :: fire_mortality_method
INTEGER :: photo_acclim_model
INTEGER :: photo_act_model
INTEGER :: photo_jv_model
Expand Down Expand Up @@ -1074,6 +1092,7 @@ SUBROUTINE read_nml_jules_vegetation (unitnumber)
LOGICAL :: l_scale_resp_pm
LOGICAL :: l_vegcan_soilfx
LOGICAL :: l_inferno
LOGICAL :: l_inferno_wham
LOGICAL :: l_vegdrag_pft(npft_max)
LOGICAL :: l_rsl_scalar
LOGICAL :: l_spec_veg_z0
Expand Down Expand Up @@ -1103,6 +1122,7 @@ SUBROUTINE read_nml_jules_vegetation (unitnumber)
my_nml % can_rad_mod = can_rad_mod
my_nml % ilayers = ilayers
my_nml % ignition_method = ignition_method
my_nml % fire_mortality_method = fire_mortality_method
my_nml % photo_acclim_model = photo_acclim_model
my_nml % photo_act_model = photo_act_model
my_nml % photo_jv_model = photo_jv_model
Expand Down Expand Up @@ -1148,6 +1168,7 @@ SUBROUTINE read_nml_jules_vegetation (unitnumber)
my_nml % l_scale_resp_pm = l_scale_resp_pm
my_nml % l_vegcan_soilfx = l_vegcan_soilfx
my_nml % l_inferno = l_inferno
my_nml % l_inferno_wham = l_inferno_wham
my_nml % l_vegdrag_pft = l_vegdrag_pft
my_nml % l_rsl_scalar = l_rsl_scalar
my_nml % l_spec_veg_z0 = l_spec_veg_z0
Expand All @@ -1166,6 +1187,7 @@ SUBROUTINE read_nml_jules_vegetation (unitnumber)
can_rad_mod = my_nml % can_rad_mod
ilayers = my_nml % ilayers
ignition_method = my_nml % ignition_method
fire_mortality_method = my_nml % fire_mortality_method
photo_acclim_model = my_nml % photo_acclim_model
photo_act_model = my_nml % photo_act_model
photo_jv_model = my_nml % photo_jv_model
Expand Down Expand Up @@ -1211,6 +1233,7 @@ SUBROUTINE read_nml_jules_vegetation (unitnumber)
l_scale_resp_pm = my_nml % l_scale_resp_pm
l_vegcan_soilfx = my_nml % l_vegcan_soilfx
l_inferno = my_nml % l_inferno
l_inferno_wham = my_nml % l_inferno_wham
l_vegdrag_pft = my_nml % l_vegdrag_pft
l_rsl_scalar = my_nml % l_rsl_scalar
l_spec_veg_z0 = my_nml % l_spec_veg_z0
Expand Down
Loading
Loading