Back to Odor Forecast

Community Odor Forecasting Using Real-Time Atmospheric Modeling and Chemical-Specific Dispersion: A Novel Application of AI-Assisted Software Engineering

Authors: Community Environmental Monitoring Project, Alexandria–Pineville, Louisiana
Date: March 2026
Version: 1.0

Abstract

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.

1. Introduction

1.1 Problem Statement

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.

1.2 Objective

This project sought to bridge that gap by developing an accessible, browser-based prediction tool that:

  1. Translates publicly available emissions inventory data into real-time odor forecasts
  2. Accounts for the chemical-specific behavior of different VOC compounds
  3. Integrates freely available NWS weather forecast data as the atmospheric driver
  4. Provides spatially resolved predictions on an interactive map
  5. Operates without specialized hardware, software licenses, or atmospheric science training

1.3 AI-Assisted Development

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.


2. Facility Characterization and Emissions Profiles

2.1 Data Sources

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.

2.2 Alexandria Facility (LDEQ Permit #2360-00032-07)

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

CompoundAnnual Emissions (tons/yr)Fugitive FractionOdor Character
Naphthalene9.2680% (7.41 tons)Mothball/tar
Cresol0.14HighMedicinal/phenolic
Quinoline0.36ModerateChemical
Biphenyl0.20ModeratePleasant/floral
PAHs (mixed)0.26LowTar
Phenol0.09HighSweet/medicinal
Total VOCs18.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.

2.3 Pineville Facility (LDEQ Permit #2360-00004-07)

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

CompoundAnnual Emissions (tons/yr)Release TypeOdor Character
Kiln Stack Emissions (elevated, 25–32 ft):
Acetaldehyde2.10StackPungent/fruity
Formaldehyde0.86StackSharp/irritating
Methanol0.82StackSweet/pungent
Other kiln VOCs~57.90StackMixed
Ground-Level Emissions:
Cresol1.62FugitiveMedicinal/phenolic
Naphthalene0.84FugitiveMothball
Diesel (carrier)SignificantFugitivePetroleum
Biphenyl0.19FugitivePleasant
Quinoline0.11FugitiveChemical
n-Hexane0.26FugitiveGasoline-like
Total VOCs78.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.


3. Meteorological Data Integration

3.1 Data Sources and Grid Configuration

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:

3.2 Forecast Parameters

The following parameters are extracted from NWS hourly forecasts for each prediction period:

ParameterSource EndpointResolution
Temperature (°F)/gridpoints/LCH/88,143/forecast/hourlyHourly
Dewpoint (°F)/gridpoints/LCH/88,143 (gridData)Hourly
Relative Humidity (%)/gridpoints/LCH/88,143/forecast/hourlyHourly
Wind Speed (mph)/gridpoints/LCH/88,143/forecast/hourlyHourly
Wind Direction (compass)/gridpoints/LCH/88,143/forecast/hourlyHourly
Short Forecast (text)/gridpoints/LCH/88,143/forecast/hourlyHourly
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.

3.2.1 Observation Blending

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:

ParameterSourceUse in Model
Barometric Pressure (mb)/stations/KAEX/observations/latestInversion detection: pressure trend signal
Visibility (miles)/stations/KAEX/observations/latestInversion 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.

3.3 Caching and Archival Architecture

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:

  1. Browser-side cache: Hourly forecasts are cached for 30 minutes, gridpoint metadata for 24 hours, Area Forecast Discussions for 1 hour, and observation data for 10 minutes, using in-memory storage.
  2. Edge cache (Cloudflare Worker + KV): A lightweight edge proxy with KV storage provides shared caching across all users, reducing NWS API load and providing resilience against transient API failures through exponential backoff retry logic.
  3. Persistent archive (Cloudflare D1): A cron-triggered process runs every 30 minutes, fetching the latest KAEX observation and the corresponding NWS forecast period, and storing them side-by-side in a SQLite database at the edge. This archive serves two purposes:
    • Instant observation serving: The front-end reads current observations from D1 (<1 ms response) rather than querying the NWS API directly, eliminating latency and rate-limit concerns.
    • Forecast accuracy tracking: Each archived row pairs what was predicted (NWS forecast) with what was observed (KAEX measurement) for the same time period, enabling systematic analysis of forecast bias and model calibration over time.

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.


4. Core Prediction Model

4.1 Multiplicative Factor Architecture

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.

4.2 Emission Factor (E)

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.

4.2.1 Solar Surface Temperature Model

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

Solar Position Calculation

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.

Solar Elevation Scaling

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 TempRailroad Ties (Alexandria)Telephone Poles (Pineville)Rationale
> 85°F40–62°F boost30–48°F boostSharp nonlinear ramp; surfaces reach 125–155°F at solar noon
70–85°F15–40°F boost10–30°F boostModerate solar heating
55–70°F0–15°F boost0–10°F boostMild solar effect
< 55°F0°F0°FInsufficient 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$.

4.2.2 Alexandria (Three-Source Model)

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

SourceDaytime (sunrise–sunset)NighttimeRationale
Open-air tie yard0.550.30Solar heating drives massive daytime off-gassing; cools at night
Cylinder operations0.300.50Constant 24/7; relatively more important when area sources cool
Retention ponds0.150.20Persistent 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).

4.2.3 Pineville (Three-Source Model)

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

SourceDaytime (sunrise–sunset)NighttimeRationale
Open-air pole yard0.300.10Major daytime source via solar heating; cools at night
Ground-level process0.250.20Continuous but temperature-modulated
Kiln stacks0.450.70Dominates 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.

4.3 Transport Factor (T)

The transport factor models how emissions move through the atmosphere from the source to a receptor point, using a simplified Gaussian plume approach.

4.3.1 Wind-Driven Transport (Wind Speed > 3 mph)

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 mph50°5 km
8–15 mph30°7 km
> 15 mph20°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}}$$

