SWMM5 → SWMM6 EXTRAN Features Upgrader

Edit a SWMM5 .inp so the OpenSWMM SWMM6 engine runs its new EXTRAN-heritage dynamic-wave features — every fact on this page verified against four real engines · openswmm.engine swmm6_rel @ 1610516 · 6.0.0-alpha.3

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.

4
EXTRAN-heritage features, .inp-switchable
4
real engines tested with the same files
+34%
peak-flow shift, all features on (verified)
1
hard crash found (alpha.2 WASM + [VIRTUAL_JUNCTIONS])

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.

What this is not. Not a model editor and not a calibration tool. Not a claim that SWMM6 is production-ready — the engine is 6.0.0-alpha.3 and the numbers here are alpha numbers. Not a parity certificate: the demo chain is one small surcharged model, not a corpus. And the crash finding applies to the pinned alpha.2 WASM build; newer builds may differ.

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.

Verified on the demo chain: C2 peak flow 14.38 → 16.32 cfs (+13.5%); routing continuity −0.205% → −0.478%. The .rpt echoes Surcharge Method ......... DYNAMIC_SLOT.
SWMM 5.2.4 dies on this one with ERROR 205: invalid keyword DYNAMIC_SLOT — SURCHARGE_METHOD is a known keyword there, so a bad value is fatal, and each 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)
Verified: C2 peak 14.38 → 13.82 cfs (−3.9%); routing continuity flips sign, −0.205% → +0.705%. Echoed as Node Continuity .......... SEMI_IMPLICIT.
The repo README calls SEMI_IMPLICIT the default. The source disagrees: 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)
Verified: C2 peak 14.38 cfs — identical to the base run, routing continuity −0.203% vs −0.205%. That is the point: acceleration should change the iteration count, not the converged answer. The 25–50% iteration-cut figure is the source's claim (SimulationOptions.hpp:250–256), not measured here — the .rpt does not print iteration counts.

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
Verified: runs clean, and the .rpt gains a Virtual Junction Summary reporting the momentum residual through each virtual node (demo J2: max 791.64, mean 5.82 cfs·ft/s). Only convert junctions with exactly two attached conduits and no local inflows — the Upgrader enforces this.
This is the edit that breaks every other engine, each differently: stock 5.2.4 → fatal ERROR 205 at the section header; the repo's own legacy 5.3.0-beta.3 → warns, skips the section, then fails with ERROR 209 (undefined object J2) while still exiting 0; the pinned alpha.2 WASM build → hard crash, "memory access out of bounds". See the matrix tab.

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.

ModelJCBase cont%AppStrict
Example 1990.011%53−2 over-reported
EXTRAN Ex.1990.011%53−2 over-reported
EXTRAN Ex.299-4.052%53−2 over-reported
EXTRAN Ex.3 · orifice990.085%53−2 over-reported
EXTRAN Ex.4 · weir990.019%53−2 over-reported
EXTRAN Ex.5 · storage/orifice99-0.206%53−2 over-reported
EXTRAN Ex.6 · pump1010-0.030%53−2 over-reported
EXTRAN Ex.7 · pump990.049%53−2 over-reported
EXTRAN Ex.9 · storage000.485%00
EXTRAN Ex.10 · pump+controls010.131%00
User 1 · 59-node runoff59590.083%360−36 over-reported
User 2 · SLOT4383-0.026%240−24 over-reported
User 3 · pumps5134-0.012%30−3 over-reported
User 4 · 208 nodes2082090.054%7149−22 over-reported
User 5 · SLOT197273-2.438%480−48 over-reported
Engine-eligible ≠ advisable. Every base + DYNAMIC_SLOT + SEMI_IMPLICIT + ANDERSON run passed on all 15 models. But converting the strict-eligible nodes to virtual junctions en masse degraded continuity to −4.1% (extran2) and −24.9% (user4, from −0.07% base). Treat VJ conversion as a physics change to validate per model, not a free node reduction. Full four-engine comparison table: Verified Numbers tab.

Input demo loaded

Features to switch on

