Does the model get the water level right along a calm river reach?
Test A1F-001 MacDonald (1997) Version 1.1.0
What happens
Water flows slowly down a 1 km channel whose bed has been shaped so that the exact water surface is known everywhere. The level at the outlet backs water up the reach.
Why it matters
Most flood studies are steady backwater runs like this one. If the friction and slope balance is off, every flood level along the river is off too.
A good model must
keep the average depth error under 1 cm
neither lose nor create water
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 40 m down to 5 m cells; the checks are scored on the 5 m grid, and each card lists the error on every grid. Compare them in the results viewer →
The model files for this run will be published with its next run.
The test itself (inputs, exact answer, checks): A1F-001.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
#1= under 0.01 % off
Rate the error shrinks on finer grids: 1.8 (90 % range 1.6 to 2.1); the method's expected rate is 0.8 or more
Run time, finest grid: 0.51 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)
Average depth error
• 0.022 mm off
<0.01 % of the exact profile's mean depth, 0.905 m
The test itself (inputs, exact answer, checks): A1F-001.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
#1= under 0.01 % off
Rate the error shrinks on finer grids: 1.8 (90 % range 1.6 to 2.1); the method's expected rate is 0.8 or more
Run time, finest grid: 0.30 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)
Average depth error
• 0.022 mm off
<0.01 % of the exact profile's mean depth, 0.905 m
The test itself (inputs, exact answer, checks): A1F-001.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
#1= under 0.01 % off
Rate the error shrinks on finer grids: 1.8 (90 % range 1.6 to 2.1); the method's expected rate is 0.8 or more
Run time, finest grid: 0.30 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)
Average depth error
• 0.022 mm off
<0.01 % of the exact profile's mean depth, 0.905 m
The test itself (inputs, exact answer, checks): A1F-001.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.
HEC-RAS 7.0
HEC-RAS 7.0.1 (US Army Corps of Engineers), built and run headless with its default settings; in 2D, its default full shallow-water option (SWE-ELM)
#5= 0.011 % off
Rate the error shrinks on finer grids: the error is already at the solver's own precision on every grid
Run time, finest grid: 7.3 s· AMD EPYC 7763 64-Core Processor, 2 cores, 16 GB, Windows 2025Server (GitHub Actions (github-hosted, win25-vs2026))
Settings: hecras (text project, ras-commander, plan HDF)
Average depth error
• 0.1 mm off
0.011 % of the exact profile's mean depth, 0.905 m
The test itself (inputs, exact answer, checks): A1F-001.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.
HEC-RAS 6.6
HEC-RAS 6.6, the release before 7.0, run the same way (1D, and 2D with its default SWE-ELM): kept so a change between versions shows
#5= 0.011 % off
Rate the error shrinks on finer grids: the error is already at the solver's own precision on every grid
Run time, finest grid: 7.2 s· AMD EPYC 7763 64-Core Processor, 2 cores, 16 GB, Windows 2025Server (GitHub Actions (github-hosted, win25-vs2026))
Settings: hecras (text project, ras-commander, plan HDF)
Average depth error
• 0.1 mm off
0.011 % of the exact profile's mean depth, 0.905 m
reported, not counted · the checks above are scored on the 5 m grid
Improves with finer grids
· rate −0.35 (90 % range −0.76 to 0.05)
reported, not counted · already at the solver's own precision
HEC-RAS stores input elevations to the nearest 0.001 ft (0.3 mm), even in a metric project. The depth error therefore stops at about 0.1 mm on every grid and cannot shrink with the grid, so its convergence rate says nothing about the scheme.
The test itself (inputs, exact answer, checks): A1F-001.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.
TELEMAC-2D
openTELEMAC-2D 9.1.1, run with its default finite-volume settings
#5= 0.011 % off
Rate the error shrinks on finer grids: 1 (90 % range 0.99 to 1); the method's expected rate is 0.8 or more
Run time, finest grid: 12.4 s· AMD EPYC 7763 64-Core Processor, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: telemac2d (Selafin, centreline nodes)
Average depth error
• 0.1 mm off
0.011 % of the exact profile's mean depth, 0.905 m
The test itself (inputs, exact answer, checks): A1F-001.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)
#8 0.014 % off
Rate the error shrinks on finer grids: 1 (90 % range 0.98 to 1); the method's expected rate is 0.8 or more
Run time, finest grid: 0.12 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)
Average depth error
• 0.13 mm off
0.014 % of the exact profile's mean depth, 0.905 m
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-001.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
#9= 0.022 % off
Rate the error shrinks on finer grids: 0.81 (90 % range 0.64 to 0.97); the method's expected rate is 0.8 or more
Run time, finest grid: 0.27 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)
Average depth error
• 0.2 mm off
0.022 % of the exact profile's mean depth, 0.905 m
The test itself (inputs, exact answer, checks): A1F-001.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.
The test itself (inputs, exact answer, checks): A1F-001.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.
The test itself (inputs, exact answer, checks): A1F-001.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
#12 0.049 % off
Rate the error shrinks on finer grids: 0.79 (90 % range 0.73 to 0.85); the method's expected rate is 0.8 or more
Run time, finest grid: 0.98 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)
Average depth error
• 0.44 mm off
0.049 % of the exact profile's mean depth, 0.905 m
The test itself (inputs, exact answer, checks): A1F-001.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
#13 0.062 % off
Rate the error shrinks on finer grids: 1 (90 % range 0.99 to 1); the method's expected rate is 0.8 or more
Run time, finest grid: 10.5 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)
Average depth error
• 0.57 mm off
0.062 % of the exact profile's mean depth, 0.905 m
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-001.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.
Landlab
Landlab 2.11 (CSDMS), its OverlandFlow component: the local-inertial 2D flood scheme of de Almeida et al. (2012), written independently in NumPy, with its defaults
#14= 0.085 % off
Rate the error shrinks on finer grids: 0.37 (90 % range -0.34 to 1.1); the method's expected rate is 0.8 or more
Run time, finest grid: 1.3 s· AMD EPYC 7763 64-Core Processor, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Settings: landlab.components.OverlandFlow (local inertial, defaults; a node per cell centre)
Average depth error
• 0.77 mm off
0.085 % of the exact profile's mean depth, 0.905 m
The model files for this run will be published with its next run.
Landlab models are built in Python: the script is the model.
The test itself (inputs, exact answer, checks): A1F-001.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.
LISFLOOD-FP ACC
LISFLOOD-FP 8.3, the local-inertia solver it is best known for; it leaves out the advection term
#14= 0.085 % off
Rate the error shrinks on finer grids: 0.36 (90 % range -0.34 to 1.1); the method's expected rate is 0.8 or more
Run time, finest grid: 0.32 s· AMD EPYC 7763 64-Core Processor, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
The test itself (inputs, exact answer, checks): A1F-001.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, TUFLOW, MIKE 21, Iber, BASEMENT, Delft3D FM
Steady rectangular-channel flow with constant discharge \(Q\) and Manning
friction. A smooth depth profile \(h(x)\) is prescribed; the bed \(z_b(x)\) is
manufactured so that the steady Saint-Venant equations hold exactly
(MacDonald et al., 1997). Default M1 parameters live in
references.macdonald.M1_PARAMS (\(L = 1000\,\mathrm{m}\), \(B = 10\,\mathrm{m}\),
\(Q = 2\,\mathrm{m^3\,s^{-1}}\), \(n = 0.03\)).
Citation
MacDonald, I., Baines, M. J., Nichols, N. K., and Samuels, P. G. (1997).
"Analytic benchmark solutions for open-channel flows."
J. Hydraul. Eng., 123(11), 1041–1045.
https://doi.org/10.1061/(ASCE)0733-9429(1997)123:11(1041)
Errors in bed slope / friction source terms (well-balanced vs non-balanced
discretizations) dominate depth error on coarse meshes.
Reach steady state before scoring; transient residuals pollute L1(\(h\)).
Boundary conditions must match the analytic subcritical regime (downstream
depth control).
Use the manufactured bed from the same parameter set as the depth profile;
mismatched \(n\) or \(Q\) voids the exactness property.
Case history
1.1.0 — inputs/params.json described a 1 m channel with n = 0.033,
contradicting the reference (10 m, n = 0.03, wide-channel hydraulic radius).
The inputs now state the reference's parameters, the exact downstream depth
and that only friction losses apply. The reference is unchanged, so scores
from solvers that used the reference parameters are comparable.