![]() |
OpenSWMM Engine
6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
|
G-steps 3, 6-12, 16 — the two-zone groundwater kernel: saturated FV update, lateral Darcy, closure dispatch, node exchange, Dunne transfer, ET, and the LTS tier hooks the surface marcher calls. More...
Go to the source code of this file.
Classes | |
| class | openswmm::twoD::SubsurfaceSolver |
| The two-zone kernel. Owned by SurfaceRouter2D; driven by the marcher's tier hooks. More... | |
| struct | openswmm::twoD::NodeData |
| Structure-of-Arrays storage for all nodes. More... | |
Namespaces | |
| namespace | openswmm |
| namespace | openswmm::twoD |
G-steps 3, 6-12, 16 — the two-zone groundwater kernel: saturated FV update, lateral Darcy, closure dispatch, node exchange, Dunne transfer, ET, and the LTS tier hooks the surface marcher calls.
The subsurface does not get a loop of its own. ExplicitInertialSolver calls four hooks, mirroring what it already does for the surface:
| Hook | When | What |
|---|---|---|
assignTiers | every syncAndRebuild | Δt_g / Δt_u per cell → tier lists |
fireGwFaces(tier, dt) | face phase of a due tier | lateral Darcy → ±ΔV side accumulators |
fireGwCells(tier, dt) | cell phase of a due tier | gather, closure, node/deep/ET/Dunne |
settle() | before any re-tier | flush every accumulator |
G-A — a GW cell's tier comes only from min(Δt_g, Δt_u). The surface's pin-to-tier-0 rule for coupling cells is deliberately NOT applied here: a GW cell with node exchange or infiltration keeps its own tier and the exchange accumulates until it fires. Only the surface twin is ever pinned.
G-B — every new flux channel books ±Δ into a side accumulator at the producer's cadence and is gathered by the owner at its own firing, exactly like facc_L_/facc_R_. Cross-tier conservation is inherited, not re-proved.
The order matters and is the plan's (§2.3 "apply saturated Δh_g first, then the column sees the new L"):
q₀_phys — the physical Darcy flux across the table, from the current column state (closure B) or the closed form (closure A).q₀_phys, lateral gather, node exchange, deep loss → new h_g, clamped to [0, z_s].L̇ from the CLAMPED h_g, so clamping cannot break conservation.L̇; its f_bot carries the handover, and its overflow_to_sat / deficit_from_sat are applied to h_g in this same firing.h_g > z_s − ε moves the excess to the surface twin.θ_s − θ_bot, not θ_s. See SigmaColumn.hpp's note: with the handover made explicit, θ_s does not conserve and θ_s − θ_bot is the textbook specific yield.