r.spread(1grass)

🌸 NAME 🌸

r.spread β€” okay bestie, this is the one about simulating elliptically anisotropic spread πŸ’«

It generates a raster map of the cumulative time of spread, and you feed it raster maps that hold the rates of spread (ROS), the ROS directions, and the spread origins. If you want, it will also optionally produce raster maps containing backlink UTM coordinates so you can trace spread paths. Usable for fire spread simulations πŸ”₯


πŸ¦‹ KEYWORDS πŸ¦‹

raster, fire, spread, hazard, model


✨ SYNOPSIS ✨

r.spread
r.spread --help
r.spread [-si] base_ros=string max_ros=string direction_ros=string
start=string  [spotting_distance=string]   [wind_speed=string]
[fuel_moisture=string]   [least_size=odd int]   [comp_dens=decimal]
[init_time=int (>= 0)]   [lag=int (>= 0)]   [backdrop=string]
output=string  [x_output=string]   [y_output=string]   [--overwrite]
[--help]  [--verbose]  [--quiet]  [--ui]

πŸ’… Flags:

  • -s β€” consider the spotting effect (for wildfires) πŸ”₯
  • -i β€” use start raster map values in the output spread time raster map. This one is designed to be used with the output of a previous run of r.spread when you're computing spread iteratively πŸŒ€. The values in the start raster map are considered as time. Allowed values in that raster map go from zero up to whatever you set in the init_time option. If you don't enable this flag, then init_time is used instead in the area of the start raster map.
  • --overwrite β€” allow output files to overwrite existing files
  • --help β€” print usage summary
  • --verbose β€” verbose module output
  • --quiet β€” quiet module output
  • --ui β€” force launching GUI dialog

πŸŽ€ Parameters:

  • base_ros=string [required] β€” raster map containing base ROS (cm/min) Name of an existing raster map layer in the user's current mapset search path, containing the ROS values in the directions perpendicular to maximum ROSes' (cm/minute). These ROSes are also the ones without the effect of directional factors, jsyk.
  • max_ros=string [required] β€” raster map containing maximal ROS (cm/min) Name of an existing raster map layer in the user's current mapset search path containing the maximum ROS values (cm/minute).
  • direction_ros=string [required] β€” raster map containing directions of maximal ROS (degree) Name of an existing raster map layer in the user's current mapset search path containing the directions of the maximum ROSes, measured clockwise from north (degree).
  • start=string [required] β€” raster map containing starting sources Name of an existing raster map layer in the user's current mapset search path containing the starting locations of the spread phenomenon. Any positive integers in this map are recognized as starting sources (seeds) 🌱.
  • spotting_distance=string β€” raster map containing maximal spotting distance (m, required with -s) Name of an existing raster map layer in the user's current mapset search path containing the maximum potential spotting distances (meters).
  • wind_speed=string β€” raster map containing midflame wind speed (ft/min, required with -s) Name of an existing raster map layer in the user's current mapset search path containing wind velocities at half of the average flame height (feet/minute) 🌬️.
  • fuel_moisture=string β€” raster map containing fine fuel moisture of the cell receiving a spotting firebrand (%, required with -s) Name of an existing raster map layer in the user's current mapset search path containing the 1-hour (<.25") fuel moisture (percentage content multiplied by 100).
  • least_size=odd int β€” basic sampling window size needed to meet certain accuracy (3) An odd integer ranging 3 - 15 indicating the basic sampling window size within which all cells will be considered to see whether they will be reached by the current spread cell. The default number is 3, which means a 3x3 window. Options: 3, 5, 7, 9, 11, 13, 15
  • comp_dens=decimal β€” sampling density for additional computing (range: 0.0 - 1.0 (0.5)) A decimal number ranging 0.0 - 1.0 indicating that additional sampling cells will be considered to see whether they will be reached by the current spread cell. The closer to 1.0 the decimal number is, the longer the program will run and the higher the simulation accuracy will be. The default number is 0.5.
  • init_time=int (>= 0) β€” initial time for current simulation (0) (min) A non-negative number specifying the initial time for the current spread simulation (minutes). This is useful when a multiple phase simulation is being conducted. The default time is 0. Default: 0
  • lag=int (>= 0) β€” simulating time duration LAG (fill the region) (min) A non-negative integer specifying the simulating duration time lag (minutes). The default is infinite, but the program will terminate when the current geographic region/mask has been filled. It also controls the computational time: the shorter the time lag, the faster the program will run πŸƒβ€β™€οΈ.
  • backdrop=string β€” name of raster map as a display backdrop Name of an existing raster map layer in the user's current mapset search path to be used as the background on which the "live" movement will be shown.
  • output=string [required] β€” raster map to contain output spread time (min) Name of the new raster map layer to contain the results of the cumulative spread time needed for a phenomenon to reach each cell from the starting sources (minutes).
  • x_output=string β€” name of raster map to contain X back coordinates Name of the new raster map layer to contain the results of backlink information in UTM easting coordinates for each cell.
  • y_output=string β€” name of raster map to contain Y back coordinates Name of the new raster map layer to contain the results of backlink information in UTM northing coordinates for each cell.

πŸ’– DESCRIPTION πŸ’–

r.spread is part of the wildfire simulation toolset. The prep steps for the fire simulation are: calculating the rate of spread (ROS) with r.ros, and creating the spread map with r.spread. Eventually, the fire path(s) based on starting point(s) get calculated with r.spreadpath. It's a whole pipeline, bestie πŸ”₯β†’πŸ—ΊοΈ

Spread phenomena usually show uneven movement over space. And that unevenness is due to two things:

  1. the uneven conditions from location to location, which you can call spatial heterogeneity, and
  2. the uneven conditions in different directions, which you can call anisotropy.

