Does the model hold a hydraulic jump in the right place, at the right height?
Test A1F-020 Bélanger (1828) Version 1.0.0
Hidden at first because they are far off the exact answer: EPA SWMM 5.2.4, OpenSWMM 6 dynamic wave, OpenSWMM 6 finite volume, Hydra, SWMM 5.1.15. Click a name to show it.
What happens
Fast, shallow water (20 cm deep) meets slow, deep water (61 cm) and jumps abruptly between the two. With these exact depths the jump stands still at 50 m.
Why it matters
Jumps form below weirs, spillways and culverts, where they decide scour and the size of energy dissipators. A jump that drifts means the wrong design.
A good model must
match the depth profile within 1 %
keep the jump where it should be (no drift)
get steadily more accurate on finer grids
How models did
In rank order: by each model's percent difference from the right answer, the largest over the test's accuracy checks (lower is better; results within 10 % of each other share a rank). Mass error, timing and NSE are shown beside it, not folded in. Each model runs the same inputs on 4 grids, from 2 m down to 0.25 m cells; the checks are scored on the 0.25 m grid, and each card lists the error on every grid. Compare them in the results viewer →
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
Basilisk
Basilisk (Popinet, basilisk.fr), its second-order well-balanced Saint-Venant solver on a uniform Cartesian grid with its defaults; Manning friction added as the usual semi-implicit term (it has none built in)
#2 0.093 % off
Rate the error shrinks on finer grids: 1 (90 % range 1 to 1); the method's expected rate is 0.8 or more
Run time, finest grid: 0.29 s· Intel(R) Xeon(R) 6973P-C, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: basilisk saint-venant.h (uniform Cartesian grid, defaults; a C program per test, generated by scripts/run_basilisk.py)
The script writes a small Basilisk C program for the test (kept in the model files below) and compiles it with qcc.
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
Demo 1D
Worked example that ships with the suite: plain, well-understood schemes
#3 0.15 % off
Rate the error shrinks on finer grids: 1 (90 % range 1 to 1); the method's expected rate is 0.8 or more
The model files for this run will be published with its next run.
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
ANUGA
ANUGA 4.0.1 (Geoscience Australia / ANU), default settings on a triangular mesh
#4 0.28 % off
Rate the error shrinks on finer grids: -0.016 (90 % range -0.57 to 0.54); the method's expected rate is 0.8 or more
Run time, finest grid: 27.6 s· AMD EPYC 7763 64-Core Processor, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: anuga (rectangular_cross mesh, defaults, sampled at cell centres)
The model files for this run will be published with its next run.
ANUGA builds its mesh and boundaries in Python: the script is the model.
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
OpenSWMM 6
OpenSWMM Engine v6 with its new explicit finite-volume routing (FLOW_ROUTING FV): one cell per conduit on the channel tests, its default cells per pipe on the drainage networks
#5 50 % off
Rate the error shrinks on finer grids: -0.0083 (90 % range -0.016 to -0.00071); the method's expected rate is 0.8 or more
Run time, finest grid: 3.3 s· INTEL(R) XEON(R) PLATINUM 8573C, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: swmm (FV routing, conduit per grid cell)
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
Hydra
Hydra 17 (NEER AI, Rust): its urban-drainage engine on the SWMM data model, run through its CLI with default settings
#6 71 % off
Rate the error shrinks on finer grids: 0.25 (90 % range -0.13 to 0.63); the method's expected rate is 0.8 or more
Run time, finest grid: 25.1 s· INTEL(R) XEON(R) PLATINUM 8573C, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: swmm (DYNWAVE routing, conduit per grid cell)
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
OpenSWMM 6
OpenSWMM Engine v6 (HydroCouple's SWMM 6, pre-release) with dynamic-wave routing
#7= 99 % off
Rate the error shrinks on finer grids: 0.11 (90 % range -0.063 to 0.28); the method's expected rate is 0.8 or more
Run time, finest grid: 6.9 s· INTEL(R) XEON(R) PLATINUM 8573C, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: swmm (DYNWAVE routing, conduit per grid cell)
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
SWMM 5.1.15
EPA SWMM 5.1.15, the release before 5.2: on the parity tests compared with SWMM 5.2.4, on the exact tests scored like any other engine
#7= 102 % off
Rate the error shrinks on finer grids: 0.13 (90 % range -0.17 to 0.43); the method's expected rate is 0.8 or more
Run time, finest grid: 6.3 s· INTEL(R) XEON(R) PLATINUM 8573C, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: swmm (DYNWAVE routing, conduit per grid cell)
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
EPA SWMM 5.2.4
EPA SWMM 5.2.4 with dynamic-wave routing; on the channel tests, the channel is written as one conduit per grid cell
#7= 102 % off
Rate the error shrinks on finer grids: 0.13 (90 % range -0.17 to 0.43); the method's expected rate is 0.8 or more
Run time, finest grid: 6.4 s· INTEL(R) XEON(R) PLATINUM 8573C, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: swmm (DYNWAVE routing, conduit per grid cell)
The test itself (inputs, exact answer, checks): A1F-020.zip. Check the score card with benchmark1d2d verify-card: its signature by the suite's public development key shows the card has not changed since it was written, not who wrote it.
Not run yet: HEC-RAS 7.0, GeoClaw, LISFLOOD-FP, TUFLOW, MIKE 21, Iber, BASEMENT, Delft3D FM
Technical details for reviewers Checks, reference, inputs, sources
Checks and why each limit was chosen
Check
Difference measured as a percentage of
Latest
Difference
Why this check
jump_profile
L1 of h · in the score
already a percentage
–
Depth profile within 1 % (relative L1) of the stationary Bélanger step at x = 50 m on the finest grid. A captured jump smeared over two cells contributes Δh·2dx/L ≈ 0.5 % at dx = 0.25 m; a drifting jump or wrong sequent depth exceeds it.
jump_stays_put
global_mass_error of volume · conservation, beside the score
already a percentage
–
Stored volume within 0.1 % of the exact step: a jump that drifts by half a cell (0.125 m) on the finest grid changes the volume by 0.13 %, so this fails any solver that cannot hold the Rankine–Hugoniot balance.
convergence
observed order of L1 error in h · reported, not counted
the design order, 1
–
Measured from the error on every refinement level, as in ASME V&V 20.
Reference
Exact solution from references.belanger.sequent_depths.
More figures
Exact (stationary Bélanger jump)
Demo solver after 200 s
h₁ = 0.200 m, h₂ = 0.614 m, energy loss 0.145 m. The jump must stay at x = 50 m; the first-order scheme spreads it over about two cells.
Promotion checklist
Only frozen tests have fixed inputs and answers. This list is computed from the manifest and the published score cards; the rules are in the method.
The jump conserves mass and momentum and dissipates energy. Started from the
exact step at \(x = 50\) m, it must stay there: on a frictionless bed its
position is neutral, so any imbalance in the scheme shows up as drift.
What it checks
Shock capturing of a stationary jump: the conjugate depths, the
Rankine–Hugoniot balance (no drift) and convergence of the captured profile
at order 1 in L1, which is what any consistent shock-capturing scheme
achieves. The demo first-order HLL solver holds the jump within one cell and
converges at 1.00.
Case history
1.0.0 — grids 2, 1, 0.5, 0.25 m (the draft's 20 m grid had five cells
in the channel); criteria on the relative L1 profile error and the stored
volume.
Citation
Bélanger, J.-B. (1828). Essai sur la solution numérique de quelques
problèmes relatifs au mouvement permanent des eaux courantes. Paris.
Chow, V. T. (1959). Open-Channel Hydraulics, ch. 15. McGraw-Hill.
Sources
Bélanger, J. B. (1828). Essai sur la solution numérique de quelques problèmes relatifs au mouvement permanent des eaux courantes (Bélanger sequent-depth relation). Belanger-1828.
Test A1F-020_hydraulic_jump_belanger · version 1.0.0 · data licence analytic-public