Back to Odor Forecast

Atmospheric Dispersion Methodology

A simplified Gaussian plume heuristic for real-time community odor forecasting
Application: Plumewatch — Alexandria–Pineville, Louisiana
Date: March 2026
Version: 2.0
This document describes the methodology used by this application. It is published for transparency and peer review. The model is a simplified heuristic, not a regulatory-grade dispersion model. A companion document with full facility characterization, calibration history, and UI details is available for internal review.

1. Model Overview

1.1 What This Model Is

This is a real-time odor scoring heuristic that runs entirely in a web browser. It ingests publicly available weather observations and forecasts, combines them with emissions data from LDEQ air permits, and produces a 0–100 odor intensity score for each point on a map, updated every 30 minutes across a 48-hour forecast horizon.

1.2 What This Model Is Not

This is not a regulatory dispersion model. It does not replace AERMOD, CALPUFF, or any EPA-approved model. Key differences:

The model borrows specific physics formulations from AERMOD (EPA’s regulatory Gaussian plume model, version 24142) where possible and documents every deviation where simplification was necessary.

1.3 Scoring Architecture

The core prediction is a product of seven dimensionless factors:

$$\text{Score} = E \times T \times I \times D \times H \times G \times M \times 100$$
SymbolFactorRangeWhat it captures
$E$Emission0–1Source strength: temperature-driven volatilization, source category weighting
$T$Transport0–1Wind direction, distance decay, meander
$I$Inversion1.0–1.8Multi-hour accumulation under persistent trapping
$D$Diurnal0.5–1.0Time-of-day atmospheric mixing regime
$H$Humidity0.6–1.3Moisture effects on odor perception and droplet absorption
$G$Terrain0.5–1.6Elevation-based drainage, valley channeling
$M$Mixing height0.6–1.0Boundary layer depth from AERMOD-inspired vertical physics
Deviation from AERMOD: AERMOD computes concentration in µg/m³ using $C = Q / (U_{\text{eff}} \cdot \sigma_y \cdot \sigma_z) \times F_y \times F_z$. Our multiplicative scoring approach was chosen because (a) we lack the emission rate $Q$ in g/s (we have only annual permit totals), (b) we lack the meteorological inputs to compute $\sigma_y$ reliably, and (c) the output is odor perception, not a regulatory concentration threshold. The tradeoff: we lose dimensional consistency but gain the ability to calibrate each factor independently against field observations.

2. Meteorological Inputs

2.1 Data Sources

SourceParametersUpdate frequencyRole
KAEX ASOS Temperature, dewpoint, humidity, wind speed/direction, pressure, visibility, ceiling, cloud cover ~30 min (METAR) Ground truth for current hour; blended into forecast
NWS hourly forecast (LCH gridpoint 88,143) Temperature, dewpoint, humidity, wind speed/direction, cloud cover, short forecast text ~1 hr Primary forecast source (0–48h)
Open-Meteo (ECMWF) Temperature, dewpoint, humidity, wind speed/direction, cloud cover, surface pressure ~6 hr (model runs) Secondary forecast; sole source of forecast pressure
NWS Area Forecast Discussion (LCH) Free-text meteorological analysis ~2×/day Scanned for inversion/stagnation keywords

2.2 Forecast Blending

NWS and Open-Meteo forecasts are blended with time-dependent weights. Near-term forecasts favor NWS (local forecaster skill); extended forecasts favor Open-Meteo (ECMWF global model). Wind direction is blended using vector averaging to handle the 360°/0° wraparound.

$$w_{\text{NWS}} = \begin{cases} 0.70 & \text{lead} \leq 6\text{h} \\ 0.70 - \frac{0.40}{42}(\text{lead} - 6) & 6\text{h} < \text{lead} < 48\text{h} \\ 0.30 & \text{lead} \geq 48\text{h} \end{cases}$$

2.3 What We Do Not Have

The following standard AERMOD/AERMET inputs are unavailable to this model:

Deviation from AERMOD: AERMOD requires a full suite of processed meteorological data from AERMET, including hourly mixing heights, Monin-Obukhov lengths, friction velocities, and turbulence parameters derived from surface and upper-air observations. Every subsequent calculation in this model inherits uncertainty from the absence of these inputs.

3. Stability Estimation

3.1 Our Approach

Atmospheric stability is represented as a single value from 0 (strongly unstable/convective) to 1 (strongly stable/inversion). This proxy is derived from a weighted combination of nine surface observation signals processed by the inversion detection module. The inversion score (0–1) is then mapped to stability:

$$\text{stability} = 0.5 + \text{inversionScore} \times 0.45$$

With overrides:

