Skip to content

Commit

Permalink
New module firebrand_spotting for WRF-Fire (wrf-model#1540)
Browse files Browse the repository at this point in the history
TYPE: new feature

KEYWORDS: fire firebrand spotting Lagrangian transport passive advection burnout 

SOURCE: Maria Frediani, Tim W. Juliano (NCAR-RAL)

DESCRIPTION OF CHANGES:
The new module firebrand_spotting for WRF-Fire is a passive Lagrangian transport parameterization to 
advect firebrands. The Firebrand Spotting parameterization was developed for the WRF-Fire component of the 
WRF model versions starting at 4.0.1. The parameterization couples to WRF-Fire and uses a Lagrangian 
particle transport framework to advect firebrands in the innermost nest of the domain. 

The parameterization runs in the atmospheric model inner domain and does not modify model variables (no 
feedback to WRF or WRF-Fire). The code comprises two independent modules, one with the physical 
processes and another with the necessary MPI wrapping routines that were not yet part of the WRF source 
code. The motivation to separate the MPI routines in an independent module was to enable them to be used in 
other model parameterizations through a USE statement without importing the firebrand spotting component. 
The Firebrand Spotting variables are part of Registry.fire and the subroutine is called from start_em.F and 
solve_em.F, after all the physics parameterizations and relevant halos are completed.

When fires are active, the parameterization identifies areas at risk of fire spotting by modeling transport 
and physical processes of individual firebrands. Firebrands are released at multiple heights from grid points 
along the fire front with high fire rate-of-spread and denser fuel loads. Particles are transported with the 
atmospheric flow and consumed by combustion. Firebrands may burnout entirely or land, once they descend 
below a given height threshold. Particles that land before complete burnout are accumulated in a 2-D field 
during regular intervals.

The likelihood of new fire ignitions due to spotting is computed using the ratio of landed firebrands per grid 
point to the total number of landed particles within the corresponding time interval between model outputs. 
The ratios are then scaled by a function of fuel load and moisture content at the corresponding grid points.

LIST OF MODIFIED FILES:
M       Registry/Registry.EM_COMMON
M       Registry/registry.fire
M       dyn_em/depend.dyn_em
M       dyn_em/solve_em.F
M       dyn_em/start_em.F
M       main/depend.common
M       phys/Makefile
A       phys/module_firebrand_spotting.F
A       phys/module_firebrand_spotting_mpi.F

TESTS CONDUCTED: 
1. The module was designed for high-resolution simulations and tested using large-eddy simulation (LES) in 
the inner nest. Simulations for various case studies in Colorado have been done.  
2. All tests have passed (latest commit: afc9142, after switching pbl from MYNN to YSU). There were no 
differences among the serial and MPI builds with 1 and 12 processors. The tests were all done from a restart 
file. The time step for these runs was 5s and the outputs were compared after 20s, 40s, and 1 min.
3. Jenkins tests are all passing.

RELEASE NOTE: A new module to parameterize firebrand spotting for WRF-Fire is added. This is a passive Lagrangian transport scheme to transport and burnout firebrands generated at the fire front. The scheme is activated when ifire == 2 by setting the namelist option fs_firebrand_gen_lim to an integer greater than zero (default is 0, i.e. scheme is off). It runs with dmpar and serially compiled code and in the inner nest (grid_id == max_dom). It was designed and tested using a mesoscale to LES domain configuration.
  • Loading branch information
mefrediani committed Jan 19, 2022
1 parent 75bfe6d commit 609c2fc
Show file tree
Hide file tree
Showing 9 changed files with 4,869 additions and 10 deletions.
1 change: 1 addition & 0 deletions Registry/Registry.EM_COMMON
Original file line number Diff line number Diff line change
Expand Up @@ -3372,6 +3372,7 @@ halo HALO_EM_D3_3 dyn_em 24:u_1,u_2,v_1,v_2,w_1,w_2,t_1,t_2,ph_1,ph_2,tke_1
halo HALO_EM_D3_5 dyn_em 48:u_1,u_2,v_1,v_2,w_1,w_2,t_1,t_2,ph_1,ph_2,tke_1,tke_2,moist,chem,tracer,scalar;4:mu_1,mu_2
halo HALO_EM_E_3 dyn_em 24:u_1,u_2,v_1,v_2,w_1,w_2,t_1,t_2,ph_1,ph_2,tke_1,tke_2,;4:mu_1,mu_2
halo HALO_EM_E_5 dyn_em 48:u_1,u_2,v_1,v_2,w_1,w_2,t_1,t_2,ph_1,ph_2,tke_1,tke_2,;4:mu_1,mu_2
halo HALO_FIREBRAND_SPOTTING_5 dyn_em 48:muts,al
halo HALO_EM_MOIST_E_3 dyn_em 24:moist
halo HALO_EM_MOIST_E_5 dyn_em 48:moist
halo HALO_EM_MOIST_E_7 dyn_em 80:moist
Expand Down
146 changes: 139 additions & 7 deletions Registry/registry.fire

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion dyn_em/depend.dyn_em
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,7 @@ start_em.o: module_bc_em.o \
../phys/module_diag_zld.o \
../phys/module_diag_trad_fields.o \
../phys/module_fr_fire_driver_wrf.o \
../phys/module_firebrand_spotting.o \
$(CF)

solve_em.o: module_small_step_em.o \
Expand Down Expand Up @@ -280,7 +281,8 @@ solve_em.o: module_small_step_em.o \
../phys/module_microphysics_driver.o \
../phys/module_microphysics_zero_out.o \
../phys/module_physics_addtendc.o \
../phys/module_checkerror.o
../phys/module_checkerror.o \
../phys/module_firebrand_spotting.o

module_convtrans_prep.o :

Expand Down
51 changes: 50 additions & 1 deletion dyn_em/solve_em.F
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ SUBROUTINE solve_em ( grid , config_flags &
,period_bdy_em_tracer_sub,period_em_da_sub,period_em_hydro_uv_sub &
,period_em_f_sub,period_em_g_sub &
,halo_em_f_1_sub,halo_em_init_4_sub,halo_em_thetam_sub,period_em_thetam_sub &
,halo_em_d_pv_sub
,halo_em_d_pv_sub,halo_firebrand_spotting_5_sub
#endif
USE module_utility
! Mediation layer modules
Expand Down Expand Up @@ -78,6 +78,7 @@ SUBROUTINE solve_em ( grid , config_flags &
USE module_llxy, ONLY : proj_cassini
USE module_avgflx_em, ONLY : zero_avgflx, upd_avgflx
USE module_cpl, ONLY : coupler_on, cpl_settime, cpl_store_input
USE module_firebrand_spotting, ONLY : firebrand_spotting_em_driver

IMPLICIT NONE

Expand Down Expand Up @@ -4746,6 +4747,54 @@ SUBROUTINE solve_em ( grid , config_flags &
ENDIF
#endif
!-----------------------------------------------------------------------
! firebrand spotting (passive Lagrangian particle transport,
! tracks firebrand physics properties)
!-----------------------------------------------------------------------
IF(config_flags%ifire == 2 .AND. &
! Check if spotting is on
config_flags%fs_firebrand_gen_lim > 0 .AND. &
! Check if this is the inner most grid
config_flags%max_dom == grid%id) THEN
#ifdef DM_PARALLEL
CALL wrf_debug ( 200 , ' call HALO_FIREBRAND_SPOTTING' )
# include "HALO_FIREBRAND_SPOTTING_5.inc"
#endif
CALL wrf_debug ( 3 , 'solve: calling firebrand_spotting_em_driver...' )
CALL firebrand_spotting_em_driver ( &
cf = config_flags, &
grid = grid, &
fs_p_id = grid%fs_p_id, &
fs_p_dt = grid%fs_p_dt, &
fs_p_x = grid%fs_p_x, &
fs_p_y = grid%fs_p_y, &
fs_p_z = grid%fs_p_z, &
fs_gen_inst = grid%fs_gen_inst, &
fs_p_mass = grid%fs_p_mass, &
fs_p_diam = grid%fs_p_diam, &
fs_p_effd = grid%fs_p_effd, &
fs_p_temp = grid%fs_p_temp, &
fs_p_tvel = grid%fs_p_tvel, &
fs_last_gen_dt= grid%fs_last_gen_dt, &
fs_gen_idmax = grid%fs_gen_idmax, &
fs_fire_ROSdt = grid%fs_fire_ROSdt, &
fs_fire_area = grid%fs_fire_area, &
fs_count_landed_all = grid%fs_count_landed_all, &
fs_count_landed_hist = grid%fs_count_landed_hist, &
fs_landing_mask = grid%fs_landing_mask, &
fs_spotting_lkhd = grid%fs_spotting_lkhd, &
fs_frac_landed = grid%fs_frac_landed, &
fs_fuel_spotting_risk = grid%fs_fuel_spotting_risk, &
fs_count_reset = grid%fs_count_reset)
ENDIF
! end of firebrand spotting
!-----------------------------------------------------------------------
! Max values of CFL for adaptive time step scheme
DEALLOCATE(max_vert_cfl_tmp)
Expand Down
43 changes: 43 additions & 0 deletions dyn_em/start_em.F
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ SUBROUTINE start_domain_em ( grid, allowed_to_read &
USE module_sf_noahmpdrv, ONLY : groundwater_init
USE module_lightning_driver, ONLY : lightning_init
USE module_fr_fire_driver_wrf, ONLY : fire_driver_em_init
USE module_firebrand_spotting, ONLY : firebrand_spotting_em_init
USE module_stoch, ONLY : setup_rand_perturb, rand_seed, update_stoch, initialize_stoch
USE module_trajectory, ONLY : trajectory_init
#if (WRF_CHEM == 1)
Expand Down Expand Up @@ -2177,6 +2178,48 @@ SUBROUTINE start_domain_em ( grid, allowed_to_read &
,ips,ipe, kps,kpe, jps,jpe )
CALL wrf_debug ( 100 , 'start_domain_em: After call to fire_driver_em_init' )
!-----------------------------------------------------------------------
! fire spotting (passive Lagrangian particle transport, tracks
! firebrand physics properties)
!-----------------------------------------------------------------------
IF (config_flags%fs_firebrand_gen_lim > 0) THEN
IF (config_flags%max_dom == grid%id) THEN
WRITE (message,*) 'SPFire_init: In inner most grid_id: ', grid%id, ' of ', config_flags%max_dom
CALL wrf_debug ( 100 , message)
CALL wrf_debug ( 100 , 'start_em: calling firebrand_spotting_em_init ...' )
CALL firebrand_spotting_em_init ( &
grid = grid, &
cf = config_flags, &
fs_p_id = grid%fs_p_id, &
fs_p_dt = grid%fs_p_dt, &
fs_p_x = grid%fs_p_x, &
fs_p_y = grid%fs_p_y, &
fs_p_z = grid%fs_p_z, &
fs_p_mass = grid%fs_p_mass, &
fs_p_diam = grid%fs_p_diam, &
fs_p_effd = grid%fs_p_effd, &
fs_p_temp = grid%fs_p_temp, &
fs_p_tvel = grid%fs_p_tvel, &
fs_last_gen_dt= grid%fs_last_gen_dt, &
fs_gen_idmax = grid%fs_gen_idmax, &
fs_count_landed_all = grid%fs_count_landed_all, &
fs_count_landed_hist = grid%fs_count_landed_hist,&
fs_landing_mask = grid%fs_landing_mask, &
fs_spotting_lkhd = grid%fs_spotting_lkhd, &
fs_frac_landed = grid%fs_frac_landed, &
fs_count_reset = grid%fs_count_reset)
CALL wrf_debug ( 100 , 'start_em: firebrand_spotting_em_init ok ' )
ENDIF
ENDIF
!-----------------------------------------------------------------------
endif
#if ( WRFPLUS != 1 )
Expand Down
15 changes: 15 additions & 0 deletions main/depend.common
Original file line number Diff line number Diff line change
Expand Up @@ -893,6 +893,21 @@ module_fire_debug_output.o: \
../frame/module_configure.o \
../share/mediation_integrate.o

module_firebrand_spotting_mpi.o: \
../frame/module_domain.o \
../frame/module_configure.o \
../frame/module_dm.o

module_firebrand_spotting.o: \
../frame/module_domain.o \
../frame/module_configure.o \
../frame/module_dm.o \
../frame/module_state_description.o \
../frame/module_domain_type.o \
../external/esmf_time_f90/module_symbols_util.o \
../external/esmf_time_f90/module_utility.o \
module_firebrand_spotting_mpi.o

module_fdda_spnudging.o :\
../frame/module_dm.o \
../frame/module_state_description.o \
Expand Down
4 changes: 3 additions & 1 deletion phys/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,9 @@ FIRE_MODULES = \
module_fr_fire_model.o \
module_fr_fire_core.o \
module_fr_fire_phys.o \
module_fr_fire_util.o
module_fr_fire_util.o \
module_firebrand_spotting_mpi.o \
module_firebrand_spotting.o

DIAGNOSTIC_MODULES_EM = \
module_diag_afwa.o \
Expand Down
Loading

0 comments on commit 609c2fc

Please sign in to comment.