Target engine
The new keywords are SWMM6-only — each is a fatal ERROR 205 in stock SWMM 5.2.4, so they are never written to a SWMM5 file. Download SWMM5 .inp strips them all (and restores any [VIRTUAL_JUNCTIONS] nodes) before writing the file.

Diff

Apply edits to see the 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%runsrunsruns −0.181%
SURCHARGE_METHOD DYNAMIC_SLOTruns echoedruns engages; report label prints (null)ERROR 205 known key, bad valueERROR 205 fatal
DPS_CELERITY / DPS_ALPHA / DPS_DECAY_TIMErunsrunsWARNING ignored, still runsERROR 205 each line
NODE_CONTINUITY SEMI_IMPLICITruns echoedruns echoedWARNING ignoredERROR 205 fatal
ANDERSON_ACCEL YESruns echoedruns echoedWARNING ignoredERROR 205 fatal
[VIRTUAL_JUNCTIONS] sectionruns + VJ SummaryCRASH memory access out of boundsskip → ERROR 209 exits 0 anywayERROR 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
The silent-ignore trap is the sneaky one: hand a SEMI_IMPLICIT or ANDERSON file to legacy 5.3 and it runs, prints a one-line warning, and returns numbers computed without the feature. If two people compare "the same file" on alpha.3 vs legacy, they are comparing different physics with no error anywhere.

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.

