Skip to content

Repository files navigation

Gaussian Plume Studio

A validated Gaussian plume dispersion model with a desktop interface.

Python 3.10+ License: MIT Tests

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.


Stability atlas

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.


Run it

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.sh

As 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 10

Only 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.


The application

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.


What makes it trustworthy

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.


Repository layout

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

Documentation


Scope

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.

License

MIT — see LICENSE.