Validation — AERMOD 26135
When EPA released AERMOD/AERMET version 26135 on July 9, 2026 — replacing 24142 as the regulatory version — we did not simply recompile and ship it. Before the new version became selectable on this platform, we validated our build against EPA's own official test suite: the 53-case bundle EPA publishes on SCRAM for exactly this purpose.
Re-validated July 19, 2026 — the 26135-family library cases re-run on the current build and matched again, most exactly.
Re-validated July 29, 2026 — the complete 41-case platform library was rebuilt and re-run end-to-end through the product interface on the production service, each case compared against EPA's reference outputs. All 41 passed: every design value within the acceptance envelope, the large multi-source cases verifying every per-receptor value the references provide.
Extended August 31, 2026 — EPA publishes the 26135 suite under two met pairings; the transition pairing (AERMET-24142 met, EPA's primary validation set) is what the 53/53 above used. The latest-met × latest-model pairing (aermet26135_aermod26135) — the exact chain this platform runs for users — is now also verified: its reference case reproduces EPA's published output on the production AWS runtime, and the case runs in the continuous nightly conformance gate alongside the AERMET 26135 byte-match matrix.
Result: 53 of 53 cases validated
Every comparable output artifact EPA ships — plotfiles, postfiles, summary tables, threshold-exceedance and season-hour files — was compared against EPA's reference outputs, receptor by receptor and hour by hour. Across all 53 cases:
- The design values — the numbers actually compared against a NAAQS — match EPA's references in every case, to at least four significant figures and typically to six.
- 36 cases reproduce EPA's output character-for-character, millions of values identical.
- Across the full suite, more than 99.9% of all compared values are identical; the remainder agree within 5×10⁻⁴ relative (most within 10⁻⁵), confined to individual hourly values — never a design value.
The acceptance criterion
A validated case means: every output artifact compared, design values in agreement with EPA's references to at least four significant figures, and any remaining differences quantified, attributable to compiler arithmetic, and within the envelope EPA's own methodology accepts. All 53 cases meet this bar.
The small residual differences arise because EPA compiles its reference binaries with a different Fortran compiler and platform than any independent build; different compilers order floating-point operations slightly differently, so two correct builds of identical code can disagree in the last digit of an occasional value. Two facts establish that this is expected behavior, not a defect:
- The control experiment. Our long-validated 24142 binary shows the same magnitude of last-digit differences against EPA's own published 24142 references — the envelope predates 26135 and applies to every AERMOD build on every platform, from every vendor.
- EPA's own acceptance method. The instructions EPA ships with the test cases direct users to compare runs using EPA's R scripts, which produce comparison plots and summary statistics — not byte equality across builds.
Detailed accounting
| Cases | Outcome |
|---|---|
| 36 | Output identical, character-for-character |
| 1 | Identical except one value near 10⁻¹⁷ differing by one unit in the file format's last decimal |
| 9 | Individual hourly values agree within 5th–7th significant figure; design values match to 4+ significant figures |
| 5 | The multi-year (MULTYEAR) chain, run sequentially as EPA runs it: 99.987% of 9,465,984 hourly values identical; all remaining differences below 0.0007 µg/m³ in magnitude; design values for all five years match to ~10⁻⁶ |
| 2 | Cases whose EPA inputs request only summary outputs: design-value tables match to 8.9×10⁻⁶ or better; auxiliary files within the same envelope as the 24142 control |
What each case runs
Each row is one case from EPA's official suite. Together they exercise the model's breadth: all the major source types, the five NO₂ chemistry options, urban dispersion, building downwash, deposition, multi-year processing, and every receptor network type.
| Case | Pollutant | Averaging (hr) | Sources | What it exercises | Receptors |
|---|---|---|---|---|---|
Test1_Base_cart_3cond_SNC | OTHER | 1 | 1 RLINEXT | flagpole receptors, flat terrain | Cartesian grid |
Test20_Urban_cart_3cond_SNC | OTHER | 1 | 1 RLINEXT | urban option, flagpole receptors, flat terrain | Cartesian grid |
Test3_Base_cart_3cond_SNC_bar | OTHER | 1 | 1 RLINEXT | flagpole receptors, flat terrain | Cartesian grid |
Test4_Base_cart_3cond_SNC_dep | OTHER | 1 | 1 RLINEXT | flagpole receptors, flat terrain | Cartesian grid |
aermod-baldwin45 | OTHER | 1 3 8 24 PERIOD | 3 BUOYLINE | hourly emission file, flat terrain | Cartesian grid |
aermod-baldwinHoriz | OTHER | 1 3 8 24 PERIOD | 3 BUOYLINE | hourly emission file, flat terrain | Cartesian grid |
aermod-baldwinVert | OTHER | 1 3 8 24 PERIOD | 3 BUOYLINE | hourly emission file, flat terrain | Cartesian grid |
aertest | SO2 | 1 3 8 24 PERIOD | 1 POINT | building downwash, EVENT companion run, flat terrain | polar grid |
allsrcs | SO2 | 1 3 8 24 PERIOD | 3 RLINEXT + 3 BUOYLINE + 2 POINT + 1 AREA + 1 AREACIRC + 1 AREAPOLY + 1 VOLUME + 1 OPENPIT + 1 RLINE + 1 LINE | building downwash, flat terrain | Cartesian grid, polar grid, discrete points, evaluation grid |
bg_no2_arm2_ppb | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, ARM2 NO2 chemistry | polar grid |
bg_no2_arm2_ugm3 | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, ARM2 NO2 chemistry | polar grid |
bg_no2_grsm_ppb | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, GRSM NO2 chemistry | polar grid |
bg_no2_grsm_ugm3 | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, GRSM NO2 chemistry | polar grid |
bg_no2_olm_ppb | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, OLM NO2 chemistry | polar grid |
bg_no2_olm_ugm3 | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, OLM NO2 chemistry | polar grid |
bg_no2_pvmrm_ppb | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, PVMRM NO2 chemistry | polar grid |
bg_no2_pvmrm_ugm3 | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, PVMRM NO2 chemistry | polar grid |
bg_no2_ttrm_ppb | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, TTRM NO2 chemistry | polar grid |
bg_no2_ttrm_ugm3 | NO2 | 1 | 1 POINT | background concentrations, NO2 equilibrium ratio, TTRM NO2 chemistry | polar grid |
blp_urban | OTHER | 1 ANNUAL | 2 BUOYLINE | urban option, flat terrain | Cartesian grid |
capped | SO2 | 1 3 8 24 PERIOD | 5 POINT + 2 POINTCAP + 2 POINTHOR | building downwash, EVENT companion run, flat terrain | polar grid |
capped_nostd | SO2 | 1 3 8 24 PERIOD | 2 POINT + 1 POINTHOR + 1 POINTCAP | EVENT companion run, flat terrain | polar grid |
flatelev | SO2 | 1 3 8 24 PERIOD | 2 POINT | EVENT companion run | — |
hrdow | OTHER | 1 3 8 24 ANNUAL | 6 POINT | variable emission factors, EVENT companion run, flat terrain | polar grid |
in_urban | SF6 | 1 | 1 POINT | urban option, hourly emission file, flat terrain | evaluation grid |
lovett | SO2 | 1 3 24 PERIOD | — | hourly emission file, EVENT companion run | — |
mcr | SO2 | 1 3 24 PERIOD | 8 POINT | building downwash, hourly emission file, EVENT companion run | discrete points |
multurb | SO2 | 1 3 8 24 PERIOD | — | urban option, EVENT companion run, flat terrain | polar grid |
no2_1yrAK_1tier | NO2 | 1 ANNUAL | 1 POINT + 1 VOLUME + 1 AREA | building downwash, background concentrations, MAXDCONT contributions, NO2 equilibrium ratio, flat terrain | polar grid |
no2_1yrAK_arm2 | NO2 | 1 ANNUAL | 1 POINT + 1 VOLUME + 1 AREA | building downwash, background concentrations, MAXDCONT contributions, NO2 equilibrium ratio, ARM2 NO2 chemistry, flat terrain | polar grid |
no2_1yrAK_arm2min | NO2 | 1 ANNUAL | 1 POINT + 1 VOLUME + 1 AREA | building downwash, background concentrations, MAXDCONT contributions, NO2 equilibrium ratio, ARM2 NO2 chemistry, flat terrain | polar grid |
no2_1yrAK_grsm | NO2 | 1 ANNUAL | 1 POINT + 1 VOLUME + 1 AREA | building downwash, background concentrations, MAXDCONT contributions, NO2 equilibrium ratio, GRSM NO2 chemistry, flat terrain | polar grid |
no2_1yrAK_olm | NO2 | 1 ANNUAL | 1 POINT + 1 VOLUME + 1 AREA | building downwash, background concentrations, MAXDCONT contributions, NO2 equilibrium ratio, OLM NO2 chemistry, flat terrain | polar grid |
no2_1yrAK_olmgrp | NO2 | 1 ANNUAL | 1 POINT + 1 VOLUME + 1 AREA | building downwash, OLM groups, background concentrations, MAXDCONT contributions, NO2 equilibrium ratio, OLM NO2 chemistry, flat terrain | polar grid |
no2_1yrAK_pvmrm | NO2 | 1 ANNUAL | 1 POINT + 1 VOLUME + 1 AREA | building downwash, background concentrations, MAXDCONT contributions, NO2 equilibrium ratio, PVMRM NO2 chemistry, flat terrain | polar grid |
olm | NO2 | 1 ANNUAL | 1 POINT | EVENT companion run, OLM NO2 chemistry, flat terrain | polar grid |
olmgrp | NO2 | 1 ANNUAL | 2 POINT | OLM groups, EVENT companion run, OLM NO2 chemistry, flat terrain | polar grid |
openpits | SO2 | 1 3 24 PERIOD | 3 OPENPIT | particle deposition (Method 2), particle deposition, EVENT companion run, flat terrain | polar grid |
psdcred | NO2 | 1 ANNUAL | 3 POINT | PSD-credit groups, PVMRM NO2 chemistry, flat terrain | polar grid |
pvmrm | NO2 | 1 ANNUAL | 1 POINT | EVENT companion run, PVMRM NO2 chemistry, flat terrain | polar grid |
scimtest | OTHER | ANNUAL | 1 POINT + 1 AREA + 1 AREACIRC + 1 AREAPOLY + 1 VOLUME + 1 OPENPIT | SCIM sampled-hour scheme, flat terrain | polar grid |
surfcoal | OTHER | 1 24 | — | hourly emission file, particle deposition, flagpole receptors, EVENT companion run, flat terrain | discrete points |
testgas | BENZENE | 1 | 1 POINT | gas deposition, flat terrain | discrete points |
testgas2 | BENZENE | 1 3 8 24 MONTH ANNUAL | 1 POINT | gas deposition, EVENT companion run, flat terrain | polar grid |
testpart | CHROMIUM | 1 | 1 POINT | particle deposition (Method 2), flat terrain | discrete points |
testpm10 | PM10 | 1 24 PERIOD | 2 POINT | building downwash, EVENT companion run, flat terrain | polar grid |
testpm10_1986 | PM10 | 1 PERIOD | 2 POINT | MULTYEAR, building downwash, EVENT companion run, flat terrain | polar grid |
testpm10_1987 | PM10 | 1 PERIOD | 2 POINT | MULTYEAR, building downwash, EVENT companion run, flat terrain | polar grid |
testpm10_1988 | PM10 | 1 PERIOD | 2 POINT | MULTYEAR, building downwash, EVENT companion run, flat terrain | polar grid |
testpm10_1989 | PM10 | 1 PERIOD | 2 POINT | MULTYEAR, building downwash, EVENT companion run, flat terrain | polar grid |
testpm10_1990 | PM10 | 1 PERIOD | 2 POINT | MULTYEAR, building downwash, EVENT companion run, flat terrain | polar grid |
testpm25 | PM25 | 24 ANNUAL | 2 POINT | building downwash, EVENT companion run, flat terrain | polar grid |
testprt2 | CHROMIUM | 1 3 8 24 MONTH ANNUAL | 1 POINT | particle deposition (Method 2), EVENT companion run, flat terrain | polar grid |
Parallel (receptor-split) execution was re-proven under 26135 directly: the same run executed whole and split across multiple containers produces identical results to the last digit, for both discrete receptors and gridded networks.
The full platform library, re-run under 26135: 41 of 41
Beyond EPA's own test suite, the platform's EPA reference library — the 41 cases built entirely through the product interface and maintained as durable projects — was re-run under 26135 the way a real user upgrades: each project's version pin switched to 26135 and re-run, so every library project now holds both runs of record side by side. All 41 match EPA's 26135 references: every design value (including the ranked tables EPA's own inputs request), and every per-receptor value where the reference provides them — the largest case verifying all 1,080 evaluation-grid cells.
Based on this, new projects now default to AERMOD 26135. Existing projects keep their pinned version — a re-run of yesterday's project reproduces yesterday's run, always.
AERMET 26135: 32 of 32 byte-identical
The meteorological preprocessor was validated separately, against EPA's own AERMET test-case bundle — eight cases (EX01–EX05, Anchorage, Lovett, Martins Creek) in each of the two suites EPA distributes (the default configuration and the ADJ_U* low-wind configuration).
- Every produced surface and profile met file is byte-for-byte identical to EPA's bundled reference output — 32 of 32 case-runs. No tolerance was needed: character-for-character equality.
- The same harness run against the 24142 suites with our 24142 build also matches 32 of 32 — the method is identical to the long-standing gate that has guarded the platform's met processing since launch.
- Both versions stay proven. These 32 case-runs are not a one-time clearance: the same byte-for-byte comparison is re-run automatically whenever the meteorological preprocessor, the image it runs in, or the code that invokes it changes — for both versions and both suites. Because a project keeps whatever version it was pinned to, a superseded version has to keep working, so it keeps being checked.
- AERMET 26135 also introduces support for the GHCNh surface-data format, which replaces the discontinued ISHD format for newly published data.
Every processed met dataset records which AERMET version produced it, that version is shown on the run record, and datasets processed under different versions are kept strictly separate.
AERSURFACE 26135: reference case reproduced exactly
The surface-characteristics preprocessor was validated against the test case EPA distributes with AERSURFACE (Raleigh-Durham, NLCD 2021 land cover with impervious and tree-canopy supplements), whose bundled reference output was generated by EPA's own AERSURFACE 26135. Our build reproduces every data line of that reference exactly.
AERMINUTE 26135: both EPA test cases reproduced
The 1-minute ASOS wind processor was validated against both cases EPA ships with the AERMET test suite — Pittsburgh (2000) and Providence (2005), a full year of 1-minute data each. Every output the cases produce (the hourly wind file that feeds AERMET, the summary file, and the comparison file against standard observations) matches EPA's reference copies: Providence is character-for-character identical, and Pittsburgh differs only in the run-date header lines.
The prior version (15272) passes the same comparison against its own EPA references, so projects processed under the earlier met chain re-run with the exact program their results were built with. Version 26135 also reads GHCNh files as the standard-observation input, matching the AERMET 26135 data chain end to end.
The 26135 capabilities, each proven against the running system
Version 26135 added several modeling capabilities beyond its corrections. Each one on this platform was verified against the deployed system — not just unit tests — before it became selectable:
- Multiple hourly emission files in one run. A year-long, eight-source reference case was run twice — once with a single merged hourly file, once split across two files — and the resulting concentration files are identical byte for byte.
- Backup upper-air station substitution. A complete four-stage meteorology chain (surface + primary radiosonde + backup radiosonde + merge) was processed end to end for Raleigh-Durham; the control chain without the backup produces the same output when the primary record has no missing soundings, exactly as the method specifies.
- GHCNh surface data. The same station-month was processed twice — once from the GHCNh archive, once from the ISHD archive it replaces — and every comparable hour agrees on wind speed, wind direction, and temperature.
- Segmented roadside barriers and edge effects. A roadway case with a solid barrier shows reduced concentrations behind the wall; turning on edge effects changes concentrations near the barrier ends — both in the direction the method describes.
- Vegetative roadside barriers. The inputs are accepted with the vegetation's computed wake, and the calculation is confirmed active through the model's own diagnostic output. No published reference values exist for this research-grade option yet, so no numerical comparison is claimed.
- Aircraft sources. An apron source modeled with aircraft plume rise produces different — lower peak — ground-level concentrations than the same source without it, consistent with exhaust rising from engine momentum and buoyancy.
- Refined roughness rings. Subdividing the surface-roughness sectors into distance bands changes every computed surface characteristic for the reference site, confirming the refinement takes effect.
What changed between 24142 and 26135
EPA's release memorandum lists the substantive changes, several of which this platform's users benefit from directly: corrections to the Ozone Limiting Method with sector-varying background concentrations, corrected source-group accounting in MAXDCONT under GRSM, corrected POSTFILE output under multi-year processing, and support for per-source hourly-emission files. EPA's own comparison statistics quantify the concentration effects as small (average relative differences of 10⁻⁸ to 10⁻⁴ in the affected cases) with design-value-class metrics unchanged.
Version policy on this platform
-
New meteorological processing also defaults to the current EPA chain — AERMET 26135 and AERSURFACE 26135 — while every existing processed dataset keeps the version that produced it, recorded in its provenance.
-
Every project is pinned to one AERMOD version, so a re-run always reproduces the run of record.
-
A new EPA version becomes selectable only after this validation passes.
-
Existing projects stay on their pinned version; new analyses can use the current regulatory version, and an explicit upgrade re-run is always available.
For version 24142 — validated end-to-end through the product UI itself — see the companion report Validation — AERMOD 24142.