SkillAgentSearch skills...

Pyrothermel

Python bindings to the Behave fire modelling framework

Install / Use

/learn @j-tenny/Pyrothermel
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

Pyrothermel

Model fire rate of spread, intensity, and more for surface fires and crown fires using the extended Rothermel model. Pyrothermel provides a Python interface to the C++ code that underlies Behave, Flammap, and other software tools maintained by the Missoula Fire Lab*.

Please submit bugs and feature requests as Github issues. Note, there may be some API changes in early versions of this package.

*Pyrothermel and its authors are not associated with the Missoula Fire Lab or the US Government.

Dependencies

  • Python >= 3.8
  • A C++ compiler (conda install -c conda-forge compilers) The C++ compilers used for testing were Visual Studio 2022 and gcc for WSL.

Install

pip install pyrothermel

Quickstart

import pyrothermel
import pandas as pd
import seaborn as sns

Setup Base Fuel Model and Moisture Scenario

moisture = pyrothermel.MoistureScenario.from_existing(dead_fuel_moisture_class='low',live_fuel_moisture_class='moderate')
fuel = pyrothermel.FuelModel.from_existing(identifier='TL8')
canopy_base_height = 2.5 # default unit is m
canopy_bulk_density = .1 # default unit is kg/m^3

# Print some fuel loading values from fuel model TL8
print([fuel.fuel_load_one_hour, fuel.fuel_load_ten_hour, fuel.fuel_load_hundred_hour])
print(fuel.units.loading_units)

[1.300187341185569, 0.31383832373444764, 0.2465872543627803]
LoadingUnitsEnum.KilogramsPerSquareMeter

Run Rothermel Models Across Range of Wind Speeds

results_list = []
for wind_speed in range(0,60,2):
    run = pyrothermel.PyrothermelRun(fuel,moisture,wind_speed,wind_input_mode='ten_meter',canopy_base_height=canopy_base_height,canopy_bulk_density=canopy_bulk_density,canopy_cover=.5,canopy_height=20,canopy_ratio=.6)
    results_surface = run.run_surface_fire_in_direction_of_max_spread()
    results_final = run.run_crown_fire_scott_and_reinhardt()
    results_final['wind_speed'] = wind_speed
    results_final['treatment'] = 'untreated'
    results_list.append(results_final)
    
untreated_crowning_index = run.calculate_crowning_index()
untreated_torching_index = run.calculate_torching_index()
    
df = pd.DataFrame(results_list)
df

