Skip to main content

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

Modify Fuel Loading and Recalculate

fuel.fuel_load_one_hour *= .5
fuel.fuel_load_ten_hour *= .5
fuel.fuel_load_hundred_hour *= .75
fuel.fuel_bed_depth *= .5

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=2.5,canopy_bulk_density=.1,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'] = 'treated'
    results_list.append(results_final)

treated_crowning_index = run.calculate_crowning_index()
treated_torching_index = run.calculate_torching_index()

df_treated = pd.DataFrame(results_list)
df = pd.concat([df,df_treated])

Display Results

sns.lineplot(df,x='wind_speed',y='flame_length',hue='treatment').set(xlabel='Wind Speed (km/hr)',ylabel='Flame Length (m)')
[Text(0.5, 0, 'Wind Speed (km/hr)'), Text(0, 0.5, 'Flame Length (m)')]

png

print('Wind Speed to initiate crown fire in untreated stand: ', untreated_torching_index, ' km/hr')
print('Wind Speed to initiate crown fire in treated stand: ', treated_torching_index, ' km/hr')
print('Wind Speed to propagate crown fire in untreated stand: ', untreated_crowning_index, ' km/hr')
print('Wind Speed to propagate crown fire in treated stand: ', treated_crowning_index, ' km/hr')
Wind Speed to initiate crown fire in untreated stand:  43  km/hr
Wind Speed to initiate crown fire in treated stand:  98  km/hr
Wind Speed to propagate crown fire in untreated stand:  60  km/hr
Wind Speed to propagate crown fire in treated stand:  60  km/hr

Metadata

Release files for pyrothermel 0.1.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyrothermel 0.1.4
File Size Uploaded
pyrothermel-0.1.4.tar.gz 1.1 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyrothermel 0.1.4
File Interpreter ABI Platform
pyrothermel-0.1.4-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details

Total release size: 1.3 MB

Release files / pyrothermel-0.1.4.tar.gz

Download URL pyrothermel-0.1.4.tar.gz
Size 1.1 MB
Tags Source
SHA-256 checksum
How to use checksums
4b5ffb1212f705c993de48e5245b946187123896bcbb63ead353f728cd94c672
BLAKE2b-256 checksum
How to use checksums
782551f4f5872aaa22186479491c2dc544c07f0996915c3c5377f2b176c39e2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.7

Release files / pyrothermel-0.1.4-cp312-cp312-win_amd64.whl

Download URL pyrothermel-0.1.4-cp312-cp312-win_amd64.whl
Size 286.5 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
1105fb6b53e55f42d62b54b375feac4c9e11dafdfc96e6d252c4b61ebc2e0e6b
BLAKE2b-256 checksum
How to use checksums
06793a90f52dbf53a8a2415d918433a5578cf8a24e8b33bc3b71b46fa778c0ee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.12.7

Release history Release notifications | RSS feed

This release

0.1.4 This release

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page