Established dispersion model readiness

Verified 5 September 2026. This living record supersedes the earlier missing-compiler and AERMOD-only readiness checks and now includes the separate flare-screening verification.

The complete EPA sample input chain now works locally: AERMAP 24142, AERMET 26135 and AERMOD 26135 reproduced their supplied reference outputs at printed precision. Raw terrain and weather inputs were processed into new receptor, surface and profile files, then passed to AERMOD. Across preprocessing and dispersion, 1,559,741 numeric tokens matched with no numeric differences after documented formatting and file-path normalizations. This establishes the software chain for this reference case, not a validated Woodfibre prediction.

The readiness record contains package versions, compiler settings, hashes and execution metadata. The preprocessing report describes the new terrain/weather checks; the integration comparison records the final AERMOD results. The earlier AERMOD-only comparison is preserved separately.

Reference reproduction

The test is EPA’s Martin’s Creek 1992–1993, Terrain Option 2 sample: eight sources, seven receptors and 9,216 meteorological hours, modelling SO₂. Both the official reference output and local executable report 26135; there is no version mismatch. Original source rates, geometry and weather values were retained.

The initial isolated run used EPA’s supplied preprocessor outputs. The subsequent integration run used newly generated AERMAP/AERMET outputs, each first checked against its official reference. Preprocessing control files and raw data retained their original bytes. Three AERMOD input paths were adapted for directory case and Unix separators; its staged control file uses LF rather than CRLF newlines. EPA identifies the supplied _ORG files as comparison references. Official sample instructions, §§4.1–4.3.

File Numeric tokens compared Maximum absolute numeric difference Result
aermod.out 9,230 0 Matched
aermod.sum 1,428 0 Matched
ERRORS.OUT 368 0 Matched

The five supplied AERMAP output files also matched (421 numeric tokens), as did both AERMET weather files (1,548,294 tokens). The AERMET files are text-identical after newline normalization. AERMAP's wall-clock timestamps differed; weather timestamps and scientific fields were retained.

Text and line structure also matched after normalization of generated run dates/times, the three paths, whitespace/newlines and equivalent numeric formatting such as signed zero. Meteorological dates and concentration differences were not discarded. ERRORS.OUT is identical after newline normalization.

Before execution, the concentration comparison rule was set to an absolute tolerance of 0.00001 µg/m³ or relative tolerance of 0.000001, whichever is larger. This is a project reproduction tolerance, not a regulatory criterion. The outcome was stronger: printed numeric values matched exactly. Internal floating-point states were not compared.

These are EPA sample values, not Woodfibre concentrations:

Sample statistic EPA reference, µg/m³ Local result, µg/m³
Highest 1-hour concentration 1,026.83656 1,026.83656
Highest 3-hour concentration 475.50696 475.50696
Highest 24-hour concentration 107.88322 107.88322
Highest period mean 8.50722 8.50722

The integration AERMOD run took 2.875 seconds; the preceding AERMAP and AERMET stages took 3.659 and 6.907 seconds respectively, for 13.44 seconds total model runtime. All processes exited successfully. AERMOD reproduced zero fatal errors, 84 warnings and 72 informational messages, including sample calm/missing-data and input warnings. Reproducing those messages does not make similar warnings acceptable in another application. AERMET's diagnostic reports are preserved but have no supplied matching report references; its final weather outputs were compared in full. The earlier isolated AERMOD run took 3.526 seconds.

Local compiler and build

The missing compiler was resolved with a project-local environment: GNU Fortran 14.4.0, micromamba 2.9.0, and the existing Xcode MacOSX SDK 26.2. The model executable is native Mach-O arm64. The 46 pinned compiler packages required approximately 114 MB of downloads, plus 92 MB for EPA’s sample. The bootstrap came from the official micromamba distribution; compiler packages came from conda-forge. Micromamba instructions, GNU Fortran package.

Installed software, caches, temporary data and model files remain under work/epa-model/. No global packages or shell configuration were changed. The installer was restricted from writing outside that directory. The initial package-resolution probe created a new empty fallback cache in the user directory; those empty artifacts were identified and removed. The final audit confirms that the task environment was not added to the user’s environment registry.

The build retained EPA’s source order and -fbounds-check -Wuninitialized -O2 flags. Platform adaptations were the Xcode SDK path, a local dynamic-library search path, native executable naming, correctly cased object filenames and omission of Windows static linkage. The compiler directory was added only to the build process’s search path. All 31 files in the official source archive remain byte-for-byte unchanged.

The compiler produced 27 warnings, retained in work/epa-model/logs/build-native.log, without source changes to suppress them. Two additional linker messages reported duplicate runtime search paths. The successful sample does not exercise every optional model pathway or resolve every compiler warning.