<div> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>spread_rate</th> <th>flame_length</th> <th>fireline_intensity</th> <th>scorch_height</th> <th>transition_ratio</th> <th>active_ratio</th> <th>fire_type</th> <th>wind_speed</th> <th>treatment</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>0.035297</td> <td>0.850504</td> <td>182.940784</td> <td>5.005403</td> <td>0.274758</td> <td>0.025974</td> <td>Surface</td> <td>0</td> <td>untreated</td> </tr> <tr> <th>1</th> <td>0.036477</td> <td>0.863471</td> <td>189.058483</td> <td>5.150455</td> <td>0.283946</td> <td>0.033603</td> <td>Surface</td> <td>2</td> <td>untreated</td> </tr> <tr> <th>2</th> <td>0.038485</td> <td>0.885015</td> <td>199.463628</td> <td>5.391881</td> <td>0.299574</td> <td>0.046541</td> <td>Surface</td> <td>4</td> <td>untreated</td> </tr> <tr> <th>3</th> <td>0.040997</td> <td>0.911142</td> <td>212.486479</td> <td>5.685303</td> <td>0.319133</td> <td>0.062713</td> <td>Surface</td> <td>6</td> <td>untreated</td> </tr> <tr> <th>4</th> <td>0.043907</td> <td>0.940336</td> <td>227.566123</td> <td>6.013981</td> <td>0.341781</td> <td>0.081423</td> <td>Surface</td> <td>8</td> <td>untreated</td> </tr> <tr> <th>5</th> <td>0.047152</td> <td>0.971693</td> <td>244.386618</td> <td>6.367902</td> <td>0.367044</td> <td>0.102279</td> <td>Surface</td> <td>10</td> <td>untreated</td> </tr> <tr> <th>6</th> <td>0.050693</td> <td>1.004603</td> <td>262.738585</td> <td>6.740268</td> <td>0.394606</td> <td>0.125023</td> <td>Surface</td> <td>12</td> <td>untreated</td> </tr> <tr> <th>7</th> <td>0.054500</td> <td>1.038631</td> <td>282.470446</td> <td>7.126172</td> <td>0.424242</td> <td>0.149466</td> <td>Surface</td> <td>14</td> <td>untreated</td> </tr> <tr> <th>8</th> <td>0.058551</td> <td>1.073456</td> <td>303.466091</td> <td>7.521935</td> <td>0.455775</td> <td>0.175465</td> <td>Surface</td> <td>16</td> <td>untreated</td> </tr> <tr> <th>9</th> <td>0.062828</td> <td>1.108839</td> <td>325.633015</td> <td>7.924731</td> <td>0.489067</td> <td>0.202906</td> <td>Surface</td> <td>18</td> <td>untreated</td> </tr> <tr> <th>10</th> <td>0.067316</td> <td>1.144599</td> <td>348.895334</td> <td>8.332347</td> <td>0.524005</td> <td>0.231694</td> <td>Surface</td> <td>20</td> <td>untreated</td> </tr> <tr> <th>11</th> <td>0.072003</td> <td>1.180595</td> <td>373.189391</td> <td>8.743023</td> <td>0.560492</td> <td>0.261751</td> <td>Surface</td> <td>22</td> <td>untreated</td> </tr> <tr> <th>12</th> <td>0.076879</td> <td>1.216721</td> <td>398.460819</td> <td>9.155342</td> <td>0.598447</td> <td>0.293011</td> <td>Surface</td> <td>24</td> <td>untreated</td> </tr> <tr> <th>13</th> <td>0.081935</td> <td>1.252892</td> <td>424.662512</td> <td>9.568151</td> <td>0.637799</td> <td>0.325414</td> <td>Surface</td> <td>26</td> <td>untreated</td> </tr> <tr> <th>14</th> <td>0.087161</td> <td>1.289045</td> <td>451.753155</td> <td>9.980508</td> <td>0.678487</td> <td>0.358909</td> <td>Surface</td> <td>28</td> <td>untreated</td> </tr> <tr> <th>15</th> <td>0.092553</td> <td>1.325129</td> <td>479.696141</td> <td>10.391632</td> <td>0.720454</td> <td>0.393453</td> <td>Surface</td> <td>30</td> <td>untreated</td> </tr> <tr> <th>16</th> <td>0.098102</td> <td>1.361104</td> <td>508.458756</td> <td>10.800878</td> <td>0.763653</td> <td>0.429003</td> <td>Surface</td> <td>32</td> <td>untreated</td> </tr> <tr> <th>17</th> <td>0.103804</td> <td>1.396940</td> <td>538.011536</td> <td>11.207708</td> <td>0.808038</td> <td>0.465524</td> <td>Surface</td> <td>34</td> <td>untreated</td> </tr> <tr> <th>18</th> <td>0.109653</td> <td>1.432613</td> <td>568.327776</td> <td>11.611672</td> <td>0.853570</td> <td>0.502983</td> <td>Surface</td> <td>36</td> <td>untreated</td> </tr> <tr> <th>19</th> <td>0.115645</td> <td>1.468107</td> <td>599.383126</td> <td>12.012394</td> <td>0.900212</td> <td>0.541350</td> <td>Surface</td> <td>38</td> <td>untreated</td> </tr> <tr> <th>20</th> <td>0.121775</td> <td>1.503406</td> <td>631.155270</td> <td>12.409561</td> <td>0.947930</td> <td>0.580597</td> <td>Surface</td> <td>40</td> <td>untreated</td> </tr> <tr> <th>21</th> <td>0.128040</td> <td>1.538500</td> <td>663.623663</td> <td>12.802911</td> <td>0.996695</td> <td>0.620699</td> <td>Surface</td> <td>42</td> <td>untreated</td> </tr> <tr> <th>22</th> <td>0.241603</td> <td>3.448728</td> <td>1474.064719</td> <td>13.192226</td> <td>1.046476</td> <td>0.661632</td> <td>Torching</td> <td>44</td> <td>untreated</td> </tr> <tr> <th>23</th> <td>0.379762</td> <td>5.160256</td> <td>2697.956066</td> <td>13.577327</td> <td>1.097248</td> <td>0.703375</td> <td>Torching</td> <td>46</td> <td>untreated</td> </tr> <tr> <th>24</th> <td>0.536191</td> <td>7.103385</td> <td>4357.386068</td> <td>13.958064</td> <td>1.148986</td> <td>0.745907</td> <td>Torching</td> <td>48</td> <td>untreated</td> </tr> <tr> <th>25</th> <td>0.711691</td> <td>9.296938</td> <td>6524.360652</td> <td>14.334319</td> <td>1.201667</td> <td>0.789210</td> <td>Torching</td> <td>50</td> <td>untreated</td> </tr> <tr> <th>26</th> <td>0.907056</td> <td>11.754955</td> <td>9275.974007</td> <td>14.705996</td> <td>1.255270</td> <td>0.833266</td> <td>Torching</td> <td>52</td> <td>untreated</td> </tr> <tr> <th>27</th> <td>1.123074</td> <td>14.489637</td> <td>12694.462206</td> <td>15.073021</td> <td>1.309773</td> <td>0.878058</td> <td>Torching</td> <td>54</td> <td>untreated</td> </tr> <tr> <th>28</th> <td>1.360525</td> <td>17.512343</td> <td>16867.255868</td> <td>15.435336</td> <td>1.365159</td> <td>0.923571</td> <td>Torching</td> <td>56</td> <td>untreated</td> </tr> <tr> <th>29</th> <td>1.620185</td> <td>20.833995</td> <td>21887.031854</td> <td>
View on GitHub
GitHub Stars8
CategoryDevelopment
Updated2mo ago
Forks1

Languages

C++

Security Score

90/100

Audited on Jan 21, 2026

No findings