Validation
AquaSWMM has three kinds of numbers in it, and each is checked differently. This page summarises what is checked, against what, to what tolerance — and what the checks do not establish. The full working is in the manual.
1. SWMM results come from EPA's engine
AquaSWMM contains no SWMM solver. It runs EPA's command-line runswmm as a child process, unmodified, and reads the .rpt and .out files it writes. It never links to the engine, patches it, or edits its results.
- Each run is stamped with the version the engine reports and the SHA-256 of the executable, and the model report prints both, so a reviewer can confirm which build produced the numbers.
- Success is decided from the report — no
ERRORline and a non-empty.out— becauserunswmmexits 0 whether a run worked or not. Stale.rptand.outfiles are deleted before each run so a failed run cannot pass for a good one. - Several engines can be registered (5.1.015 beside 5.2.4, for example) and chosen per run, and runs can be compared engine to engine.
- The editor keeps every byte of the
.inpit did not change. The round trip is checked against EPA's sample models on every build. - The model report's input tables are held to EPA's own input summary: the engine's report with
INPUT YESis kept as a test fixture, and a test checks both name the same objects with the same values.
Manual: Run and engines.
2. The design engine matches hand calculations
The storm-sewer design tools implement published methods: the Rational method, Manning with exact circular geometry, standard-step HGL backwater, and HEC-22 inlets. On a reference network — three pipes down a trunk to a fixed-tailwater outfall — every number the engine reports is worked by hand, and the two agree to six decimal places. A test asserts these values, so a change to the engine that moves any of them fails the build.
| Pipe | ΣCA | Tc (min) | i (in/hr) | Q engine (cfs) | Q by hand | Capacity engine | Capacity by hand |
|---|---|---|---|---|---|---|---|
| P1 | 0.70 | 12.000000 | 5.060729 | 3.542510 | 3.542510 | 4.567765 | 4.567765 |
| P2 | 1.40 | 13.216080 | 4.847526 | 6.786536 | 6.786536 | 7.574786 | 7.574786 |
| P3 | 1.80 | 14.075517 | 4.708589 | 8.475460 | 8.475460 | 12.937425 | 12.937425 |
i = 60 / (t + 10)0.8; n = 0.013; Manning K = 1.486, the exact unit conversion 3.2808401/3; tailwater 100.5 ft; junction K = 0.5.
The same page of working carries on through partial-flow velocity (P1: 4.111571 ft/s at a normal depth of 0.825392 ft), the HGL (junction loss at N2: 0.182488 ft, HGL 103.790792 ft, every structure below its rim), and HEC-22 inlet interception.
The design engine has also been run against a four-line network designed and printed in a widely used commercial storm-sewer program. Slopes, ΣCA, rainfall intensity for a given Tc, the surcharge calls and the tailwater agree exactly; downstream flows differ by up to 2.5% and HGLs by up to 0.5 ft, and each difference is traced to one of three stated method choices — most importantly, AquaSWMM uses normal-depth velocity for travel time, which is the conservative side for pipe sizing.
Manual: Methods.
3. The 2D solver reproduces known solutions
Each case below is an integration test with the threshold it asserts, run on every build.
| Case | Set-up | Asserted |
|---|---|---|
| Lake at rest | 50 × 50 cells on a random bed, one island, both schemes | Velocity and depth drift ≤ 1e-12; balance error < 1e-9% |
| Uniform flow (Manning) | 200 m plane, S = 0.01, n = 0.03, q = 0.1 m²/s | Depth within 1% of normal depth (0.12203 m), both schemes |
| Dam break (Ritter) | 1200 × 3 cells, frictionless dry bed, HLL scheme | Depth error < 5% of h₀ against the analytical solution |
| Closed basin | Parabolic bowl, 600 m³ inflow hydrograph | Inflow booked to 1e-9; stored volume within 0.1% |
| Symmetry | Point source on a flat 41 × 41 plate | Mirror-symmetric in x, y and the diagonal to 1e-9 |
| Rain and infiltration | 36 mm/h rain, 7.2 mm/h infiltration, then an open edge | Volumes booked exactly; balance < 1e-9% |
| 1D-2D interfaces | Manhole, inlet, outfall and bank exchanges | Volumes conserved to 1e-12; inlet capture never exceeds weir or orifice limits |
| Graded mesh | Lake at rest, rain, and uniform flow across a refinement | Depth unchanged to 1e-12; flow within 2% of normal depth past the refinement |
Manual: 2D methods: equations, numerics and validation, with references.
What this does not establish
- The checks prove the software computes the published equations correctly. They do not prove a method suits your site. Choosing the Rational method, choosing C, and choosing a design storm remain engineering judgement, owned by the engineer who seals the work.
- 2D results are checked against published benchmarks and against the engine's own flooding totals, not yet against a measured real-world event.
- The 2D solver is first-order: fronts and hydraulic jumps smear over a few cells, so check a result's sensitivity by halving the cell size. The default local-inertial scheme is for low Froude numbers; dam breaks and supercritical flow need the full-dynamic scheme.
- Reconcile Manning's K, loss coefficients and spread criteria against your own agency's standards before relying on the output.
Found a network where AquaSWMM and your usual tool disagree? That is the most useful thing you can send us: send the inputs and both sets of results.