3.2 Inversion Detection Signals

The inversion score is a weighted sum of nine proxy signals. Weights depend on whether KAEX observation data is blended into the current period:

SignalWhat it measuresObs weightFcst weight
Dewpoint spread$|T - T_d|$; tight spread suggests fog/saturation0.100.10
Temperature trendOvernight temp rising/flat = inversion; cooling = normal0.100.10
Wind speedCalm wind allows stratification to persist0.150.20
Time-of-day priorBayesian prior for radiation inversions (peak 3–8 AM)0.050.05
AFD text keywordsNWS Area Forecast Discussion scanned for “inversion,” “fog,” “stagnation,” “high pressure,” “ridge”0.100.15
VisibilityKAEX ASOS visibility; low = trapping confirmed0.15
Pressure trendSteady/rising = stagnation; falling = frontal mixing0.10
Sky conditionClear night sky + Brutsaert radiative cooling estimate0.100.20
PersistenceExponential carryover from overnight formation (half-life ~2h)0.150.20

Wind veto: When wind speed $\geq 8$ mph, the inversion score is floored to $\min(0.2,\; \text{AFD} \times 0.2)$ regardless of other signals.

3.3 Subsidence Floor

When surface pressure is $\geq 1025$ mb, wind $\leq 8$ mph, and it is evening/nighttime (18:00–09:00), a floor is applied to the inversion score:

Pressure (mb)Inversion score floor
$\geq 1030$0.65
$\geq 1025$0.50
$\geq 1020$0.35
Deviation from AERMOD: AERMOD does not “detect” inversions. It receives stability ($L$) and mixing height ($z_i$) directly from AERMET, which has actual temperature soundings. Our entire inversion detection subsystem is a proxy-based classifier that infers atmospheric stratification from surface observations because we lack vertical temperature profiles. The subsidence floor is a heuristic: high surface pressure correlates with subsidence aloft, but the relationship is not deterministic.

3.4 AERMOD’s Approach (for comparison)

AERMOD classifies stability solely from the Monin-Obukhov length $L$:

$L$ is computed from friction velocity $u_*$, sensible heat flux $H_0$, and surface temperature via the surface energy balance in AERMET. This requires net radiation measurements or cloud cover with a radiation model, plus surface roughness and Bowen ratio — none of which we have.

4. Mixing Height Estimation

4.1 Our Approach

The boundary layer depth $z_i$ (meters) is estimated from three mechanisms, taking the minimum of applicable constraints:

Mechanical mixing depth (Zilitinkevich 1972 form)

$$z_{i,\text{mech}} = \frac{2300 \cdot u_*^{3/2}}{\sqrt{\text{stability}}}$$

where $u_*$ is estimated from neutral log-law:

$$u_* = \frac{\kappa \cdot U_{10}}{\ln(z_{\text{ref}} / z_0)}$$

with $\kappa = 0.4$, $z_{\text{ref}} = 10$ m, $z_0 = 0.5$ m (suburban/light industrial).

Convective mixing depth (daytime only)

$$z_{i,\text{conv}} = (400 + 1200 \cdot I_{\text{solar}}) \times f_T$$

where $I_{\text{solar}}$ is the normalized solar intensity (0 at horizon, 1 at solar noon) from Spencer (1971) solar position equations, and $f_T$ is a temperature boost (1.0 below 70°F, 1.1 at 70–85°F, 1.3 above 85°F).

Pressure-based subsidence cap (removed)

An earlier version of this model included a pressure-based subsidence cap: $z_{i,\text{sub}} = \max(80,\; 800 - 20 \cdot (P - 1013))$. This was removed after analysis of KSHV (Shreveport) radiosonde soundings from March 21–29, 2026, which showed no reliable relationship between surface pressure and inversion height:

Date/Time (CDT)Sfc P (mb)Inversion base (m AGL)Strength
Mar 21, 1 PM1005~830Strong (+3.6°C)
Mar 24, 7 PM1007~1700Weak
Mar 25, 7 PM1007~1900Strong (+2.4°C)
Mar 26, 7 PM1005~1500Very strong (+4.2°C)
Mar 27, 7 PM1011NoneUnstable (pre-frontal)
Mar 28, 7 PM1017 (SHV) / 1026 (KAEX)~830Moderate (+1.8°C)

The coefficient 20 m/mb had no literature basis, and the data show that inversions at ~830 m can occur at both 1005 mb and 1017 mb, while no inversion exists at 1011 mb. The synoptic pattern (ridge position, frontal timing, warm advection) determines inversion structure, not surface pressure alone. Mixing height estimation without upper-air soundings remains the model’s weakest link.

Inversion compression

