A validated Gaussian plume dispersion model with a desktop interface.
Predicts where a pollutant released from one or more stacks ends up: the concentration field at ground level, the plume aloft, and how both change with the weather. Briggs plume rise, Pasquill-Gifford and Briggs dispersion, multiple reflection off the ground and the inversion lid, dry deposition with source depletion, and first-order chemical decay.
Agreement with the closed-form solution is exact to 1.4 × 10⁻¹⁴, and the reflection series conserves mass to within 10⁻⁴ — both asserted in the test suite and shown in the validation gallery.
One stack, six atmospheres. Only the stability class changes — the peak falls from 236 to 6.5 µg/m³ and moves from 640 m to beyond 15 km downwind.
Windows — double-click Run_Gaussian_Plume_Studio.bat. It finds Python,
installs the two libraries it needs the first time only, and opens the
application.
macOS / Linux
chmod +x run_gaussian_plume_studio.sh
./run_gaussian_plume_studio.shAs a package
pip install -e .
gaussian-plume gui # the desktop application
gaussian-plume list # the built-in scenarios
gaussian-plume run --preset worst-case --png map.png
gaussian-plume stability --night --wind 3 --cloud 10Only numpy and matplotlib are required. tkinter, used for the window, ships
with Python on Windows and macOS; on Debian and Ubuntu it is python3-tk.
Four views of the same run, recomputed in under a second whenever an input changes — which is what makes it possible to build intuition by sweeping a parameter rather than by reading a table.
| view | what it answers |
|---|---|
| Concentration map | where the pollutant lands, with labelled isopleths |
| Vertical section | what the plume is doing aloft — still rising, trapped under the lid, or reaching the ground |
| Profiles | along-plume and crosswind cuts through the peak |
| Report | every intermediate quantity: wind at stack height, plume rise and its regime, the fluxes, deposition velocities |
Six worked scenarios are built in, from a large power station on a neutral afternoon to a screening worst case. Scenarios save and load as JSON; fields export as CSV; every figure exports as PNG.
Stability class can be entered directly or worked out from the weather — time of day, cloud cover, sun angle and wind speed — through Turner's method, built into the interface.
The model is checked against things that cannot be argued with:
- The analytical solution. For a passive release with no lid the model must
reproduce
C = Q/(π u σ_y σ_z)·exp(−h_e²/2σ_z²). It does, to machine precision. - Conservation of mass. Integrating the vertical profile across the mixed layer returns exactly the emitted mass, whatever σ_z is. A wrong normalising constant would leave every concentration wrong by the same factor while still looking entirely plausible; this is what catches it.
- Published coefficients. σ_y and σ_z at 1 km for all six stability classes, against the Pasquill-Gifford curves.
- Physical limits. Superposition is exact. Dispersion is monotonic in distance. Unstable air disperses faster than stable air. Urban disperses faster than rural. Stronger wind never makes the atmosphere less neutral. Decay removes exactly half the mass per half-life of travel.
pytest # 33 physics tests
python tools_make_gallery.py # regenerate every figure in the gallery→ See the full validation gallery — ten figures covering all six stability classes, both terrains, three plume-rise regimes, eight wind directions, five particle sizes, and four independent verification checks.
Run_Gaussian_Plume_Studio.bat double-click launcher (Windows)
run_gaussian_plume_studio.sh launcher (macOS / Linux)
PROJECT_GUIDE.txt plain-text walkthrough of the whole model
tools_make_gallery.py regenerates every figure in the gallery
src/gaussianplume/
model.py the solver: geometry, superposition, assembly
dispersion.py sigma_y and sigma_z (Pasquill-Gifford, Briggs)
plume_rise.py Briggs rise, stack-tip downwash
wind.py power law and Monin-Obukhov similarity
vertical.py reflection off the ground and the mixing lid
deposition.py settling, deposition velocity, source depletion
stability.py Turner's classification from the weather
scenarios.py six worked examples with defensible numbers
gui.py the desktop application
cli.py command line interface
docs/
PHYSICS.md every equation, its source, and where it lives in the code
VALIDATION.md the gallery
figures/ the figures themselves
tests/ 33 physics tests, each pinned to an independent result
PROJECT_GUIDE.txt— what the model does, stage by stage, in plain textdocs/PHYSICS.md— every equation with its source and the assumptions it rests ondocs/VALIDATION.md— the gallery, with each figure explained
This is a steady-state Gaussian model. It assumes flat terrain, a uniform wind
field, and hourly averaging, and it does not represent building wakes, terrain
channelling or complex chemistry. Those limits are listed in full in
docs/PHYSICS.md — every one of them is
a condition under which the answer should not be trusted.
Within that scope the implementation follows the same formulations as the standard regulatory screening models, and the validation gallery shows it behaving correctly across the whole range.
MIT — see LICENSE.
