OpenSWMM Engine  6.0.0-alpha.3
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.3)
Loading...
Searching...
No Matches
SurfaceRouter2D.hpp
Go to the documentation of this file.
1
21
22#ifndef OPENSWMM_ENGINE_2D_SURFACE_ROUTER_HPP
23#define OPENSWMM_ENGINE_2D_SURFACE_ROUTER_HPP
24
26#include "data/MeshData.hpp"
29#include "data/BoundaryData.hpp"
33
34#include <memory>
35#include <unordered_map>
36#include <vector>
37#ifdef OPENSWMM_HAS_2D
39#endif
40
41namespace openswmm {
43}
44
45namespace openswmm::twoD {
46
51public:
52 SurfaceRouter2D() = default;
53 ~SurfaceRouter2D() = default;
54
55 // Non-copyable, movable
60
70
86 void step(SimulationContext& ctx, double dt, double t);
87
96
106 void advancePostRouting(SimulationContext& ctx, double dt, double t);
107
116
126 void finalize(SimulationContext& ctx);
127
140 double computeCflHint(const SimulationContext& ctx) const;
141
143 bool isActive() const noexcept { return active_; }
144
156 void prepareForEdit();
157
159 const MeshData& mesh() const noexcept { return mesh_; }
160
162 MeshData& mesh() noexcept { return mesh_; }
163
165 const SurfaceStateData& state() const noexcept { return state_; }
166
168 SurfaceStateData& state() noexcept { return state_; }
169
171 const SolverOptions2D& options() const noexcept { return options_; }
172
174 SolverOptions2D& options() noexcept { return options_; }
175
177 const BoundaryData& boundary() const noexcept { return boundary_; }
178
180 BoundaryData& boundary() noexcept { return boundary_; }
181
193 std::vector<PendingBoundaryRow>& pendingBCRows() noexcept { return pending_bc_rows_; }
194 const std::vector<PendingBoundaryRow>& pendingBCRows() const noexcept { return pending_bc_rows_; }
195
207 std::vector<PendingEdgeConveyanceRow>& pendingEdgeConveyanceRows() noexcept {
208 return pending_edge_conveyance_rows_;
209 }
210 const std::vector<PendingEdgeConveyanceRow>& pendingEdgeConveyanceRows() const noexcept {
211 return pending_edge_conveyance_rows_;
212 }
213
215 double totalVolume() const;
216
218 double totalExchangeFlow() const;
219#ifdef OPENSWMM_HAS_2D
221 long lastCvodeSteps() const {
222 return solver_ ? solver_->last_num_steps() : 0;
223 }
224 double lastCvodeStepSize() const {
225 return solver_ ? solver_->last_step_size() : 0.0;
226 }
227#else
228 long lastCvodeSteps() const { return 0; }
229 double lastCvodeStepSize() const { return 0.0; }
230#endif
231
232private:
236 void drainPendingRows();
237
238 MeshData mesh_;
239 SurfaceStateData state_;
240 SolverOptions2D options_;
241 BoundaryData boundary_;
242
244 std::vector<PendingBoundaryRow> pending_bc_rows_;
245
249 std::vector<PendingEdgeConveyanceRow> pending_edge_conveyance_rows_;
250
251 std::vector<CouplingPoint> coupling_points_;
256 std::vector<CouplingPoint> node_coupling_points_;
257
258 bool active_ = false;
259 int coupling_counter_ = 0;
260 double sim_time_ = 0.0;
264 double pending_dt_ = 0.0;
265 bool force_next_window_ = false;
266
269 double prev_boundary_cum_ = 0.0;
270
275 std::unordered_map<int, double> outfall_applied_q_;
278 long outfall_clamp_windows_ = 0;
281 long failed_advance_windows_ = 0;
282
286 double cfl_hint_ = 1.0e30;
289 std::vector<int> cfl_cells_;
290 void updateCflHint();
291
294 ActiveSetData active_set_;
295
300 double effective_window_ = 0.0;
302 double window_target_ = 0.0;
304 int clean_windows_ = 0;
306 long quiescent_windows_ = 0;
308 double last_t_ = 0.0;
309
313 void fireAdvanceWindow(SimulationContext& ctx, double dt, double t);
314
318 bool boundary_names_resolved_ = false;
319#ifdef OPENSWMM_HAS_2D
324 std::unique_ptr<ISurfaceSolver> solver_;
325#endif
326
329 void updateRainfall(SimulationContext& ctx);
330
334 RainfallInterpolator interp_;
335
338 std::vector<double> rain_si_;
339
345 void resolveBoundaryValues(SimulationContext& ctx, double t);
346
351 void accumulateMassBalance(SimulationContext& ctx, double dt);
352};
353
354} // namespace openswmm::twoD
355
356#endif // OPENSWMM_ENGINE_2D_SURFACE_ROUTER_HPP
Dry-cell active-set (wet-front) mask for the 2D RHS pipeline.
Structure-of-Arrays (SoA) storage for 2D mesh boundary conditions.
Backend-neutral interface for the 2D surface-routing time integrator.
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.
Structure-of-Arrays (SoA) storage for 2D surface routing state.
Builds and applies static rainfall-interpolation weights for the mesh.
Definition RainfallInterpolator.hpp:44
const SolverOptions2D & options() const noexcept
Access solver options (read-only).
Definition SurfaceRouter2D.hpp:171
void advancePostRouting(SimulationContext &ctx, double dt, double t)
Post-routing hook: compute coupling exchange and advance 2D solver.
Definition SurfaceRouter2D.cpp:635
SurfaceRouter2D & operator=(const SurfaceRouter2D &)=delete
SurfaceRouter2D & operator=(SurfaceRouter2D &&)=default
twoD::PendingBoundaryRow PendingBoundaryRow
Per-row buffer for [2D_BOUNDARY_CONDITIONS] parse output.
Definition SurfaceRouter2D.hpp:192
std::vector< PendingEdgeConveyanceRow > & pendingEdgeConveyanceRows() noexcept
Definition SurfaceRouter2D.hpp:207
BoundaryData & boundary() noexcept
Access per-edge boundary-condition data (mutable, for forcing/parsing).
Definition SurfaceRouter2D.hpp:180
std::vector< PendingBoundaryRow > & pendingBCRows() noexcept
Definition SurfaceRouter2D.hpp:193
void step(SimulationContext &ctx, double dt, double t)
Advance the 2D surface routing by one SWMM routing step.
Definition SurfaceRouter2D.cpp:616
long lastCvodeSteps() const
Definition SurfaceRouter2D.hpp:228
MeshData & mesh() noexcept
Access mesh data (mutable, for input parsing).
Definition SurfaceRouter2D.hpp:162
double lastCvodeStepSize() const
Definition SurfaceRouter2D.hpp:229
const SurfaceStateData & state() const noexcept
Access surface state (read-only).
Definition SurfaceRouter2D.hpp:165
double computeCflHint(const SimulationContext &ctx) const
Compute a CFL-like stability hint for the 2D domain.
Definition SurfaceRouter2D.cpp:1003
double totalExchangeFlow() const
Get total exchange flow (sum of coupling flows, m³/s).
Definition SurfaceRouter2D.cpp:1043
double totalVolume() const
Get total 2D surface volume (sum of depth * area).
Definition SurfaceRouter2D.cpp:1031
void initialize(SimulationContext &ctx)
Initialize the 2D module after input parsing is complete.
Definition SurfaceRouter2D.cpp:170
SurfaceStateData & state() noexcept
Access surface state (mutable, for forcing).
Definition SurfaceRouter2D.hpp:168
const std::vector< PendingBoundaryRow > & pendingBCRows() const noexcept
Definition SurfaceRouter2D.hpp:194
void updateOutfallsPreRouting(SimulationContext &ctx)
Pre-routing hook: update outfall boundaries from 2D surface heads.
Definition SurfaceRouter2D.cpp:629
SurfaceRouter2D(const SurfaceRouter2D &)=delete
void finalize(SimulationContext &ctx)
Finalize the 2D module at simulation end.
Definition SurfaceRouter2D.cpp:967
SurfaceRouter2D(SurfaceRouter2D &&)=default
const MeshData & mesh() const noexcept
Access mesh data (read-only).
Definition SurfaceRouter2D.hpp:159
void prepareOneShotForcing(SimulationContext &ctx)
Prepare a RESET 2D forcing to apply on the next routing step.
Definition SurfaceRouter2D.cpp:677
bool isActive() const noexcept
Check if the 2D module is active.
Definition SurfaceRouter2D.hpp:143
SolverOptions2D & options() noexcept
Access solver options (mutable).
Definition SurfaceRouter2D.hpp:174
const BoundaryData & boundary() const noexcept
Access per-edge boundary-condition data (read-only).
Definition SurfaceRouter2D.hpp:177
twoD::PendingEdgeConveyanceRow PendingEdgeConveyanceRow
Per-row buffer for [2D_EDGE_CONVEYANCE] parse output (§11A).
Definition SurfaceRouter2D.hpp:206
const std::vector< PendingEdgeConveyanceRow > & pendingEdgeConveyanceRows() const noexcept
Definition SurfaceRouter2D.hpp:210
void prepareForEdit()
Make the parsed mesh editable without a full initialize().
Definition SurfaceRouter2D.cpp:161
Definition NodeCoupling.cpp:15
Definition NodeCoupling.cpp:15
Central, reentrant simulation context.
Definition SimulationContext.hpp:292
Definition ActiveSetData.hpp:39
SoA storage for per-edge boundary conditions.
Definition BoundaryData.hpp:55
SoA storage for 2D triangular mesh geometry and topology.
Definition MeshData.hpp:34
Per-row buffer for [2D_BOUNDARY_CONDITIONS] parse output.
Definition PendingRows2D.hpp:37
Per-row buffer for [2D_EDGE_CONVEYANCE] parse output (§11A).
Definition PendingRows2D.hpp:56
Configuration for the 2D surface routing CVODE solver.
Definition SolverOptions2D.hpp:132
Definition SurfaceStateData.hpp:41