When inversion score $> 0.5$:

$$z_i \leq 300 \times (1.5 - \text{inversionScore})$$

At score 1.0, this caps $z_i$ at 150 m. At score 0.85 (strong fog inversion), $z_i \leq 195$ m.

Final mixing height

$$z_i = \max\!\big(30,\; \min(z_{i,\text{mech}},\; z_{i,\text{conv}},\; z_{i,\text{inv}})\big)$$
Deviation from AERMOD: AERMOD receives $z_i$ from AERMET, which computes convective mixing height from the surface energy balance and mechanical mixing height from $u_*$ and the Coriolis parameter. AERMET uses actual upper-air soundings (NWS radiosonde network, typically 2×/day) to determine the top of the mixed layer directly. Without soundings, our $z_i$ estimate relies entirely on surface-derived proxies: $u_*$ from neutral log-law, a simplified solar heating diagnostic, and the inversion score. The convective depth diagnostic (400 + 1200 × solar intensity) has no direct counterpart in AERMET and may overestimate $z_i$ on overcast days or underestimate it during strong surface heating. A pressure-based subsidence cap was tested and removed after radiosonde validation showed no reliable surface-pressure-to-mixing-height relationship (see table above). This is the model’s single largest source of uncertainty.

5. Transport Model

5.1 Lateral Spread: Empirical Angular Model

The transport factor uses an empirical angular-sigma approach rather than Gaussian lateral dispersion ($\sigma_y$). For a receptor at distance $d$ (km) and bearing offset $\theta$ from the downwind direction:

Angular Gaussian falloff

$$F_{\theta} = \exp\!\left(-\frac{1}{2}\left(\frac{\theta}{\sigma_{\theta}}\right)^2\right)$$
Wind speed$\sigma_{\theta}$ (degrees)Base max distance (km)
$\leq 8$ mph50°5
8–15 mph30°7
$> 15$ mph20°10

Distance decay

$$F_d = \left(1 - \frac{d}{d_{\max}}\right)^{\alpha}$$

where the decay exponent $\alpha$ and max distance $d_{\max}$ are stability-dependent:

$$\alpha = 2.2 - 1.2 \times \text{stability}$$ $$d_{\max} = d_{\text{base}} \times (0.85 + 0.75 \times \text{stability})$$

Under strong stability ($s = 0.9$): $\alpha = 1.12$ (slow decay), $d_{\max} = 5 \times 1.525 = 7.6$ km.
Under instability ($s = 0.2$): $\alpha = 1.96$ (fast decay), $d_{\max} = 5 \times 1.0 = 5.0$ km.

Meander transition (AERMOD MEANDR)

Under calm winds, the plume meanders in all directions rather than maintaining a coherent fan. The meander fraction $m$ determines the blend between circular (pooling) and directional (fan) modes. The FRAN equation follows AERMOD’s MEANDR subroutine in calc2.f:

$$\text{FRAN} = \frac{2\sigma_v^2 + \overline{U}^2_{\text{mean}}(1 - e^{-t_{\text{trav}}/T})}{U^2}$$ $$m = 1 - \text{FRAN}$$

where $\overline{U}^2_{\text{mean}} = \max(0.01,\; U^2 - 2\sigma_v^2)$, $T = 86400$ s (24-hour meander timescale), and $t_{\text{trav}} = d/U$ is the travel time.

Deviation from AERMOD — meander inputs: The FRAN equation itself is correctly transcribed from AERMOD. However, the inputs differ in three ways:
  1. $\sigma_v$: We use $\sigma_v = 0.5 \times \min(U,\, 2.0)$ m/s. AERMOD computes $\sigma_v$ from measured turbulence profiles or Monin-Obukhov similarity ($\sigma_{v,\text{mech}} = \sqrt{3.6}\,u_* \approx 1.9\,u_*$). Our formula gives $\sigma_v/U \approx 0.5$ at low wind — higher than the typical 0.1–0.3 under neutral conditions. This overestimates meander, spreading the plume more circularly than AERMOD would. The 0.5 m/s floor at calm wind is consistent with Hanna (1990) observations.
  2. Timescale: We use $T = 24$ hours. EPA’s 2021 low-wind white paper recommended reducing this to 12 hours (LOWWIND2 option) after finding the default produced excessive meander. At our typical receptor distances (2–5 km), travel times are 15–30 minutes, so $e^{-t/T} \approx 1$ regardless of whether $T$ is 12 or 24 hours — the practical impact is small.
  3. FRAN cap: We allow FRAN to reach 1.0. The LOWWIND options cap it at 0.95, ensuring a minimum 5% meander contribution even in strong wind. The difference is negligible in practice.