4.3.2 Calm-Air Transport (Wind Speed ≤ 3 mph)

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.

4.3.3 Haversine Distance and Bearing Calculations

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.

4.4 Temperature Inversion Detection and Factor (I)

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.

4.4.1 Multi-Signal Detection

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:

SpreadSignal ValueInterpretation
≤ 1°F1.0Fog-like, strong inversion
1–2°F0.7Very close, likely inversion
2–4°F0.3Normal night, not indicative
4–8°F0.1Moderately dry
> 8°F0.0Dry, 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 SpeedSignal Value
≤ 2 mph1.0
2–5 mph0.7
5–8 mph0.3
≥ 8 mphVETO: 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 PeriodSignal ValueBasis
3–8 AM0.9Maximum radiative cooling, strongest inversions
Midnight–2 AM0.7Stable nocturnal boundary layer
7–11 PM0.6Cooling transition, inversions forming
11 AM–3 PM0.05Peak 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:

VisibilitySignal ValueInterpretation
≤ 0.5 mi1.0Dense fog — strong inversion confirmed
0.5–1 mi0.9Fog
1–3 mi0.7Mist/haze — significant trapping
3–5 mi0.4Light haze — some trapping
5–7 mi0.15Slight reduction — marginal
> 7 mi0.0Clear, 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 ValueInterpretation
≥ 0.5 (rising fast)0.3High pressure building, moderate stagnation signal
−0.1 to 0.5 (steady)0.7Classic stagnation — air mass not moving
−0.5 to −0.1 (slowly falling)0.3Marginal — change approaching
< −0.5 (falling fast)0.1Front approaching — mixing likely

4.4.2 Combined Inversion Score

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)$.

4.4.3 Inversion Amplification Factor

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.

4.5 Diurnal Factor (D)

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:

PhaseTime WindowFactorPhysical Basis
Sunrise$t_r - 1$ to $t_r + 1$1.0Boundary layer collapse + area surfaces beginning to warm
Late morning$t_r + 1$ to $t_n - 1$0.5Convective mixing ramps up; solar heating of surfaces increasing
Midday$t_n - 1$ to $t_n + 1$0.55Peak solar heating of area sources partially offsets peak mixing
Afternoon$t_n + 1$ to $t_s - 1$0.65Peak surface temps; convective mixing beginning to decline
Evening$t_s - 1$ to $t_s + 3$0.8Surfaces still warm; vertical mixing drops rapidly post-sunset
Night$t_s + 3$ to $t_r - 1$0.6Surfaces 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.

