SWMM routes water through a network of nodes and links. What happens
when a manhole surcharges and water runs down the street, pools in a car
park, and finds its way back into a downstream inlet is not something
the 1D network can tell you: the engine reports the flooded volume at
the node and loses it (or, with Aponded, stores it in a
column of air). The 2D menu adds a surface to the model
— a grid of cells on a digital elevation model (DEM) — solves the
shallow-water equations on it, and couples the two so that surcharge
leaves the network at the nodes and bank lines, flows over the ground,
and is captured again where the surface meets an inlet.
The equations, the numerical scheme, the wet/dry treatment and the tests that show the solver reproduces known solutions are in 20b. This chapter is the user's side: what to load, what to set, how to run, and what the map shows afterwards.
Everything 2D lives outside the .inp.
The settings are kept in a sidecar text file
<model>.2d beside <model>.inp, and
the results go to <model>.2d.out. The
.inp stays EPA's format, so the model still opens in the
EPA GUI and runs on any engine; the sidecar is simply ignored by
software that does not know it. AquaSWMM never writes anything 2D into
the .inp.
.asc) or a
GeoTIFF (.tif). Chapter 19 covers
coordinate systems and where DEMs come from.| Item | What it does |
|---|---|
| 2D Setup… | The setup window (§20.3). |
| Interfaces… | Node interfaces and bank lines (§20.4). |
| Sources… | Point sources (§20.5). |
| Run 2D Only | Runs the surface alone (§20.6). |
| Run Coupled (1D-2D)… | Picks the engine and the coupling mode, then runs both. |
| Stop 2D | Asks a running 2D or coupled run to stop at its next progress report. |
| Load 2D Results | Opens <model>.2d.out beside the model (a finished
run loads it by itself). |
| Export Max Depth Grid… | Writes the run's maximum depth as an ESRI ASCII grid. |
| Export Frame Grid… | Writes the depth of the frame the overlay is showing. |
| Export Hazard Grid… | Writes the run's maximum depth × velocity. |
| Draw Profile Line | Click the vertices of a section line on the map; Enter or a double-click finishes and opens the profile of the ground and 2D water along it (§11.7). Escape cancels. |
| Clear Profile Line | Removes the section line; the profile goes back to the pipes. |
| 2D Legend | Shows or hides the 2D legend in the map's corner. |
| Show Interfaces | Shows or hides the interface markers and bank lines on the map. |
Every item needs a model open. The run items need the model saved to
a file: the run reads <model>.inp from disk and
writes <model>.2d.out beside it. A model with unsaved
changes is saved first, exactly as the Run menu does before an ordinary
run; an untitled model is refused with "Save the model first". A model
whose validation finds errors is refused too, with the count, as Run →
Run Model is.
The window's first line names the sidecar the settings go to. Nothing
in this window touches the .inp.
DEM — the path to the elevation grid. Type it, drop
the file on the window, or use … to browse.
Load DEM reads it; once loaded the window reports its
size and cell, its bounds, the elevation range, and how much of the
model's drawn extent it covers ("covers the whole model extent", a
percentage, or "does NOT overlap the model: check the coordinate system"
— the usual first sign of a DEM in a different projection or different
units from the .inp's coordinates). ESRI ASCII grids
(.asc) and GeoTIFFs (.tif, read by the GIS
chapter's reader) are accepted; the run reads the DEM with the same
reader, so what loads here is what runs.
Grid
x0 y0 x1 y1 per line, in map
units. Corners may be given in either order. A line that is not four
numbers is refused on Save with its line number.Roughness (Manning's n) — one of:
Rain on grid — one of:
[RAINGAGES]; its time series falls on every cell.[POLYGONS]) contains the cell's
centre, so a model with several gages rains on the grid the way it rains
on its subcatchments. A cell outside every outline takes the gage
nearest to it on the map (the gages' [SYMBOLS] positions —
Thiessen polygons, in effect). The Fallback gage (the
model's first gage unless you choose one) covers what neither rule
reaches: every cell when the model has a single gage, or has no
subcatchment outlines and no placed gages, and the cells outside every
outline when no gage is placed. Check rain assignment
works the assignment out from the DEM and the model there and then and
lists, for each gage that covers any of the grid, its cells, the area
they cover, and how many came from subcatchment outlines (hover for
which), from the nearest-gage rule and from the fallback. The same
summary is among the run's notes.0:05 radar/r0005.asc — the time as
H:MM, H:MM:SS or a number of seconds from the
model start. Add rasters… appends files in name order,
one frame length after the last listed frame. A frame applies from its
start for its length, or until the next frame starts if that is sooner;
there is no rain outside every frame. Each grid cell takes the
area-weighted mean of the raster cells it overlaps, so a coarse radar
grid over a fine mesh puts the radar cell's value on every cell under
it, and a cell over the raster's edge is not diluted by the ground
outside it. No-data raster cells are left out; a grid cell with no
raster data under it gets no rain, and the run's notes say how many
there are.Direct rainfall on the grid is the choice when the surface itself is the catchment; with subcatchments already draining to the nodes, leave it off or the rain is counted twice. Whatever the kind, the solver ends a time step wherever the rain changes — a new gage value, the end of a value's interval, a new frame — so the rain it books is exactly the input's.
Infiltration from the surface —
None, a Constant loss rate in rain
units, Horton (f0, fc, k in 1/hr), or
Green-Ampt: Suction head (in or mm),
saturated conductivity Ksat (rain units) and initial
moisture deficit IMD (a fraction), the same three
values and units as a Green-Ampt subcatchment's
[INFILTRATION] row. Each cell keeps its own running total
of what has infiltrated, so a cell that has been wet for an hour takes
water more slowly than one the flood has just reached, and no cell ever
loses more than the water standing on it. With From
subcatchments ticked (the default), a cell inside a
subcatchment's outline takes that subcatchment's own Green-Ampt row, and
the three values here apply only outside every outline and in
subcatchments that use another method; the run's notes say how many
cells came from where. Chapter 20b
§2.8 has the equations.
Boundary — how the edge of the grid behaves. Other edges sets every edge face that no boundary segment covers: Closed (a wall), Open (free outflow at the local slope), or Fixed head (a receiving water level; water flows out or in to hold it). Below it, boundary segments give chosen parts of the edge their own condition — a tide or river stage, an inflow hydrograph, normal depth, a wall or open outflow — with Add segment and Draw segment; section 20.9e covers them.
Exchange coefficients — the model-wide Weir
C and Orifice C for every node and bank
interface whose own coefficient is left on auto in the
Interfaces window. Both are 0.6 by default, the usual literature value;
the weir coefficient governs shallow capture, surcharge onto a dry lid
and flow over bank crests, the orifice coefficient deep capture and
surcharge through a submerged lid. Changing them here changes every
interface still on auto, and none that has its own value. They are saved
in the sidecar's [EXCHANGE] section only when they differ
from 0.6.
Scheme
The scheme and the order are saved in the sidecar's
[RUN] section as SCHEME and
ORDER. A sidecar saved before they existed runs as it did:
local inertial (and first order if the full-dynamic scheme is chosen for
it on the command line,
aquaswmm-swmm twod run … --scheme hll;
--order 1|2 overrides the order there too).
Time
Save writes the sidecar and reports the path; Revert reads it again, discarding the edits. An "● unsaved" mark shows while the draft differs from the file. The same two buttons, acting on the same file, are in the Interfaces and Sources windows.
The 2D Interfaces window: where the 1D network and the 2D surface exchange water.
The table has every node with coordinates: its name and type,
Ground (the DEM's elevation at the node once a DEM is
loaded), Rim (the node's invert plus its maximum depth,
from the .inp), and the interface:
Weir C and Orifice C are the node's discharge coefficients: the weir one for shallow capture and for surcharge over a dry lid, the orifice one for deep capture and surcharge through a submerged lid (chapter 20b §4.1 has the formulas). auto uses the model-wide value from 2D Setup → Exchange coefficients (0.6 unless changed there); untick it to type the node's own.
A ground elevation well below the rim means the DEM and the model disagree about where the surface is, and the node will surcharge onto a surface lower than its own rim. Check the DEM's datum and units before running.
Selection — pick a kind and Apply to selection to set every node selected on the map at once. Seal all outfalls sets every outfall Sealed; an outfall is where water leaves the model, not somewhere it comes back onto the ground.
Bank lines couple an open channel to the cells beside it: water spills over the crest when the channel's head exceeds it and flows back when the surface is higher. Draw bank line starts the pick tool on the map: click near the conduit to choose it (or select the conduit first), then click the vertices along the bank; Enter or a double-click finishes, Escape cancels. Each line then has its Left/Right bank (as seen looking downstream), a Crest elevation (auto uses the DEM along the line), a Weir C (auto is the model-wide weir coefficient), its vertex count, and Remove. Spill from the channel onto the surface is limited, in a tight coupled run, by what the conduit's two end nodes hold and receive: each end gives at most what is left of its node's allowance for the interval after the node's own lid, so a bank cannot spill water the network does not have. While the pick tool is on, the ordinary map tools do not act; the wheel still zooms and the middle button still pans.
Everything here edits the sidecar draft; Save writes
it. The .inp is untouched: the Unsaved mark in the status
bar stays off.
The 2D Sources window: point inflows onto the
surface that are not network nodes — a culvert outlet, a pump discharge,
an upstream catchment represented by a hydrograph. Each has a
Name, a place (X, Y),
and a Series: a [TIMESERIES] in the model,
in the model's flow units (Project → Time Series adds one). Type the
name and choose the series, then Place source and click
the map (Escape cancels); a name already in use gets the next free
number. The table edits the place and series in place;
Remove deletes a row.
Run 2D Only runs the surface by itself: rain on the grid, infiltration and sources apply; the interfaces feed from nothing because there is no network run to feed them. It is the run for a pure overland-flow question (where does the rain go on this DEM?) and the quick check that a setup is sound before a coupled run.
Run Coupled (1D-2D)… opens a dialog with the Engine (the same registry as the Run menu) and the mode:
aquaswmm-swmm-bridge32.exe (chapter 23 says where it is looked for, and
scripts\build-bridge.ps1 builds it in a source tree) and a
32-bit engine with its swmm5.dll beside
runswmm.exe, as EPA SWMM 5.2's Windows install has; without
them the option is greyed with "Tight coupling needs the engine bridge;
iterative is available". The engine runs to the end of its own
simulation after the surface finishes, so the report is complete; its
continuity errors, when above 5 %, are among the run's warnings.runswmm runs the whole 1D
model, its node overflow hydrographs drive the surface, the surface's
captured flows are written back as [INFLOWS] time series
into a scratch copy of the model, and the pair is re-run until the
exchanged volume changes by less than the tolerance or the pass limit is
reached. It works with any engine and no bridge. It converges quickly
when the surface mostly receives water (surcharge that ponds
and drains away over the surface) and slowly, or not at all, when the
surface and the network trade the same water back and forth, which is
the tight mode's job. The scratch model, report and results are in the
same per-model run folder as ordinary runs (chapter 9); the model's own .inp
is never rewritten.Run starts; Cancel closes the dialog.
Both runs open the Run 2D window and report as they go: simulation time against the duration as a progress bar, the current Time step, Wet cells, Surface volume, the running Mass error (coloured green, amber and red at the same 1 % and 10 % thresholds as the Run Status window's continuity errors), and the Elapsed wall clock. Stop 2D (also in the menu) raises a flag the solver checks at every progress report. When a run finishes the window shows the summary — results path, final mass error, steps and frames, elapsed, peak depth (over every step and every cell, so it agrees with the max-depth grid rather than with the frames), largest wet area, the inflow, outflow, infiltrated and stored volumes, and for a coupled run the iterations, the surcharged and captured volumes and the 1D run's files — a Boundary segments table of the volume in and out through each segment and through the edges no segment covers, when the run had segments — plus every warning; Load 2D Results brings the results onto the map (a finished run does this by itself). Anything that stops a run from starting — no DEM, no saved model, validation errors, a DEM that does not cover the model — is written on the window's status line; the window never disappears on an error. Close closes it.
The run happens on its own thread; the editor stays live and the map can be panned while it goes.
With results loaded, the map paints a grid over the DEM's extent under the network. The Layers tab's 2D overland section controls it:
Cells below the dry depth are transparent, so the DEM, backdrop and GIS layers show through the dry ground. The colour scale of a frame mode is the run's maximum of that quantity, so the same depth is the same blue in every frame; the legend in the map's lower-right corner gives the scale, the unit (ft or m, and the corresponding velocity and hazard units, after the model's flow units) and the frame's time. Move the pointer over the grid and the depth, velocity and hazard under it are written beside the cursor (the static modes read out their own grid).
The time slider. When the SWMM results are loaded and the Results view is showing an instant (the period slider, Play, ◀ ▶), the 2D overlay shows the 2D frame nearest that instant: SWMM's reporting period p is at (p + 1) × report step seconds, and the nearest saved 2D frame by time is chosen. Playback of the SWMM results therefore animates the surface as well. With the SWMM results showing the run's peaks, or with no SWMM results loaded, the 2D frame slider in the Layers tab chooses the frame instead.
Interface markers (Show Interfaces): a circle at every manhole interface (a dot inside it when the lid is open), a square at every inlet, a cross at a sealed node, and the bank lines as thick orange polylines labelled with their link and bank. With results loaded the node markers are coloured by the exchange in the current frame: red when water is leaving the network onto the surface, blue when the surface is being captured, grey when nothing is passing; the whole-run modes colour by the net exchange. Sources are purple triangles.
The three export items write ESRI ASCII grids (.asc)
with the results' geometry and -9999 for no-data, which any
GIS opens directly: the run's maximum depth, the
depth of the current frame (whichever frame the overlay
is showing), and the maximum hazard. Arrival time and
maximum velocity are on the map but not yet exported.
<model>.2d is a plain text file beside the model
holding everything in the three windows: the DEM path and grid,
roughness, rain, infiltration, groundwater, boundary and boundary
segments, time stepping, the node interfaces, the bank lines and their
vertices, the sources and the sealed list. Its format (sections,
keywords and an example) is in 20b,
§5.1. Opening a model reads its sidecar; a model without one starts from
the defaults (a manhole at every node, uniform n = 0.05, no rain on
grid, closed boundary, local-inertial scheme). The file carries a format
version ([FORMAT] VERSION 2 since the scheme options were
added); an older AquaSWMM cannot open a version-2 sidecar, and this one
reads every older file as it was written. A different model gets its own
sidecar; the results and DEM loaded for one model are dropped when
another is opened.
Building footprints block the surface. Give the
Buildings box in 2D Setup one polygon layer per line
(.shp or .geojson); every feature in them
removes the cells it covers from the flow field, and water goes around
the building.
This is deliberately not the same as raising the DEM under the footprint. Raising the ground makes the roof part of the flow field: water runs up the wall, ponds on top, and the building appears as a puddle in the depth map. Blocking takes the cells out of the domain instead, which is what a footprint is actually telling you.
Details worth knowing:
[BUILDINGS] section with
one BLOCK line per layer, so it travels with the
model.Standing water on the surface evaporates according to the model's own
[EVAPORATION] section. CONSTANT,
MONTHLY and TIMESERIES are read; rates are a
depth per day, which is SWMM's convention. SWMM's
DRY_ONLY is honoured, so nothing evaporates off a surface
that is being rained on.
TEMPERATURE and FILE derive evaporation
from a climate record the 2D surface does not read. Rather than
evaporate nothing and say nothing, the run warns that surface
evaporation is off and names the three forms that work.
Evaporation only ever removes water that is there: it is applied
after infiltration, bounded by the remaining depth, and booked in the
mass balance as its own term, so a run with evaporation still closes to
the same tolerance as one without. A MONTHLY rate uses the
column for the month the run starts in — a 2D run covers a storm, not a
season.
A uniform grid has to be as fine as its most demanding feature. Resolving a kerb line at 0.5 m means 0.5 m cells over the whole catchment, and since the cell count goes as the inverse square of the cell size and the time step goes with the cell size, that is roughly an eightfold cost for detail you wanted in one street.
Refine to lets the grid be fine where it matters and coarse elsewhere. Columns and rows are split — the mesh stays rectilinear, so a refined column is fine for its whole height — and a grading sweep keeps neighbours within the max neighbour ratio of each other, so the size change is gradual rather than a step from 10 m to 0.5 m in one face.
What gets refined:
What it costs, and what it does not buy:
The solver treats a graded mesh exactly as it treats a uniform one: each face uses the centre-to-centre distance across it and the length of the face itself, and continuity uses the true cell area. Lake at rest stays exact, mass closes over the real ground area, and steady uniform flow matches Manning straight through a refinement interface — those three are tests, run on every build, and section 6 of the methods chapter gives the numbers.
The sidecar records this as a [REFINE] section
(CELL, RADIUS, RATIO,
NODES, and a BOX line per box), so it travels
with the model. A refined run writes a version 2 results file, which
carries the mesh edges; a uniform run still writes version 1.
The grid's edge is often not one thing. A model of a tidal outfall has the sea along one side, a creek coming in across another, and high ground everywhere else; a model of a reach has the upstream river entering at one end and leaving at the other. A boundary segment gives a part of the edge its own condition. The faces no segment covers keep Other edges (Closed, Open or Fixed head), so a model without segments runs exactly as it did before they existed.
Segments are listed in 2D Setup, under Boundary. Each row has:
[TIMESERIES] in the model, dated or not, placed on the
model's clock as for sources), or a File of
time value rows (comma, tab or space separated; the time
H:MM[:SS] or decimal hours from the start; a header row is
skipped). A stage holds its first value before the series starts and its
last after it ends; an inflow is zero outside its series, as a source
is, and a negative flow counts as none.Add segment adds a stage on the whole west edge to edit. Draw segment draws one on the map: click points along the grid edge, then Enter or a double-click finishes (Escape cancels); the new segment is a stage, to be given its type and value in the list. A drawn line takes the edge faces it runs beside, within one cell of the edge, so it can be drawn along the edge or through the edge cells; at a corner it takes only the side it runs along. Where two segments claim the same face, the one listed first keeps it, and the run's notes say so; a segment that covers no face is a warning too. − removes a row.
On the map each segment is drawn along the edge in its type's colour — stage blue, inflow green, normal depth teal, closed grey, open orange — with its name, whenever the interfaces are shown or 2D Setup is open.
After a run, the Run 2D window's Boundary segments table gives the volume in and out through each segment and through the other edges; they add up to the boundary part of the mass balance.
In the sidecar each segment is a SEGMENT row in
[BOUNDARY]:
[BOUNDARY]
CLOSED ; every face no segment covers
SEGMENT Tide STAGE TideLevel EDGE WEST ; a [TIMESERIES] of levels
SEGMENT Creek INFLOW FILE "creek q.csv" EDGE NORTH 120 180
SEGMENT Outlet NORMAL_DEPTH 0.002 LINE 500 0 500 40
Chapter 20b §2.7 has the methods for each type and §6.7c the tests.
On flat ground with a high water table — coastal plains, Florida —
floods are made by the ground filling up: once the soil is saturated the
rain runs off, low spots pond from below, and groundwater leaks into the
pipes. The Groundwater part of 2D Setup puts SWMM's own
two-zone aquifer (the one behind [AQUIFERS],
[GROUNDWATER] and [GWF]) under the 2D surface,
so the surface, the groundwater and the sewer keep one water
balance.
It is SWMM's lumped model: one water table per store, no groundwater flow between stores or cells. It is not a 2D or 3D groundwater model (a MODFLOW-type coupling would be a separate, later option). Chapter 20b §2.11 has the equations and §6.12 the comparison with EPA SWMM's own groundwater.
Groundwater under the surface — off by default. When on:
[GROUNDWATER] row belongs to that
subcatchment's store and uses its [GROUNDWATER] and
[AQUIFERS] rows (and any [GWF] expressions) as
SWMM would. Set them in the subcatchment's groundwater editor (chapter
21).[AQUIFERS] name), the Node it drains to,
its ground elevation (Ground from the DEM: the mean DEM
elevation of its cells; clear it to type one), and the flow coefficients
A1, B1, A2,
B2, A3 and the Fixed
depth of surface water, as in a [GROUNDWATER] row.
Without it, cells outside those subcatchments have no groundwater and
their infiltration leaves the model as before.[GROUNDWATER] row and lies
under 2D cells, so the same water is not in two aquifers: 2D
surface (the store does; coupled runs take that subcatchment's
[GROUNDWATER] row out of the engine's copy of the model —
your .inp is not changed) or SWMM
subcatchment (SWMM does; the 2D cells inside it get no store).
While it is Not chosen and such a subcatchment exists,
the run stops with a message naming it.C × π × diameter × length × (water table − invert), half to
each end node. 0 turns it off. 20b
§2.11.4 converts a gpd/inch-diameter/mile allowance into it.What it does to a run:
Files beside the model:
<model>.2d.gw — the water table of every store at
every saved frame; the map's Water table depth layer
reads it (depth from the ground down to the water table, negative where
the water table is above the ground).<model>.2d.gwstate — the state at the end of the
run. For a continuous or forecast run, copy it and name the copy in
Start state: the next run starts with the water table
where this one ended. From the command line,
aquaswmm-swmm twod run model.inp --gw-state-in a --gw-state-out b
does the same, and chapter 25 shows
how a forecast chain carries it beside SWMM's hotstart files. Its format
is in 20b §5.3.TIMESERIES gages; a gage reading
a rainfall FILE cannot be used. Rain by subcatchment and
Green–Ampt from subcatchments assign a cell by where its centre falls,
so a subcatchment narrower than a cell may get no cells of its own.CONSTANT, MONTHLY and TIMESERIES
only (section 20.9c).MaxDepth raised to the crown
of every pipe that meets the node (storage units keep their
MaxDepth). A junction with MaxDepth 0 therefore shows the
crown of its highest pipe, not its invert. Water leaves a node onto the
surface when the engine floods it at that rim, or, for a node with a
surcharge depth, when its head rises above both the rim and the water on
the cell. Chapter 20b §4.2 has the
formulas.This tutorial is the one the editor's end-to-end tests run, step by
step, through the same menus and buttons
(app/src/swmm_twod_e2e_tests.rs); the numbers quoted are
from those runs with EPA SWMM 5.2.4.
The EPA Site Drainage sample (Site_Drainage_Model.inp,
in the EPA install's Samples folder) is a small development drained by
swales, culverts and street gutters to one outfall, with coordinates in
feet and junction inverts from 4963 to 4973 ft. Copy it to a folder of
its own as site.inp.
Make a DEM. The model has no DEM, so build one
from the network: interpolate a surface through the ground at every node
(the Rim the Interfaces table shows: the invert plus
the node's full depth by SWMM's own rule, which for these MaxDepth 0
junctions is the crown of the highest conduit that meets them) at a 20
ft cell, with a cell of margin round the model's drawn extent. Any GIS
does this: inverse-distance weighting from a point layer of the nodes
(File → Export GIS Layers…), saved as .asc
or .tif. Save it as ground.asc beside
site.inp.
Setup. Open site.inp, 2D →
2D Setup…, type the DEM's path (or drop the file on the
window) and Load DEM: it covers the whole model extent.
Set rain on grid to Constant, 3 in/hr; boundary
Open; tick Duration and set 0.333 h
(20 minutes); output step 300 s. Leave roughness uniform 0.05 and
infiltration None. Save: the status
line reads "Saved …\site.2d".
Run 2D Only. 2D → Run 2D Only. The Run 2D window counts to 00:20:00 in about a second and reports 5 frames (0, 5, 10, 15 and 20 minutes), mass error +0.000 %, inflow 210,267 ft³ (3 in/hr for a third of an hour over the grid), outflow 32,993 ft³ over the open edge, and a peak depth of about 1.4 ft in the low spots between the nodes. The results load by themselves; the status bar says "2D run finished".
Look and export. The map shows the depth over
the DEM. In the Layers tab's 2D
overland section drag 2D frame to the last
frame, or switch to Max depth. 2D → Export Max
Depth Grid… writes site_max_depth.asc, a grid the
size of the DEM with the deepest water of the run in each cell;
Export Hazard Grid… writes the depth × velocity
maximum. 2D → Load 2D Results re-reads the file at any
time.
Inlets. Now let the network take the water. 2D → Interfaces…, select everything on the map (Ctrl+A), choose Inlet and Apply to selection (10 ft perimeter and 2 ft² opening unless you change them in the table), then Seal all outfalls. Back in 2D Setup, set the duration to 0.5 h and Save.
Coupled, iterative. 2D → Run Coupled (1D-2D)…, choose the engine, Iterative, up to 3 passes, tolerance 0.020, Run. The run takes 2 passes (the second changes the exchanged volume by less than 2 %), the surface mass error stays at +0.000 %, and the inlets capture 23,276 ft³ of the 315,400 ft³ that fell on the grid in the half hour; nothing surcharges. The summary's Surcharged / captured and 1D run rows show the volumes and the scratch model's files.
Coupled, tight. The same dialog, Tight, sync every 30 s, Run (it needs the bridge, see §20.6). The engine is stepped alongside the surface and the captured water enters the network as it is captured: 32,954 ft³ captured, nothing surcharged, surface mass error +0.000 %, no engine continuity warning. Tight captures more than iterative here because the network heads it sees are the ones the capture itself produces, not a previous pass's.
When the network surcharges. The sample's pipes carry the storm, so nothing leaves the network above. On a stressed copy (every conduit narrowed 2.5 times, the same kind of DEM through the rims, manholes at the junctions) the engine alone reports a flooding loss of 0.040 MG (about 5,350 ft³). Coupled, that water goes onto the surface instead: 5,229 ft³ iterative, 5,360 ft³ tight. With every lid ticked Lid open, tight coupling captured 1,454 ft³ of it back, which the engine booked as 0.011 MG of external inflow. The surface balance was 0.0000 % in every case.
Stop 2D ends a run early at its next progress report. Try it with a ten-hour duration: the summary then carries "2D run stopped by the caller at … s" among its warnings, and the frames written so far load as usual.