Why we kept these values: In AERMOD, $\sigma_v$ drives both the meander fraction AND the lateral dispersion parameter $\sigma_y$. We use $\sigma_v$ only for meander — our lateral spread uses a separate angular-sigma model (Section 5.1). The “too high” $\sigma_v$ may compensate for the angular model’s different treatment of crosswind spread. Field validation of plume boundaries during morning inversion events showed good agreement with observed odor extent using the current parameterization. Correcting $\sigma_v$ to the AERMOD formula (using our estimated $u_*$, which is itself approximate) would lose this empirical validation without gaining a more physically grounded input.

Directional transport score

$$T_{\text{dir}} = F_{\theta} \times F_d \times F_{\text{dilution}}$$

where $F_{\text{dilution}}$ accounts for wind dilution at wind speeds above 5 mph.

Circular transport score

$$T_{\text{circ}} = \left(1 - \frac{d}{d_{\text{calm}}}\right)^{\alpha_c}$$

where $d_{\text{calm}} = 4.0 \times (0.85 + 0.75 \times s)$ km and $\alpha_c = \max(0.8, \alpha - 0.4)$.

Final transport factor

$$T = m \cdot T_{\text{circ}} + (1 - m) \cdot T_{\text{dir}}$$
Deviation from AERMOD: AERMOD computes lateral dispersion using $\sigma_y = (\sigma_v / U) \times x / (1 + x/(2UT_L))^{0.3}$ (from sigmas.f), producing a Gaussian crosswind profile $F_y = \exp(-y^2 / 2\sigma_y^2) / (\sqrt{2\pi}\,\sigma_y)$. We use an angular sigma ($\sigma_{\theta} = 20$–$50$°) instead. The 50° angular sigma at low wind speeds is intentionally wider than the Gaussian $\sigma_y$ would predict — this accounts for sub-hourly wind direction variability that an hourly-averaged observation cannot resolve. Field validation confirmed that the angular model produces plume boundaries matching observed odor extent during morning inversion events. The distance decay exponent $\alpha$ is empirically tuned, not derived from $\sigma_y \times \sigma_z$ physics.

6. Vertical Dispersion Physics

6.1 Vertical turbulence ($\sigma_w$)

Estimated from friction velocity with stability reduction (AERMOD siggrid.f form):

$$\sigma_w = \max\!\big(0.08,\; 1.3 \cdot u_* \cdot (1 - 0.6 \cdot s)\big)$$

The factor 1.3 is the AERMOD mechanical $\sigma_w$ coefficient near the surface. The $(1 - 0.6s)$ term reduces vertical turbulence under stable conditions.

Deviation from AERMOD: AERMOD computes $\sigma_w$ from measured turbulence profiles or Monin-Obukhov similarity theory: $\sigma_{w,\text{mech}} = 1.3 \cdot u_* \cdot \sqrt{1 - z/z_i}$. Our formula drops the $\sqrt{1 - z/z_i}$ height dependence (we evaluate at the surface only) and substitutes an empirical stability reduction $(1 - 0.6s)$ for the full M-O parameterization.

6.2 Vertical dispersion parameter ($\sigma_z$) with BVF capping

This is the AERMOD formula from sigmas.f for stable conditions:

$$\sigma_z = \frac{\sigma_w \cdot t}{\sqrt{1 + \sigma_w \cdot t \cdot \left(\frac{1}{0.72\,z_i} + \frac{N}{0.54\,\sigma_w}\right)}}$$

where $t = x / U$ is travel time and $N$ is the Brunt-Väisälä frequency:

$$N = 0.005 + 0.035 \times s$$

Asymptotic behavior: As $x \to \infty$, $\sigma_z$ saturates at $\sqrt{0.54 \cdot \sigma_w / N}$. For strong stability ($s = 0.9$, $N = 0.037$ s$^{-1}$), this cap is approximately 5–8 m. This is the key mechanism that extends plume range under stable conditions: vertical spread stops growing, so concentration decays only as $1/\sigma_y$ (one dimension) instead of $1/(\sigma_y \cdot \sigma_z)$ (two dimensions).

$\sigma_z$ is additionally capped at $0.8 \times z_i$ (cannot exceed mixing layer depth).

Deviation from AERMOD: The BVF ($N$) is estimated from a linear mapping $N = 0.005 + 0.035 \times s$, where $s$ is our 0–1 stability proxy. AERMOD computes $N = \sqrt{g \cdot (\partial\theta / \partial z) / T}$ from measured potential temperature gradients in upper-air soundings. Our linear mapping is a significant simplification: it cannot capture the actual temperature profile structure, and the coefficients (0.005, 0.035) are heuristic choices, not derived from local climatology.