4.6 Humidity Factor (H)

Humidity affects odor perception and transport through multiple mechanisms, including moisture absorption of water-soluble compounds and enhanced olfactory sensitivity in humid air:

Relative HumidityFactorMechanism
≥ 97%1.30Fog/heavy mist — odor compounds adsorb to droplets
93–97%1.15Near-fog; enhanced dissolution of soluble compounds
80–93%1.00Baseline (typical Louisiana humidity)
50–80%0.90Below-average humidity reduces transport
< 50%0.75Unusually 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.

4.7 Terrain Factor (G)

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.

4.7.1 Geological Context

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:

4.7.2 Elevation Model

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:

FeatureElevationControl PointsSignificance
Valley floor (Alexandria)72–78 ft10Natural pooling basin for dense emissions
Pineville bluff95–105 ft7Sharp escarpment, drainage source
Western rise80–82 ft4Gradual slope, partial containment
East of Pineville75–95 ft4Transition 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).

4.7.3 Drainage Flow Modeling

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:

  1. Gravitational drainage: The 30-ft bluff creates a steep gradient that accelerates dense vapor flow downhill. Unlike gentle slopes where drainage is sluggish, the Pineville escarpment produces a concentrated drainage stream that carries heavy compounds (diesel, cresol) efficiently into the valley.
  2. Valley pooling: The valley floor acts as a topographic bowl. Once dense emissions reach the bottom, they have nowhere to go — the western rise (80–82 ft) and the river channel create partial containment. During inversions, this pooled mass cannot disperse vertically, leading to sustained high concentrations at breathing height.

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.

4.7.4 Valley Channeling

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.

4.7.5 Fenceline Exclusion

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.

4.7.6 Current Limitations of the Terrain Model

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.


5. Chemical-Specific Plume Geometry

5.1 Compound-Specific Transport Characteristics

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σ MultiplierDistance MultiplierPhysical Basis
Naphthalene1.30.7MW 128; pools in calm air, wide/short plume
Cresol1.20.65MW 108; dense, strong odor at low concentration
Diesel1.40.5MW ~170; heaviest, widest spread, shortest range
Kiln gases0.71.4MW 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.

5.2 Chemical-Specific Gradient Profiles

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 ClassBandsBase OpacityOpacity RampFalloff $\beta$Physical Basis
Diesel (MW ≥ 150)80.050.142.0Heaviest; steep concentration near source, rapid falloff
Naphthalene (MW ≥ 120)70.050.101.5Pools near source, moderate falloff
Cresol (MW < 120)70.040.081.0Medium weight; standard Gaussian-like gradient
Kiln gases (stack release)60.040.040.6Light, 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.

5.3 Plume Polygon Generation

For wind-driven conditions, plume polygons are generated as fan-shaped sectors:

  1. The downwind direction is computed as $(D_{\text{wind}} + 180°) \bmod 360°$
  2. Angular rays are cast from $-3\sigma$ to $+3\sigma$ in 5° increments
  3. Each ray extends to a distance weighted by the Gaussian angular factor
  4. Destination points are calculated using the Haversine destination formula
  5. The polygon is closed through the plant location

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

5.4 Ground-Level Fraction

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

FactorConditionAdjustmentPhysical 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 weightMW > 44$+$up to $0.15$ Heavier-than-air compounds settle toward ground due to density-driven sinking velocity
Humidity/fogHumidity > 70%$+0.05$ to $+0.20$ Fog droplets absorb water-soluble gases; wet deposition pulls plume to surface
Temperature stabilityTemp < 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.


6. Visualization and User Interface

6.1 Interactive Map

The system renders predictions on an interactive Leaflet.js map with OpenStreetMap base tiles. Key features include:

6.2 Combined Plume Visualization Modes

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.

6.2.1 Heatmap Mode (Default)

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.

6.2.2 Gradient Mode

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.

6.2.3 When to Use Each Mode

