44#ifndef OPENSWMM_DYNAMIC_WAVE_HPP
45#define OPENSWMM_DYNAMIC_WAVE_HPP
103 std::vector<double>
As;
104 std::vector<double>
hs;
106 std::vector<double>
P;
118 P_hat.assign(n, 1.0);
212 void setNumThreads(
int n, std::vector<std::string>* warnings =
nullptr);
242 double fixed_step,
double courant_factor);
283 int num_threads_ = 1;
289 bool any_conduit_seep_ =
false;
295 bool losses_all_zero_ =
true;
298 std::vector<int> conduit_idx_;
302 std::vector<uint8_t> is_open_;
303 std::vector<uint8_t> is_force_main_;
304 std::vector<uint8_t> has_losses_;
305 std::vector<double> barrels_d_;
306 std::vector<double> cached_length_;
307 std::vector<double> inv_length_;
324 std::vector<int> tile_uj_;
325 std::vector<int> tile_n1_;
326 std::vector<int> tile_n2_;
327 std::vector<double> tile_inv1_elev_;
328 std::vector<double> tile_inv2_elev_;
329 std::vector<double> tile_z1_off_;
330 std::vector<double> tile_z2_off_;
331 std::vector<double> tile_y_full_;
332 std::vector<double> tile_a_full_;
333 std::vector<double> tile_r_full_;
334 std::vector<double> tile_w_max_;
335 std::vector<double> tile_length_;
336 std::vector<double> tile_inv_length_;
337 std::vector<double> tile_links_length_;
338 std::vector<double> tile_beta_;
339 std::vector<double> tile_q_max_;
340 std::vector<double> tile_rough_factor_;
341 std::vector<double> tile_barrels_d_;
342 std::vector<uint8_t> tile_is_open_;
343 std::vector<uint8_t> tile_is_force_main_;
344 std::vector<uint8_t> tile_is_closed_;
345 std::vector<uint8_t> tile_has_losses_;
346 std::vector<int> tile_xsect_batch_shape_;
347 std::vector<XsectShape> tile_shape_;
354 std::vector<uint8_t> tile_has_offset_;
359 std::vector<int> tile_uj_to_ci_;
362 std::vector<int> tile_culvert_code_;
363 std::vector<double> tile_slope_;
364 std::vector<double> tile_q_limit_;
365 std::vector<double> tile_loss_inlet_;
366 std::vector<double> tile_loss_outlet_;
367 std::vector<double> tile_loss_avg_;
368 std::vector<double> tile_roughness_;
369 std::vector<double> tile_fm_sbot_;
370 std::vector<double> tile_fm_rbot_;
371 std::vector<uint8_t> tile_has_flap_gate_;
372 std::vector<int8_t> tile_direction_;
380 double dt_gravity_ = 0.0;
382 bool last_converged_ =
false;
396 std::vector<double> wcap_d1_, wcap_d2_, wcap_dm_;
399 mutable double variable_step_ = 0.0;
405 std::vector<double> area1_;
406 std::vector<double> area2_;
407 std::vector<double> area_mid_;
408 std::vector<double> hrad_mid_;
409 std::vector<double> width_mid_;
410 std::vector<double> depth1_;
411 std::vector<double> depth2_;
412 std::vector<double> depth_mid_;
415 std::vector<double> velocity_;
416 std::vector<double> froude_;
417 std::vector<double> sigma_;
418 std::vector<double> dqdh_;
419 std::vector<double> new_flow_;
422 std::vector<double> area_old_;
426 std::vector<uint8_t> bypassed_;
444 std::vector<int> csr_row_;
445 std::vector<int32_t> csr_link_;
446 std::vector<uint8_t> csr_is_n2_;
447 std::vector<uint8_t> csr_other_outfall_;
457 int link_a = -1, link_b = -1;
458 int up_link = -1, dn_link = -1;
463 double sigma_j = 1.0;
464 double a_up_mid = 0.0;
465 double r_up_mid = 0.0;
471 double resid_max = 0.0;
472 double resid_sum = 0.0;
473 long long resid_n = 0;
475 std::vector<VJuncPair> vjunc_;
479 std::vector<int32_t> vj_pair_n1_;
480 std::vector<int32_t> vj_pair_n2_;
490 static constexpr double kVjWetSeedFrac = 0.02;
491 std::vector<double> vj_wet_floor_;
522 std::vector<NodeTile> node_tile_;
530 std::vector<double> surf_area1_;
531 std::vector<double> surf_area2_;
534 std::vector<double> hrad1_;
535 std::vector<double> width1_;
536 std::vector<double> width2_;
540 std::vector<double> h1_;
541 std::vector<double> h2_;
542 std::vector<double> fasnh_;
545 std::vector<double> aa_y_prev_;
546 std::vector<double> aa_g_prev_;
547 std::vector<double> aa_r_prev_;
548 std::vector<uint8_t> aa_skip_;
554 std::vector<MomentumCategory> category_;
588 std::size_t uj,
double& q,
double qLast,
589 double barrels_d,
bool isFull);
621 double y_new,
double dV,
double dt);
650 const auto uj =
static_cast<std::size_t
>(j);
651 return uj < bypassed_.size() && bypassed_[uj] != 0;
657 double&
nodeSumDqdh(
int n) {
return xnode_.sumdqdh[
static_cast<std::size_t
>(n)]; }
665 setNodeDepth(ctx, node_idx, dt, step);
669 const std::vector<uint8_t>&
aaSkipFlags()
const {
return aa_skip_; }
680 double getSlotWidth(
double y,
double y_full,
double w_max,
XsectShape shape)
const;
681 double getCrownCutoff()
const;
686 double sim_time_ = 0.0;
693 std::vector<double> tpa_w_;
698 std::vector<uint8_t> tpa_latch_;
700 std::vector<uint8_t> tpa_latch_changed_;
Global physical, numerical, and model constants for OpenSWMM Engine.
Structure-of-Arrays (SoA) storage for all link types.
Structure-of-Arrays (SoA) storage for all node types.
Simulation options parsed from the [OPTIONS] section.
Cross-section geometry — unified batch + per-element API.
Shape-grouped cross-section manager for batch computation.
Definition XSectBatch.hpp:243
Dynamic wave solver — operates on entire link/node system.
Definition DynamicWave.hpp:193
double tpa_celerity
Definition DynamicWave.hpp:261
double evap_rate
Definition DynamicWave.hpp:277
std::vector< int > uf_nb_dn_
Definition DynamicWave.hpp:272
void setNumThreads(int n, std::vector< std::string > *warnings=nullptr)
Set the number of OpenMP threads for parallel loops.
Definition DynamicWave.cpp:1209
SurchargeMethod surcharge_method
Definition DynamicWave.hpp:247
void init(int n_nodes, int n_links, const XSectGroups &groups, const SimulationContext &ctx)
Definition DynamicWave.cpp:491
double uf_k3
Brunone-type k3; consumed only when active.
Definition DynamicWave.hpp:256
bool isBypassed(int j) const
Definition DynamicWave.hpp:649
DPSLinkArrays & dpsStateMut()
Mutable access to DPS state for tests that need to seed slot conditions.
Definition DynamicWave.hpp:676
std::vector< int8_t > uf_sg_up_
Definition DynamicWave.hpp:273
std::vector< int > uf_nb_up_
Definition DynamicWave.hpp:272
const DPSLinkArrays & dpsState() const
Read-only access to DPS per-conduit state arrays (for tests/diagnostics).
Definition DynamicWave.hpp:672
bool lastConverged() const
Definition DynamicWave.hpp:234
double head_tol
Definition DynamicWave.hpp:244
int unsteady_friction
Definition DynamicWave.hpp:255
NodeContinuity node_continuity
Definition DynamicWave.hpp:248
const DPSConfig & dpsConfig() const
Read-only access to DPS configuration (for tests/diagnostics).
Definition DynamicWave.hpp:674
bool anderson_accel
Enable Anderson acceleration.
Definition DynamicWave.hpp:249
double omega
Definition DynamicWave.hpp:246
int execute(SimulationContext &ctx, double dt, NonConduitFlowFunc non_conduit_fn=nullptr)
Execute one DW routing timestep.
Definition DynamicWave.cpp:1240
std::vector< int8_t > uf_sg_dn_
+1 same sense, -1 opposed
Definition DynamicWave.hpp:273
double & nodeSumDqdh(int n)
Definition DynamicWave.hpp:657
uint8_t & nodeSurchargedFlag(int idx)
Direct write access to the per-node is_surcharged flag (for tests/non-conduit scatter).
Definition DynamicWave.hpp:636
void setNodeDepthForTest(SimulationContext &ctx, int node_idx, double dt, int step)
Definition DynamicWave.hpp:663
double * nodeNewSurfAreaDataMut()
Definition DynamicWave.hpp:640
int max_trials
Definition DynamicWave.hpp:245
double getRoutingStep(SimulationContext &ctx, double fixed_step, double courant_factor)
Compute CFL-based variable timestep.
Definition DynamicWave.cpp:4007
std::function< void(SimulationContext &, double, int)> NonConduitFlowFunc
Definition DynamicWave.hpp:216
const std::vector< uint8_t > & aaSkipFlags() const
Access per-node AA skip flags (read-only, for testing/diagnostics).
Definition DynamicWave.hpp:669
bool isInitialized() const noexcept
Definition DynamicWave.hpp:633
constexpr double MIN_SURFAREA
Definition Constants.hpp:95
constexpr double DEFAULT_HEAD_TOL
Definition Constants.hpp:121
constexpr double FUDGE
Definition Constants.hpp:91
constexpr double EXTRAN_CROWN_CUTOFF
Definition Constants.hpp:137
constexpr double MAX_VELOCITY
Definition Constants.hpp:129
constexpr double SLOT_WIDTH_FACTOR
Preissmann slot width factor (slot_width = y_full * this factor).
Definition Constants.hpp:143
constexpr double OMEGA
Definition Constants.hpp:117
constexpr int DEFAULT_MAX_TRIALS
Definition Constants.hpp:125
constexpr double MIN_TIMESTEP
Definition Constants.hpp:133
constexpr double SLOT_CROWN_CUTOFF
Preissmann slot crown cutoff fraction.
Definition Constants.hpp:140
Definition DynamicWave.cpp:97
constexpr double DEFAULT_HEAD_TOL
Definition Constants.hpp:121
constexpr double OMEGA
Definition Constants.hpp:117
constexpr int DEFAULT_MAX_TRIALS
Definition Constants.hpp:125
SurchargeMethod
Surcharge method: EXTRAN (classic) or SLOT (Preissmann).
Definition DynamicWave.hpp:158
@ SLOT
Preissmann slot — fictitious narrow slot above crown.
Definition DynamicWave.hpp:160
@ TPA
Definition DynamicWave.hpp:162
@ DYNAMIC_SLOT
Dynamic slot — slot width varies with flow conditions (experimental) Sharior, S., Hodges,...
Definition DynamicWave.hpp:161
@ EXTRAN
Classic EXTRAN approach — dQ/dH for surcharged nodes.
Definition DynamicWave.hpp:159
MomentumCategory
Momentum category for branch-free per-category kernel dispatch.
Definition DynamicWave.hpp:175
@ MANNING_OPEN
Standard Manning, open channel (Froude-based sigma)
Definition DynamicWave.hpp:177
@ MANNING_CLOSED_FULL
Manning, closed conduit, surcharged (fr=0, sig=0)
Definition DynamicWave.hpp:179
@ FORCE_MAIN_HW
Force main, Hazen-Williams friction.
Definition DynamicWave.hpp:180
@ FORCE_MAIN_DW
Force main, Darcy-Weisbach friction.
Definition DynamicWave.hpp:181
@ MANNING_CLOSED_FS
Manning, closed conduit, free surface.
Definition DynamicWave.hpp:178
@ N_CATEGORIES
Definition DynamicWave.hpp:182
@ SKIP_DRY
DRY/UP_DRY/DN_DRY, aMid<=FUDGE, or is_closed.
Definition DynamicWave.hpp:176
Definition NodeCoupling.cpp:16
NodeContinuity
Node continuity formulation for depth update.
Definition SimulationOptions.hpp:143
@ EXPLICIT
Classic explicit two-branch (default)
Definition SimulationOptions.hpp:144
XsectShape
Conduit cross-section shape code.
Definition LinkData.hpp:70
double * y
Definition odesolve.c:28
Central, reentrant simulation context.
Definition SimulationContext.hpp:353
DPS configuration parameters (derived from SimulationOptions at init).
Definition DynamicWave.hpp:84
double alpha
Surcharge shock parameter (>= 2)
Definition DynamicWave.hpp:86
double c_pT_sq
c_pT^2 (pre-computed)
Definition DynamicWave.hpp:88
double c_pT
Target pressure celerity (ft/s, internal units)
Definition DynamicWave.hpp:85
double r
Decay time scale for P → 1 (seconds)
Definition DynamicWave.hpp:87
Definition DynamicWave.hpp:102
std::vector< uint8_t > surcharged
Currently surcharged flag.
Definition DynamicWave.hpp:111
std::vector< double > As
Accumulated slot area (ft²)
Definition DynamicWave.hpp:103
void resize(std::size_t n)
Definition DynamicWave.hpp:113
std::vector< double > P_hat_0
Initial P for unpressurized conduit.
Definition DynamicWave.hpp:108
std::vector< double > P_hat
Provisional Preissmann Number (before smoothing)
Definition DynamicWave.hpp:107
std::vector< double > P
Current Preissmann Number (smoothed)
Definition DynamicWave.hpp:106
std::vector< double > t_s
Time when element last became surcharged (sec)
Definition DynamicWave.hpp:110
std::vector< double > T_s_target
g · A_C / c_pT² (cached at init)
Definition DynamicWave.hpp:109
std::vector< double > hs_prev_iter
hs at start of current timestep (ft)
Definition DynamicWave.hpp:105
std::vector< double > hs
Current surcharge head (ft)
Definition DynamicWave.hpp:104
Definition DynamicWave.hpp:132
std::vector< double > dYdT
Definition DynamicWave.hpp:136
std::vector< double > old_surf_area
Surface area from last non-surcharged state.
Definition DynamicWave.hpp:134
std::vector< double > new_surf_area
Definition DynamicWave.hpp:133
void resize(std::size_t n)
Definition DynamicWave.hpp:140
std::vector< uint8_t > is_surcharged
TRUE when node depth > crown elevation.
Definition DynamicWave.hpp:138
std::vector< double > sumdqdh
Definition DynamicWave.hpp:135
std::vector< uint8_t > converged
Definition DynamicWave.hpp:137