Does a 2D model balance slope, pressure and friction like the 1D answer?
Test A2A-010 MacDonald (1997) Version 2.0.0
What happens
Steady flow down a 1 km × 100 m channel with a bed shaped so the exact depth is known. The run starts from a flat level and must settle to the right profile.
Why it matters
2D models are used for the same river reaches as 1D models; they must agree where the flow is effectively one-dimensional.
A good model must
keep the average depth error under 1 cm
store the right volume of 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 50 m down to 6.25 m cells; the checks are scored on the 6.25 m grid, and each card lists the error on every grid. Compare them in the results viewer (depth maps and animation) →
The test itself (inputs, exact answer, checks): A2A-010.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 2D with its Eulerian shallow-water option (SWE-EM), which HEC recommends for dam breaks
#1= under 0.01 % off
Rate the error shrinks on finer grids: 1 (90 % range 0.44 to 1.6); the method's expected rate is 0.8 or more
Run time, finest grid: 24.6 s· AMD EPYC 7763 64-Core Processor, 2 cores, 16 GB, Windows 2025Server (GitHub Actions (github-hosted, win25-vs2026))
The test itself (inputs, exact answer, checks): A2A-010.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
#3= 0.01 % off
Rate the error shrinks on finer grids: 0.81 (90 % range 0.11 to 1.5); the method's expected rate is 0.8 or more
Run time, finest grid: 25.4 s· AMD EPYC 7763 64-Core Processor, 2 cores, 16 GB, Windows 2025Server (GitHub Actions (github-hosted, win25-vs2026))
reported, not counted · the checks above are scored on the 6.25 m grid
Improves with finer grids
· rate 0.81 (90 % range 0.11 to 1.50)
reported, not counted · the scheme's design order is 1
Very accurate (0.09 mm), but the error stops falling below about 0.1 mm on finer grids (0.54, 0.16, 0.12, 0.09 mm), so its convergence rate's range is wide (0.11 to 1.50). HEC-RAS stops iterating at its default water-surface tolerance (0.01), which is the likely floor.
The test itself (inputs, exact answer, checks): A2A-010.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)
#3= 0.01 % off
Rate the error shrinks on finer grids: 0.81 (90 % range 0.12 to 1.5); the method's expected rate is 0.8 or more
Run time, finest grid: 21.5 s· AMD EPYC 9V74 80-Core Processor, 2 cores, 16 GB, Windows 2025Server (GitHub Actions (github-hosted, win25-vs2026))
The test itself (inputs, exact answer, checks): A2A-010.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.015 % off
Rate the error shrinks on finer grids: 0.97 (90 % range 0.93 to 1); the method's expected rate is 0.8 or more
Run time, finest grid: 25.7 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.13 mm off
0.015 % of the exact profile's mean depth, 0.905 m
reported, not counted · the checks above are scored on the 6.25 m grid
Improves with finer grids
· rate 0.97 (90 % range 0.93 to 1.01)
reported, not counted · the scheme's design order is 1
0.13 mm from the exact water level, converging at first order. The inflow discharge and outlet level are listed in the order TELEMAC numbers its open boundaries.
The test itself (inputs, exact answer, checks): A2A-010.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)
#6 0.017 % 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: 2.5 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.16 mm off
0.017 % 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): A2A-010.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
#7= 0.02 % off
Rate the error shrinks on finer grids: 1.1 (90 % range 0.94 to 1.2); the method's expected rate is 0.8 or more
Run time, finest grid: 41.2 s· Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz, 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): A2A-010.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): A2A-010.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): A2A-010.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
#10= 0.08 % off
Rate the error shrinks on finer grids: 0.54 (90 % range -0.19 to 1.3); 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)
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): A2A-010.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
#10= 0.082 % off
Rate the error shrinks on finer grids: 0.54 (90 % range -0.24 to 1.3); the method's expected rate is 0.8 or more
Run time, finest grid: 0.36 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): A2A-010.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 2D
Worked example that ships with the suite: first-order finite volume
#10= 0.087 % 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: 2.4 s· AMD EPYC 9V74 80-Core Processor, 2 cores, 15.6 GB, Linux 6.17.0-1022-azure (GitHub Actions (github-hosted, ubuntu24))
Average depth error
• 0.79 mm off
0.087 % of the exact profile's mean depth, 0.905 m
The model files for this run will be published with its next run.
The test itself (inputs, exact answer, checks): A2A-010.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: GeoClaw, 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
depth_L1
L1 of h · in the score
of the exact profile's mean depth, 0.905 m
–
Mean depth error below 1 cm on the finest grid (1.3 % of the 0.74 m outlet depth); a scheme that is not well balanced over the sloping bed, or that mis-applies friction, settles to a visibly different profile.
mass
global_mass_error of volume · conservation, beside the score
already a percentage
–
Water stored in the channel within 0.5 % of the exact profile: confirms the run has reached the steady state rather than a different equilibrium.
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.macdonald_2d.depth_velocity.
More figures
Exact water surface
Demo solver, centreline, t = 1 h
Ochre: the bed built so that this surface is exact. The solver starts from a uniform depth and must settle onto it.
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.
MacDonald's method: prescribe a smooth depth and a discharge, then build the
bed so the steady shallow-water equations with Manning friction hold exactly.
Here A1F-001's profile, \(h(x) = (4/g)^{1/3}\,[1 + \tfrac12 e^{-16(x/L - 1/2)^2}]\),
fills a 1000 m × 100 m channel with slip walls, unit discharge
\(q = 0.2\) m²/s and \(n = 0.03\). The flow is uniform across the channel, so
\(h = h(x)\), \(u = q/h\), \(v = 0\) over the bed
That a 2D solver balances pressure, bed slope and friction on its own grid.
Only the inflow discharge and the outlet depth are imposed; the run starts at
a uniform depth and must settle onto the exact surface. The demo first-order
finite-volume solver converges at order 1.02.
Case history
2.0.0 — the 1.x reference held the free surface flat while water flowed
without friction, which is not a solution of the shallow-water equations;
it is replaced by the construction above.
2.0.0, October 2026 — a typo in inputs/params.json (the text gave the
downstream depth as 0.742 m) corrected to 0.748 m, the depth the reference
and every run use. No result changes.
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)