OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
SubsurfaceSolver.hpp File Reference

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...

#include "SigmaColumn.hpp"
#include "SubsurfaceData.hpp"
#include <string>
#include <vector>
Include dependency graph for SubsurfaceSolver.hpp:
This graph shows which files directly or indirectly include this file:

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
 

Detailed Description

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.

How this joins the marcher (§3, guarantees G-A and G-B)

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.

Operator split within one cell firing

The order matters and is the plan's (§2.3 "apply saturated Δh_g first, then the column sees the new L"):

  1. q₀_phys — the physical Darcy flux across the table, from the current column state (closure B) or the closed form (closure A).
  2. Saturated update with q₀_phys, lateral gather, node exchange, deep loss → new h_g, clamped to [0, z_s].
  3. from the CLAMPED h_g, so clamping cannot break conservation.
  4. Column sweep with that ; its f_bot carries the handover, and its overflow_to_sat / deficit_from_sat are applied to h_g in this same firing.
  5. Dunne: h_g > z_s − ε moves the excess to the surface twin.
Note
Specific yield. Step 2 divides by θ_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.
Author
Caleb Buahin caleb.nosp@m..bua.nosp@m.hin@g.nosp@m.mail.nosp@m..com
License\n Apache-2.0