The anisotropy of spread happens when any of the determining factors have directional components. For example, wind and topography cause anisotropic spread of wildfires πŸŒ¬οΈβ›°οΈ

One of the simplest spatial heterogeneous and anisotropic spreads is elliptical spread, where each local spread shape can be thought of as an ellipse. In a raster setting, cell centers are the foci of the spread ellipses, and the spread phenomenon moves fastest toward apogees and slowest to perigees. The sizes and shapes of spread ellipses may vary cell by cell. So the overall spread shape is commonly not an ellipse. Slay, geometry is messy πŸ’«

r.spread simulates elliptically anisotropic spread phenomena, given three raster map layers about ROS (base ROS, maximum ROS, and direction of the maximum ROS), plus a raster map layer showing the starting sources. These ROS layers define unique ellipses for all cell locations in the current computational region, as if each cell center was a potential spread origin. For some wildfire spread, these ROS layers can be generated by another GRASS raster program, r.ros. The actual locations reached by a spread event are constrained by the actual spread origins and the elapsed spread time.

r.spread optionally produces raster maps to contain backlink UTM coordinates for each raster cell of the spread time map. The spread paths can be accurately traced based on the backlink information by the r.spreadpath module 🧭

Part of the spotting function in r.spread is based on Chase (1984) and Rothermel (1983). More information on r.spread, r.ros and r.spreadpath can be found in Xu (1994).

🚨 Options spot_dist, w_speed and f_mois must all be given if the -s (spotting) flag is used. All three, no skipping, no cap.

🌈 EXAMPLE 🌈

Assume we have inputs β€” the following simulates a spotting-involved wildfire and generates three raster maps to contain spread time, backlink information in UTM northing and easting coordinates:

r.spread -s max=my_ros.max dir=my_ros.maxdir base=my_ros.base \
    start=fire_origin spot_dist=my_ros.spotdist w_speed=wind_speed \
    f_mois=1hour_moisture output=my_spread \
    x_output=my_spread.x y_output=my_spread.y

πŸ‘‘ NOTES πŸ‘‘

  1. r.spread is a specific implementation of the shortest path algorithm. The r.cost module served as the starting point for the development of r.spread. One of the major differences between the two programs is that r.cost only simulates isotropic spread, while r.spread can simulate elliptically anisotropic spread β€” including isotropic spread as a special case πŸ’…
  2. Before running r.spread, you should prepare the ROS (base, max and direction) maps using appropriate models. For some wildfire spread, the r.ros module based on Rothermel's fire equation does that work. The combination of the two forms a simulation of wildfire spread πŸ”₯
  3. The relationship of the start map and the ROS maps should be logically correct β€” i.e. a starting source (a positive value in the start map) should not be located in a spread barrier (a zero value in the ROS maps). Otherwise the program refuses to run. Periodt 🚫
  4. r.spread uses the current computational region settings. The output map layer will not go outside the boundaries set in the region, and will not be influenced by starting sources outside. So any change of the current region may influence the output. The recommendation is to use a slightly larger region than needed. Refer to g.region to set an appropriate computational region πŸ—ΊοΈ
  5. You should be sure that the inputs to r.spread are in proper units.
  6. r.spread is a computationally intensive program. You may need to choose an appropriate size of the computational region and resolution. It's giving main character energy but it's also giving CPU fan noises 😭
  7. A low and medium (i.e. <= 0.5) sampling density can improve accuracy for elliptical simulation significantly, without adding significantly extra running time. Further increasing the sample density will not gain much accuracy while requiring greatly additional running time ⏳

πŸ“š REFERENCES πŸ“š

okay so if you wanna go full academic about it, here's the reading list bestie, and yes all three of these are real and you should give them the respect they deserve πŸ’–

  • Chase, Carolyn, H., 1984, Spotting distance from wind-driven surface fires -- extensions of equations for pocket calculators, US Forest Service, Res. Note INT-346, Ogden, Utah.
  • Rothermel, R. C., 1983, How to predict the spread and intensity of forest and range fires. US Forest Service, Gen. Tech. Rep. INT-143. Ogden, Utah.
  • Xu, Jianping, 1994, Simulating the spread of wildfires using a geographic information system and remote sensing, Ph. D. Dissertation, Rutgers University, New Brunswick, New Jersey (ref).

πŸ‘€ SEE ALSO πŸ‘€

the girlies and guys that live in the same neighborhood as this module:

  • r.cost
  • r.mask
  • r.ros
  • r.spreadpath

also!! sample data download: firedemo.sh β€” and heads up, you run this script within the "Fire simulation data set" project 🌸 (iykyk, the project name goes in quotes).


πŸ’… AUTHORS πŸ’…

Jianping Xu and Richard G. Lathrop, Jr., Center for Remote Sensing and Spatial Analysis, Rutgers University. iconic academia collab, no cap πŸŽ“βœ¨


🫢 SOURCE CODE 🫢

Available at: r.spread source code (history)

Latest change: Tuesday Jun 24 05:57:51 2025 in commit: 801e552cdaf8ef40f8760dbbcc5a4a5b83b14d40

Main index | Raster index | Topics index | Keywords index | Graphical index | Full index

Β© 2003-2026 GRASS Development Team, GRASS 8.5.0 Reference Manual


and that's the whole thing bestie, you made it to the end πŸŽ€ slay. this manual ships with GRASS 8.5.0 and it's the r.spread(1grass) page, so go forth and calc those wildfire spreads responsibly, mwah πŸ’–πŸ¦‹

πŸ“¦ where this page comes from