6.3 Vertical concentration term ($F_z$) with reflections

Ground-level concentration from an elevated source requires accounting for reflections off the ground ($z = 0$) and the mixing height lid ($z = z_i$). Following AERMOD calc2.f, the vertical term uses an image-source sum:

$$F_z = \frac{1}{\sqrt{2\pi}\,\sigma_z} \sum_{n=-2}^{2} \left[ \exp\!\left(-\frac{(H_e + 2nz_i)^2}{2\sigma_z^2}\right) + \exp\!\left(-\frac{(-H_e + 2nz_i)^2}{2\sigma_z^2}\right) \right]$$

where $H_e$ is the effective release height. For the transport scoring, $H_e = 2$ m (ground-level sources dominate community odor). The sum uses 5 image pairs ($n = -2$ to $2$), which is sufficient when $\sigma_z < z_i$.

Well-mixed limit: When $\sigma_z \to z_i$, the image sum converges to $1/z_i$. This is the classic box-model result: concentration is inversely proportional to mixing height. Under subsidence (low $z_i$), $F_z$ is large, naturally producing higher concentrations without a separate multiplier.

6.4 Mixing Height Factor ($M$)

The mixing height factor compares the vertical concentration under current conditions to a neutral reference at 2 km downwind:

$$M = \frac{F_z(z_i, \sigma_z, U_{\text{eff}})}{F_z(z_{i,\text{ref}}, \sigma_{z,\text{ref}}, U_{\text{ref}})}$$

Reference conditions: $z_{i,\text{ref}} = 500$ m, stability $= 0.4$, $U_{\text{ref}} = 3.0$ m/s. The ratio is clamped to [0.6, 1.0] — the factor can reduce scores during strong daytime mixing but does not amplify above 1.0 because the morning inversion model was already calibrated without it.

7. Briggs Plume Rise

Elevated stack emissions (Pineville kilns, 25–32 ft / ~9 m stacks) undergo buoyancy-driven plume rise. The formulas follow Briggs (1975, 1984) as implemented in AERMOD prise.f:

Buoyancy flux

$$F_b = g \cdot v_s \cdot \left(\frac{d_s}{2}\right)^2 \cdot \frac{T_s - T_a}{T_s}$$

Stable rise

$$\Delta H_{\text{stable}} = 2.66 \cdot \left(\frac{F_b}{U \cdot N^2}\right)^{1/3}$$

Unstable/neutral rise

$$\Delta H_{\text{unstable}} = 1.6 \cdot F_b^{1/3} \cdot x_f^{2/3} / U$$

where $x_f = 49 \cdot F_b^{5/8}$ when $F_b < 55$ m$^4$/s$^3$.

Blended rise

$$\Delta H = s \cdot \Delta H_{\text{stable}} + (1 - s) \cdot \Delta H_{\text{unstable}}$$ $$H_e = H_{\text{stack}} + \min(\Delta H, 50)$$

Note: Plume rise is used in the chemical overlay visualization and the groundLevelFraction calculation, but the transport scoring uses $H_e = 2$ m for all plants because ground-level sources (cylinder operations, storage yards, fugitives) dominate the odor signal at community distances.

Deviation from AERMOD: The Briggs plume rise formulas themselves are standard (no deviation). However, we compute them with our estimated BVF ($N$) rather than measured potential temperature gradients, so the stable rise inherits that uncertainty. Additionally, the 50 m cap on $\Delta H$ is a conservative guard; AERMOD allows larger rise when $F_b$ is high.

8. Wind Profile

KAEX ASOS measures wind at 10 m. Wind at other heights uses neutral log-law (AERMOD windgrid.f):

$$U(z) = U_{\text{ref}} \cdot \frac{\ln(z / z_0)}{\ln(z_{\text{ref}} / z_0)}$$

with $z_0 = 0.5$ m and $z_{\text{ref}} = 10$ m. The ratio is capped at 2.0 to prevent extreme extrapolation.

Deviation from AERMOD: AERMOD uses stability-corrected Monin-Obukhov wind profiles: $U(z) = (u_* / \kappa)[\ln(z/z_0) - \psi_M(z/L) + \psi_M(z_0/L)]$, where $\psi_M$ is the stability correction function. Under stable conditions, the neutral log-law overestimates wind speed at height because $\psi_M$ for stable conditions reduces the profile. This makes our model slightly conservative (more dilution) under stable conditions.

9. Emission Modeling

9.1 Temperature-Driven Volatilization

VOC emission rates from open-air storage yards follow the Clausius-Clapeyron relation for vapor pressure. For naphthalene (the dominant odor compound at the Alexandria facility):