The preprocessors reused that compiler environment without installing further packages. Their two official source archives added 575,961 download bytes. All 25 AERMAP and 12 AERMET archive files were checked unchanged. AERMAP followed its official bounds-checking recipe; AERMET followed its full-checking Fortran 2008 recipe, with the same native SDK/linkage adaptations. Four AERMAP and 70 AERMET compiler warnings, plus duplicate-runtime-path linker warnings, remain in their build logs. Details and fingerprints are in the preprocessing readiness record.

Scope still outstanding

Component Version checked Readiness
AERMOD 26135 Built; isolated and complete-chain official sample reproduced.
AERMAP 24142 Built; all five supplied terrain output references reproduced.
AERMET 26135 Built; both stages executed and final surface/profile references reproduced.
AERSURFACE Not built Surface-characteristic preparation remains untested.
AERSCREEN 21112 Built; official flat-terrain flare case reproduced with AERMOD 26135.
MAKEMET 16216 Built and executed through the matched flare example; no direct weather-file references supplied for that case.
CALMET/CALPUFF Provider versions/access checked Current CALPUFF requires a provider request; no package installed or terms accepted.

The current EPA pages provide these AERMOD, preprocessor and screening versions and their documentation. AERSCREEN invokes AERMOD but needs its own execution checks. EPA AERMOD downloads, EPA terrain preprocessor, EPA weather preprocessor, EPA screening models.

Downloads required no account or purchase. No standalone licence file or SPDX identifier was found in the AERMOD archive; this report does not assign it a particular open-source licence. EPA’s general website terms describe scientific and educational use and note that individual materials can have separate conditions. EPA terms.

Evidence and reproduction

Official archives and reference data are retained separately from generated outputs. SHA-256 fingerprints include:

Artifact SHA-256
Official source archive 5092c1d68b77d9407c9f67d497b440a79d2ee746f9ed6515a63ad4a5b11cd8ed
Official sample archive 3ee2180fd0ad9c954350bbbe3ca3567ce02df91a2869cec5f6c45178bff32da0
Local native executable e7cb9a1f69a8697a0e5a6f35fe03d8b1b484aa9b24c721cefffbd8b864298163

These are locally calculated fingerprints, not independent attestations. Package URLs and hashes are in the readiness JSON. The explicit package lock is work/epa-model/environment-explicit-lock.txt.

With the retained environment and source/reference files, these workspace commands reproduce the complete chain. They replace generated run outputs while preserving the official references:

sh work/epa-model/build-aermod.sh
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

The original isolated results remain under work/epa-model/runs/sample-aermod-26135/; the new raw-input preprocessing and integration runs are under work/epa-model/runs/sample-full-chain/. The build and installation scripts are local; the installer uses pinned packages and does not initialize a shell.

Practical next step

The measured runtime supports a bounded AERMOD sensitivity exercise. A unit-emission comparison can isolate transport with fixed source geometry, heat and meteorology, labelled as an artificial or documented engineering case. Changing actual flare throughput also changes heat and buoyancy, so a simple concentration multiplier cannot represent that change.

The subsequent AERSCREEN/MAKEMET flat-flare reference check reproduced 7,095 printed numeric fields and normalized text. Its terrain, building-downwash, NO₂-conversion and fumigation branches remain untested. The functioning AERMOD input chain still requires checks for Canadian terrain and current weather formats and a justified surface-characteristic dataset. None of these software checks establishes that a straight-line model resolves changing fjord flow. Model choice, representative weather, current flare inputs and site evaluation remain separate work in the prediction roadmap.

Subsequent historical engineering cases

The verified screening pathway has subsequently completed 40 historical-case executions: 36 source/surface/temperature combinations, three 40 km search extensions and one fixed-heat pollutant-mass scaling check. These use dated Woodfibre heat/geometry and artificial meteorology on flat ground, with explicit 1.5 m receptors. They are separate from the official reference tests described above. All three selected extensions retained their printed peaks and the scaling check matched output precision. Historical screening results

The 13 CDGF executions retain AERMOD's W320 warning because the derived equivalent diameter exceeds its generic 20 m plausibility check; applicability at that scale remains unresolved. All 27 other executions completed without model warnings, which is not physical validation. Very large separate AERSCREEN final-rise diagnostics also require review and must not become map release-height defaults. Current source inputs, terrain/coastal flow, transient chronology, chemistry/background and community exposure remain unvalidated. Applicability review

Three additional diagnostic replays now reproduce the original selected peaks with the same binary, sources, receptor networks and exact selected synthetic records. Their 906 receptor calculations pass component-sum and meander-blend checks. A separate failed date-filter attempt is preserved and excluded from scientific interpretation. These checks identify dominance of the penetrated component at the selected ground peaks; they do not expand physical validation or exercise new dispersion options. Diagnostic findings