AspectHeatmapGradient
Data representationCombined score from both plants at each pointPer-plant intensity with distance falloff
Interaction zonesNaturally shows overlap areas with elevated combined impactOverlap areas blend via opacity stacking only
Color accuracyPer-point color reflects actual score at that locationSingle color per plant based on peak-at-source score
PerformanceHeavier (grid sampling per tile)Lighter (8 polygons per plant)
Best forUnderstanding community exposure across the full areaSeeing individual plant contribution and plume shape

6.3 Ground-Level Fraction in Visualization

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.

6.4 Scoring Visualization

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.

6.5 Odor Level Classification

Score RangeLevelColorDescription
0–15LowGreen (#4CAF50)Minimal odor expected
16–40ModerateOrange (#FF9800)Noticeable odor possible
41–65ElevatedRed (#F44336)Significant odor likely
66–100HighDark Red (#B71C1C)Strong odor expected

7. Field Calibration and Validation

7.1 Calibration Methodology

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.

7.2 Key Calibration Adjustments

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.

7.3 Validation Results

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.


8. Technical Architecture

8.1 Application Stack

The application is implemented as a static web application with no server-side processing requirements:

LayerTechnologyPurpose
UI FrameworkPreact + htmLightweight reactive components
MappingLeaflet.jsInteractive map rendering
Forecast DataNWS APIHourly weather forecasts (future hours)
Observation DataNWS KAEX ASOSReal-time surface measurements (current hour)
Edge CacheCloudflare Worker + KVAPI proxy and response caching
Persistent ArchiveCloudflare D1 (SQLite)Weather observation + forecast archival, odor report storage
Scheduled ArchivalCloudflare Cron Trigger30-minute observation + forecast snapshot capture
DeploymentStatic hostingZero-infrastructure operation

8.2 Performance Considerations

The system achieves responsive performance through:


9. Discussion

9.1 Significance of AI-Assisted Development

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.

9.2 Limitations

  1. Single-point meteorological data: The system uses a single NWS grid point, which may not capture microscale variations in wind speed and direction across the study area.
  2. Forecast-dependent accuracy (future hours): Predictions beyond the current hour are only as accurate as the underlying NWS forecast. The current hour now uses KAEX observations, and the D1 archive enables systematic measurement of forecast error to inform future bias corrections.
  3. Simplified dispersion model: The Gaussian plume approach, while effective for screening-level predictions, does not account for building downwash, complex terrain-induced turbulence, or chemical transformation during transport.
  4. Qualitative validation: Field validation relies on subjective odor perception rather than instrumental VOC measurements.
  5. Steady-state assumption: Each hourly prediction assumes steady-state conditions; rapid meteorological transitions may produce transient odor events not captured by the hourly resolution.

9.3 Community Empowerment Through Condition-Specific Visualization

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.

9.4 Future Directions

Recently implemented:

Planned:


10. Conclusion

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.


Appendix A: Mathematical Notation Summary

SymbolDefinitionUnits
$E$Emission factordimensionless
$T$Transport factordimensionless
$I$Inversion amplification factordimensionless
$D$Diurnal (time-of-day) factordimensionless
$H$Humidity factordimensionless
$G$Terrain (geographic) factordimensionless
$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 angledegrees
$\delta$Solar declinationradians
$\omega_0$Hour angle at sunrise/sunsetdegrees
$t_r, t_s, t_n$Sunrise, sunset, solar noon (local time)hours
$v_w$Wind speedmph
$\sigma$Gaussian plume spread parameterdegrees
$d$Haversine distancekm
$d_{\max}$Maximum transport distancekm
$S_6$Visibility signal (observation-only)dimensionless
$S_7$Pressure trend signal (observation-only)dimensionless
$P$Barometric pressuremb (hPa)
$V$Visibilitymiles
$\Delta\theta$Angular offset from downwinddegrees
$S_{\text{inv}}$Inversion confidence score0–1
$\Delta z$Elevation difference (receptor – source)ft
$B_I$Base intensitydimensionless
$F_g$Ground-level fraction (proportion of elevated emissions reaching breathing height)0–1
$\beta$Chemical gradient falloff exponentdimensionless
$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 bandsinteger

Appendix B: Elevation Control Points

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.