$$\text{VP ratio} = 2^{(T_{\text{eff}} - 77) / 15}$$

where 77°F is the reference temperature and the vapor pressure doubles every 15°F. For cresol (dominant at Pineville): the doubling interval is 18°F. The effective temperature $T_{\text{eff}}$ includes a solar heating boost for dark creosote surfaces during daytime, scaled by astronomical solar elevation angle (Spencer 1971).

9.2 Source Categories and Diurnal Weighting

Each facility’s emissions are split into source categories with time-of-day-dependent weights. Source characterization is derived from LDEQ air permits and production data.

CategoryRelease heightDay weightNight weightDriver
Alexandria: tie yard (area)Ground0.650.40Solar-heated surfaces
Alexandria: cylinders (point)Ground0.350.60Process at 140°F, 24/7
Pineville: pole yard (area)Ground0.300.10Solar-heated surfaces
Pineville: ground processGround0.250.35Cylinders, tanks, fugitives
Pineville: kiln stacks9 m0.450.55Batch process, 65% duty cycle
Deviation from AERMOD: AERMOD takes emission rates $Q$ (g/s) as direct inputs from the user. We estimate relative emission intensity (0–1 range) from annual permit totals and temperature. We do not know actual real-time emission rates. Our emission factors are dimensionless and cannot be validated against measured mass flux.

10. Terrain

Terrain elevation is interpolated from 60+ USGS 1/3 arc-second DEM control points using inverse-distance-weighted (IDW) interpolation with $w = 1/d^2$.

During calm/inversion conditions, terrain modifies the score:

Deviation from AERMOD: AERMOD uses AERMAP for full terrain preprocessing, computing receptor-specific terrain heights and a hill-height scaling factor that adjusts the effective plume height at each receptor. Our model uses a simpler elevation-difference heuristic that only considers whether a point is above or below the plant, without AERMOD’s dividing streamline concept or terrain-following plume behavior.

11. Brutsaert Radiative Cooling (Inversion Signal)

The sky condition signal in the inversion detector uses the Brutsaert (1975) clear-sky atmospheric emissivity to estimate net radiative cooling rate:

$$\varepsilon_{\text{clear}} = 1.24 \cdot \left(\frac{e_a}{T_K}\right)^{1/7}$$

with the Li et al. (2017) nighttime correction ($+0.035$) and Crawford & Duchon (1999) cloud modification ($\varepsilon_{\text{all}} = \varepsilon_{\text{clear}} \times (1 + 0.22 \cdot CF^{2.75})$). Net cooling: $R = \sigma T^4 (1 - \varepsilon)$, normalized to a 0–1 signal over the range 20–70 W/m².

These formulas are applied as published with no modification.

12. Summary of Deviations from AERMOD

ComponentAERMOD approachOur approachRationale
Stability Monin-Obukhov length $L$ from energy balance 0–1 proxy from 9 surface signals No flux measurements available
Mixing height AERMET with upper-air soundings Estimated from $u_*$, solar heating, inversion score (pressure proxy tested and removed) No radiosonde data; pressure-to-zi relationship not supported by KSHV sounding analysis
Lateral dispersion $\sigma_y$ from M-O similarity Angular sigma (20–50°) with empirical decay Sub-hourly wind variability; validated against field obs
Vertical dispersion $\sigma_z$ from M-O with measured $N$ $\sigma_z$ from AERMOD formula with estimated $N$ Formula is standard; $N$ input is heuristic
BVF ($N$) $\sqrt{g \cdot d\theta/dz \;/\; T}$ from soundings $0.005 + 0.035 \times s$ (linear mapping) No temperature profile data
Wind profile M-O similarity with $\psi_M$ correction Neutral log-law only $L$ not available for stability correction
Concentration output $\mu$g/m³ Dimensionless 0–100 score No $Q$ in g/s; calibrated to odor perception
Emission rates Direct input ($Q$ in g/s) Relative intensity from permits + temperature Real-time emission data not available
Terrain AERMAP with dividing streamline Elevation-difference heuristic Simplified for browser computation
Subsidence detection Not needed (receives $z_i$ from AERMET) Inversion score floor when P $\geq$ 1025 mb (stability proxy, not $z_i$ estimate) Surface pressure indicates stable conditions but does not reliably predict $z_i$

