Track B corpus
1,396 EPA SWMM models from HydroCouple openswmm.engine.benchmarks at commit 63eb8bc5b4e7, each run on the pinned EPA SWMM 5.2.4 engine. Models are not copied here: the index records each file's URL at that commit and its SHA-256. The HydroCouple corpus is the 1729 SWMM5 models library before its repairs; R. E. Dickinson's 1729-SWMM5-Models-2030 fixes many of the input errors counted below, and a census from it is planned.
Does each model run on the reference engine?
A model joins a tier only if it runs cleanly and SWMM's own continuity error stays within ±5 %: a reference that loses or creates water cannot anchor parity. 297 models stop with input or engine errors (mostly older-version syntax: ERROR 205, 207, 209, 211, 235, and 32 missing rainfall files, ERROR 317), 157 exceed the 60 s census limit, and 98 run but fail the continuity rule. All stay in the index so upstream maintainers can see them.
Tiers
| Tier | Models | Selection rule | Download |
|---|---|---|---|
| PR | 40 + 3 catalog cases | Runs in ≤ 5 s, picked for feature-tag coverage across collections, at least five control-rule models; gates every pull request | selection.json |
| Nightly | 500 | Runs in ≤ 10 s, picked greedily so every tag is covered | selection.json |
| Release | 773 | Every model that runs, keeps continuity within ±5 % and has a verified licence | selection.json |
Does another engine match SWMM 5.2.4?
Any SWMM-compatible engine can be scored against the reference across a whole tier with scripts/corpus_parity.py: both engines run every model, and each model gets the worst node (relative peak depth) and worst link (relative volume of |Q|) — the same metrics as the catalog's Track B cases. Two candidates are scored here: the previous release, EPA SWMM 5.1.15 (OWA build in swmm-toolkit 0.10.0), HydroCouple's rewritten OpenSWMM Engine v6 (pre-release openswmm 6.0.0a4 on PyPI, run with its new engine, both with each model's own routing and with its new finite-volume routing, FLOW_ROUTING FV, which changes the numerical method and so is expected to differ), and NEER AI's Hydra 17 urban-drainage engine (CLI 4.1.1). Each week the same comparison runs on Bellinge (Odense, Denmark; Pedersen et al. 2021, CC BY 4.0), a real combined sewer system of about 1,000 nodes and 1,000 links with pumps, weirs and control rules, on a two-day storm.
- Identical
- Within 1 %
- 1–5 %
- Over 5 %
- Candidate could not run it
weir-overtopping, shows water created at an outfall (routing continuity −48 %), and long continuous runs are up to 57 times slower. Details for the developers: docs/openswmm.md.EPA SWMM 5.1.15, pr tier: largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
hydrology/greenroofs | 438 % | worst of 19 elements: 33 (+438.4 %) | worst of 17 elements: 1 (+0 %) |
swmm5-ncimm/270-h-h-elements | 46.32 % | worst of 93 elements: 60 (+46.32 %) | worst of 90 elements: 29 (+3.547 %) |
swmm5-ncimm/greenville-epa | 11.58 % | worst of 170 elements: JCT-142 (+11.4 %) | worst of 233 elements: PUMP-17 (+11.58 %) |
semi-real-models/490-kw-h-h-elements | 7.625 % | worst of 180 elements: 2003 (+0.004309 %) | worst of 225 elements: N_I90-ORIFICE (+7.625 %) |
swmm5-ncimm/399-h-h-elements | 7.625 % | worst of 180 elements: 2003 (+0.004309 %) | worst of 225 elements: N_I90-ORIFICE (+7.625 %) |
swmm5-ncimm/usgs-runoff | 4.601 % | worst of 6 elements: FLOWFROMSUB (-2.708 %) | worst of 6 elements: 1 (-4.601 %) |
hydraulics/pid-extran-master-swmm34-example-sw5 | 4.473 % | worst of 61 elements: 15009b (+0.01879 %) | worst of 58 elements: OR1@82309d-82308d (-4.473 %) |
epa/pid-extran-master-swmm34-example-sw5 | 4.473 % | worst of 61 elements: 15009b (+0.01879 %) | worst of 58 elements: OR1@82309d-82308d (-4.473 %) |
hydrology/suds-swmm5-example4 | 1.776 % | worst of 8 elements: D (-0.01622 %) | worst of 7 elements: 5 (-1.776 %) |
hydrology/master-gw | 1.333 % | worst of 5 elements: P011 (-0.3584 %) | worst of 4 elements: P011 (-1.333 %) |
xpswmm/sprenger | 0.535 % | worst of 141 elements: SMCPMCD-I (+0.5349 %) | worst of 139 elements: CHIGMAU (+0.1096 %) |
swmm5-ncimm/1710-2014-20year-r3 | 0.0635 % | worst of 40 elements: Pond1 (+0.001583 %) | worst of 57 elements: C18 (-0.06355 %) |
5 model(s) the candidate could not run: lew-chi-swmm5-2/control-rules-test, lew-chi-swmm5-2/example7-inlets, lew-chi-swmm5-2/onsag-curb-inlet-12-inflow, lew-chi-swmm5-2/onsag-grate-inlet-11-inflow, swmm5-ncimm/lid1d. Most use input syntax added after 5.1 (inlets, newer options), which an older engine rejects with ERROR 200.
Hydra 17 (urban drainage), nightly tier: largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
swmm5-ncimm/90-h-h-si-units-elements | inf % | 1 reference elements missing from results (e.g. Exutório) | worst of 31 elements: Sol9 (+356.4 %) |
swmm5-ncimm/77-h-h-elements | inf % | 1 reference elements missing from results (e.g. Exutório) | worst of 31 elements: Sol9 (+356.4 %) |
semi-real-models/90-h-h-si-units-elements-2 | inf % | 1 reference elements missing from results (e.g. Exutório) | worst of 31 elements: Sol9 (+398.3 %) |
semi-real-models/90-h-h-si-units-elements-1 | inf % | 1 reference elements missing from results (e.g. Exutório) | worst of 31 elements: Sol9 (+398.3 %) |
ncimm-routing/swmm-ehh-geog-alvaromiguel-cenario1 | inf % | 1 reference elements missing from results (e.g. Exutório) | worst of 31 elements: Sol9 (+356.4 %) |
semi-real-models/77-h-h-elements-1 | inf % | 1 reference elements missing from results (e.g. Exutório) | worst of 31 elements: Sol9 (+398.3 %) |
hydrology/runoff31-sw5 | 975,669,200,979,173,248 % | worst of 2 elements: Node201 (+1061 %) | worst of 1 elements: Node301 (+9.757e+17 %) |
swmm5-ncimm/hechms | 2,308,130,645,751,953 % | worst of 1 elements: DUMMY2 (+2.308e+15 %) | – |
lid/lid-single-outfall-upstream | 100,000 % | worst of 3 elements: 1 (+1e+05 %) | worst of 1 elements: 1 (+3.876e+04 %) |
epa/all-outfall-types-model | 23,343 % | worst of 6 elements: TimeSeries_Outfall (+1.429e+04 %) | worst of 5 elements: 7000 (+2.334e+04 %) |
swmm5-ncimm/780-h-h-si-units-elements | 18,124 % | worst of 394 elements: F4014 (+1.569e+04 %) | worst of 403 elements: 13117 (+1.812e+04 %) |
epa/extran1-dummy | 15,492 % | worst of 10 elements: 10309 (+1.549e+04 %) | worst of 9 elements: 1570 (+5.012e-06 %) |
20 model(s) the candidate could not run: epa/3-pumps-kw-ideal-pumps, epa/linear-links, epa/pressure-net, epa/small-pump-fm-model, hydrology/25-subcatchments-cn-infiltration, hydrology/feng-scs-test-model, hydrology/feng-scs-test-model-v13, hydrology/horton-continuous-model …. Hydra refuses these with an explicit validation message (for example incomplete subcatchment data or ground below the initial water table), or took longer than 600 s; see docs/hydra.md.
OpenSWMM Engine v6, finite-volume routing, nightly tier: largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
swmm5-ncimm/6867-h-elements | 2,438,540,597,569,654,882,304 % | worst of 3414 elements: LS-13_WW (+9.411e+16 %) | worst of 3449 elements: 23 (+2.439e+21 %) |
swmm5-ncimm/6869-h-elements | 2,438,540,597,569,654,882,304 % | worst of 3414 elements: LS-13_WW (+9.411e+16 %) | worst of 3449 elements: 23 (+2.439e+21 %) |
swmm5-ncimm/weir-overtopping | 556,016,352,539,062,501,376 % | worst of 3 elements: Spill (+7.606e+05 %) | worst of 2 elements: road_overtop (+5.56e+20 %) |
hydrology/runoff31-sw5 | 966,849,049,066,566,784 % | worst of 2 elements: Node201 (+1062 %) | worst of 1 elements: Node301 (+9.668e+17 %) |
swmm5-ncimm/mjtestofnoslope | 877,462,163,517,521 % | worst of 289 elements: N10.10.10B (+6.896e+11 %) | worst of 303 elements: CDT-27 (+8.775e+14 %) |
swmm5-ncimm/duobiocell | 39,025,348,992,454 % | worst of 3 elements: 2 (+3.903e+13 %) | worst of 2 elements: 23 (+2.11e+11 %) |
hydrology/lar-zero-rtk | 9,999,533,358 % | worst of 2 elements: 1 (+1e+10 %) | worst of 1 elements: 1 (+1.582e+09 %) |
swmm5-ncimm/100yr-event-epa-swmm-5-1-test | 119,728,030 % | worst of 3 elements: Cell_E_FB (+2.906e+05 %) | worst of 2 elements: FB_WEIR (+1.197e+08 %) |
epa/inlet-pipe-test | 3,936,972 % | worst of 90 elements: 48 (+3.937e+06 %) | worst of 90 elements: 92 (+59.73 %) |
hydrology/137-h-h-elements | 1,339,178 % | worst of 43 elements: EOF_OUTFALL (+1.339e+06 %) | worst of 67 elements: GOLF_COURSE_EOF (+1411 %) |
ncimm-routing/29street | 571,521 % | worst of 80 elements: ChelsaMan5 (+5.715e+05 %) | worst of 79 elements: Chelsa54.4 (+57.49 %) |
swmm5-ncimm/219-elements-dw-si-units | 265,978 % | worst of 77 elements: J43 (+2.66e+05 %) | worst of 74 elements: P10 (+571.3 %) |
21 model(s) the candidate could not run: epa/3-pumps-kw-ideal-pumps, epa/extran1-dummy, hydraulics/extran1-dummy, hydrology/ejemplo-epa, hydrology/greenroofs, owa-update-v5111/porous-pavement, swmm5-ncimm/1765-nodes, swmm5-ncimm/1943-h-h-elements-si-units ….
OpenSWMM Engine v6, nightly tier: largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
swmm5-ncimm/weir-overtopping | 556,016,352,539,062,501,376 % | worst of 3 elements: Spill (+7.606e+05 %) | worst of 2 elements: road_overtop (+5.56e+20 %) |
epa/inlet-pipe-test | 3,936,972 % | worst of 90 elements: 48 (+3.937e+06 %) | worst of 90 elements: 14 (+0.005452 %) |
hydrology/137-h-h-elements | 1,339,188 % | worst of 43 elements: EOF_OUTFALL (+1.339e+06 %) | worst of 67 elements: JUNC_23_EOF (-3.691 %) |
swmm5-ncimm/559-h-h-elements | 144,709 % | worst of 234 elements: 12223912 (+9184 %) | worst of 241 elements: 12223911.3 (+1.447e+05 %) |
hydrology/9-subs | 10,004 % | worst of 22 elements: 2888_FES (+1e+04 %) | worst of 20 elements: LS4_18IN_FM (+9.298 %) |
epa/pumps-activated-sludge | 9,961 % | worst of 5 elements: TreatedWater (+9961 %) | worst of 5 elements: AS_Weir (+0 %) |
epa/tunnelmh | 9,961 % | worst of 4 elements: Overflow (+9961 %) | worst of 3 elements: Gate (+0 %) |
hydraulics/tunnelmh | 9,961 % | worst of 4 elements: Overflow (+9961 %) | worst of 3 elements: Gate (+0 %) |
owa-routing/routing-combo-all-links | 8,127 % | worst of 6 elements: OvfOut (+8127 %) | worst of 6 elements: C1 (+0 %) |
epa/diversion-weir-network | 8,074 % | worst of 10 elements: OFALL-14 (+8074 %) | worst of 8 elements: CDT-31 (-7.621 %) |
ncimm-routing/small-si-transects | 4,579 % | worst of 15 elements: Outfall (+4579 %) | worst of 14 elements: 28 (+0.1168 %) |
swmm5-ncimm/1943-h-h-elements-si-units | 3,788 % | worst of 449 elements: Z2.1-MH-24 (+3788 %) | worst of 444 elements: P4Z4.18-MH-04 (-1.313 %) |
1 model(s) the candidate could not run: swmm5-ncimm/3525-nodes. The v6 pre-release stops at initialisation with an unexplained parse error; see docs/openswmm.md.
EPA SWMM 5.1.15, nightly tier: largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
pumps/extran6-type1 | 86,829 % | worst of 11 elements: 16109 (+775.1 %) | worst of 11 elements: 1630 (+8.683e+04 %) |
pumps/extran6-type4 | 86,829 % | worst of 11 elements: 16109 (+775.1 %) | worst of 11 elements: 1630 (+8.683e+04 %) |
pumps/extran6-type3 | 72,392 % | worst of 11 elements: 16109 (+784.8 %) | worst of 11 elements: 1630 (+7.239e+04 %) |
swmm5-ncimm/lid-imperviouscapture | 1,048 % | worst of 19 elements: 33 (+1048 %) | worst of 17 elements: 1 (+0 %) |
hydrology/ejemplo-epa | 903 % | worst of 33 elements: 50 (+902.8 %) | worst of 32 elements: 10 (+0 %) |
swmm5-ncimm/new-mikeurbancn | 478 % | worst of 9 elements: 6037 (+477.6 %) | worst of 8 elements: 25482.1 (+0.4077 %) |
hydrology/greenroofs | 438 % | worst of 19 elements: 33 (+438.4 %) | worst of 17 elements: 1 (+0 %) |
swmm5-ncimm/treattest1 | 268 % | worst of 14 elements: 18 (+268 %) | worst of 13 elements: 1 (+0 %) |
owa-user/user3-horiz-ellipse-varied | 55.07 % | worst of 141 elements: SCANOUT1 (-55.07 %) | worst of 139 elements: SCANOUT1 (-0.07794 %) |
swmm5-ncimm/270-h-h-elements | 46.32 % | worst of 93 elements: 60 (+46.32 %) | worst of 90 elements: 29 (+3.547 %) |
epa/pump-speed-ratio | 22.32 % | worst of 61 elements: 82308D (-22.32 %) | worst of 58 elements: OR1@82309D-82308D (+1.871 %) |
swmm5-ncimm/pump4-rating-curve-comparison | 17.52 % | worst of 61 elements: 80608e (+17.52 %) | worst of 58 elements: OR1@82309d-82308d (+6.893 %) |
26 model(s) the candidate could not run: epa/master-extran-rtc, lew-chi-swmm5-2/control-rules-test, lew-chi-swmm5-2/drop-grate-inlet-17, lew-chi-swmm5-2/drop-grate-inlet-18, lew-chi-swmm5-2/example7-inlets, lew-chi-swmm5-2/onsag-curb-inlet-12, lew-chi-swmm5-2/onsag-curb-inlet-12-backwater, lew-chi-swmm5-2/onsag-curb-inlet-12-inflow …. Most use input syntax added after 5.1 (inlets, newer options), which an older engine rejects with ERROR 200.
Hydra 17 (urban drainage), bellinge network (1 real system): largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
bellinge | 146 % | worst of 1020 elements: G61F012 (+145.6 %) | worst of 1044 elements: G72R33Bout1 (+82.49 %) |
OpenSWMM Engine v6, finite-volume routing, bellinge network (1 real system): largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
bellinge | 86,877 % | worst of 1020 elements: G71F350 (+8.688e+04 %) | worst of 1044 elements: G80F66Yw2 (+1084 %) |
OpenSWMM Engine v6, bellinge network (1 real system): largest differences
| Model | Worst | Peak depth (worst node) | Volume (worst link) |
|---|---|---|---|
bellinge | 95.1 % | worst of 1020 elements: G74F130 (+95.1 %) | worst of 1044 elements: G71F05R_skylo1 (-14.16 %) |
The self-check (5.2.4 scored against itself) must give exactly 0 on every PR-tier model; CI runs it on every pull request.
Parity over time
One row per nightly run of each candidate (newest first). The result collector appends a row after every nightly run and opens an issue when five or more models move in or out of "within 1 %", when the number of models a candidate cannot run changes, or when its version changes.
| Date | Candidate | Version | Models | Within 1 % | Within 5 % | Cannot run |
|---|---|---|---|---|---|---|
| 2026-10-17 | EPA SWMM 5.1.15 | 5.1.15 | 500 | 431 | 448 | 21 |
| 2026-10-17 | OpenSWMM Engine v6 | 6.0.0a4.dev1 | 500 | 379 | 425 | 1 |
| 2026-10-17 | OpenSWMM Engine v6, finite-volume routing | 6.0.0a4.dev1 | 500 | 41 | 48 | 16 |
| 2026-10-17 | Hydra 17 (urban drainage) | 17.0.0/4.1.1 | 500 | 65 | 125 | 18 |
| 2026-10-16 | EPA SWMM 5.1.15 | 5.1.15 | 500 | 430 | 447 | 21 |
| 2026-10-16 | OpenSWMM Engine v6 | 6.0.0a4.dev1 | 500 | 379 | 425 | 1 |
| 2026-10-16 | Hydra 17 (urban drainage) | 17.0.0/4.1.1 | 500 | 65 | 125 | 18 |
| 2026-10-15 | EPA SWMM 5.1.15 | 5.1.15 | 500 | 431 | 448 | 21 |
| 2026-10-15 | OpenSWMM Engine v6 | 6.0.0a4.dev1 | 500 | 379 | 425 | 1 |
| 2026-10-15 | Hydra 17 (urban drainage) | 17.0.0/4.1.1 | 500 | 65 | 125 | 18 |
Does another engine match EPANET 2.2?
The same comparison for water-distribution engines, on the six example networks bundled with WNTR 1.5.0 (EPANET's Net1, Net2, Net3 and Net6 and two Kentucky utility networks), so the set is independent of any candidate's own test fixtures. Each cell gives the worst node's relative peak pressure and the worst pipe's relative volume of |Q| against EPANET 2.2, from scripts/epanet_parity.py.
| Network | Hydra 17 water distribution, its defaults | Hydra 17 water distribution, EPANET tank stepping (--tank-tolerance 0) | EPANET 2.0 (2.00.12), for scale |
|---|---|---|---|
Net1 | -0.113 % / 0.0911 % | 0.0247 % / -0.00401 % | 0 % / -1.6e-07 % |
Net2 | 0.0257 % / -0.0631 % | 0.0257 % / -0.0631 % | -3.4e-05 % / -1.6e-05 % |
Net3 | -0.657 % / -4.667 % | 0.0279 % / -0.0335 % | -9.5e-06 % / -7.4e-06 % |
Net6 | 0.664 % / 26.82 % | 0.155 % / 3.432 % | 0.0305 % / -0.0122 % |
ky4 | 0.0235 % / -0.346 % | 0.0235 % / -0.346 % | 0 % / -2e-05 % |
ky10 | 0.101 % / 0.545 % | 0.101 % / 0.545 % | 11.16 % / -0.00271 % |
--tank-tolerance 0) five of six match within 1 % and Net6 within 3.4 %; pressures agree within 0.7 % either way.Runtime
What the tiers cover
- PR
- Nightly
- Release only
- Not in a tier
Largest routing continuity errors on SWMM 5.2.4
Continuity error is SWMM's own mass-balance check. Models beyond ±5 % are excluded from every tier: their reference results are not physically meaningful, so agreeing with them proves nothing.
| Model | Routing continuity | Runtime |
|---|---|---|
swmm5-ncimm/1900-nodes | -9064495.70 % | 4.77 s |
epa/allow-ponding-high-ce | -104835.88 % | 0.61 s |
swmm5-ncimm/392-nodes | -30190.04 % | 34.43 s |
swmm5-ncimm/952-nodes | -1902.62 % | 51.71 s |
ncimm-routing/daily-rainfall | -286.77 % | 19.49 s |
owa-extran/extran7-type3-high-pump-rate | -220.03 % | 0.07 s |
epa/attenuation-kw-high-ce | -204.95 % | 29.59 s |
swmm5-ncimm/neid3-existingb-m | -201.08 % | 22.80 s |
swmm5-ncimm/110-h-elements | -196.39 % | 3.51 s |
swmm5-ncimm/3600-h-elements | -132.53 % | 29.93 s |
epa/attenuation-dw-high-ce | -113.89 % | 30.22 s |
hydrology/kw-no-links-swmm5-runoff | +100.00 % | 0.25 s |
Median absolute routing continuity error across models that ran: 0.156 %.
Data
Download the full index as CSV or Parquet. Fetch models with python scripts/fetch_track_b_models.py --tier nightly; every file is checked against its hash.