Practice that falls out of this: keep a SWMM5 twin. The three option-line features strip cleanly (the Upgrader's strip button removes them and restores virtual junctions to [JUNCTIONS] with MaxDepth 0, which SWMM5 raises to the highest connecting crown). Strip before sharing a file with anyone not on alpha.3.

One feature at a time

RunFeature lines addedRouting 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.

Alpha caveat, stated plainly: these deltas are one small model on an alpha engine. They demonstrate the switches engage and change real numbers; they do not tell you which answer is right. That question needs the benchmark corpus, and it is exactly what these switches exist to let you test.

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.

ModelJCBase cont% (α.3)+Slot+Semi+AndVJ eligibleAll-VJ cont%5.2.4 round-trip
Example 1990.011%runsrunsruns5→3 over0.030%0.011%
EXTRAN Ex.1990.011%runsrunsruns5→3 over0.030%0.011%
EXTRAN Ex.299-4.052%runsrunsruns5→3 over-4.120%-4.052%
EXTRAN Ex.3 · orifice990.085%runsrunsruns5→3 over0.222%0.085%
EXTRAN Ex.4 · weir990.019%runsrunsruns5→3 over-0.016%0.020%
EXTRAN Ex.5 · storage/orifice99-0.206%runsrunsruns5→3 over-0.139%-0.205%
EXTRAN Ex.6 · pump1010-0.030%runsrunsruns5→3 over0.108%-0.054%
EXTRAN Ex.7 · pump990.049%runsrunsruns5→3 over0.029%0.050%
EXTRAN Ex.9 · storage000.485%runsrunsruns0→0no eligible0.688%
EXTRAN Ex.10 · pump+controls010.131%runsrunsruns0→0no eligible0.131%
User 1 · 59-node runoff59590.083%runsrunsruns36→0 overno eligible0.085%
User 2 · SLOT4383-0.026%runsrunsruns24→0 overno eligible0.308%
User 3 · pumps5134-0.012%runsrunsruns3→0 overno eligible-0.013%
User 4 · 208 nodes2082090.054%runsrunsruns71→49 over-24.946%0.054%
User 5 · SLOT197273-2.438%runsrunsruns48→0 overno 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

Releasegit refCommits since previousFiles changedThe 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 · 74ef6e27335—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 · 241ffc8e208703 (+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
130402 (+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 @ 2f428fce30 past the pin67 (+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.
Where this app sits. The embedded numbers were measured at 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.

BranchHeadLast commitFamilyLatest subject
swmm6_rel2f428fce2026-08-09releaserefactor(xsect): one definition of every analytic shape formula
port/v2-on-marcher2c69733d2026-08-06uncertaintyMerge branch 'hsym2/prh10-threshold-probability' into port/v2-on-marcher
hsym2/prh10-threshold-probability107ea92d2026-08-06uncertaintyfeat(uncertainty): PR H10 — threshold-crossing probability + bimodality flag
hsym2/prh1-surcharge-cold-restart0eb378122026-08-06uncertaintydocs(uncertainty): H1 comment accuracy — triggers compare against the last SUCCESSFUL re
hsym2/prh3-hskew-diagnostic07a7f7662026-08-05uncertaintyfeat(uncertainty): PR H3 — H_skew trust diagnostic (fr_trust/surcharge_frac)
port/p5-hsnapshot-regime-fields9dee30d52026-08-04uncertaintyfeat(uncertainty): PR P5 — widen HSnapshot with surcharge/Froude regime fields
port/p4-compat-matrixc2cde6f02026-08-04uncertaintydocs(uncertainty): record PR P4 solver-mode compatibility results
fix/windows-cuda-release-buildea2719af2026-07-21engine: add coupling delivery queue and GUI-facing lenient-open/diagnostics API
feature/uncertainty-sidecar8cb150532026-07-20uncertaintyMerge pull request #106 from HydroCouple/softrain/cl2d-docs
developf2a6cf7a2026-07-17coreMerge pull request #103 from ddspot/bugfix/102-lid-unit-conversion — 160 behind / 4 ahead of swmm6_rel
ci/docs-deploy-develop4459d37c2026-06-21cici(docs): sync Documentation workflow to canonical version
ci/docs-deployef8db1602026-06-21cici(docs): add Documentation workflow (deploy Pages on push to main)
mainafb7b3792026-05-28coreMerge pull request #78 from HydroCouple/copilot/fix-maximum-depth-warning — 662 behind / 3 ahead of swmm6_rel
copilot/swmm6-rel-constants-precision-nits7e2deffd2026-05-28copilotfix: update constants precision and replace hardcoded Manning coefficient
copilot/scale-factor-for-rain-gages-v2cc3d002a2026-05-28copilotAdd rainfall scale factor for rain gages
copilot/fix-parity-gaps-control-rules502710b92026-05-28copilotInitial plan
copilot/fix-overflow-issue-arm6435ffb2ec2026-05-28copilotFix integer overflow in gage_validate for single-point timeseries on arm64
copilot/fix-constants-precision06fe73452026-05-28copilotfix: update constants precision and centralize definitions
copilot/fix-conduit-inlet-compatibility-issue01b778662026-05-28copilotchore: remove build artifacts and add build_test to .gitignore
swmm6_exp9066ce502026-05-08coreMerge pull request #63 from wiesnerfriedman/pr/thread-safety — 453 behind / 0 ahead of swmm6_rel
dev-seasonal-cninfil2cfb288d2024-10-252024Seasonal CN infiltration
dev-elliptical_pipes8e27af6c2024-10-082024Leave users to prescribe rise and span #144
v5.2.4_tag7952ca832023-10-10EPA 5.2Update build-and-test.yml
build-v5.2.40eecb1b72023-10-06EPA 5.2Update build-and-test.yml
build-v5.2.36ea2989e2023-10-06EPA 5.2Trigger build

How every fact on this page was established

ItemMethod
Source treegithub.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 + defaultsRead 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 behaviorBuilt 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 behaviorBuilt 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 behaviorBuilt 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 behaviorFetched 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 numbersRouting 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 measuredAnderson'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.

How to use this app

1. Read The Four Edits — each card is one feature: the lines to add, the default, the verified effect.

2. On Upgrader, paste your SWMM5 .inp (or keep the demo), tick features, hit Apply edits, and download — SWMM6 .inp for the openswmm CLI, or SWMM5 .inp for the same model with every SWMM6-only keyword stripped (each is a fatal ERROR 205 in stock 5.2.4). Eligible virtual-junction nodes are detected for you.

3. Check Compatibility Matrix before sharing the file — three of the four engines out there will reject or crash on parts of it, each differently.

4. Strip back to SWMM5 reverses every edit on the upgraded result, restoring virtual junctions to [JUNCTIONS]; Download SWMM5 .inp does the same strip automatically on every SWMM5 download.

5. Verified Numbers and Provenance hold the measured effects and how each fact was established.