Gaussian Plume Simulation

Real-Time Atmospheric Dispersion

A sensor reads 50 ppm. Wind vector applied. Plume footprint drawn. Jurisdiction boundary highlights when the plume crosses it. Adjust the controls to see the physics respond instantly.

SENSOR · 50 ppm detected
WIND · 3.0 m/s · 270°
JURISDICTION · CLEAR

Emission Parameters

Wind Speed 3.0 m/s
Wind Direction 270°
Emission Rate (Q) 50 g/s
Stack Height (H) 10 m
σy (crosswind spread)
σz (vertical spread)
Peak ground conc.
Plume centerline (100m)
Jurisdiction max conc.

Boundary Monitoring

CLEAR
River Valley Air Quality District
EPA-designated non-attainment zone. Industrial emission threshold applies within district boundary.
Threshold: 5.0 µg/m³ · Current: 0.00 µg/m³

Gaussian Plume Model (Tier 1)

// Ground-level concentration (z=0) C(x,y) = Q / (π·σy·σz·u) · exp(-y²/2σy²) · exp(-H²/2σz²) // Pasquill-Gifford Class D // σy = 0.22x(1+0.0001x)^-0.5 // σz = 0.16x(1+0.0001x)^-0.5

What the API call looks like

POST https://api.geog.ai/v1/simulate/plume { "sensor_id": "S-4821", "lat": 36.7783, "lon": -119.4179, "reading_ppm": 50, "wind_speed": 3.0, // m/s — from met station or forecast "wind_dir_deg": 270, // meteorological convention "stack_height": 10, // effective emission height, m "stability": "D" // Pasquill-Gifford class } // Response includes: contour GeoJSON, jurisdiction crossings, // regulatory thresholds exceeded, confidence interval (calibrated)