38#ifndef OPENSWMM_ENGINE_2D_SURFACE_ROUTER_HPP
39#define OPENSWMM_ENGINE_2D_SURFACE_ROUTER_HPP
53#include <unordered_map>
54#include <unordered_set>
159 return report_old_depth_;
163 return report_old_head_;
183 const std::vector<std::string>&
threadWarnings() const noexcept {
return thread_warnings_; }
191 std::vector<std::pair<int, double>>& out)
const;
241 if (render_dirty_) refreshRenderFields();
267 return aquifer_node_names_;
270 return aquifer_node_names_;
301 return subcatch_recharge_;
307 out = subcatch_recharge_;
308 std::fill(subcatch_recharge_.begin(), subcatch_recharge_.end(), 0.0);
313 return cell_subcatch_;
317 return infil_cum_applied_;
330 return coupling_cum_applied_;
360 return pending_iq_rows_;
363 return pending_bq_rows_;
365 std::vector<PendingBoundaryRow>&
pendingBCRows() noexcept {
return pending_bc_rows_; }
366 const std::vector<PendingBoundaryRow>&
pendingBCRows() const noexcept {
return pending_bc_rows_; }
380 return pending_edge_conveyance_rows_;
383 return pending_edge_conveyance_rows_;
391#ifdef OPENSWMM_HAS_2D
394 return solver_ ? solver_->last_num_steps() : 0;
397 return solver_ ? solver_->last_step_size() : 0.0;
402 ISurfaceSolver::RunStats runStats()
const {
403 return solver_ ? solver_->run_stats() : ISurfaceSolver::RunStats{};
411 const std::string&
backendName() const noexcept {
return backend_name_; }
417 void drainPendingRows();
423 std::vector<std::string> thread_warnings_;
424 std::string backend_name_;
434 double infil_elapsed_ = 0.0;
441 std::vector<double> infil_cum_applied_;
447 std::vector<double> coupling_cum_applied_;
452 std::vector<int> cell_subcatch_;
453 std::vector<double> subcatch_recharge_;
463 std::vector<std::string> aquifer_node_names_;
468 std::vector<double> rain_cum_;
471 std::vector<PendingBoundaryRow> pending_bc_rows_;
472 std::vector<PendingInitialQualityRow> pending_iq_rows_;
473 std::vector<PendingBoundaryQualityRow> pending_bq_rows_;
478 std::vector<PendingEdgeConveyanceRow> pending_edge_conveyance_rows_;
480 std::vector<CouplingPoint> coupling_points_;
484 std::vector<CouplingPoint> node_coupling_points_;
488 std::vector<double> node_row_conc_;
493 std::vector<double> react_phi_, react_a_, react_dx_;
496 double co_refresh_elapsed_ = 0.0;
502 double co_render_elapsed_ = 0.0;
503 bool render_dirty_ =
false;
506 std::vector<double> render_eta_;
511 std::vector<int> bc_nonwall_slots_;
514 bool bc_nonwall_dirty_ =
true;
517 std::unordered_set<int> mb_seen_nodes_;
519 double co_forcing_elapsed_ = 0.0;
520 bool co_forcing_first_ =
true;
531 void refreshRenderFields();
533 bool active_ =
false;
534 double sim_time_ = 0.0;
536 double pending_dt_ = 0.0;
545 std::vector<double> report_old_depth_;
546 std::vector<double> report_old_head_;
547 double report_window_old_ms_ = 0.0;
548 double report_window_new_ms_ = 0.0;
549 bool report_old_valid_ =
false;
554 std::vector<double> ramp_prev_head_;
555 double ramp_prev_span_ = 0.0;
559 double prev_boundary_cum_ = 0.0;
564 std::vector<double> window_outfall_accum_;
569 std::vector<double> window_avail_budget_;
573 void resetWindowAccumulators();
576 long outfall_clamp_windows_ = 0;
579 double last_t_ = 0.0;
584 bool boundary_names_resolved_ =
false;
591 double bc_stage_scale_ = 1.0;
600 double bc_stage_ts_scale_ = 1.0;
606 double bc_flow_scale_ = 1.0;
607#ifdef OPENSWMM_HAS_2D
611 std::unique_ptr<ISurfaceSolver> solver_;
625 std::vector<double> rain_si_;
Structure-of-Arrays (SoA) storage for 2D mesh boundary conditions.
U4 (2026-09-07) — authoring state for subsurface (groundwater) transport: [GW_TRANSPORT_OPTIONS],...
Backend-neutral interface for the 2D surface-routing time integrator.
Per-cell infiltration for the 2D overland-flow mesh (track I).
Structure-of-Arrays (SoA) storage for 2D triangular mesh geometry.
Orifice-equation exchange between 2D surface and SWMM nodes.
Parse-time scratch rows for [2D_BOUNDARY_CONDITIONS] and [2D_EDGE_CONVEYANCE] input sections.
Static per-cell weights mapping raingage rainfall onto the 2D mesh.
Configuration options for the 2D surface routing solver.
G-steps 3, 6-12, 16 — the two-zone groundwater kernel: saturated FV update, lateral Darcy,...
Structure-of-Arrays (SoA) storage for 2D surface routing state.
Owns per-cell infiltration parameters, kernel state and held rates.
Definition Infil2D.hpp:181
Builds and applies static rainfall-interpolation weights for the mesh.
Definition RainfallInterpolator.hpp:60
The two-zone kernel. Owned by SurfaceRouter2D; driven by the marcher's tier hooks.
Definition SubsurfaceSolver.hpp:97
~SurfaceRouter2D()=default
const SolverOptions2D & options() const noexcept
Access solver options (read-only).
Definition SurfaceRouter2D.hpp:219
void computeCouplingConductances(const SimulationContext &ctx, std::vector< std::pair< int, double > > &out) const
Definition SurfaceRouter2D.cpp:1564
void advancePostRouting(SimulationContext &ctx, double dt, double t)
Post-routing hook: compute coupling exchange and advance 2D solver.
Definition SurfaceRouter2D.cpp:1580
SurfaceRouter2D & operator=(const SurfaceRouter2D &)=delete
SurfaceRouter2D & operator=(SurfaceRouter2D &&)=default
const std::vector< std::string > & threadWarnings() const noexcept
Definition SurfaceRouter2D.hpp:183
twoD::PendingBoundaryRow PendingBoundaryRow
Per-row buffer for [2D_BOUNDARY_CONDITIONS] parse output.
Definition SurfaceRouter2D.hpp:355
std::vector< PendingEdgeConveyanceRow > & pendingEdgeConveyanceRows() noexcept
Definition SurfaceRouter2D.hpp:379
const std::vector< double > & infilCumulative() const noexcept
Definition SurfaceRouter2D.hpp:316
GwTransportData & gwTransport() noexcept
Definition SurfaceRouter2D.hpp:258
BoundaryData & boundary() noexcept
Access per-edge boundary-condition data (mutable, for forcing/parsing).
Definition SurfaceRouter2D.hpp:228
double reportWeight(double report_ms) const noexcept
Definition SurfaceRouter2D.cpp:1634
const SubsurfaceConfig & aquiferConfig() const noexcept
Definition SurfaceRouter2D.hpp:265
void invalidateBoundaryIndex() noexcept
Definition SurfaceRouter2D.hpp:233
SubsurfaceConfig & aquiferConfig() noexcept
Definition SurfaceRouter2D.hpp:264
long lastSolverSteps() const
Definition SurfaceRouter2D.hpp:406
const std::vector< double > & reportOldDepth() const noexcept
Definition SurfaceRouter2D.hpp:158
std::vector< PendingBoundaryRow > & pendingBCRows() noexcept
Definition SurfaceRouter2D.hpp:365
void step(SimulationContext &ctx, double dt, double t)
Advance the 2D surface routing by one SWMM routing step.
Definition SurfaceRouter2D.cpp:1170
void drainSubcatchRecharge(std::vector< double > &out)
Definition SurfaceRouter2D.hpp:306
SubsurfaceSolver & subsurface() noexcept
The running kernel. active() is false until [2D_AQUIFER] resolves.
Definition SurfaceRouter2D.hpp:273
void refreshRenderFieldsIfStale()
Definition SurfaceRouter2D.hpp:240
MeshData & mesh() noexcept
Access mesh data (mutable, for input parsing).
Definition SurfaceRouter2D.hpp:210
const std::vector< double > & rainCumulative() const noexcept
Ledger-consistent cumulative rainfall volume per cell (m³).
Definition SurfaceRouter2D.hpp:341
const std::vector< std::string > & aquiferNodeNames() const noexcept
Definition SurfaceRouter2D.hpp:269
const std::vector< double > & couplingCumulative() const noexcept
Signed cumulative coupling exchange per cell (m³).
Definition SurfaceRouter2D.hpp:329
const std::vector< double > & reportOldHead() const noexcept
Cell head (m) at the start of that batch.
Definition SurfaceRouter2D.hpp:162
const std::vector< double > & subcatchRecharge() const noexcept
Ledger-consistent cumulative infiltrated depth per cell (m).
Definition SurfaceRouter2D.hpp:300
const SurfaceStateData & state() const noexcept
Access surface state (read-only).
Definition SurfaceRouter2D.hpp:213
const Infil2D & infil() const noexcept
Definition SurfaceRouter2D.hpp:253
std::vector< PendingInitialQualityRow > & pendingInitialQualityRows() noexcept
S1/S2: raw [2D_INITIAL_QUALITY] rows, resolved at initialize().
Definition SurfaceRouter2D.hpp:359
double totalExchangeFlow() const
Get total exchange flow (sum of coupling flows, m³/s).
Definition SurfaceRouter2D.cpp:1815
const SubsurfaceSolver & subsurface() const noexcept
Definition SurfaceRouter2D.hpp:274
twoD::PendingInitialQualityRow PendingInitialQualityRow
Definition SurfaceRouter2D.hpp:356
std::vector< std::string > & aquiferNodeNames() noexcept
Definition SurfaceRouter2D.hpp:266
std::vector< PendingBoundaryQualityRow > & pendingBoundaryQualityRows() noexcept
Definition SurfaceRouter2D.hpp:362
double totalVolume() const
Get total 2D surface volume (sum of depth * area).
Definition SurfaceRouter2D.cpp:1803
const std::string & backendName() const noexcept
Definition SurfaceRouter2D.hpp:411
void initialize(SimulationContext &ctx)
Initialize the 2D module after input parsing is complete.
Definition SurfaceRouter2D.cpp:202
void flushPendingBatch(SimulationContext &ctx)
Flush the pending (partial) sync batch, if any.
Definition SurfaceRouter2D.cpp:1624
SurfaceRouter2D()=default
SurfaceStateData & state() noexcept
Access surface state (mutable, for forcing).
Definition SurfaceRouter2D.hpp:216
const std::vector< PendingBoundaryRow > & pendingBCRows() const noexcept
Definition SurfaceRouter2D.hpp:366
Infil2D & infil() noexcept
Access the per-cell infiltration model (plan §5.5, track I).
Definition SurfaceRouter2D.hpp:252
void updateOutfallsPreRouting(SimulationContext &ctx)
Pre-routing hook: update outfall boundaries from 2D surface heads.
Definition SurfaceRouter2D.cpp:1183
SurfaceRouter2D(const SurfaceRouter2D &)=delete
void finalize(SimulationContext &ctx)
Finalize the 2D module at simulation end.
Definition SurfaceRouter2D.cpp:1746
SurfaceRouter2D(SurfaceRouter2D &&)=default
double lastSolverStepSize() const
Definition SurfaceRouter2D.hpp:407
twoD::PendingBoundaryQualityRow PendingBoundaryQualityRow
Definition SurfaceRouter2D.hpp:357
const MeshData & mesh() const noexcept
Access mesh data (read-only).
Definition SurfaceRouter2D.hpp:207
void prepareOneShotForcing(SimulationContext &ctx)
Prepare a RESET 2D forcing to apply on the next routing step.
Definition SurfaceRouter2D.cpp:1645
bool isActive() const noexcept
Check if the 2D module is active.
Definition SurfaceRouter2D.hpp:178
const GwTransportData & gwTransport() const noexcept
Definition SurfaceRouter2D.hpp:259
SolverOptions2D & options() noexcept
Access solver options (mutable).
Definition SurfaceRouter2D.hpp:222
const BoundaryData & boundary() const noexcept
Access per-edge boundary-condition data (read-only).
Definition SurfaceRouter2D.hpp:225
twoD::PendingEdgeConveyanceRow PendingEdgeConveyanceRow
Per-row buffer for [2D_EDGE_CONVEYANCE] parse output (§11A).
Definition SurfaceRouter2D.hpp:378
const std::vector< int > & cellSubcatchment() const noexcept
Definition SurfaceRouter2D.hpp:312
const std::vector< PendingEdgeConveyanceRow > & pendingEdgeConveyanceRows() const noexcept
Definition SurfaceRouter2D.hpp:382
void prepareForEdit()
Make the parsed mesh editable without a full initialize().
Definition SurfaceRouter2D.cpp:193
Definition NodeCoupling.cpp:16
Definition NodeCoupling.cpp:16
Central, reentrant simulation context.
Definition SimulationContext.hpp:353
SoA storage for per-edge boundary conditions.
Definition BoundaryData.hpp:71
Every [GW_*] authoring row of one model.
Definition GwTransportData.hpp:180
SoA storage for 2D mixed triangle/quad mesh geometry and topology.
Definition MeshData.hpp:67
Definition PendingRows2D.hpp:101
Per-row buffer for [2D_BOUNDARY_CONDITIONS] parse output.
Definition PendingRows2D.hpp:53
Per-row buffer for [2D_EDGE_CONVEYANCE] parse output (§11A).
Definition PendingRows2D.hpp:72
One [2D_INITIAL_QUALITY] row (overland transport S1/S2).
Definition PendingRows2D.hpp:89
Configuration for the 2D surface routing solver.
Definition SolverOptions2D.hpp:208
Everything the parser fills, before resolution onto cells.
Definition SubsurfaceData.hpp:234
Definition SurfaceStateData.hpp:59