EPA terrain, weather and dispersion reference check

Verified 5 September 2026.

The official sample now runs from raw terrain and weather inputs through AERMAP, AERMET and AERMOD, with all supplied reference outputs reproduced at their printed precision. This establishes a usable local input chain for this EPA example. It does not establish a Woodfibre prediction or the suitability of a particular model for changing winds in Howe Sound.

The example is EPA’s Martin’s Creek 1992–1993 case. We retained its source characteristics and weather observations. The official archive supplies raw NED terrain, surface observations, upper-air soundings and onsite weather, plus expected output files. EPA sample instructions.

What passed

Stage Version Reference outputs compared Numeric tokens Largest printed numeric difference Runtime
Terrain preprocessing, AERMAP 24142 Receptor/source coordinates and elevations; three terrain diagnostic files 421 0 3.659 s
Weather preprocessing, AERMET 26135 Hourly surface and vertical-profile files 1,548,294 0 2.303 s + 4.604 s
Dispersion, AERMOD 26135 Main output, summary and diagnostic messages, using the newly generated terrain/weather files 11,026 0 2.875 s

Across all stages, 1,559,741 numeric tokens matched and normalized text structure matched. This count includes coordinates, dates, identifiers and other numeric fields; it is not a count of independent concentration predictions. Total model runtime was approximately 13.44 seconds, excluding compilation and comparison.

AERMAP processed two terrain files, seven receptors and six source locations. AERMET produced 9,216 hourly surface records and 119,808 profile records for the sample period. AERMOD processed the sample’s eight source definitions, seven receptors and 9,216 hours for SO₂. AERMAP’s six terrain source locations and AERMOD’s eight emission definitions are the supplied case structure, not a newly reconciled Woodfibre inventory.

The AERMAP reference files report 24142 and the AERMET/AERMOD references report 26135, matching the native builds. EPA currently lists those versions. EPA terrain preprocessor, EPA weather preprocessor, EPA AERMOD.

Comparison and preserved evidence

Before preprocessing, we specified equality of all printed numeric fields and normalized text as the primary reference criterion. The only AERMAP content normalization affecting values was removal of generated wall-clock dates and times in its first two header lines. We also allowed line-ending/whitespace and equivalent numeric formatting differences. The AERMET .sfc and .pfl files are text-identical after newline normalization; their meteorological dates and missing-data values were retained.

The integration run retained the earlier concentration tolerance of the larger of 0.00001 µg/m³ absolute or 0.000001 relative. All displayed numeric fields matched exactly, which is stronger than that project criterion. No field-specific discrepancy was hidden by a general tolerance. Neither criterion is a regulatory acceptance threshold, and internal floating-point states were not compared.

Raw preprocessing input and control-file bytes were unchanged. Staged filenames were capitalized as requested by the supplied input files. AERMOD required the same three directory-path adaptations as the earlier isolated test, plus LF line endings in its staged control file. The integration input manifest records hashes proving that its receptor, surface and profile files came from the new local preprocessing runs.

The original archive and all _ORG references remain separately preserved. The earlier AERMOD-only run also remains intact. Machine-readable evidence:

Diagnostics and build scope

All model processes exited successfully. AERMET stage 1 reported zero errors, 114 warnings, 22 informational and 43,620 QA messages. Stage 2 reported zero errors, 765 warnings and 1,280 informational messages. These include the sample’s missing observations, calm periods and sounding handling. The archive does not supply matching AERMET .rpt/.msg references, so those diagnostic reports are preserved but were not independently reference-matched. Its final surface/profile outputs were matched in full. AERMOD reproduced its reference’s zero errors, 84 warnings and 72 informational messages.

Both preprocessors used the existing task-local GNU Fortran 14.4.0 environment and Xcode SDK 26.2; no new package installation was needed. New source downloads totalled 575,961 bytes. Both executables are native arm64. All 25 AERMAP and 12 AERMET archive files remain byte-for-byte unchanged, in addition to the previously checked 31 AERMOD files.

The build follows EPA’s source order and compiler flags, adapting only platform linkage: native arm64 instead of Windows -m64, an explicit Xcode SDK/local runtime path, and omission of Windows static linkage. AERMAP uses -fbounds-check -Wuninitialized -O2; AERMET uses -fcheck=all -Wall -Wextra -O2 -Wno-compare-reals -Wno-character-truncation -std=f2008 -ffree-form. The build logs retain four AERMAP and 70 AERMET compiler warnings; each link also reports two duplicate runtime-path warnings. Scientific source was not edited to suppress warnings.

Artifact SHA-256
EPA AERMAP source archive 4b34b39fe0039db114e3e78e3b6faa4797a5f8ee8ca0771db030a9b93ab3bed6
Native AERMAP executable 758c48265304f8021a01cb3ef313cf7510999eeaf7845f9a55c3ab7ff78745c2
EPA AERMET source archive 11b0f7efaaa384fe20651d6553aed6c3604803f0a3e8bd103b925e88f7088686
Native AERMET executable 986f43e580c53e391a49ce509b2c4543f601e0c2ec27692c2ed5379d53afc75d

Reproduce locally

These commands use retained inputs and the existing environment. They replace generated outputs under work/epa-model/runs/sample-full-chain/ while preserving original EPA references. Build AERMOD with the existing build-aermod.sh first if its executable is absent.

sh work/epa-model/build-preprocessors.sh aermap
sh work/epa-model/build-preprocessors.sh aermet
python3 work/epa-model/stage-preprocessors.py
python3 work/epa-model/run-preprocessors.py aermap
python3 work/epa-model/run-preprocessors.py aermet
python3 work/epa-model/compare-preprocessors.py
python3 work/epa-model/stage-integration.py
python3 work/epa-model/run-reference.py runs/sample-full-chain/integration
python3 work/epa-model/compare-reference.py runs/sample-full-chain/integration

What remains

This check exercises one official input pathway: NED terrain and the example’s FSL/CD144/onsite meteorology. Canadian terrain conversion, current weather formats, representative surface characteristics and other model options still need their own checks. AERSURFACE, AERSCREEN/MAKEMET and CALMET/CALPUFF were not built or tested in this step.

The software chain is now available for carefully defined sensitivity runs. A Woodfibre application still requires documented source geometry, heat release, pollutants and event timing; a justified meteorological record and terrain/receptor setup; a fit-for-purpose model decision; and evaluation against independent observations. Those requirements are tracked in the prediction roadmap.