OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
openswmm::fv::PressurizedHeadSolver Class Reference

#include <PressurizedHeadSolver.hpp>

Collaboration diagram for openswmm::fv::PressurizedHeadSolver:

Public Types

enum  : std::uint8_t {
  kNone = 0 ,
  kFull = 1 ,
  kDelta = 2
}
 

Public Member Functions

bool classify (const PressurizedView &v)
 
void solve (const PressurizedView &v, double dt)
 
void finalizeCells (const PressurizedView &v)
 
const std::vector< std::uint8_t > & foldedNodes () const noexcept
 
bool anyImplicit () const noexcept
 

Static Public Member Functions

static bool cellPressurized (const NetworkMeshData &mesh, const NetworkStateData &state, int cell)
 
static std::uint8_t faceModeOf (const NetworkMeshData &mesh, const NetworkStateData &state, int f)
 
static bool ghostPressurized (const NetworkMeshData &mesh, const NetworkStateData &state, int f)
 Is the node-side ghost of face f pressurized?
 

Member Enumeration Documentation

◆ anonymous enum

anonymous enum : std::uint8_t

Face treatment decided by classify(). Values are load-bearing for the assembly switch; kNone faces are untouched. kFull — both sides pressurized: Casulli form (steady state reduces to ΔH/L = −S_f exactly — the head-loss invariance gate). kDelta — a transition face (exactly one side pressurized, with a pressurized CELL side). CLASSIFICATION ONLY in R2a: the face stays fully explicit — Godunov flux and census bound. Folding transitions in was built and MEASURED before being cut: every memoryless fold (frozen-ghost delta form, free cell as a soft unknown, free-side depth thresholds at 0.05 and 0.5·y_full) re-times an ADVANCING fill — bore arrival 65/345 s, 60/545 s, 75/1320 s at c = 150/660 against the 42 s quasi-steady analytic — because any instantaneous threshold is swept through transiently while a cell fills. A STANDING transition (backwater below an internal jump) is only distinguishable by cadence, so releasing its census throttle belongs to the LTS composition (R2b), which can put the front on its own fine tier. kNone — everything else: gated/culvert faces (their laws stand), closed ends, and faces with no pressurized CELL side (a pressurized ghost against a free cell is the classic manhole bore).

Enumerator
kNone 
kFull 
kDelta 

Member Function Documentation

◆ anyImplicit()

bool openswmm::fv::PressurizedHeadSolver::anyImplicit ( ) const
inlinenoexcept

◆ cellPressurized()

static bool openswmm::fv::PressurizedHeadSolver::cellPressurized ( const NetworkMeshData & mesh,
const NetworkStateData & state,
int cell )
inlinestatic

Is this cell pressurized (band entry and above) under the R2 rule? Under the TPA closure (issue #156: state.cell_tpa non-empty) membership IS the regime flag — a latched sub-atmospheric cell sits below y_crown yet is exactly the stiff-acoustic case this solver exists for (plan §2.2(1)). The flag is fixed within a substep, so the SPD structure and the census edit stay consistent.

Here is the caller graph for this function:

◆ classify()

bool openswmm::fv::PressurizedHeadSolver::classify ( const PressurizedView & v)

Re-derive the pressurized subset from the instantaneous state: pressurized cells, implicit faces with their mode, folded junction rows and the component partition. Returns true when at least one implicit face exists (i.e. solve() has work).

Here is the call graph for this function:

◆ faceModeOf()

static std::uint8_t openswmm::fv::PressurizedHeadSolver::faceModeOf ( const NetworkMeshData & mesh,
const NetworkStateData & state,
int f )
inlinestatic

Implicit eligibility and mode of one face, derived from the instantaneous state alone — the ONE predicate classify() and the census edit share, so the dt bound and the solve can never disagree about which faces are covered. Gated and culvert-capped faces are never implicit (their laws stand, explicitly); a pressurized ghost against a FREE cell is the filling bore and stays explicit too.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ finalizeCells()

void openswmm::fv::PressurizedHeadSolver::finalizeCells ( const PressurizedView & v)

Post-update pass: a pressurized cell's momentum state is slaved to the solved face discharges (Q_i = mean of its two face fluxes in the cell frame) so no explicit acoustic residue survives in the collocated Q. Call AFTER updateCells/updateNodes.

Here is the call graph for this function:

◆ foldedNodes()

const std::vector< std::uint8_t > & openswmm::fv::PressurizedHeadSolver::foldedNodes ( ) const
inlinenoexcept

Folded-node mask from the last classify() — relaxNodeFluxes must skip these (their continuity is a row of the implicit system).

◆ ghostPressurized()

static bool openswmm::fv::PressurizedHeadSolver::ghostPressurized ( const NetworkMeshData & mesh,
const NetworkStateData & state,
int f )
inlinestatic

Is the node-side ghost of face f pressurized?

Here is the caller graph for this function:

◆ solve()

void openswmm::fv::PressurizedHeadSolver::solve ( const PressurizedView & v,
double dt )

Assemble and solve the SPD head system per component, then overwrite the implicit faces' entries in f_mass (and the species-facing copies f_flux.mass / f_sstar) with the back-substituted discharges, and write the folded junctions' heads (ceiling/floor clamped, with a one-shot Dirichlet re-solve for violating rows).

Here is the call graph for this function:

The documentation for this class was generated from the following files: