This paper presents a novel, web-based atmospheric odor prediction system designed to forecast community-level odor events originating from two wood-treatment industrial facilities in central Louisiana. The system integrates real-time National Weather Service (NWS) forecast data, chemical-specific volatilization physics, Gaussian plume dispersion modeling, terrain-aware transport calculations, and temperature inversion detection into a unified scoring model that produces hourly odor intensity forecasts across a 48-hour horizon. A key innovation is the explicit modeling of open-air treated wood storage yards as dominant area emission sources, with solar-heated surface temperature calculations driving nonlinear volatilization curves that shift source dominance between daytime (area sources) and nighttime (point and elevated sources). The system also incorporates retention pond volatilization, product-specific surface-area-to-volume ratios, and diurnally shifting source weights. The application was developed entirely through AI-assisted coding using Claude, Anthropic’s large language model, and has demonstrated consistent accuracy in predicting real-world odor events as validated through field observations and aerial imagery analysis.
Wood-treatment facilities that use creosote, pentachlorophenol, and other chemical preservatives emit volatile organic compounds (VOCs) that can produce persistent, community-impacting odors. The Alexandria–Pineville metropolitan area in central Louisiana hosts two such facilities that collectively emit approximately 97 tons of VOCs per year. Community members have long reported episodic odor events, but the occurrence and intensity of these events are highly dependent on meteorological conditions, making them difficult to predict.
Traditional air quality monitoring relies on fixed-position sensors and regulatory dispersion models (e.g., AERMOD, CALPUFF) that require professional operation, expensive instrumentation, and are not typically available to the public in real-time. There exists a gap between industrial emissions data publicly available through environmental permits and the community’s ability to anticipate when those emissions will produce noticeable odors at ground level.
This project sought to bridge that gap by developing an accessible, browser-based prediction tool that:
The entire application — encompassing atmospheric physics, chemical engineering principles, geographic information systems, and web development — was developed through iterative collaboration with Claude, Anthropic’s AI assistant. This represents a significant demonstration of how large language models can synthesize domain knowledge across multiple scientific and engineering disciplines to produce functional, accurate software systems. The development process involved translating environmental permit data, atmospheric science principles, and field observations into working algorithms through natural-language dialogue, with the AI generating all source code, mathematical models, and visualization components.
Emissions data were derived from Louisiana Department of Environmental Quality (LDEQ) permit records, which provide annual emissions estimates by compound for each facility. These permits represent the authoritative public record of expected emissions under normal operating conditions. Permit data was supplemented by analysis of publicly available Google Maps aerial imagery and Street View photography, which revealed significant open-air storage areas and retention ponds that constitute major emission sources not fully characterized by permit-level fugitive emission estimates. The distinction between area sources (open-air wood storage yards, retention ponds) and point sources (treatment cylinders, kiln stacks) is critical to the model’s emission factor architecture.
The Alexandria facility, located at 72 ft elevation on the Red River valley floor, treats railroad ties with coal-tar creosote using four high-pressure treatment cylinders operating at approximately 140°F. The facility operates continuously (24/7/365) with 7–8 cylinder unloading events per day.
Aerial imagery and street-level photography reveal three distinct emission source categories at this facility:
Untreated railroad ties are also stored on site in tightly packed, uniform square stacks, primarily in the northern portion of the yard. These lighter-colored stacks are not a significant odor source.
Table 1: Alexandria Facility Emissions Profile
| Compound | Annual Emissions (tons/yr) | Fugitive Fraction | Odor Character |
|---|---|---|---|
| Naphthalene | 9.26 | 80% (7.41 tons) | Mothball/tar |
| Cresol | 0.14 | High | Medicinal/phenolic |
| Quinoline | 0.36 | Moderate | Chemical |
| Biphenyl | 0.20 | Moderate | Pleasant/floral |
| PAHs (mixed) | 0.26 | Low | Tar |
| Phenol | 0.09 | High | Sweet/medicinal |
| Total VOCs | 18.67 | — | — |
| Non-VOC emissions: | |||
| PM10 (particulate matter) | 12.22 | — | — |
The dominant odor-producing compound is naphthalene, with 80% of emissions classified as fugitive (released from equipment surfaces, valves, pumps, and freshly treated product rather than from controlled stacks). This fugitive-dominated profile is critical to the dispersion model, as these emissions occur at ground level and are directly subject to meteorological conditions at the surface. The open-air tie yard represents a massive area source with zero effective stack height — even very light winds carry volatilized naphthalene directly into adjacent neighborhoods without the vertical dispersion benefit that elevated stack releases provide.
The Pineville facility presents a substantially more complex emissions profile. Located at 103 ft elevation on the Pineville bluff — approximately 30 ft above the Red River valley floor — the facility treats utility poles with multiple preservative systems (creosote, pentachlorophenol, DCOI, and CCA) and operates three treatment cylinders, two dry kilns, and a large tank farm (>103,000 gallons of creosote and >62,000 gallons of diesel carrier solvent).
Aerial imagery reveals dozens of creosote-treated telephone pole stacks stored outdoors across several acres of open yard. These are clearly visible from satellite as dark black/brown bundles, distinct from the lighter raw/untreated poles also staged on site. A pole drying kiln is also visible, with an estimated effective stack height of 25–30 ft, a row of rooftop exhaust vents, and thick insulated concrete/metal walls — constituting a continuous elevated point source during operation. The facility’s three source categories — open-air pole yard, ground-level process emissions, and elevated kiln stacks — each exhibit fundamentally different emission and transport behaviors.
Table 2: Pineville Facility Emissions Profile
| Compound | Annual Emissions (tons/yr) | Release Type | Odor Character |
|---|---|---|---|
| Kiln Stack Emissions (elevated, 25–32 ft): | |||
| Acetaldehyde | 2.10 | Stack | Pungent/fruity |
| Formaldehyde | 0.86 | Stack | Sharp/irritating |
| Methanol | 0.82 | Stack | Sweet/pungent |
| Other kiln VOCs | ~57.90 | Stack | Mixed |
| Ground-Level Emissions: | |||
| Cresol | 1.62 | Fugitive | Medicinal/phenolic |
| Naphthalene | 0.84 | Fugitive | Mothball |
| Diesel (carrier) | Significant | Fugitive | Petroleum |
| Biphenyl | 0.19 | Fugitive | Pleasant |
| Quinoline | 0.11 | Fugitive | Chemical |
| n-Hexane | 0.26 | Fugitive | Gasoline-like |
| Total VOCs | 78.68 | — | — |
The critical insight incorporated into the model is that Pineville’s emissions operate as a three-regime system. Open-air treated pole storage constitutes a solar-driven area source that dominates during daytime hours. Ground-level process emissions (cylinders, tanks, drip pads) contribute cresol, diesel, and naphthalene as fugitive sources. Kiln stacks (25–32 ft) release 78% of total VOCs as light, buoyant gases (molecular weight 30–44 g/mol) that dominate the nighttime and inversion-trapped odor profile. The treated poles have a lower surface-area-to-volume ratio than Alexandria’s railroad ties (cylindrical vs. flat rectangular geometry), resulting in a lower per-acre area source emission rate despite covering a comparable footprint. These three regimes exhibit fundamentally different emission rates, temperature sensitivities, and atmospheric transport behavior, requiring separate modeling approaches with diurnally shifting source weights.
The system integrates two complementary NWS data streams: hourly forecast data for future predictions and real-time observation data for current-hour accuracy. The NWS provides hourly forecast data on a 2.5 km grid covering the continental United States. The system queries the grid point nearest to the Alexandria–Pineville area:
The following parameters are extracted from NWS hourly forecasts for each prediction period:
| Parameter | Source Endpoint | Resolution |
|---|---|---|
| Temperature (°F) | /gridpoints/LCH/88,143/forecast/hourly | Hourly |
| Dewpoint (°F) | /gridpoints/LCH/88,143 (gridData) | Hourly |
| Relative Humidity (%) | /gridpoints/LCH/88,143/forecast/hourly | Hourly |
| Wind Speed (mph) | /gridpoints/LCH/88,143/forecast/hourly | Hourly |
| Wind Direction (compass) | /gridpoints/LCH/88,143/forecast/hourly | Hourly |
| Short Forecast (text) | /gridpoints/LCH/88,143/forecast/hourly | Hourly |
| Area Forecast Discussion | /products/types/AFD/locations/LCH | ~6 hourly |
Wind speed values, which are reported in range format (e.g., “5 to 10 mph”), are parsed by extracting all numeric values and using the maximum, providing a conservative estimate for dilution calculations.
For the current hour, the system replaces NWS forecast values with actual measurements from the KAEX ASOS (Automated Surface Observing System) station. This “observation blending” addresses a fundamental limitation of forecast-only models: NWS forecasts are predictions that may diverge significantly from actual conditions, particularly for wind speed and direction. In initial testing, forecast wind speed errors of 5+ mph were observed, which can substantially alter plume dispersion calculations.
The following additional parameters are available from KAEX observations but not from NWS forecasts:
| Parameter | Source | Use in Model |
|---|---|---|
| Barometric Pressure (mb) | /stations/KAEX/observations/latest | Inversion detection: pressure trend signal |
| Visibility (miles) | /stations/KAEX/observations/latest | Inversion detection: direct trapping measurement |
When a KAEX observation is available and less than 90 minutes old, the system identifies the forecast period closest
to the current time and overlays measured values (temperature, dewpoint, humidity, wind speed, wind direction) onto the
forecast data. The blended period is flagged (hasObservation = true) to enable observation-aware
weighting in downstream algorithms (see Section 4.4). Future forecast periods continue to use NWS predictions unchanged.
To manage API rate limits, ensure responsive user experience, and build a persistent weather archive for model calibration, the system implements a three-tier data strategy:
The D1 archive retains data indefinitely. At approximately 200 bytes per observation and 48 observations per day, annual storage is approximately 1.7 MB — negligible cost for a dataset that becomes increasingly valuable for pattern analysis, seasonal calibration, and forecast error characterization.
The system computes odor intensity as a dimensionless score (0–100) using a multiplicative combination of independent environmental factors:
$$\text{Score} = E \times T \times I \times D \times H \times G \times 100$$Where:
Each factor is normalized to a baseline of approximately 1.0 under typical conditions, with values below 1.0 indicating conditions that reduce odor impact and values above 1.0 indicating amplification. The multiplicative structure ensures that any single factor near zero (e.g., strong wind providing high dilution) can suppress the overall score regardless of other favorable conditions — reflecting the physical reality that effective dispersion through any mechanism reduces ground-level concentrations.
The emission factor models the rate at which VOCs volatilize from facility surfaces, equipment, and liquid impoundments as a function of temperature and time of day. The model distinguishes between three source categories at each facility: area sources (open-air treated wood storage, retention ponds), point sources (treatment cylinders), and elevated sources (kiln stacks). Source weighting shifts diurnally: solar-heated area sources dominate during daytime hours, while point and elevated sources dominate at night and during inversions.
Dark, creosote-saturated surfaces absorb 85–95% of incident solar radiation (albedo 0.05–0.15), consistent with published values for dark organic coatings and asphalt. The resulting surface temperature exceeds ambient air temperature by a margin that increases nonlinearly with ambient temperature, consistent with the Stefan-Boltzmann law (radiative heating scales as $T^4$, while convective cooling scales linearly).
Rather than using fixed daytime hours (e.g., 8 AM–6 PM), the model calculates astronomically correct sunrise and sunset times for each forecast period using the solar declination equation (Spencer, 1971). This accounts for seasonal variation in day length and DST transitions:
The solar declination $\delta$ is computed from the day of year $n$:
$$\gamma = \frac{2\pi(n-1)}{365}$$ $$\delta = 0.006918 - 0.399912\cos\gamma + 0.070257\sin\gamma - 0.006758\cos 2\gamma + \ldots$$The hour angle at sunrise/sunset is:
$$\omega_0 = \arccos(-\tan\phi \cdot \tan\delta)$$where $\phi$ is the site latitude (31.31°N). Solar noon is corrected using the Equation of Time, and sunrise/sunset times are derived from solar noon ± $\omega_0 / 15$ hours.
The solar heating boost is not applied as a flat on/off switch but is scaled by the normalized solar elevation angle $\alpha$, which represents the sun’s angular height above the horizon relative to its peak for the day:
$$S_I = \frac{\alpha(h)}{\alpha_{\max}}$$where $\alpha(h)$ is the solar elevation at hour $h$ and $\alpha_{\max}$ is the peak elevation at solar noon. This ensures the heating boost ramps gradually after sunrise (low sun angle = weak heating), peaks at solar noon, and tapers toward sunset. The effective surface temperature becomes:
$$T_{\text{eff}} = T_F + \Delta T_{\text{solar}} \cdot S_I$$where $\Delta T_{\text{solar}}$ is the peak solar heating boost (at full intensity), which varies by product type:
Table 3: Peak Solar Heating Boost by Ambient Temperature and Product Type
| Ambient Temp | Railroad Ties (Alexandria) | Telephone Poles (Pineville) | Rationale |
|---|---|---|---|
| > 85°F | 40–62°F boost | 30–48°F boost | Sharp nonlinear ramp; surfaces reach 125–155°F at solar noon |
| 70–85°F | 15–40°F boost | 10–30°F boost | Moderate solar heating |
| 55–70°F | 0–15°F boost | 0–10°F boost | Mild solar effect |
| < 55°F | 0°F | 0°F | Insufficient solar input |
These peak values are attained at solar noon ($S_I = 1.0$). At one hour after sunrise, $S_I$ is typically 0.2–0.3, so a 95°F day would produce only ~12°F of surface boost rather than the full 55°F. This prevents the model from applying unrealistic solar heating during early morning or late evening when the sun is near the horizon.
Railroad ties receive a larger solar boost than telephone poles due to their higher surface-area-to-volume ratio. A tie (approximately 7” × 9” × 8.5’) exposes roughly 2–3× more creosote-saturated surface per unit volume than a cylindrical pole (approximately 12” diameter × 40’). More exposed surface area means more evaporative surface, and the flat horizontal faces of stacked ties receive more direct-normal solar radiation than the curved surfaces of cylindrical poles. At night ($S_I = 0$), surfaces cool to near ambient temperature and $T_{\text{eff}} = T_F$.
The Alexandria emission model combines three source categories with diurnally shifting weights:
Source 1: Open-air tie storage (area source). Vapor pressure is calculated using the Clausius-Clapeyron relation at the effective surface temperature:
$$f_{\text{ties}} = \text{clamp}\!\left(2^{(T_{\text{eff}} - 77) / 15},\; 0.35,\; 5.0\right)$$The floor of 0.35 reflects field observations that creosote-soaked wood emits detectable naphthalene even at 40°F. The ceiling is raised to 5.0 (from the previous 3.0) to accommodate the high effective surface temperatures driven by solar heating on hot summer days.
Source 2: Cylinder operations (point source). Internal temperature of 140°F is maintained regardless of ambient conditions. The factor is constant at 1.0, reflecting the 24/7 nature of the 7–8 daily unloading events.
Source 3: Retention ponds (area source). Volatilization from open creosote-contaminated stormwater follows the same Clausius-Clapeyron relationship but at ambient temperature (liquid temperature approximates air temperature) with a 0.4× scaling factor reflecting the lower concentration of dissolved VOCs in stormwater compared to neat creosote on wood:
$$f_{\text{ponds}} = \text{clamp}\!\left(0.4 \times 2^{(T_F - 77) / 15},\; 0.15,\; 2.5\right)$$The combined Alexandria emission factor uses diurnally shifting source weights:
$$E_{\text{Alex}} = B_I \times (f_{\text{ties}} \times w_1 + f_{\text{cyl}} \times w_2 + f_{\text{ponds}} \times w_3)$$Table 4: Alexandria Source Weights by Time of Day
| Source | Daytime (sunrise–sunset) | Nighttime | Rationale |
|---|---|---|---|
| Open-air tie yard | 0.55 | 0.30 | Solar heating drives massive daytime off-gassing; cools at night |
| Cylinder operations | 0.30 | 0.50 | Constant 24/7; relatively more important when area sources cool |
| Retention ponds | 0.15 | 0.20 | Persistent but lower-rate; modest thermal mass moderates cooling |
where $B_I = 0.5$. Both facilities operate 24/7/365 with no publicly known shift or batch schedule, so the model does not assume peak operational hours. Temporal variation in odor intensity is instead driven entirely by atmospheric factors: temperature-dependent volatilization, inversion trapping, solar heating, and the diurnal factor (Section 4.5).
The Pineville emission model separately calculates three source contributions with diurnally shifting weights:
Source 1: Open-air pole storage (area source). Vapor pressure is calculated at effective surface temperature using the cresol curve (doubles every 18°F) since cresol dominates the odor profile of treated poles due to its extraordinarily low detection threshold (~0.001 ppm):
$$f_{\text{poles}} = \text{clamp}\!\left(2^{(T_{\text{eff}} - 77) / 18},\; 0.25,\; 4.0\right)$$Source 2: Ground-level process emissions (point/fugitive sources). This regime models emissions from cylinders, storage tanks, drip pads, and fugitive sources using a weighted blend of compound-specific factors:
A tank breathing modifier adds 20% during afternoon hours (1–5 PM) when temperatures exceed 70°F, modeling thermal expansion of liquid in the facility’s 165,000+ gallon tank farm. Cylinder operations contribute a constant baseline blended at 25% weight.
Source 3: Kiln stack emissions (elevated source, 25–32 ft). Uses a base factor of 0.7 reflecting reduced ground-level impact of elevated releases, with adjustments:
The combined Pineville emission factor uses diurnally shifting source weights:
$$E_{\text{Pine}} = B_I \times (f_{\text{poles}} \times w_1 + f_{\text{ground}} \times w_2 + f_{\text{kiln}} \times w_3)$$Table 5: Pineville Source Weights by Time of Day
| Source | Daytime (sunrise–sunset) | Nighttime | Rationale |
|---|---|---|---|
| Open-air pole yard | 0.30 | 0.10 | Major daytime source via solar heating; cools at night |
| Ground-level process | 0.25 | 0.20 | Continuous but temperature-modulated |
| Kiln stacks | 0.45 | 0.70 | Dominates by mass (78% of VOCs); elevated emissions get trapped during inversions |
where $B_I = 0.55$. The kiln retains the highest weight even during daytime because it accounts for 78% of total facility VOC emissions by mass, but the open-air pole yard’s weight increases during daytime to reflect the solar-driven amplification of area source off-gassing.
The transport factor models how emissions move through the atmosphere from the source to a receptor point, using a simplified Gaussian plume approach.
When definable wind exists, the transport factor combines three components:
Angular dispersion uses a Gaussian distribution centered on the downwind direction:
$$f_{\text{angular}} = \exp\!\left(-\frac{1}{2}\left(\frac{\Delta\theta}{\sigma}\right)^{\!2}\right)$$where $\Delta\theta$ is the angular offset between the plant-to-receptor bearing and the downwind direction, and $\sigma$ is the plume spread parameter. The spread parameter varies with wind speed to reflect turbulence effects:
| Wind Speed | σ (degrees) | Max Transport Distance |
|---|---|---|
| ≤ 8 mph | 50° | 5 km |
| 8–15 mph | 30° | 7 km |
| > 15 mph | 20° | 10 km |
At low wind speeds, greater atmospheric meandering produces wider plume spread (larger σ), while stronger winds create more directionally focused transport with greater reach.
Distance decay follows a power-law relationship field-calibrated to local observations:
$$f_{\text{distance}} = \left(1 - \frac{d}{d_{\max}}\right)^{1.8}$$where $d$ is the Haversine distance from the plant to the receptor point and $d_{\max}$ is the wind-speed-dependent maximum transport distance. The exponent of 1.8 produces a steep concentration drop beyond approximately 40% of the maximum distance, consistent with field observations of odor detection limits.
Wind dilution models the turbulent mixing effect of wind:
$$f_{\text{dilution}} = \frac{5}{v_w}$$where $v_w$ is wind speed in mph. Higher wind speeds produce greater mechanical turbulence, diluting ground-level concentrations proportionally.
The complete wind-driven transport factor is:
$$T = f_{\text{angular}} \times f_{\text{distance}} \times f_{\text{dilution}}$$Under calm conditions, the directional plume model is replaced with an isotropic (circular) pooling pattern. Emissions spread uniformly in all directions with a maximum radius of 4 km and a gentler distance decay:
$$f_{\text{distance, calm}} = \left(1 - \frac{d}{4.0}\right)^{1.2}$$The lower exponent (1.2 vs. 1.8) reflects the reduced dilution under calm conditions — without wind-driven mixing, concentrations decrease more slowly with distance, and pooling effects maintain elevated concentrations closer to the source.
All geographic calculations use the Haversine formula for great-circle distance on a spherical Earth:
$$d = 2R \arcsin\!\left(\sqrt{\sin^2\!\left(\frac{\Delta\phi}{2}\right) + \cos\phi_1 \cos\phi_2 \sin^2\!\left(\frac{\Delta\lambda}{2}\right)}\right)$$where $R = 6{,}371$ km (Earth’s mean radius), $\phi$ denotes latitude, and $\lambda$ denotes longitude. Bearing calculations use the standard forward azimuth formula to determine the direction from plant to receptor.
Temperature inversions — stable atmospheric layers where temperature increases with altitude — are the single most important amplifier of ground-level odor concentrations. Under inversion conditions, vertical mixing is suppressed, trapping emissions near the surface and allowing concentrations to build over time.
Direct measurement of vertical temperature profiles requires radiosonde (weather balloon) data, which is available only twice daily from stations often hundreds of kilometers away. The system instead detects inversions through five meteorological proxy signals, each providing independent evidence of atmospheric stability:
Signal 1: Dewpoint-Temperature Convergence (Weight: 0.25)
The spread between temperature and dewpoint indicates moisture saturation proximity. In Louisiana’s humid climate, a baseline nighttime spread of 2–5°F is typical; convergence below this range strongly suggests radiative cooling has created a stable surface layer:
| Spread | Signal Value | Interpretation |
|---|---|---|
| ≤ 1°F | 1.0 | Fog-like, strong inversion |
| 1–2°F | 0.7 | Very close, likely inversion |
| 2–4°F | 0.3 | Normal night, not indicative |
| 4–8°F | 0.1 | Moderately dry |
| > 8°F | 0.0 | Dry, inversions unlikely |
Signal 2: Temperature Trend Analysis (Weight: 0.20)
The system tracks temperature changes across forecast periods to identify trend breaks characteristic of inversion formation. During nighttime hours (midnight–7 AM), rising or flat temperatures indicate an inversion layer is insulating the surface from further radiative cooling (signal value 0.9). During post-sunset hours (6–11 PM), a rapid cooling trend followed by a plateau suggests inversion formation (signal value 0.7). A minimum of three prior forecast periods is required for trend detection reliability.
Signal 3: Wind Speed (Weight: 0.30, with VETO capability)
Wind is the strongest single predictor of inversion persistence, as mechanical turbulence from wind disrupts stable atmospheric layers:
| Wind Speed | Signal Value |
|---|---|
| ≤ 2 mph | 1.0 |
| 2–5 mph | 0.7 |
| 5–8 mph | 0.3 |
| ≥ 8 mph | VETO: total score capped at 0.2 |
The veto mechanism prevents the system from predicting inversions during windy conditions regardless of other signals, avoiding false positives that might occur on windy, humid nights where dewpoint convergence alone might suggest stability.
Signal 4: Time-of-Day Prior (Weight: 0.10)
A Bayesian prior reflecting the climatological probability of inversions by time of day:
| Time Period | Signal Value | Basis |
|---|---|---|
| 3–8 AM | 0.9 | Maximum radiative cooling, strongest inversions |
| Midnight–2 AM | 0.7 | Stable nocturnal boundary layer |
| 7–11 PM | 0.6 | Cooling transition, inversions forming |
| 11 AM–3 PM | 0.05 | Peak solar heating, inversions broken |
Signal 5: NWS Area Forecast Discussion Keywords (Weight: 0.15)
The system performs natural language parsing of the NWS Area Forecast Discussion (AFD), a free-text narrative written by meteorologists that often describes atmospheric stability conditions not captured in gridded forecast data. The following keywords are scanned:
inversion, fog, stagnation, mixing height, boundary layer, stable, decoupled, trapped, poor dispersion, low-level, nocturnal
Each keyword match contributes 0.25 to the signal value (maximum 1.0), providing a mechanism to incorporate expert meteorological judgment into the automated prediction.
Signal 6: KAEX Visibility (Observation-only, Weight: 0.20)
When KAEX observation data is available, the ASOS visibility sensor provides a direct measurement of atmospheric trapping. Low visibility indicates that particles and droplets cannot disperse vertically — a physical confirmation of inversion conditions that the dewpoint signal can only infer:
| Visibility | Signal Value | Interpretation |
|---|---|---|
| ≤ 0.5 mi | 1.0 | Dense fog — strong inversion confirmed |
| 0.5–1 mi | 0.9 | Fog |
| 1–3 mi | 0.7 | Mist/haze — significant trapping |
| 3–5 mi | 0.4 | Light haze — some trapping |
| 5–7 mi | 0.15 | Slight reduction — marginal |
| > 7 mi | 0.0 | Clear, good vertical mixing |
Signal 7: Barometric Pressure Trend (Observation-only, Weight: 0.10)
Steady or rising barometric pressure with calm winds indicates a stagnant air mass — the synoptic-scale pattern most conducive to persistent inversions. Falling pressure typically indicates an approaching front that will introduce mechanical mixing and break any existing inversion. The signal requires pressure data from at least two observation periods to compute a trend rate:
| Pressure Rate (mb/hr) | Signal Value | Interpretation |
|---|---|---|
| ≥ 0.5 (rising fast) | 0.3 | High pressure building, moderate stagnation signal |
| −0.1 to 0.5 (steady) | 0.7 | Classic stagnation — air mass not moving |
| −0.5 to −0.1 (slowly falling) | 0.3 | Marginal — change approaching |
| < −0.5 (falling fast) | 0.1 | Front approaching — mixing likely |
The system uses dual-mode weighting depending on whether real-time observation data is available for the current period. When observation data is present, weights shift to favor measured signals over inferred ones; when unavailable (future forecast hours), the original five-signal weights apply:
Forecast-only mode (future hours):
$$S_{\text{inv}} = 0.25\,S_1 + 0.20\,S_2 + 0.30\,S_3 + 0.10\,S_4 + 0.15\,S_5$$Observation-blended mode (current hour):
$$S_{\text{inv}} = 0.15\,S_1 + 0.15\,S_2 + 0.25\,S_3 + 0.05\,S_4 + 0.10\,S_5 + 0.20\,S_6 + 0.10\,S_7$$The rationale for weight redistribution: visibility ($S_6$) directly measures what dewpoint spread ($S_1$) can only infer, so $S_1$ is reduced from 0.25 to 0.15. The time-of-day prior ($S_4$) becomes less important when real observations tell us what is actually happening regardless of what time-based climatology would predict, so $S_4$ is reduced from 0.10 to 0.05. Both observation-only signals ($S_6$, $S_7$) return 0 when observation data is unavailable, ensuring zero regression in forecast-only mode.
Subject to the wind veto: if wind speed ≥ 8 mph, $S_{\text{inv}} = \min(S_{\text{inv}},\; 0.2)$.
The inversion score is converted to an amplification factor with a threshold to avoid false amplification from merely humid conditions:
$$I = \begin{cases} 1.0 & \text{if } S_{\text{inv}} < 0.3 \\ 1.0 + (S_{\text{inv}} - 0.3) \times 1.2 & \text{if } S_{\text{inv}} \geq 0.3 \end{cases}$$At maximum inversion confidence ($S_{\text{inv}} = 1.0$), the amplification factor reaches approximately 1.84×, reflecting the substantial concentration increase observed during strong inversion events.
The diurnal factor accounts for the daily cycle of atmospheric mixing driven by solar heating. Traditional dispersion models apply strong daytime suppression (mixing height increases → dilution) because they focus on elevated point-source emissions that are lofted and dispersed by convective mixing. However, the open-air area sources at these facilities — treated wood storage yards spread across acres of ground-level surface — are the primary daytime odor driver. These area sources have zero effective stack height: emissions originate at the surface where people breathe, and even vigorous convective mixing does not eliminate ground-level impact the way it disperses emissions from elevated stacks. Simultaneously, solar heating maximizes area source off-gassing precisely when convective mixing is strongest.
The diurnal factor uses solar-relative timing rather than fixed clock hours. Phase boundaries are defined relative to the astronomically computed sunrise ($t_r$), sunset ($t_s$), and solar noon ($t_n$) for the actual forecast date, so summer evenings (sun still strong at 7 PM CDT) correctly maintain higher scores, and winter mornings (dark until nearly 7 AM) do not apply solar-driven factors prematurely:
| Phase | Time Window | Factor | Physical Basis |
|---|---|---|---|
| Sunrise | $t_r - 1$ to $t_r + 1$ | 1.0 | Boundary layer collapse + area surfaces beginning to warm |
| Late morning | $t_r + 1$ to $t_n - 1$ | 0.5 | Convective mixing ramps up; solar heating of surfaces increasing |
| Midday | $t_n - 1$ to $t_n + 1$ | 0.55 | Peak solar heating of area sources partially offsets peak mixing |
| Afternoon | $t_n + 1$ to $t_s - 1$ | 0.65 | Peak surface temps; convective mixing beginning to decline |
| Evening | $t_s - 1$ to $t_s + 3$ | 0.8 | Surfaces still warm; vertical mixing drops rapidly post-sunset |
| Night | $t_s + 3$ to $t_r - 1$ | 0.6 | Surfaces cool; inversions may trap residual and kiln emissions |
The early morning maximum reflects the well-documented phenomenon of boundary layer collapse at sunrise, combined with area sources that are beginning to absorb solar radiation. The midday factor (0.55) is notably higher than the 0.3 used in traditional point-source models, reflecting the physical reality that ground-level area sources maintain significant impact even during peak convective mixing. The afternoon factor (0.65) captures the critical period when surface temperatures peak while atmospheric mixing begins to subside.
Using solar-relative phases ensures the model adapts correctly across the year. For example, at Alexandria’s latitude the “Evening” phase (factor 0.8) extends to approximately 11:13 PM on the summer solstice (sunset ~8:13 PM + 3 hours) but only to ~8:07 PM on the winter solstice (sunset ~5:07 PM + 3 hours). This ~4-hour seasonal swing in daylight duration (10h in winter vs 14h in summer) produces meaningful differences in when thermal retention and source weighting transitions occur, and the model captures this without manual seasonal adjustments.
Humidity affects odor perception and transport through multiple mechanisms, including moisture absorption of water-soluble compounds and enhanced olfactory sensitivity in humid air:
| Relative Humidity | Factor | Mechanism |
|---|---|---|
| ≥ 97% | 1.30 | Fog/heavy mist — odor compounds adsorb to droplets |
| 93–97% | 1.15 | Near-fog; enhanced dissolution of soluble compounds |
| 80–93% | 1.00 | Baseline (typical Louisiana humidity) |
| 50–80% | 0.90 | Below-average humidity reduces transport |
| < 50% | 0.75 | Unusually dry; rapid evaporative dispersion |
The baseline of 1.0 at 80–93% humidity is calibrated to Louisiana’s climate, where high humidity is the norm rather than an exceptional condition. An additional 10% multiplier is applied to Pineville’s kiln emissions at humidity ≥ 93%, reflecting the high water solubility of acetaldehyde, formaldehyde, and methanol.
The terrain factor models the influence of topography on pollutant transport. Unlike flat-terrain dispersion models that treat the landscape as a uniform surface, this system explicitly accounts for the geological features of the Alexandria–Pineville area that profoundly affect where emissions accumulate and how they move.
The study area is defined by the Red River valley, a north-south alluvial floodplain carved through central Louisiana. The valley floor sits at 70–78 ft elevation and runs roughly north-south, creating a natural channel for airflow. On the east side of the river, the Pineville bluff rises sharply to 100–105 ft — a 30-foot escarpment that has direct consequences for pollutant behavior:
The system uses inverse-distance-weighted (IDW) interpolation from 25 elevation control points derived from USGS topographic data to estimate terrain height at any latitude-longitude coordinate:
$$z(\mathbf{x}) = \frac{\sum_{i=1}^{25} w_i\, z_i}{\sum_{i=1}^{25} w_i}, \quad w_i = \frac{1}{d(\mathbf{x}, \mathbf{x}_i)^2}$$where $z_i$ is the known elevation at control point $\mathbf{x}_i$ and $d(\mathbf{x}, \mathbf{x}_i)$ is the Haversine distance. The control points are concentrated along the key terrain features:
| Feature | Elevation | Control Points | Significance |
|---|---|---|---|
| Valley floor (Alexandria) | 72–78 ft | 10 | Natural pooling basin for dense emissions |
| Pineville bluff | 95–105 ft | 7 | Sharp escarpment, drainage source |
| Western rise | 80–82 ft | 4 | Gradual slope, partial containment |
| East of Pineville | 75–95 ft | 4 | Transition zone back to lower terrain |
The IDW approach with squared distance weighting produces a smooth elevation surface that captures the dominant features — particularly the sharp Pineville bluff — while remaining computationally inexpensive (a single pass through 25 points per receptor location).
Under calm or inversion conditions (wind ≤ 5 mph, inversion score > 0.4), the vertical atmospheric mixing that normally disperses pollutants upward is suppressed. In this regime, gravity becomes the dominant transport mechanism for heavy compounds. Dense vapors behave like cold air in a katabatic flow — sliding downhill along the terrain surface and pooling in topographic depressions.
For receptor points below the plant elevation ($\Delta z < -10$ ft):
$$G_{\text{drain}} = 1.0 + \min\!\left(0.4,\; \frac{|\Delta z|}{75}\right)$$This produces a maximum 40% concentration enhancement for points deep in the valley relative to the source. For the Pineville facility specifically, drainage from the bluff receives a 1.5× enhancement when the elevation difference exceeds 20 ft, reflecting two compounding physical mechanisms:
For receptor points above the plant elevation ($\Delta z > 15$ ft), the terrain factor is reduced to 0.5, reflecting the shielding effect of higher ground. Points slightly above ($\Delta z$ 5–15 ft) receive a modest reduction to 0.8.
Under light-to-moderate wind conditions (≤ 10 mph), winds aligned with the north-south Red River valley axis (0° or 180° ± 30°) receive a channeling boost of 1.15× for valley-floor receptor points. This models the well-documented tendency of valley topography to constrain and accelerate airflow along the valley axis, concentrating pollutants into a narrower corridor rather than allowing lateral dispersion across the full wind rose.
The model excludes a 150-meter radius around each plant center from community odor scoring. This fenceline exclusion serves two purposes: (1) the model is designed to predict community exposure, not occupational exposure within the facility boundary, and (2) the near-source concentration field is dominated by turbulent wake effects from buildings and process equipment that the simplified dispersion model cannot capture. Scores within the exclusion zone return zero, and the user interface displays “Facility Zone — Not Tracked” when a user places a pin inside the fenceline.
The 25-point IDW elevation model captures the dominant geological features but does not account for:
Future work may incorporate higher-resolution USGS Digital Elevation Model (DEM) data at 1/3 arc-second (~10 m) resolution to improve terrain fidelity, particularly along the Pineville bluff where the sharp elevation gradient is critical to drainage modeling.
Beyond the scalar intensity calculation, the system generates chemical-specific plume geometries for map visualization. Each compound class has distinct transport characteristics based on molecular weight, volatility, and release height:
Table 6: Chemical Plume Parameters
| Compound Class | σ Multiplier | Distance Multiplier | Physical Basis |
|---|---|---|---|
| Naphthalene | 1.3 | 0.7 | MW 128; pools in calm air, wide/short plume |
| Cresol | 1.2 | 0.65 | MW 108; dense, strong odor at low concentration |
| Diesel | 1.4 | 0.5 | MW ~170; heaviest, widest spread, shortest range |
| Kiln gases | 0.7 | 1.4 | MW 30–44; buoyant, narrow/far, elevated release |
These multipliers are applied to the base plume geometry parameters, producing visually distinct plume shapes on the map that communicate the different transport behaviors of each compound class.
Each chemical overlay uses a gradient rendering profile tuned to the compound’s physical behavior. The key parameter is the falloff exponent $\beta$, which controls how opacity concentrates toward the source: $\beta > 1$ produces steep concentration near the source (heavy compounds pooling in calm air), while $\beta < 1$ spreads opacity more evenly across distance (buoyant gases dispersing uniformly).
Table 7: Chemical Gradient Rendering Profiles
| Compound Class | Bands | Base Opacity | Opacity Ramp | Falloff $\beta$ | Physical Basis |
|---|---|---|---|---|---|
| Diesel (MW ≥ 150) | 8 | 0.05 | 0.14 | 2.0 | Heaviest; steep concentration near source, rapid falloff |
| Naphthalene (MW ≥ 120) | 7 | 0.05 | 0.10 | 1.5 | Pools near source, moderate falloff |
| Cresol (MW < 120) | 7 | 0.04 | 0.08 | 1.0 | Medium weight; standard Gaussian-like gradient |
| Kiln gases (stack release) | 6 | 0.04 | 0.04 | 0.6 | Light, buoyant; gentle gradient, even spread |
For each band $i$ (outermost to innermost), the band opacity is computed as:
$$O_i = \left(O_{\text{base}} + p_i^\beta \cdot O_{\text{ramp}}\right) \times F_g$$where $p_i = i / N$ is the progress from edge to center, and $F_g$ is the ground-level fraction (Section 5.4). This produces visualizations that directly communicate compound-specific transport behavior: diesel appears as a dense, concentrated cloud near the source, while kiln gases appear as a diffuse, far-reaching haze.
For wind-driven conditions, plume polygons are generated as fan-shaped sectors:
Under calm conditions, a circular polygon is generated with a radius that extends under inversion conditions:
$$r = r_{\text{base}} \times (1 + S_{\text{inv}} \times k)$$where $k = 0.5$ for ground-level compounds and $k = 0.15$ for stack-released kiln gases (which are less affected by surface-level inversions).
For elevated stack releases (e.g., kiln gases released at 30–60 m height), only a fraction of the plume reaches breathing height. The ground-level fraction $F_g$ estimates the proportion of emissions that affect ground-level receptors, modulating both the chemical overlay opacity and the effective odor contribution. Ground-level releases always have $F_g = 1.0$.
For elevated releases, the base fraction starts at $F_g = 0.35$ (clear-sky, moderate-wind conditions) and is modified by several atmospheric factors:
Table 8: Ground-Level Fraction Modifiers for Elevated Releases
| Factor | Condition | Adjustment | Physical Basis |
|---|---|---|---|
| Inversion trapping | $S_{\text{inv}} > 0.3$ | $+(S_{\text{inv}} - 0.3) \times 0.75$ | Inversion lid traps elevated emissions, forcing plume downward; strong inversions can add up to +0.525 |
| Wind-induced mixing | $v_w \ge 3$ mph | $+0.05$ to $+0.15$ | Mechanical turbulence from moderate winds enhances vertical mixing toward ground |
| Molecular weight | MW > 44 | $+$up to $0.15$ | Heavier-than-air compounds settle toward ground due to density-driven sinking velocity |
| Humidity/fog | Humidity > 70% | $+0.05$ to $+0.20$ | Fog droplets absorb water-soluble gases; wet deposition pulls plume to surface |
| Temperature stability | Temp < 50°F / > 85°F | $\pm 0.08$ | Cool air suppresses buoyancy (plume sinks); hot air enhances buoyant rise (plume stays aloft) |
The final fraction is clamped to $[0.1, 1.0]$. Under worst-case conditions (strong inversion, high humidity, heavy compound, moderate wind), elevated releases can approach $F_g \approx 1.0$, meaning nearly all emissions reach breathing height—reflecting the “fumigation” events that residents experience during temperature inversions.
The system renders predictions on an interactive Leaflet.js map with OpenStreetMap base tiles. Key features include:
The system offers two rendering modes for the combined odor plume, selectable via radio buttons in the Map Overlays panel. Each mode represents the same underlying prediction model but communicates different aspects of the data.
The heatmap renders a per-pixel combined score from both facilities at every point on the map.
A canvas tile overlay samples a grid of points (8-pixel resolution per cell, with GPU-accelerated CSS blur for
smoothing), computes computeCombinedScore at each point — which takes the maximum contribution
from either plant accounting for emission, transport, inversion, time-of-day, humidity, and terrain factors —
and colors each cell according to the score.
Why the heatmap matters: The heatmap’s key advantage is that it shows interaction zones where emissions from both plants overlap. Because both facilities are within 4 km of each other and often share the same downwind corridor, their plumes frequently converge over residential areas. The heatmap computes the actual combined impact at each point, revealing zones of elevated exposure that per-plant visualizations cannot show.
Color is determined by smooth interpolation between risk level colors using a square-root curve that accelerates transitions near level boundaries:
$$\text{color}(s) = \text{lerp}\!\left(\text{color}_{\text{prev}},\; \text{color}_{\text{next}},\; \sqrt{\frac{s - s_{\text{prev}}}{s_{\text{next}} - s_{\text{prev}}}}\right)$$This eliminates the hard color boundaries that would otherwise appear at score thresholds (e.g., the jump from green to orange at score 15), producing a continuous gradient that better reflects the gradual nature of real-world odor intensity transitions.
Opacity uses a two-phase function to keep the Low-intensity zone (green) visually subtle while ensuring Moderate-and-above zones (orange, red) are immediately prominent:
$$\alpha(s) = \begin{cases} 0.15 + \frac{s}{15} \times 0.08 & \text{if } s \leq 15 \\ 0.30 + \frac{s - 15}{85} \times 0.50 & \text{if } s > 15 \end{cases}$$This design choice reflects community feedback: green zones should be visible but not alarming (scores 0–15 represent conditions where odor is unlikely to be noticeable), while orange and red zones should demand attention because they represent conditions where residents may be affected.
The gradient mode renders per-plant concentric polygon bands that show intensity falloff with distance from each source independently. Each plume is rendered as $N$ concentric bands (default $N = 8$), drawn from outermost to innermost. Each band’s semi-transparent fill accumulates with the layers beneath it, producing a smooth visual gradient: faint at the edges, dense near the source.
The overall intensity of the gradient scales dynamically with atmospheric conditions. A peak odor score is computed at the source location, and an intensity multiplier is derived:
$$M_I = 0.5 + \frac{S_{\text{peak}}}{100} \times 0.5$$Each band’s opacity is:
$$O_i = \left(0.06 + (1 - t_i) \times 0.10\right) \times M_I$$where $t_i$ decreases from 1.0 (outermost) to $1/N$ (innermost). The outermost band receives a visible border stroke (weight 2, opacity 0.6) to define the plume boundary.
The plume color is determined by the peak score’s odor level classification (green/orange/red/dark red), so the entire gradient communicates both extent and severity at a glance.
| Aspect | Heatmap | Gradient |
|---|---|---|
| Data representation | Combined score from both plants at each point | Per-plant intensity with distance falloff |
| Interaction zones | Naturally shows overlap areas with elevated combined impact | Overlap areas blend via opacity stacking only |
| Color accuracy | Per-point color reflects actual score at that location | Single color per plant based on peak-at-source score |
| Performance | Heavier (grid sampling per tile) | Lighter (8 polygons per plant) |
| Best for | Understanding community exposure across the full area | Seeing individual plant contribution and plume shape |
Chemical overlay opacity is modulated by the ground-level fraction $F_g$ (Section 5.4). This means that elevated stack releases appear faint on the map during clear, windy conditions (when most emissions stay aloft) and progressively opaque during inversions and fog (when emissions are trapped at breathing height). The visualization thus reflects not just where chemicals disperse, but what people actually smell at ground level.
A real-time SVG arc gauge displays the current odor score (0–100) with animated transitions, accompanied by current conditions (temperature, humidity, wind, inversion status) and a text description of the forecast.
| Score Range | Level | Color | Description |
|---|---|---|---|
| 0–15 | Low | Green (#4CAF50) | Minimal odor expected |
| 16–40 | Moderate | Orange (#FF9800) | Noticeable odor possible |
| 41–65 | Elevated | Red (#F44336) | Significant odor likely |
| 66–100 | High | Dark Red (#B71C1C) | Strong odor expected |
The system was calibrated through two complementary approaches: (1) iterative comparison of model predictions against real-time odor observations from community members in the Alexandria–Pineville area, and (2) analysis of Google Maps aerial imagery and Street View photography to identify and characterize emission sources not fully captured by permit data alone.
Naphthalene floor correction (March 2026): Initial model versions used a vapor pressure floor of 0.2 at low temperatures, which underestimated odor at 40–45°F. Field observations during a 42°F morning with confirmed odor detection led to raising the floor to 0.35, reflecting the reality that creosote-soaked surfaces (railroad ties, treatment equipment) maintain significant naphthalene evaporation even at low temperatures due to the large surface area of saturated material.
Distance decay exponent: The decay exponent was adjusted from an initial value of 2.0 (inverse-square law) to 1.8 based on observations of detectable odor at distances greater than predicted by the theoretical model. This adjustment accounts for the fact that complex terrain and building-wake effects can maintain higher concentrations at distance than idealized open-terrain models predict.
Open-air storage area source identification (March 2026): Analysis of aerial imagery revealed that both facilities maintain extensive open-air storage of treated wood products that constitutes a dominant emission source not adequately captured by the original fugitive emissions model. At Alexandria, acres of dark creosote-treated railroad ties are visible in satellite imagery, along with untreated (lighter-colored) tie stacks and open retention ponds along the western property edge. At Pineville, dozens of treated telephone pole bundles are visible as dark stacks across several acres, alongside the kiln structure with rooftop exhaust vents. This discovery led to the three-source emission model with solar surface temperature calculations and diurnally shifting source weights, substantially improving daytime prediction accuracy.
Diurnal factor recalibration: The original model applied a 0.3 suppression factor during midday hours, consistent with traditional point-source dispersion modeling where convective mixing disperses emissions vertically. After incorporating the area source model, the midday factor was raised to 0.55 to reflect that ground-level area sources (zero stack height) maintain significant impact even during peak convective mixing, and that solar heating maximizes area source emissions precisely when atmospheric mixing is strongest.
Solar position model (March 2026): All daytime/nighttime determinations were replaced with astronomically computed sunrise and sunset times using the Spencer (1971) solar declination formula. The solar heating boost, source weighting shifts, and diurnal factor phases are now defined relative to actual solar position rather than fixed clock hours. Additionally, the solar heating boost is scaled by the normalized solar elevation angle (0 at horizon, 1 at solar noon), so surface temperature estimates ramp gradually after sunrise rather than switching on abruptly. This corrects a ~4-hour seasonal swing in daylight (from ~10h at winter solstice to ~14h at summer solstice) that the fixed-hour model could not capture.
The system has demonstrated consistent accuracy in predicting odor events, with successful predictions confirmed through real-time community observations. The multiplicative factor architecture has proven particularly effective at capturing the interaction effects between meteorological variables — for example, correctly predicting elevated odor during cool, calm, humid mornings with temperature inversions, even when individual factors (e.g., low temperature reducing emissions) might suggest otherwise. The area source model improved prediction accuracy during hot afternoon periods, which the original model had systematically underestimated due to excessive daytime suppression that did not account for solar-driven ground-level off-gassing.
The application is implemented as a static web application with no server-side processing requirements:
| Layer | Technology | Purpose |
|---|---|---|
| UI Framework | Preact + htm | Lightweight reactive components |
| Mapping | Leaflet.js | Interactive map rendering |
| Forecast Data | NWS API | Hourly weather forecasts (future hours) |
| Observation Data | NWS KAEX ASOS | Real-time surface measurements (current hour) |
| Edge Cache | Cloudflare Worker + KV | API proxy and response caching |
| Persistent Archive | Cloudflare D1 (SQLite) | Weather observation + forecast archival, odor report storage |
| Scheduled Archival | Cloudflare Cron Trigger | 30-minute observation + forecast snapshot capture |
| Deployment | Static hosting | Zero-infrastructure operation |
The system achieves responsive performance through:
This project demonstrates a paradigm shift in environmental monitoring tool development. Traditional atmospheric dispersion modeling requires:
By contrast, this system was developed through iterative dialogue with an AI assistant, translating domain knowledge from environmental permits, atmospheric science textbooks, and field observations into working code. The AI synthesized principles from:
This cross-disciplinary synthesis, performed through natural language interaction, enabled a non-specialist to develop a tool with demonstrated predictive accuracy.
A central insight of this project is that visualized, condition-specific data transforms community advocacy. The statement “it stinks” is a subjective complaint that is easy to dismiss. The statement “a temperature inversion trapped ground-level creosote emissions under 85% humidity with 3 mph winds from the south, producing elevated odor conditions at our school during morning drop-off” is an evidence-based observation that demands a response.
The system’s gradient plume visualization makes this transformation tangible. When a resident sees a dense red gradient engulfing their neighborhood during a morning inversion, they are not merely experiencing a bad smell—they are seeing the atmospheric physics that explain why it smells, how far the odor extends, and which conditions are responsible. This shifts the conversation from subjective perception to objective meteorology.
This data-driven approach empowers communities in several ways:
In this sense, the system serves not as an accusation but as a shared language—one grounded in atmospheric science rather than subjective perception—through which communities and industry can work together to minimize odor impact by accounting for the weather realities that neither party controls.
Recently implemented:
Planned:
This work presents a novel, accessible approach to community-level industrial odor forecasting that combines real-time weather data, chemical-specific volatilization physics, and terrain-aware atmospheric dispersion modeling into a unified, browser-based prediction system. The gradient plume visualization—with condition-scaled intensity, chemical-specific falloff profiles, and ground-level fraction modulation—communicates not just where odor may occur, but why and how intensely, grounding subjective experience in atmospheric physics.
The system’s demonstrated accuracy in predicting real-world odor events validates both the underlying atmospheric model and the AI-assisted development approach used to create it. More importantly, by making condition-specific odor data accessible to non-specialists, the system transforms community environmental advocacy from subjective complaint to evidence-based engagement. When residents can articulate the meteorological conditions behind their experience, and when industry can anticipate those conditions proactively, the path opens from confrontation to collaborative stewardship.
The project demonstrates that large language models can serve as effective collaborators in developing sophisticated environmental monitoring tools, synthesizing domain knowledge across multiple scientific disciplines and translating it into functional software without requiring specialized expertise or expensive infrastructure. This democratization of environmental science tools has significant implications for community environmental monitoring, environmental justice initiatives, and the broader goal of informed coexistence between industry and the communities they operate within.
| Symbol | Definition | Units |
|---|---|---|
| $E$ | Emission factor | dimensionless |
| $T$ | Transport factor | dimensionless |
| $I$ | Inversion amplification factor | dimensionless |
| $D$ | Diurnal (time-of-day) factor | dimensionless |
| $H$ | Humidity factor | dimensionless |
| $G$ | Terrain (geographic) factor | dimensionless |
| $T_F$ | Ambient air temperature | °F |
| $T_{\text{eff}}$ | Effective surface temperature (solar-heated) | °F |
| $\Delta T_{\text{solar}}$ | Solar heating boost (peak, at solar noon) | °F |
| $S_I$ | Normalized solar intensity (elevation angle / peak elevation) | 0–1 |
| $\alpha$ | Solar elevation angle | degrees |
| $\delta$ | Solar declination | radians |
| $\omega_0$ | Hour angle at sunrise/sunset | degrees |
| $t_r, t_s, t_n$ | Sunrise, sunset, solar noon (local time) | hours |
| $v_w$ | Wind speed | mph |
| $\sigma$ | Gaussian plume spread parameter | degrees |
| $d$ | Haversine distance | km |
| $d_{\max}$ | Maximum transport distance | km |
| $S_6$ | Visibility signal (observation-only) | dimensionless |
| $S_7$ | Pressure trend signal (observation-only) | dimensionless |
| $P$ | Barometric pressure | mb (hPa) |
| $V$ | Visibility | miles |
| $\Delta\theta$ | Angular offset from downwind | degrees |
| $S_{\text{inv}}$ | Inversion confidence score | 0–1 |
| $\Delta z$ | Elevation difference (receptor – source) | ft |
| $B_I$ | Base intensity | dimensionless |
| $F_g$ | Ground-level fraction (proportion of elevated emissions reaching breathing height) | 0–1 |
| $\beta$ | Chemical gradient falloff exponent | dimensionless |
| $O_i$ | Band opacity for gradient band $i$ | 0–1 |
| $M_I$ | Gradient intensity multiplier (condition-scaled) | 0.5–1.0 |
| $N$ | Number of concentric gradient bands | integer |
The terrain model uses 25 USGS-derived elevation control points spanning the Alexandria–Pineville study area, with elevations ranging from 72 ft (Red River valley floor) to 103 ft (Pineville bluff). Full coordinates and elevations are available in the application source code.