Skip to content

Commit e26f21f

Browse files
domingomdavegill
authored andcommitted
WRF_Fire model developments (#403)
TYPE: new feature/enhancement KEYWORDS: WRF-Fire, level-set method, other fire-related enhancements SOURCE: Domingo Munoz-Esparza (NCAR) DESCRIPTION OF CHANGES: Here a list of the changes: • Proper parallelization of the entire level-set algorithm using MPI. • 3rd-order Runge-Kutta time integration scheme for the level-set equations. • 3rd- and 5th-order weighted essentially non-oscillatory (WENO) schemes for the discretization of the advection term in the level-set equations [also 2nd- and 4th-order schemes are available]. • A hybrid-order level-set method with locally reduced artificial viscosity (high-order over a local band). • Reinitialization PDE for the level set (also using hybrid-order discretization). • Transport and dispersion of fire-generated smoke as a passive tracer. • Diagnosed flame length. • Option to extrapolate mid-flame height winds to reduce over-coupling of atmospheric fields impacted by the fire. • Initialization from observed fire area. • Scott & Burgan (40) fuel model crosswalk to Anderson (13). • Several bug fixes. • Modified test/em_fire/namelist.input* files. LIST OF MODIFIED FILES: list of changed files (use `git diff --name-status master` to get formatted list) M Registry/registry.fire M dyn_em/module_initialize_fire.F M phys/module_fr_fire_atm.F M phys/module_fr_fire_core.F M phys/module_fr_fire_driver.F M phys/module_fr_fire_driver_wrf.F M phys/module_fr_fire_model.F M phys/module_fr_fire_phys.F M phys/module_fr_fire_util.F M test/em_fire/namelist.input_hill_simple M test/em_fire/namelist.input_two_fires TESTS CONDUCTED: 1. Regression test with WTF_v04.04 produces the following failures (note that the listed Nesting cases also failed with the fresh repository version of the code where the current developments where implemented): WRFV3_gnu_32_33_34.2018-03-05_13:50:44:em_real8 namelist.input.76 Nesting mpi FCST FAIL WRFV3_gnu_32_33_34.2018-03-05_13:50:44:em_real8 namelist.input.77 Nesting mpi FCST FAIL WRFV3_intel_13_14_15.2018-03-05_13:50:24:em_real8 namelist.input.76 Nesting mpi FCST FAIL WRFV3_intel_13_14_15.2018-03-05_13:50:24:em_real8 namelist.input.76 Nesting openmp FCST FAIL WRFV3_intel_13_14_15.2018-03-05_13:50:24:em_real8 namelist.input.77 Nesting mpi FCST FAIL WRFV3_pgi_52_53_54.2018-03-05_13:51:23:em_real8 namelist.input.77 Nesting openmp FCST FAIL 2. Performed an extensive suite of both idealized and real fire simulations. All completed successfully.
1 parent b357a11 commit e26f21f

11 files changed

+1334
-434
lines changed

Registry/registry.fire

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ package fire_sfire ifire==2 - state:nfuel_ca
1212

1313
# level function history support
1414
dimspec ign 2 constant=1 z i_lfn_history
15-
state real lfn_hist *i{ign}*j fire 1 Z i012hr "LFN_HIST" "level function history" "1"
15+
state real lfn_hist *i*j fire 1 Z i012hr "LFN_HIST" "level function history" "1"
1616
state real lfn_time {ign} fire 1 - i012hr "LFN_TIME" "level function history time" "s"
1717

1818

@@ -32,18 +32,28 @@ state real rthfrten ikj fire 1 z hr "RTHFRTEN"
3232
state real rqvfrten ikj fire 1 z hr "RQVFRTEN" "humidity tendency"
3333

3434
# diagnostics only
35-
state real avg_fuel_frac ij fire 1 z hr "AVG_FUEL_FRAC" "fuel remaining averaged to atmospheric grid" "1"
36-
state real grnhfx ij fire 1 z hr "GRNHFX" "heat flux from ground fire" "W/m^2"
37-
state real grnqfx ij fire 1 z hr "GRNQFX" "moisture flux from ground fire" "W/m^2"
38-
state real canhfx ij fire 1 z hr "CANHFX" "heat flux from crown fire" "W/m^2"
39-
state real canqfx ij fire 1 z hr "CANQFX" "moisture flux from crown fire" "W/m^2"
40-
state real uah ij fire 1 X hr "UAH" "wind at fire_wind_height" "m/s"
41-
state real vah ij fire 1 Y hr "VAH" "wind at fire_wind_height" "m/s"
35+
state real avg_fuel_frac ij fire 1 z hr "AVG_FUEL_FRAC" "fuel remaining averaged to atmospheric grid" "1"
36+
state real grnhfx ij fire 1 z hr "GRNHFX" "heat flux from ground fire" "W/m^2"
37+
state real grnqfx ij fire 1 z hr "GRNQFX" "moisture flux from ground fire" "W/m^2"
38+
state real canhfx ij fire 1 z hr "CANHFX" "heat flux from crown fire" "W/m^2"
39+
state real canqfx ij fire 1 z hr "CANQFX" "moisture flux from crown fire" "W/m^2"
40+
state real uah ij fire 1 X hr "UAH" "wind at fire_wind_height" "m/s"
41+
state real vah ij fire 1 Y hr "VAH" "wind at fire_wind_height" "m/s"
42+
state real grnhfx_fu ij fire 1 z r "GRNHFX_FU" "heat flux from ground fire (feedback unsensitive)" "W/m^2"
43+
state real grnqfx_fu ij fire 1 z r "GRNQFX_FU" "moisture flux from ground fire (feedback unsensitive)" "W/m^2"
4244

4345
# sfire variables on fire grid
4446
# (also using tign_g,zs,z_at_w,dz8w,nfuel_cat,fluxes,zsf)
4547
#
4648
state real lfn *i*j fire 1 z hr "LFN" "level function" "1"
49+
state real lfn_0 *i*j fire 1 z r "LFN_0" "level function for time integration, step 0" "1"
50+
state real lfn_1 *i*j fire 1 z r "LFN_1" "level function for time integration, step 1" "1"
51+
state real lfn_2 *i*j fire 1 z r "LFN_2" "level function for time integration, step 2" "1"
52+
state real lfn_s0 *i*j fire 1 z r "LFN_S0" "level set sign function from LSM integration" "1"
53+
state real lfn_s1 *i*j fire 1 z r "LFN_S1" "level set function for reinitialization integration" "1"
54+
state real lfn_s2 *i*j fire 1 z r "LFN_S2" "level set function for reinitialization integration" "1"
55+
state real lfn_s3 *i*j fire 1 z r "LFN_S3" "level set function for reinitialization integration" "1"
56+
#
4757
state real fuel_frac *i*j fire 1 z hr "FUEL_FRAC" "fuel remaining" "1"
4858
state real fire_area *i*j fire 1 z hr "FIRE_AREA" "fraction of cell area on fire" "1"
4959
state real uf *i*j fire 1 z hr "UF" "fire wind" "m/s"
@@ -52,7 +62,10 @@ state real fgrnhfx *i*j fire 1 z hr "FGRNHFX"
5262
state real fgrnqfx *i*j fire 1 z hr "FGRNQFX" "moisture flux from ground fire" "W/m^2"
5363
state real fcanhfx *i*j fire 1 z hr "FCANHFX" "heat flux from crown fire" "W/m^2"
5464
state real fcanqfx *i*j fire 1 z hr "FCANQFX" "moisture flux from crown fire" "W/m^2"
55-
state real ros *i*j fire 1 z hr "ROS" "rate of spread" "m/s"
65+
state real ros *i*j fire 1 z r "ROS" "rate of spread" "m/s"
66+
state real burnt_area_dt *i*j fire 1 z hr "BURNT_AREA_DT" "fraction of cell area burnt on current dt" "-"
67+
state real flame_length *i*j fire 1 z hr "FLAME_LENGTH" "fire flame length" "m"
68+
state real ros_front *i*j fire 1 z hr "ROS_FRONT" "rate of spread at fire front" "m/s"
5669

5770
# constant data arrays
5871
state real fxlong *i*j fire 1 z ihr "FXLONG" "longitude of midpoints of fire cells" "degrees"
@@ -64,14 +77,16 @@ state real phiwc *i*j fire 1 z hr "PHIWC"
6477
state real r_0 *i*j fire 1 z hr "R_0" "fuel"
6578
state real fgip *i*j fire 1 z hr "FGIP" "fuel"
6679
state real ischap *i*j fire 1 z hr "ISCHAP" "fuel"
80+
state real fz0 *i*j fire 1 z ihr "FZ0" "roughness length of fire cells" "m"
81+
state real iboros *i*j fire 1 z hr "IBOROS" "fire intensity over rate of spread" "kJ/m^2"
6782

6883
#
6984
# fire configure namelist variables
7085
#
7186
#<Table> <Type> <Sym> <How set> <Nentries> <Default>
7287
rconfig integer ifire namelist,fire max_domains 0
73-
rconfig integer fire_boundary_guard namelist,fire max_domains 2 - "fire_boundary_guard" "cells to stop when fire close to domain boundary"
74-
# ignition for sfire
88+
rconfig integer fire_boundary_guard namelist,fire max_domains 8 - "fire_boundary_guard" "cells to stop when fire close to domain boundary"
89+
# ignition for WRF-Fire
7590
rconfig integer fire_num_ignitions namelist,fire max_domains 0 - "fire_num_ignitions" "number of ignition lines"
7691
rconfig real fire_ignition_ros1 namelist,fire max_domains 0.01 - "fire_ignition_ros1" "rate of spread during ignition" "m/s"
7792
rconfig real fire_ignition_start_lon1 namelist,fire max_domains 0. - "fire_ignition_start_long1" "long coord of start of ignition line" "deg"
@@ -148,13 +163,12 @@ rconfig integer fire_fuel_cat namelist,fire max_domains
148163
# sfire switches
149164
rconfig integer fire_print_msg namelist,fire max_domains 0 - "fire_write_msg" "write fire statistics, 0 no writes, 1+ for more" ""
150165
rconfig integer fire_print_file namelist,fire max_domains 0 - "fire_write_file" "write fire output text files, 0 no writes, 1+ for more" ""
151-
# method selection`
166+
# method selection
152167
rconfig integer fire_fuel_left_method namelist,fire max_domains 1 - "fire_fuel_left_method" "1 or 2, compute fuel_left" ""
153168
rconfig integer fire_fuel_left_irl namelist,fire max_domains 2 - "fire_fuel_left_irl" "submesh to compute fuel lwft, even, at least 2" ""
154169
rconfig integer fire_fuel_left_jrl namelist,fire max_domains 2 - "fire_fuel_left_jrl" "submesh to compute fuel lwft, even, at least 2" ""
155-
rconfig real fire_back_weight namelist,fire max_domains 0.5 - "fire_back_weight" "RK timestepping coefficient, 0=forward, 0.5=Heun" "1"
156170
rconfig integer fire_grows_only namelist,fire max_domains 1 - "fire_grows_only" "if >0 level set function cannot increase = fire can only grow" "1"
157-
rconfig integer fire_upwinding namelist,fire max_domains 3 - "fire_upwinding" "upwind normal spread: 1=standard, 2=godunov, 3=eno, 4=sethian" "1"
171+
rconfig integer fire_upwinding namelist,fire max_domains 9 - "fire_upwinding" "upwind normal spread: 1=standard, 2=godunov, 3=eno, 4=sethian, 5=2nd-order, 6=WENO3, 7=WENO5, 8=hybrid WENO3/ENO1, 9=hybrid WENO5/ENO1" "1"
158172
rconfig integer fire_upwind_split namelist,fire max_domains 0 - "fire_upwind_split" "1=upwind advection separately from normal direction spread" "1"
159173
rconfig real fire_viscosity namelist,fire max_domains 0.4 - "fire_viscosity" "artificial viscosity in level set method" "1"
160174
rconfig real fire_lfn_ext_up namelist,fire max_domains 1.0 - "fire_lfn_ext_up" "0.=extend level set function at boundary by reflection, 1.=always up" "1"
@@ -200,10 +214,32 @@ rconfig real sfc_vegfra namelist,fire max_domains
200214
rconfig real sfc_canwat namelist,fire max_domains 0 - "sfc_canwat" "canopy water" ""
201215
rconfig integer sfc_ivgtyp namelist,fire max_domains 18 - "sfc_ivgtyp" "dominant vegetation category in the LSM scheme" ""
202216
rconfig integer sfc_isltyp namelist,fire max_domains 7 - "sfc_isltyp" "dominant soil category in the LSM scheme" ""
217+
# namelist options for new WRF-Fire capabilities DME
218+
rconfig logical fire_lsm_reinit namelist,fire max_domains .true. - "flag to activate reinitialization of level set method"
219+
rconfig integer fire_lsm_reinit_iter namelist,fire max_domains 1 - "number of iterations for the reinitialization PDE"
220+
rconfig integer fire_upwinding_reinit namelist,fire max_domains 4 - "numerical scheme (space) for reinitialization PDE: 1=WENO3, 2=WENO5, 3=hybrid WENO3-ENO1, 4=hybrid WENO5-ENO1"
221+
rconfig logical fire_is_real_perim namelist,fire max_domains .false. - ".false. = point/line ignition, .true. = observed perimeter"
222+
rconfig integer fire_lsm_band_ngp namelist,fire max_domains 4 - "number of grid points around lfn=0 that WENO5/3 is used (ENO1 elsewhere), for fire_upwinding_reinit=4,5 and fire_upwinding=8,9 options"
223+
rconfig logical fire_lsm_zcoupling namelist,fire max_domains .false. - "flag to activate reference velocity at a different height from fire_wind_height"
224+
rconfig real fire_lsm_zcoupling_ref namelist,fire max_domains 50. - "reference height from wich u at fire_wind_hegiht is calculated using a logarithmic profile" "m"
225+
rconfig real fire_tracer_smoke namelist,fire max_domains 0.02 - "parts per unit of burned fuel becoming smoke (tracer_opt=3)" "g_smoke/kg_air"
226+
rconfig real fire_viscosity_bg namelist,fire max_domains 0.4 - "fire_viscosity_bg" "artificial viscosity in the near-front region" "1"
227+
rconfig real fire_viscosity_band namelist,fire max_domains 0.5 - "fire_viscosity_band" "number of times the hybrid advection band to transition from fire_viscosity_bg to fire_viscosity" "1"
228+
rconfig integer fire_viscosity_ngp namelist,fire max_domains 2 - "number of grid points around lfn=0 where low artificial viscosity is used = fire_viscosity_bg"
229+
rconfig real fire_slope_factor namelist,fire max_domains 1.0 - "slope correction factor" "-"
230+
# tracers for WRF-Fire
231+
state real fire_smoke ikjftb tracer 1 - irhusdf=(bdy_interp:dt) "fire_smoke" "fire_smoke" "g_smoke/kg_air"
232+
package tracer_fire tracer_opt==3 - tracer:fire_smoke
203233
#
204234
# Fire halo descriptions
205235
#
206-
halo HALO_FIRE_LFN dyn_em 24:lfn
236+
halo HALO_FIRE_LFN dyn_em 48:lfn
237+
halo HALO_FIRE_LFN_0 dyn_em 48:lfn_0
238+
halo HALO_FIRE_LFN_1 dyn_em 48:lfn_1
239+
halo HALO_FIRE_LFN_2 dyn_em 48:lfn_2
240+
halo HALO_FIRE_LFN_S1 dyn_em 48:lfn_s1
241+
halo HALO_FIRE_LFN_S2 dyn_em 48:lfn_s2
242+
halo HALO_FIRE_LFN_S3 dyn_em 48:lfn_s3
207243
halo HALO_FIRE_TIGN dyn_em 8:tign_g
208244
halo HALO_FIRE_HT dyn_em 8:ht
209245
halo HALO_FIRE_PHB dyn_em 8:phb
@@ -218,5 +254,4 @@ halo HALO_FIRE_FUEL dyn_em 8:fuel_frac,fuel_time,bbb,betafl,phiwc,r_0,fgip,
218254
# ----------------------------------------
219255
# end fire variables and configuration
220256
# ----------------------------------------
221-
222257
##

dyn_em/module_initialize_fire.F

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,6 @@ SUBROUTINE init_domain_rk ( grid &
445445
ifms,ifme,jfms,jfme, &
446446
ifts,ifte,jfts,jfte, &
447447
grid%fxlong,grid%fxlat )
448-
call set_ideal_coord( grid%dx,grid%dy, &
449-
ids,ide,jds,jde, &
450-
ims,ime,jms,jme, &
451-
its,ite,jts,jte, &
452-
grid%xlong,grid%xlat )
453448

454449
! set terrain height
455450

phys/module_fr_fire_atm.F

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,69 @@ module module_fr_fire_atm
1010

1111
use module_model_constants, only: cp,xlv
1212
use module_fr_fire_util
13+
use module_state_description, only: num_tracer
14+
use module_state_description, only: p_fire_smoke
1315

1416
contains
1517

18+
! DME subroutine for passive tracers
19+
subroutine add_fire_tracer_emissions( &
20+
tracer_opt,dt,dx,dy, &
21+
ifms,ifme,jfms,jfme, &
22+
ifts,ifte,jtfs,jfte, &
23+
ids,ide,kds,kde,jds,jde, &
24+
ims,ime,kms,kme,jms,jme, &
25+
its,ite,kts,kte,jts,jte, &
26+
rho,dz8w, &
27+
burnt_area_dt,fgip, &
28+
tracer,fire_tracer_smoke &
29+
)
30+
31+
implicit none
32+
! arguments
33+
integer,intent(in)::tracer_opt
34+
real,intent(in)::fire_tracer_smoke
35+
real,intent(in)::dt,dx,dy
36+
integer,intent(in)::ifms,ifme,jfms,jfme,ifts,ifte,jtfs,jfte,ids,ide,kds,kde,jds,jde,ims,ime,kms,kme,jms,jme,its,ite,kts,kte,jts,jte
37+
real,intent(in)::rho(ims:ime,kms:kme,jms:jme),dz8w(ims:ime,kms:kme,jms:jme)
38+
real,intent(in),dimension(ifms:ifme,jfms:jfme)::burnt_area_dt,fgip
39+
real,intent(inout)::tracer(ims:ime,kms:kme,jms:jme,num_tracer)
40+
! local
41+
integer::isz1,jsz1,isz2,jsz2,ir,jr
42+
integer::i,j,ibase,jbase,i_f,ioff,j_f,joff
43+
real::avgw,emis,conv
44+
45+
isz1 = ite-its+1
46+
jsz1 = jte-jts+1
47+
isz2 = ifte-ifts+1
48+
jsz2 = jfte-jtfs+1
49+
ir=isz2/isz1
50+
jr=jsz2/jsz1
51+
avgw = 1.0/(ir*jr)
52+
53+
do j=max(jds+1,jts),min(jte,jde-2)
54+
jbase=jtfs+jr*(j-jts)
55+
do i=max(ids+1,its),min(ite,ide-2)
56+
ibase=ifts+ir*(i-its)
57+
do joff=0,jr-1
58+
j_f=joff+jbase
59+
do ioff=0,ir-1
60+
i_f=ioff+ibase
61+
if (num_tracer >0)then
62+
emis=avgw*fire_tracer_smoke*burnt_area_dt(i_f,j_f)*fgip(i_f,j_f)*1000/(rho(i,kts,j)*dz8w(i,kts,j)) ! g_smoke/kg_air
63+
tracer(i,kts,j,p_fire_smoke)=tracer(i,kts,j,p_fire_smoke)+emis
64+
endif
65+
enddo
66+
enddo
67+
enddo
68+
enddo
69+
70+
end subroutine add_fire_tracer_emissions
71+
72+
!
73+
!***
74+
!
75+
1676
SUBROUTINE fire_tendency( &
1777
ids,ide, kds,kde, jds,jde, & ! dimensions
1878
ims,ime, kms,kme, jms,jme, &

0 commit comments

Comments
 (0)