13. Known Limitations

  1. No upper-air data: Mixing height, BVF, and stability are all estimated from surface observations. This is the model’s single largest source of uncertainty.
  2. Hourly resolution: The model cannot resolve sub-hourly plume passage events. A transient 15-minute odor puff receives the same score as a persistent 60-minute event.
  3. Single wind observation: KAEX ASOS is applied uniformly across the domain. Local terrain-induced wind variations (valley channeling, slope flows) are not resolved.
  4. Empirical calibration: Scores are calibrated against subjective odor reports from a small number of observers. Olfactory sensitivity varies between individuals.
  5. Multiplicative structure: If any single factor is severely wrong, it multiplicatively corrupts the entire score. There is no additive fallback.
  6. No building downwash: AERMOD’s PRIME algorithm for wake effects behind structures is not implemented. Near-field concentrations from stacks near buildings may be underestimated.
  7. No reactive chemistry: VOC compounds are treated as inert tracers. Photochemical transformation and deposition are not modeled.
  8. Emission uncertainty: Actual real-time emission rates are unknown. Permit data represents maximum allowable, not actual, emissions.
  9. Meander parameterization is uncalibrated: The $\sigma_v$ input to the FRAN meander equation (Section 5.1) is a heuristic approximation that produces more circular spread than AERMOD would compute. Field-validated plume boundaries suggest the current parameterization produces reasonable results, but the agreement may be coincidental — the “too high” $\sigma_v$ may compensate for other simplifications in the angular-sigma lateral model. This is the highest-priority candidate for empirical recalibration once sufficient geo-tagged odor observations have been collected. A regression of model residuals (predicted score minus reported intensity) against wind speed, receptor distance, and angle from the downwind axis would reveal whether the meander fraction is systematically over- or under-spreading the plume, and allow data-driven tuning of $\sigma_v$ and the meander timescale $T$.

14. Known Unknowns

This section lists every place where the model bridges a gap between published physics and available data with an invented coefficient. These are known unknowns — we know exactly what we don’t know, we know what measurement would answer it, and we are using a placeholder until that data is available. Each constant is extracted by name at the top of prediction.js so it can be found, questioned, and replaced.

14.1 Mechanical Mixing Height

Constant: ZI_MECH_COEFF = 2300

$$z_{i,\text{mech}} = 2300 \cdot \frac{u_*^{3/2}}{\sqrt{s}}$$
What we knowThe Zilitinkevich (1972) formula relates stable mixing height to $u_*$, Monin-Obukhov length $L$, and the Coriolis parameter: $z_i = 0.4\sqrt{u_* L / f}$. This is published, peer-reviewed physics.
What we don’t knowThe Monin-Obukhov length $L$. Computing $L$ requires sensible heat flux, which requires net radiation measurements we do not have. We substituted our 0–1 stability proxy for $L$ and absorbed the dimensional mismatch into the coefficient.
What the coefficient isThe number 2300 has no literature basis. It was chosen to produce $z_i \approx 150$ m at $u_* = 0.3$ m/s, stability $= 0.7$ (a typical stable night). It has not been validated against sounding data.
What would replace itRegression of KSHV radiosonde mixing heights against concurrent KAEX surface observations. The nearest sounding station (Shreveport, 190 km NW) launches at 00Z and 12Z daily. A dataset of $z_i$ vs. ($u_*$, stability, season) would yield a real coefficient — or reveal that the functional form $u_*^{3/2}/\sqrt{s}$ is itself wrong.

14.2 Convective Mixing Height

Constants: ZI_CONV_BASE = 400, ZI_CONV_SOLAR = 1200

$$z_{i,\text{conv}} = (400 + 1200 \cdot I_{\text{solar}}) \times f_T$$
What we knowDaytime mixing height is driven by surface sensible heat flux, which is driven by solar radiation. $z_i$ grows through the morning and peaks in the early afternoon. Typical values for central Louisiana: 500–2000 m depending on season and cloud cover.
What we don’t knowThe actual surface heat flux. Computing it requires net radiation (measured or parameterized from cloud cover + albedo + soil moisture), none of which we have. We substituted solar elevation angle as a proxy for heat flux.
What the coefficients are400 and 1200 are invented. They were chosen to produce $z_i \approx 500$ m at sunrise and $\sim$1600 m at solar noon, which seemed reasonable. There is no published formula of this form.
What would replace themKSHV 12Z (7 AM) and 00Z (7 PM) soundings paired with KAEX surface conditions. Published alternatives exist: Betts (1992) and Stull (1988) provide convective scaling diagnostics, but they still require heat flux estimates. A simpler approach: build a $z_i$ climatology for KSHV binned by month, hour, and cloud cover.

14.3 Brunt-Väisälä Frequency Mapping

Constants: BVF_BASE = 0.005, BVF_SLOPE = 0.035

