OpenSWMM Engine  6.0.0-alpha.1
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.1)
Loading...
Searching...
No Matches
KinematicWave.hpp
Go to the documentation of this file.
1
28#ifndef OPENSWMM_KINEMATIC_WAVE_HPP
29#define OPENSWMM_KINEMATIC_WAVE_HPP
30
31#include "XSectBatch.hpp"
32#include <vector>
33
34namespace openswmm {
35
36struct SimulationContext;
37
38namespace kinwave {
39
40// ============================================================================
41// Constants (matching legacy)
42// ============================================================================
43
44constexpr double WX = 0.6;
45constexpr double WT = 0.6;
46constexpr double EPSIL = 0.001;
47
48// ============================================================================
49// KW solver — operates on entire conduit set
50// ============================================================================
51
58class KWSolver {
59public:
62 void init(int n_conduits, const XSectGroups& groups);
63
65 void setLinkOrder(const std::vector<int>& sorted_links) {
66 sorted_links_ = sorted_links;
67 }
68
82 int execute(SimulationContext& ctx, double dt);
83
85 std::vector<int> sorted_links_;
86
88 int solveConduit(int idx, const XSectParams& xs,
89 double q_full, double a_full, double s_full,
90 double beta, double length, double dt,
91 double loss_rate);
92
93 // Per-conduit SoA state (indexed by conduit-link index)
94 // Public so that unit tests can set up / inspect working arrays directly.
95 std::vector<double> q1_;
96 std::vector<double> a1_;
97 std::vector<double> q2_;
98 std::vector<double> a2_;
99
100 // Working buffers (reused each timestep)
101 std::vector<double> q_in_;
102 std::vector<double> a_in_;
103 std::vector<double> q_out_;
104 std::vector<double> a_out_;
105 std::vector<double> sf_in_;
106
107private:
108 int n_conduits_ = 0;
109};
110
111} // namespace kinwave
112} // namespace openswmm
113
114#endif // OPENSWMM_KINEMATIC_WAVE_HPP
Cross-section geometry — unified batch + per-element API.
Shape-grouped cross-section manager for batch computation.
Definition XSectBatch.hpp:208
Kinematic wave solver state.
Definition KinematicWave.hpp:58
int execute(SimulationContext &ctx, double dt)
Route all conduits for one KW timestep.
Definition KinematicWave.cpp:219
void setLinkOrder(const std::vector< int > &sorted_links)
Set topological link order (must be called after init, before first execute).
Definition KinematicWave.hpp:65
int solveConduit(int idx, const XSectParams &xs, double q_full, double a_full, double s_full, double beta, double length, double dt, double loss_rate)
Per-conduit Newton solve. Returns iteration count.
Definition KinematicWave.cpp:57
std::vector< double > q_in_
Inflow to each conduit (cfs)
Definition KinematicWave.hpp:101
std::vector< double > a_in_
Inlet area from inflow (ft2)
Definition KinematicWave.hpp:102
std::vector< double > a_out_
Outlet area from Newton solve (ft2)
Definition KinematicWave.hpp:104
std::vector< double > a2_
Previous outlet area (ft2)
Definition KinematicWave.hpp:98
std::vector< double > a1_
Previous inlet area (ft2)
Definition KinematicWave.hpp:96
std::vector< double > sf_in_
Section factor at inlet.
Definition KinematicWave.hpp:105
std::vector< double > q2_
Previous outlet flow (cfs)
Definition KinematicWave.hpp:97
std::vector< int > sorted_links_
Topological link order (upstream → downstream)
Definition KinematicWave.hpp:85
std::vector< double > q1_
Previous inlet flow (cfs)
Definition KinematicWave.hpp:95
std::vector< double > q_out_
Computed outflow (cfs)
Definition KinematicWave.hpp:103
void init(int n_conduits, const XSectGroups &groups)
Definition KinematicWave.cpp:37
constexpr double WX
Distance weighting factor.
Definition KinematicWave.hpp:44
constexpr double EPSIL
Newton convergence tolerance.
Definition KinematicWave.hpp:46
constexpr double WT
Time weighting factor.
Definition KinematicWave.hpp:45
Definition NodeCoupling.cpp:15
Central, reentrant simulation context.
Definition SimulationContext.hpp:274
Definition XSectBatch.hpp:92