28#ifndef OPENSWMM_DYNAMIC_WAVE_HPP
29#define OPENSWMM_DYNAMIC_WAVE_HPP
32#include "../core/Constants.hpp"
33#include "../core/SimulationOptions.hpp"
34#include "../data/NodeData.hpp"
35#include "../data/LinkData.hpp"
42struct SimulationContext;
86 std::vector<double>
As;
87 std::vector<double>
hs;
89 std::vector<double>
P;
93 std::vector<double>
t_s;
101 P_hat.assign(n, 1.0);
210 double fixed_step,
double courant_factor);
227 int num_threads_ = 1;
231 std::vector<int> conduit_idx_;
235 std::vector<uint8_t> is_open_;
236 std::vector<uint8_t> is_force_main_;
237 std::vector<uint8_t> has_losses_;
238 std::vector<double> barrels_d_;
239 std::vector<double> cached_length_;
240 std::vector<double> inv_length_;
257 std::vector<int> tile_uj_;
258 std::vector<int> tile_n1_;
259 std::vector<int> tile_n2_;
260 std::vector<double> tile_inv1_elev_;
261 std::vector<double> tile_inv2_elev_;
262 std::vector<double> tile_z1_off_;
263 std::vector<double> tile_z2_off_;
264 std::vector<double> tile_y_full_;
265 std::vector<double> tile_a_full_;
266 std::vector<double> tile_r_full_;
267 std::vector<double> tile_w_max_;
268 std::vector<double> tile_length_;
269 std::vector<double> tile_inv_length_;
270 std::vector<double> tile_links_length_;
271 std::vector<double> tile_beta_;
272 std::vector<double> tile_q_max_;
273 std::vector<double> tile_rough_factor_;
274 std::vector<double> tile_barrels_d_;
275 std::vector<uint8_t> tile_is_open_;
276 std::vector<uint8_t> tile_is_force_main_;
277 std::vector<uint8_t> tile_is_closed_;
278 std::vector<uint8_t> tile_has_losses_;
279 std::vector<int> tile_xsect_batch_shape_;
280 std::vector<XsectShape> tile_shape_;
287 std::vector<uint8_t> tile_has_offset_;
292 std::vector<int> tile_uj_to_ci_;
295 std::vector<int> tile_culvert_code_;
296 std::vector<double> tile_slope_;
297 std::vector<double> tile_q_limit_;
298 std::vector<double> tile_loss_inlet_;
299 std::vector<double> tile_loss_outlet_;
300 std::vector<uint8_t> tile_has_flap_gate_;
301 std::vector<int8_t> tile_direction_;
309 double dt_gravity_ = 0.0;
323 std::vector<double> wcap_d1_, wcap_d2_, wcap_dm_;
326 mutable double variable_step_ = 0.0;
332 std::vector<double> area1_;
333 std::vector<double> area2_;
334 std::vector<double> area_mid_;
335 std::vector<double> hrad_mid_;
336 std::vector<double> width_mid_;
337 std::vector<double> depth1_;
338 std::vector<double> depth2_;
339 std::vector<double> depth_mid_;
342 std::vector<double> velocity_;
343 std::vector<double> froude_;
344 std::vector<double> sigma_;
345 std::vector<double> dqdh_;
346 std::vector<double> new_flow_;
349 std::vector<double> area_old_;
353 std::vector<uint8_t> bypassed_;
357 std::vector<double> surf_area1_;
358 std::vector<double> surf_area2_;
361 std::vector<double> hrad1_;
362 std::vector<double> width1_;
363 std::vector<double> width2_;
367 std::vector<double> h1_;
368 std::vector<double> h2_;
369 std::vector<double> fasnh_;
372 std::vector<double> aa_y_prev_;
373 std::vector<double> aa_g_prev_;
374 std::vector<double> aa_r_prev_;
375 std::vector<uint8_t> aa_skip_;
380 std::vector<MomentumCategory> category_;
399 std::size_t uj,
double& q,
double qLast,
400 double barrels_d,
bool isFull);
418 const std::vector<uint8_t>&
aaSkipFlags()
const {
return aa_skip_; }
429 double getSlotWidth(
double y,
double y_full,
double w_max,
XsectShape shape)
const;
430 double getSlotArea(
double y,
double y_full,
double a_full,
double slot_width)
const;
431 double getSlotHydRad(
double y,
double y_full,
double r_full)
const;
432 double getCrownCutoff()
const;
437 double sim_time_ = 0.0;
Cross-section geometry — unified batch + per-element API.
Shape-grouped cross-section manager for batch computation.
Definition XSectBatch.hpp:208
Dynamic wave solver — operates on entire link/node system.
Definition DynamicWave.hpp:172
double evap_rate
Definition DynamicWave.hpp:221
void setNumThreads(int n)
Set the number of OpenMP threads for parallel loops.
Definition DynamicWave.cpp:610
SurchargeMethod surcharge_method
Definition DynamicWave.hpp:215
void init(int n_nodes, int n_links, const XSectGroups &groups, const SimulationContext &ctx)
Definition DynamicWave.cpp:353
DPSLinkArrays & dpsStateMut()
Mutable access to DPS state for tests that need to seed slot conditions.
Definition DynamicWave.hpp:425
const DPSLinkArrays & dpsState() const
Read-only access to DPS per-conduit state arrays (for tests/diagnostics).
Definition DynamicWave.hpp:421
double head_tol
Definition DynamicWave.hpp:212
NodeContinuity node_continuity
Definition DynamicWave.hpp:216
const DPSConfig & dpsConfig() const
Read-only access to DPS configuration (for tests/diagnostics).
Definition DynamicWave.hpp:423
bool anderson_accel
Enable Anderson acceleration.
Definition DynamicWave.hpp:217
double omega
Definition DynamicWave.hpp:214
int execute(SimulationContext &ctx, double dt, NonConduitFlowFunc non_conduit_fn=nullptr)
Execute one DW routing timestep.
Definition DynamicWave.cpp:628
double & nodeSumDqdh(int n)
Mutable reference to the per-node sumdqdh accumulator at index n.
Definition DynamicWave.hpp:415
uint8_t & nodeSurchargedFlag(int idx)
Direct write access to the per-node is_surcharged flag (for tests/non-conduit scatter).
Definition DynamicWave.hpp:409
double * nodeNewSurfAreaDataMut()
Mutable pointer to the per-node new_surf_area array (for HydStructures scatter).
Definition DynamicWave.hpp:412
int max_trials
Definition DynamicWave.hpp:213
double getRoutingStep(SimulationContext &ctx, double fixed_step, double courant_factor)
Compute CFL-based variable timestep.
Definition DynamicWave.cpp:2173
std::function< void(SimulationContext &, double, int)> NonConduitFlowFunc
Definition DynamicWave.hpp:190
const std::vector< uint8_t > & aaSkipFlags() const
Access per-node AA skip flags (read-only, for testing/diagnostics).
Definition DynamicWave.hpp:418
constexpr double MIN_SURFAREA
Definition Constants.hpp:79
constexpr double DEFAULT_HEAD_TOL
Definition Constants.hpp:105
constexpr double FUDGE
Definition Constants.hpp:75
constexpr double EXTRAN_CROWN_CUTOFF
Definition Constants.hpp:121
constexpr double MAX_VELOCITY
Definition Constants.hpp:113
constexpr double SLOT_WIDTH_FACTOR
Preissmann slot width factor (slot_width = y_full * this factor).
Definition Constants.hpp:127
constexpr double OMEGA
Definition Constants.hpp:101
constexpr int DEFAULT_MAX_TRIALS
Definition Constants.hpp:109
constexpr double MIN_TIMESTEP
Definition Constants.hpp:117
constexpr double SLOT_CROWN_CUTOFF
Preissmann slot crown cutoff fraction.
Definition Constants.hpp:124
SurchargeMethod
Surcharge method: EXTRAN (classic) or SLOT (Preissmann).
Definition DynamicWave.hpp:141
@ SLOT
Preissmann slot — fictitious narrow slot above crown.
@ DYNAMIC_SLOT
Dynamic slot — slot width varies with flow conditions (experimental) Sharior, S., Hodges,...
@ EXTRAN
Classic EXTRAN approach — dQ/dH for surcharged nodes.
MomentumCategory
Momentum category for branch-free per-category kernel dispatch.
Definition DynamicWave.hpp:154
@ MANNING_OPEN
Standard Manning, open channel (Froude-based sigma)
@ MANNING_CLOSED_FULL
Manning, closed conduit, surcharged (fr=0, sig=0)
@ FORCE_MAIN_HW
Force main, Hazen-Williams friction.
@ FORCE_MAIN_DW
Force main, Darcy-Weisbach friction.
@ MANNING_CLOSED_FS
Manning, closed conduit, free surface.
@ SKIP_DRY
DRY/UP_DRY/DN_DRY, aMid<=FUDGE, or is_closed.
Definition NodeCoupling.cpp:15
NodeContinuity
Node continuity formulation for depth update.
Definition SimulationOptions.hpp:99
@ EXPLICIT
Classic explicit two-branch (default)
XsectShape
Conduit cross-section shape code.
Definition LinkData.hpp:54
double * y
Definition odesolve.c:28
Central, reentrant simulation context.
Definition SimulationContext.hpp:274
DPS configuration parameters (derived from SimulationOptions at init).
Definition DynamicWave.hpp:67
double alpha
Surcharge shock parameter (>= 2)
Definition DynamicWave.hpp:69
double c_pT_sq
c_pT^2 (pre-computed)
Definition DynamicWave.hpp:71
double c_pT
Target pressure celerity (ft/s, internal units)
Definition DynamicWave.hpp:68
double r
Decay time scale for P → 1 (seconds)
Definition DynamicWave.hpp:70
Definition DynamicWave.hpp:85
std::vector< uint8_t > surcharged
Currently surcharged flag.
Definition DynamicWave.hpp:94
std::vector< double > As
Accumulated slot area (ft²)
Definition DynamicWave.hpp:86
void resize(std::size_t n)
Definition DynamicWave.hpp:96
std::vector< double > P_hat_0
Initial P for unpressurized conduit.
Definition DynamicWave.hpp:91
std::vector< double > P_hat
Provisional Preissmann Number (before smoothing)
Definition DynamicWave.hpp:90
std::vector< double > P
Current Preissmann Number (smoothed)
Definition DynamicWave.hpp:89
std::vector< double > t_s
Time when element last became surcharged (sec)
Definition DynamicWave.hpp:93
std::vector< double > T_s_target
g · A_C / c_pT² (cached at init)
Definition DynamicWave.hpp:92
std::vector< double > hs_prev_iter
hs at start of current timestep (ft)
Definition DynamicWave.hpp:88
std::vector< double > hs
Current surcharge head (ft)
Definition DynamicWave.hpp:87
Definition DynamicWave.hpp:115
std::vector< double > dYdT
Definition DynamicWave.hpp:119
std::vector< double > old_surf_area
Surface area from last non-surcharged state.
Definition DynamicWave.hpp:117
std::vector< double > new_surf_area
Definition DynamicWave.hpp:116
void resize(std::size_t n)
Definition DynamicWave.hpp:123
std::vector< uint8_t > is_surcharged
TRUE when node depth > crown elevation.
Definition DynamicWave.hpp:121
std::vector< double > sumdqdh
Definition DynamicWave.hpp:118
std::vector< uint8_t > converged
Definition DynamicWave.hpp:120