$$N = 0.005 + 0.035 \times s$$
What we knowThe Brunt-Väisälä frequency is $N = \sqrt{g \cdot (\partial\theta/\partial z) / T}$. This is fundamental atmospheric physics. Typical values: 0.005–0.01 s$^{-1}$ (neutral/weakly stable), 0.02–0.04 s$^{-1}$ (strongly stable nocturnal inversion). The BVF controls the asymptotic cap on $\sigma_z$ in the AERMOD formula.
What we don’t knowThe potential temperature gradient $\partial\theta/\partial z$. This requires a vertical temperature profile from a radiosonde. We have no vertical measurements of any kind.
What the coefficients are0.005 and 0.035 define a linear mapping from our 0–1 stability proxy to the BVF range. We assumed the relationship is linear. It may not be — inversions can form abruptly (a step change in $N$) rather than scaling smoothly with surface signals.
What would replace themCompute $N$ from KSHV soundings at multiple levels (surface to 1000 m AGL), then plot observed $N$ against our stability proxy for the same hour. This would reveal the actual functional form — linear, exponential, step function, or something else entirely.

14.4 Vertical Turbulence Stability Damping

Constants: SW_COEFF = 1.3 (AERMOD, published), SW_STAB_DAMP = 0.6 (invented)

$$\sigma_w = \max\!\big(0.08,\; 1.3 \cdot u_* \cdot (1 - 0.6 \cdot s)\big)$$
What we knowAERMOD computes mechanical $\sigma_w = 1.3\,u_* \cdot \sqrt{1 - z/z_i}$ near the surface (from siggrid.f). The 1.3 coefficient is published and standard. Under stable conditions, vertical turbulence is suppressed by stratification.
What we don’t knowHow much stability suppresses $\sigma_w$ in our model. AERMOD uses the full Monin-Obukhov similarity profile with height dependence. We evaluate only at the surface and need a single reduction factor.
What the coefficient isThe 0.6 stability damping factor is invented. It reduces $\sigma_w$ to 40% of neutral under strong stability ($s = 1.0$). We do not know if this is correct. It could be 0.4 or 0.8 — we have no direct measurement to constrain it.
What would replace itIndirectly, through the odor observation dataset. If the model systematically under-predicts at long range under stable conditions, the damping may be too strong ($\sigma_w$ too small, $\sigma_z$ capped too low, concentration too near-source). If it over-predicts at long range, the damping is too weak. The regression residuals from geo-tagged odor reports, binned by stability class and distance, would constrain this.

14.5 Inversion Score Compression of Mixing Height

Constants: INV_CAP_BASE = 300, INV_CAP_OFFSET = 1.5, INV_CAP_THRESHOLD = 0.5

$$z_i \leq 300 \times (1.5 - \text{inversionScore}) \quad \text{when score} > 0.5$$
What we knowStrong surface inversions compress the mixing height. A fog event with strong radiation cooling can produce $z_i$ as low as 50–200 m. Our inversion detection score (Section 3) correlates with these conditions.
What we don’t knowThe actual mapping between our inversion score and $z_i$. Is a score of 0.85 really associated with $z_i = 195$ m? Or is it 100 m? Or 400 m?
What the coefficients are300, 1.5, and 0.5 are invented. They were chosen because the resulting scores (60–65 near Pineville under fog) matched one validated morning event (March 25, 2026). One data point is not a calibration.
What would replace themPair our inversion scores with the concurrent KSHV 12Z sounding $z_i$. If the sounding shows $z_i = 200$ m when our score is 0.85, the formula is close. If it shows 400 m, we are over-compressing. A scatter plot of (inversion score, observed $z_i$) from 30+ sounding pairs would determine these constants — or show that a linear formula is the wrong shape.

14.6 Meander Parameters

The $\sigma_v$ input to the FRAN equation (Section 5.1) and the meander timescale $T$ are the highest-priority known unknowns. See Section 5.1 for the full deviation analysis. These will be the first targets for the odor observation regression described in Section 13.

What we knowThe FRAN equation structure is from AERMOD. Hanna (1990) showed $\sigma_v$ maintains ~0.5 m/s in calm conditions. EPA’s 2021 low-wind white paper recommended a 12-hour meander timescale.
What we don’t knowThe correct $\sigma_v$ for our angular-sigma lateral model (which differs from AERMOD’s $\sigma_y$-based model). The current value may be compensating for other simplifications.
What the values are$\sigma_v = 0.5 \times \min(U, 2.0)$ and $T = 86400$ s (24 hours). Neither is derived from local data.
What would replace themRegression of model residuals (predicted − observed intensity) against wind speed, distance, and angle from downwind. Systematic over-prediction at off-axis points means too much meander. Systematic under-prediction means too little.

15. References