Turn a SWMM5 model into a SWMM6 solver test in four edits
OpenSWMM's SWMM6 engine keeps EXTRAN's dynamic-wave heart — the same momentum kernel, bit-parity with dwflow.c — and then adds four solver features EXTRAN never had. All four are switched on from the .inp file: three [OPTIONS] lines and one new section. This app shows the exact lines, makes the edits for you, and tells you which engines will accept, warn, error, or crash on the result — because we ran the same six files through all four of them.
What it does
1 · Documents each feature with the exact .inp syntax, engine default, and source-line citation. 2 · Upgrades your pasted SWMM5 .inp with checkboxes and shows a line diff. 3 · Strips a SWMM6 file back to clean SWMM5. 4 · Gives you the four-engine compatibility matrix with the verbatim error messages.
Who uses it
1 · A SWMM5 modeler curious what SWMM6 changes — start on The Four Edits. 2 · Someone building a test file right now — start on Upgrader. 3 · Anyone about to share a SWMM6 file with SWMM5 users — start on Compatibility Matrix. 4 · A reviewer checking whether the features change answers — start on Verified Numbers. 5 · A skeptic — start on Provenance.
What you get out of it
A runnable SWMM6 test file from your own model in under a minute; the knowledge of which engines it will break and how; measured evidence that these switches change real answers (peak flow +13.5% from the Dynamic Preissmann Slot alone on the surcharged demo chain); and a reversible path back to SWMM5.
1 · Dynamic Preissmann Slot — SURCHARGE_METHOD DYNAMIC_SLOT
EXTRAN handles surcharge by switching to a special head-adjustment equation; the classic SLOT method replaces that with a fixed-width Preissmann slot. SWMM6 adds a third method: a dynamic slot whose width follows the Preissmann Number so pressure-wave celerity relaxes toward a target instead of being fixed (Sharior et al. 2023).
[OPTIONS] SURCHARGE_METHOD DYNAMIC_SLOT ;; was EXTRAN (default) or SLOT DPS_CELERITY 25 ;; target pressure celerity, m/s (default 25) DPS_ALPHA 3 ;; shock parameter, dimensionless >= 2 (default 3) DPS_DECAY_TIME 0.5 ;; Preissmann Number decay, seconds (default 0.5)
Lower DPS_CELERITY allows larger timesteps but reduces transient fidelity; larger DPS_ALPHA gives a bigger celerity shock at the mixed-flow transition; shorter DPS_DECAY_TIME reaches the target celerity faster but can oscillate.
Surcharge Method ......... DYNAMIC_SLOT.DPS_* line adds another ERROR 205.Parser: OptionsHandler.cpp:301–315 · defaults: SimulationOptions.hpp:208–231 (surcharge_method=0 EXTRAN, celerity 25.0, alpha 3.0, decay 0.5)
2 · Semi-implicit node continuity — NODE_CONTINUITY SEMI_IMPLICIT
EXTRAN's node depth update is explicit, with a special branch when depth crosses the crown. SWMM6 can replace that branch with one Crank–Nicolson update, dH = dV/(A − dt·Σ∂q/∂h/2) — the same formula through open, transition and surcharged states.
[OPTIONS] NODE_CONTINUITY SEMI_IMPLICIT ;; default is EXPLICIT (legacy behaviour)
Node Continuity .......... SEMI_IMPLICIT.SimulationOptions.hpp:234 sets EXPLICIT and comments it "default (legacy behaviour)". Trust the source — your model behaves the same unless you add this line.Parser: OptionsHandler.cpp:316–320 · default: SimulationOptions.hpp:234
3 · Anderson acceleration — ANDERSON_ACCEL YES
EXTRAN converges node depths by Picard successive approximation. SWMM6 can wrap that loop in depth-2 Anderson mixing; the source claims 25–50% fewer iterations on stiff surcharge problems, falling back to plain Picard for nodes that violate physical bounds. It is clamped to interpolation only (mixing factor in [0,1]) and gated off far from convergence.
[OPTIONS] ANDERSON_ACCEL YES ;; default NO (standard Picard)
Parser: OptionsHandler.cpp:326–329 · default: SimulationOptions.hpp:256
4 · Virtual junctions — the [VIRTUAL_JUNCTIONS] section
EXTRAN puts storage at every node; a pipe broken into segments picks up artificial surface area at every break node. A SWMM6 virtual junction is a zero-storage, momentum-transmitting pipe-break node: move it out of [JUNCTIONS], keep only name and invert, and the engine derives its geometry from the two attached conduits. VIRTUAL_JUNCTION_MOMENTUM FULL adds the cross-junction convective flux correction (dq4_j) — a term with no SWMM5 counterpart.
[JUNCTIONS] ;;J2 removed from here ... [VIRTUAL_JUNCTIONS] ;;Name InvertElev ;; exactly two tokens; a third is a parse error J2 105.0 [OPTIONS] VIRTUAL_JUNCTION_MOMENTUM FULL ;; default BASIC
Parser: NodesHandler.cpp:95 (name + invert only, extra tokens = ERR_VJ_EXTRA_TOKENS) · registration: DefaultInputPlugin.cpp:61 · momentum option: OptionsHandler.cpp:321–325, default BASIC at SimulationOptions.hpp:245 · merged 2026-08-03, PR #115
Where to run the result
The openswmm CLI (new data-oriented engine) takes the same inp rpt out arguments as SWMM5; the legacy EPA tree ships beside it as openswmm-legacy. In the browser, the prebuilt alpha.2 WASM engine accepts the three option-line features today (with one cosmetic bug: DYNAMIC_SLOT echoes as (null) in the report while the solver engages) — but not [VIRTUAL_JUNCTIONS]. Build alpha.3 from source for all four: with GeoPackage, 2D and the GPU plugin switched off it is pure C++20 with no external dependencies.
Built-in test fleet engine-verified 2026-08-08
The 10 EXTRAN-Manual examples and 5 real user models, embedded in this page and each run through the alpha.3 openswmm CLI. Base cont% is the as-loaded flow-routing continuity. App is what the old 2-rule scan called VJ-eligible; Strict is what the engine accepts under all four rules — the gap is the defect this build fixes.
| Model | J | C | Base cont% | App | Strict | |
|---|---|---|---|---|---|---|
| Example 1 | 9 | 9 | 0.011% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.1 | 9 | 9 | 0.011% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.2 | 9 | 9 | -4.052% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.3 · orifice | 9 | 9 | 0.085% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.4 · weir | 9 | 9 | 0.019% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.5 · storage/orifice | 9 | 9 | -0.206% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.6 · pump | 10 | 10 | -0.030% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.7 · pump | 9 | 9 | 0.049% | 5 | 3 | −2 over-reported |
| EXTRAN Ex.9 · storage | 0 | 0 | 0.485% | 0 | 0 | |
| EXTRAN Ex.10 · pump+controls | 0 | 1 | 0.131% | 0 | 0 | |
| User 1 · 59-node runoff | 59 | 59 | 0.083% | 36 | 0 | −36 over-reported |
| User 2 · SLOT | 43 | 83 | -0.026% | 24 | 0 | −24 over-reported |
| User 3 · pumps | 5 | 134 | -0.012% | 3 | 0 | −3 over-reported |
| User 4 · 208 nodes | 208 | 209 | 0.054% | 71 | 49 | −22 over-reported |
| User 5 · SLOT | 197 | 273 | -2.438% | 48 | 0 | −48 over-reported |
Input demo loaded
Features to switch on
Diff
Modified file
Engine × feature matrix
| .inp contains… | SWMM6 6.0.0-alpha.3 openswmm CLI @ 1610516 | SWMM6 6.0.0-alpha.2 prebuilt WASM (browser) | Legacy 5.3.0-beta.3 openswmm-legacy, same repo | EPA SWMM 5.2.4 stock, built from v5.2.4 tag |
|---|---|---|---|---|
| nothing new (base SWMM5 file) | runs −0.205% | runs | runs | runs −0.181% |
SURCHARGE_METHOD DYNAMIC_SLOT | runs echoed | runs engages; report label prints (null) | ERROR 205 known key, bad value | ERROR 205 fatal |
DPS_CELERITY / DPS_ALPHA / DPS_DECAY_TIME | runs | runs | WARNING ignored, still runs | ERROR 205 each line |
NODE_CONTINUITY SEMI_IMPLICIT | runs echoed | runs echoed | WARNING ignored | ERROR 205 fatal |
ANDERSON_ACCEL YES | runs echoed | runs echoed | WARNING ignored | ERROR 205 fatal |
[VIRTUAL_JUNCTIONS] section | runs + VJ Summary | CRASH memory access out of bounds | skip → ERROR 209 exits 0 anyway | ERROR 205 at section header |
The verbatim messages
This is why the Upgrader never writes these options into a SWMM5 file: with the target set to SWMM5, Apply refuses them entirely, and Download SWMM5 .inp strips them unconditionally. The messages below are what each engine does if a file carries them anyway.
Stock EPA SWMM 5.2.4 — every new keyword is fatal
ERROR 205: invalid keyword DYNAMIC_SLOT at line 26 of [OPTION] section: ERROR 205: invalid keyword DPS_CELERITY at line 27 of [OPTION] section: ERROR 205: invalid keyword NODE_CONTINUITY at line 30 of [OPTION] section: ERROR 205: invalid keyword ANDERSON_ACCEL at line 30 of [OPTION] section: ERROR 205: invalid keyword VIRTUAL_JUNCTION_MOMENTUM at line 30 of [OPTION] section:
5.2.4 has no "unknown option → warn" path: an unrecognized [OPTIONS] keyword and an unrecognized section header both raise ERR_KEYWORD (205) and kill the run (input.c pass 1 and pass 2 both).
Repo legacy 5.3.0-beta.3 — softened, with a trap
WARNING: Unknown option keyword 'NODE_CONTINUITY' in [OPTIONS] section - option will be ignored. WARNING: Unknown section '[VIRTUAL_JUNCTIONS]' at line 39 will be skipped. ERROR 209: undefined object J2 at line 49 of [CONDUIT] section:
Unknown keywords and unknown sections are now warn-and-skip — but skipping [VIRTUAL_JUNCTIONS] erases the node you moved there, so the conduits that reference it fail with ERROR 209. The process still exits 0: check the .rpt, never the exit code.
One feature at a time — the message each engine gives you
Three files, each generated by this Upgrader with exactly one feature ticked, run natively on 2026-08-08. Every process exits 0 — including the fatal parses — so read the .rpt, never the exit code.
SURCHARGE_METHOD DYNAMIC_SLOT + DPS_* only
Stock 5.2.4 ERROR 205: invalid keyword DYNAMIC_SLOT at line 23 of [OPTION] section:
ERROR 205: invalid keyword DPS_CELERITY at line 29 of [OPTION] section:
ERROR 205: invalid keyword DPS_ALPHA at line 30 of [OPTION] section:
ERROR 205: invalid keyword DPS_DECAY_TIME at line 31 of [OPTION] section:
→ FATAL: no results computed
Legacy 5.3.0-b3 ERROR 205: invalid keyword DYNAMIC_SLOT at line 23 of [OPTION] section:
WARNING: Unknown option keyword 'DPS_CELERITY' in [OPTIONS] section - option will be ignored.
WARNING: Unknown option keyword 'DPS_ALPHA' in [OPTIONS] section - option will be ignored.
WARNING: Unknown option keyword 'DPS_DECAY_TIME' in [OPTIONS] section - option will be ignored.
→ FATAL: no results computed
Alpha.3 (no error) .rpt echoes: Surcharge Method ......... DYNAMIC_SLOT
The legacy asymmetry, measured: an unknown keyword (each DPS_* line) takes the new warn-and-skip path, but a known keyword with an unknown value (SURCHARGE_METHOD DYNAMIC_SLOT) still goes through strict validation — fatal ERROR 205 even in legacy 5.3.
NODE_CONTINUITY SEMI_IMPLICIT only
Stock 5.2.4 ERROR 205: invalid keyword NODE_CONTINUITY at line 29 of [OPTION] section:
→ FATAL: no results computed
Legacy 5.3.0-b3 WARNING: Unknown option keyword 'NODE_CONTINUITY' in [OPTIONS] section - option will be ignored.
→ RUNS TO COMPLETION with the feature silently ignored — you get SWMM5 answers back
Alpha.3 (no error) .rpt echoes: Node Continuity .......... SEMI_IMPLICIT
ANDERSON_ACCEL YES only
Stock 5.2.4 ERROR 205: invalid keyword ANDERSON_ACCEL at line 29 of [OPTION] section:
→ FATAL: no results computed
Legacy 5.3.0-b3 WARNING: Unknown option keyword 'ANDERSON_ACCEL' in [OPTIONS] section - option will be ignored.
→ RUNS TO COMPLETION with the feature silently ignored
Alpha.3 (no error) .rpt echoes: Anderson Acceleration .... YES
Prebuilt alpha.2 WASM — the browser trap
callMain(['/m.inp','/m.rpt','/m.out']) → RuntimeError: memory access out of bounds
[VIRTUAL_JUNCTIONS] postdates the alpha.2 build (merged 2026-08-03; alpha.2 shipped to PyPI 2026-07-07). It does not fail gracefully — the WASM instance dies. Any browser runner on that build needs a fresh engine instance per run and should pre-scan for the section.
One feature at a time
| Run | Feature lines added | Routing continuity % | C2 peak flow, cfs | Δ peak vs base |
|---|
Read it like this
DYNAMIC_SLOT moves the answer the most on a surcharged run (+13.5% peak) — expected, since it rewrites how surcharge propagates pressure. SEMI_IMPLICIT shifts the peak −3.9% and flips the continuity sign. ANDERSON leaves the converged peak identical to base — the correct behavior for a convergence accelerator. Virtual junction J2 barely changes this chain's peak (+0.1%) because J2 was already a plain pass-through; its value shows in the new Virtual Junction Summary, which reports the momentum residual EXTRAN silently absorbs into node storage (J2: max 791.64, mean 5.82 cfs·ft/s). All features together: 19.29 cfs, +34.1% — the combination is not additive.
The 15-model fleet — one comparison table engine-verified 2026-08-08
Every cell is a measured run: SWMM6 alpha.3 native CLI for the base and feature columns, stock EPA 5.2.4 for the round-trip column. +Slot / +Semi / +And: the model with that single feature switched on. VJ eligible: what the old 2-rule scan claimed → what the engine's four rules (609/611/613/617) accept. All-VJ cont%: continuity after converting every strict-eligible node. 5.2.4 round-trip: all-features upgrade → strip → stock 5.2.4, flow-routing continuity of the result.
| Model | J | C | Base cont% (α.3) | +Slot | +Semi | +And | VJ eligible | All-VJ cont% | 5.2.4 round-trip |
|---|---|---|---|---|---|---|---|---|---|
| Example 1 | 9 | 9 | 0.011% | runs | runs | runs | 5→3 over | 0.030% | 0.011% |
| EXTRAN Ex.1 | 9 | 9 | 0.011% | runs | runs | runs | 5→3 over | 0.030% | 0.011% |
| EXTRAN Ex.2 | 9 | 9 | -4.052% | runs | runs | runs | 5→3 over | -4.120% | -4.052% |
| EXTRAN Ex.3 · orifice | 9 | 9 | 0.085% | runs | runs | runs | 5→3 over | 0.222% | 0.085% |
| EXTRAN Ex.4 · weir | 9 | 9 | 0.019% | runs | runs | runs | 5→3 over | -0.016% | 0.020% |
| EXTRAN Ex.5 · storage/orifice | 9 | 9 | -0.206% | runs | runs | runs | 5→3 over | -0.139% | -0.205% |
| EXTRAN Ex.6 · pump | 10 | 10 | -0.030% | runs | runs | runs | 5→3 over | 0.108% | -0.054% |
| EXTRAN Ex.7 · pump | 9 | 9 | 0.049% | runs | runs | runs | 5→3 over | 0.029% | 0.050% |
| EXTRAN Ex.9 · storage | 0 | 0 | 0.485% | runs | runs | runs | 0→0 | no eligible | 0.688% |
| EXTRAN Ex.10 · pump+controls | 0 | 1 | 0.131% | runs | runs | runs | 0→0 | no eligible | 0.131% |
| User 1 · 59-node runoff | 59 | 59 | 0.083% | runs | runs | runs | 36→0 over | no eligible | 0.085% |
| User 2 · SLOT | 43 | 83 | -0.026% | runs | runs | runs | 24→0 over | no eligible | 0.308% |
| User 3 · pumps | 5 | 134 | -0.012% | runs | runs | runs | 3→0 over | no eligible | -0.013% |
| User 4 · 208 nodes | 208 | 209 | 0.054% | runs | runs | runs | 71→49 over | -24.946% | 0.054% |
| User 5 · SLOT | 197 | 273 | -2.438% | runs | runs | runs | 48→0 over | no eligible | -2.379% |
Red cells flag |continuity| > 1%. extran2 arrives stressed (−4.05% before any feature touches it). user4 is the caution case: all 49 engine-eligible nodes convert and run — and continuity collapses from 0.054% to −24.946%. Engine-eligible ≠ advisable. The 5.2.4 column doubles as the SWMM5-safety proof: every stripped export matches its baseline to a few hundredths, and the SLOT models keep SLOT.
Cross-engine base check
Same base file, no new features: EPA 5.2.4 routing continuity −0.181%, SWMM6 alpha.3 −0.205%. Close, not identical — consistent with the measured 0.000% vs 0.223% routing-continuity gap on an earlier 1-pipe test. State the metric with any parity claim.
The release ladder — what actually separates the SWMM6 versions
| Release | git ref | Commits since previous | Files changed | The difference, in one breath |
|---|---|---|---|---|
| EPA 5.2.4 2023-07-15 | v5.2.4 | — | — | The shared ancestor. Single global engine state, C, the .inp dialect every tool speaks. |
| 6.0.0-alpha.1 2026-03-25 | v6.0.0-alpha.1 · 74ef6e27 | 335 | — | The rewrite: Structure-of-Arrays data layout, reentrant opaque SWMM_Engine handle (no globals, many engines per process), plugin I/O with a dedicated thread, explicit lifecycle state machine, a 19-header C API. |
| 6.0.0-alpha.2 2026-07-12 · tag cut retroactively | v6.0.0-alpha.2 · 241ffc8e | 208 | 703 (+100,154 / −34,421) | [FILES] interfaces made real — USE/SAVE RUNOFF, RDII, INFLOWS, OUTFLOWS were parsed-but-ignored before; runtime forcing; legacy quality sources. The PyPI wheel of 2026-07-07 is this generation — the browser WASM whose measured traps (VJ crash, (null) slot label) sit in the matrix tab. The changelog itself records that no alpha.2 tag was cut at the time; the tag in the repo today is retroactive. |
| 6.0.0-alpha.3 rolling since 2026-07-12 — NO TAG | swmm6_rel @ 1610516 this app's pinned engine, 2026-08-08 | 130 | 402 (+35,626 / −21,864) | The four features this app switches on — DYNAMIC_SLOT+DPS, NODE_CONTINUITY SEMI_IMPLICIT, ANDERSON_ACCEL, [VIRTUAL_JUNCTIONS] (merged 2026-08-03) — plus decoupled 1D/2D coupling with per-step exchange booking. Alpha.3 is a version bump, not a release: it moves every day. |
| Unreleased head 2026-08-09 | swmm6_rel @ 2f428fce | 30 past the pin | 67 (+19,524 / −1,447) | FLOW_ROUTING FV — a third solver. Explicit conservative finite volume: Godunov cell mesh cut from the conduits, HLL flux, Audusse reconstruction, the Preissmann slot folded into the cross-section closure, virtual junctions become ordinary interior faces. Changelog claim: 0.000% routing continuity on the EPA reference model at every mesh resolution. Plus fixes worth knowing: US-unit conduit seepage was 43,200× too large; seepage was identically zero for every shape in dynwave; [XSECTIONS]/[LOSSES] no longer order-dependent. |
1610516 — now 30 commits behind the branch head, and the gap includes an entire new solver. "6.0.0-alpha.3" does not identify an engine; only the commit SHA does. That is why every table in this app carries one.Active branches — the whole tree, live
All 25 remote branches, newest first. swmm6_rel is where releases come from; main is parked at alpha.1-era (2026-05-28), develop at alpha.2-era + fixes. The uncertainty family (hsym2/*, port/*) is a parallel line building an uncertainty sidecar onto the engine; copilot branches are automated fix PRs.
| Branch | Head | Last commit | Family | Latest subject |
|---|---|---|---|---|
| swmm6_rel | 2f428fce | 2026-08-09 | release | refactor(xsect): one definition of every analytic shape formula |
| port/v2-on-marcher | 2c69733d | 2026-08-06 | uncertainty | Merge branch 'hsym2/prh10-threshold-probability' into port/v2-on-marcher |
| hsym2/prh10-threshold-probability | 107ea92d | 2026-08-06 | uncertainty | feat(uncertainty): PR H10 — threshold-crossing probability + bimodality flag |
| hsym2/prh1-surcharge-cold-restart | 0eb37812 | 2026-08-06 | uncertainty | docs(uncertainty): H1 comment accuracy — triggers compare against the last SUCCESSFUL re |
| hsym2/prh3-hskew-diagnostic | 07a7f766 | 2026-08-05 | uncertainty | feat(uncertainty): PR H3 — H_skew trust diagnostic (fr_trust/surcharge_frac) |
| port/p5-hsnapshot-regime-fields | 9dee30d5 | 2026-08-04 | uncertainty | feat(uncertainty): PR P5 — widen HSnapshot with surcharge/Froude regime fields |
| port/p4-compat-matrix | c2cde6f0 | 2026-08-04 | uncertainty | docs(uncertainty): record PR P4 solver-mode compatibility results |
| fix/windows-cuda-release-build | ea2719af | 2026-07-21 | engine: add coupling delivery queue and GUI-facing lenient-open/diagnostics API | |
| feature/uncertainty-sidecar | 8cb15053 | 2026-07-20 | uncertainty | Merge pull request #106 from HydroCouple/softrain/cl2d-docs |
| develop | f2a6cf7a | 2026-07-17 | core | Merge pull request #103 from ddspot/bugfix/102-lid-unit-conversion — 160 behind / 4 ahead of swmm6_rel |
| ci/docs-deploy-develop | 4459d37c | 2026-06-21 | ci | ci(docs): sync Documentation workflow to canonical version |
| ci/docs-deploy | ef8db160 | 2026-06-21 | ci | ci(docs): add Documentation workflow (deploy Pages on push to main) |
| main | afb7b379 | 2026-05-28 | core | Merge pull request #78 from HydroCouple/copilot/fix-maximum-depth-warning — 662 behind / 3 ahead of swmm6_rel |
| copilot/swmm6-rel-constants-precision-nits | 7e2deffd | 2026-05-28 | copilot | fix: update constants precision and replace hardcoded Manning coefficient |
| copilot/scale-factor-for-rain-gages-v2 | cc3d002a | 2026-05-28 | copilot | Add rainfall scale factor for rain gages |
| copilot/fix-parity-gaps-control-rules | 502710b9 | 2026-05-28 | copilot | Initial plan |
| copilot/fix-overflow-issue-arm64 | 35ffb2ec | 2026-05-28 | copilot | Fix integer overflow in gage_validate for single-point timeseries on arm64 |
| copilot/fix-constants-precision | 06fe7345 | 2026-05-28 | copilot | fix: update constants precision and centralize definitions |
| copilot/fix-conduit-inlet-compatibility-issue | 01b77866 | 2026-05-28 | copilot | chore: remove build artifacts and add build_test to .gitignore |
| swmm6_exp | 9066ce50 | 2026-05-08 | core | Merge pull request #63 from wiesnerfriedman/pr/thread-safety — 453 behind / 0 ahead of swmm6_rel |
| dev-seasonal-cninfil | 2cfb288d | 2024-10-25 | 2024 | Seasonal CN infiltration |
| dev-elliptical_pipes | 8e27af6c | 2024-10-08 | 2024 | Leave users to prescribe rise and span #144 |
| v5.2.4_tag | 7952ca83 | 2023-10-10 | EPA 5.2 | Update build-and-test.yml |
| build-v5.2.4 | 0eecb1b7 | 2023-10-06 | EPA 5.2 | Update build-and-test.yml |
| build-v5.2.3 | 6ea2989e | 2023-10-06 | EPA 5.2 | Trigger build |
How every fact on this page was established
| Item | Method |
|---|---|
| Source tree | github.com/SWMMBobSWMM6/openswmm.engine, branch swmm6_rel, commit 161051639ba93af20e83016e5122dc91a698d20d (2026-08-04) — identical to upstream HydroCouple at the same SHA. Engine version 6.0.0-alpha.3; legacy tier 5.3.0-beta.3. |
| Keyword syntax + defaults | Read directly from src/engine/input/handlers/OptionsHandler.cpp (lines 301–329), NodesHandler.cpp:95, SimulationOptions.hpp (lines 208–256) at that commit. Every card links the lines. |
| SWMM6 alpha.3 behavior | Built the openswmm CLI from that commit (CMake, Release, GeoPackage/2D/GPU off — no external dependencies) and ran all six test files. rc=0 on all; .rpt echoes captured. |
| Legacy 5.3.0-beta.3 behavior | Built openswmm-legacy from the same tree; ran the same files; warnings/errors captured verbatim, including the skip-then-ERROR-209-but-exit-0 chain. |
| EPA 5.2.4 behavior | Built from the v5.2.4 tag of USEPA/Stormwater-Management-Model with gcc (fortify off); every ERROR 205 captured verbatim. Fatality of unknown sections/keywords also confirmed at input.c pass 1 & 2 and project.c. |
| Alpha.2 WASM behavior | Fetched the pinned LocalSWMM build (commit 164beb8d…), SHA-256 d0a8eadd… verified before execution, run in Node via callMain(['/m.inp','/m.rpt','/m.out']). DYNAMIC_SLOT engages (peak 16.33 vs alpha.3's 16.32) while the report label prints (null); [VIRTUAL_JUNCTIONS] throws "memory access out of bounds". |
| Run numbers | Routing continuity and C2 peaks read from the generated .rpt files; the hero "+34%" is recomputed at load from the embedded table and asserted, so it cannot silently go stale. |
| Not measured | Anderson's 25–50% iteration reduction (source comment's claim; .rpt prints no iteration counts). Whether any feature's answer is more accurate — that needs benchmark comparisons this app does not perform. |
App generated 2026-08-08. Demo model embedded below the Upgrader tab as the worked example. Built for Robert Dickinson's SWMM5/SWMM6 enablement work.