44#ifndef OPENSWMM_DYNAMIC_WAVE_HPP
45#define OPENSWMM_DYNAMIC_WAVE_HPP
104 std::vector<double>
As;
105 std::vector<double>
hs;
107 std::vector<double>
P;
129 P_hat.assign(n, 1.0);
254 void setNumThreads(
int n, std::vector<std::string>* warnings =
nullptr);
329 double courant_factor)
const;
367 friend class ::openswmm::Router;
371 int num_threads_ = 1;
377 bool any_conduit_seep_ =
false;
383 bool losses_all_zero_ =
true;
386 std::vector<int> conduit_idx_;
390 std::vector<uint8_t> is_open_;
391 std::vector<uint8_t> is_force_main_;
392 std::vector<uint8_t> has_losses_;
393 std::vector<double> barrels_d_;
394 std::vector<double> cached_length_;
395 std::vector<double> inv_length_;
412 std::vector<int> tile_uj_;
417 std::vector<int> tile_crow_;
418 std::vector<int> tile_n1_;
419 std::vector<int> tile_n2_;
420 std::vector<double> tile_inv1_elev_;
421 std::vector<double> tile_inv2_elev_;
422 std::vector<double> tile_z1_off_;
423 std::vector<double> tile_z2_off_;
424 std::vector<double> tile_y_full_;
425 std::vector<double> tile_a_full_;
426 std::vector<double> tile_r_full_;
427 std::vector<double> tile_w_max_;
430 std::vector<double> tile_inv_length_;
433 std::vector<double> tile_beta_;
434 std::vector<double> tile_q_max_;
435 std::vector<double> tile_rough_factor_;
436 std::vector<double> tile_barrels_d_;
437 std::vector<uint8_t> tile_is_open_;
438 std::vector<uint8_t> tile_is_force_main_;
439 std::vector<uint8_t> tile_is_closed_;
440 std::vector<uint8_t> tile_has_losses_;
441 std::vector<int> tile_xsect_batch_shape_;
442 std::vector<XsectShape> tile_shape_;
449 std::vector<uint8_t> tile_has_offset_;
454 std::vector<int> tile_uj_to_ci_;
457 std::vector<int> tile_culvert_code_;
458 std::vector<double> tile_slope_;
459 std::vector<double> tile_q_limit_;
460 std::vector<double> tile_loss_inlet_;
461 std::vector<double> tile_loss_outlet_;
462 std::vector<double> tile_loss_avg_;
463 std::vector<double> tile_roughness_;
468 std::vector<uint8_t> tile_has_flap_gate_;
469 std::vector<int8_t> tile_direction_;
485 double dt_gravity_ = 0.0;
487 bool last_converged_ =
false;
501 std::vector<double> wcap_d1_, wcap_d2_, wcap_dm_;
504 mutable double variable_step_ = 0.0;
510 std::vector<double> area1_;
511 std::vector<double> area2_;
512 std::vector<double> area_mid_;
513 std::vector<double> hrad_mid_;
514 std::vector<double> width_mid_;
515 std::vector<double> depth1_;
516 std::vector<double> depth2_;
517 std::vector<double> depth_mid_;
520 std::vector<double> velocity_;
521 std::vector<double> froude_;
522 std::vector<double> sigma_;
523 std::vector<double> dqdh_;
524 std::vector<double> new_flow_;
528 std::vector<double> q1_;
531 std::vector<double> area_old_;
535 std::vector<uint8_t> bypassed_;
553 std::vector<int> csr_row_;
554 std::vector<int32_t> csr_link_;
555 std::vector<uint8_t> csr_is_n2_;
556 std::vector<uint8_t> csr_other_outfall_;
566 int link_a = -1, link_b = -1;
567 int up_link = -1, dn_link = -1;
572 double sigma_j = 1.0;
573 double a_up_mid = 0.0;
574 double r_up_mid = 0.0;
580 double resid_max = 0.0;
581 double resid_sum = 0.0;
582 long long resid_n = 0;
584 std::vector<VJuncPair> vjunc_;
588 std::vector<int32_t> vj_pair_n1_;
589 std::vector<int32_t> vj_pair_n2_;
599 static constexpr double kVjWetSeedFrac = 0.02;
600 std::vector<double> vj_wet_floor_;
656 double rpt_full_volume;
662 std::vector<NodeTile> node_tile_;
670 std::vector<double> surf_area1_;
671 std::vector<double> surf_area2_;
674 std::vector<double> hrad1_;
675 std::vector<double> width1_;
676 std::vector<double> width2_;
680 std::vector<double> h1_;
681 std::vector<double> h2_;
682 std::vector<double> fasnh_;
685 std::vector<double> aa_y_prev_;
686 std::vector<double> aa_g_prev_;
687 std::vector<double> aa_r_prev_;
688 std::vector<uint8_t> aa_skip_;
693 std::vector<MomentumCategory> category_;
816 void processManningLink(
SimulationContext& ctx,
double dt,
int step, std::size_t uj,
847 void traceLinkTerms(
const SimulationContext& ctx, std::size_t uj,
double qLast,
double v,
848 double sig,
double rho,
double aWtd,
double rWtd,
double dq1,
double dq2,
849 double dq3,
double dq4,
double dq5,
double dq6,
double qOld,
double q,
869 void processForceMainLink(
SimulationContext& ctx,
double dt,
int step, std::size_t uj,
896 void applyFlowLimits(
SimulationContext& ctx,
double dt,
int step, std::size_t uj,
double& q,
897 double qLast,
double barrels_d,
bool isFull);
968 void updateNodeDepthsTeam(
SimulationContext& ctx,
double dt,
int step,
int& unconv_shared);
1007 void commitNodeDepthState(
SimulationContext& ctx,
int node_idx,
double y_new,
double dV,
1046 return xnode_.is_surcharged[
static_cast<std::size_t
>(idx)];
1071 const auto uj =
static_cast<std::size_t
>(j);
1072 return uj < bypassed_.size() && bypassed_[uj] != 0;
1084 double&
nodeSumDqdh(
int n) {
return xnode_.sumdqdh[
static_cast<std::size_t
>(n)]; }
1100 setNodeDepth(ctx, node_idx, dt, step);
1128 double getSlotWidth(
double y,
double y_full,
double w_max,
XsectShape shape)
const;
1133 double getCrownCutoff()
const;
1138 double sim_time_ = 0.0;
1156 std::vector<double> tpa_w_;
1161 std::vector<uint8_t> tpa_latch_;
1163 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.
Top-level routing orchestrator.
Definition Routing.hpp:101
Shape-grouped cross-section manager for batch computation.
Definition XSectBatch.hpp:447
Dynamic wave solver — operates on entire link/node system.
Definition DynamicWave.hpp:218
double tpa_celerity
Definition DynamicWave.hpp:348
double evap_rate
Definition DynamicWave.hpp:364
std::vector< int > uf_nb_dn_
Definition DynamicWave.hpp:359
void setNumThreads(int n, std::vector< std::string > *warnings=nullptr)
Set the number of OpenMP threads for parallel loops.
Definition DynamicWave.cpp:1294
SurchargeMethod surcharge_method
Definition DynamicWave.hpp:334
void init(int n_nodes, int n_links, const XSectGroups &groups, const SimulationContext &ctx)
Allocate and initialize dynamic-wave working state for a resolved network.
Definition DynamicWave.cpp:540
double uf_k3
Brunone-type k3; consumed only when active.
Definition DynamicWave.hpp:343
bool isBypassed(int j) const
Check whether a link holds its previous Picard flow/geometry this iteration.
Definition DynamicWave.hpp:1070
DPSLinkArrays & dpsStateMut()
Mutable access to DPS state for tests that need to seed slot conditions.
Definition DynamicWave.hpp:1111
std::vector< int8_t > uf_sg_up_
Definition DynamicWave.hpp:360
std::vector< int > uf_nb_up_
Definition DynamicWave.hpp:359
const DPSLinkArrays & dpsState() const
Read-only access to DPS per-conduit state arrays (for tests/diagnostics).
Definition DynamicWave.hpp:1107
bool lastConverged() const
Report the final Picard convergence flag from the most recent execute.
Definition DynamicWave.hpp:294
double head_tol
Definition DynamicWave.hpp:331
void accumulateLinkStepStats(SimulationContext &ctx, double dt, double fixed_step, double courant_factor) const
Record convergence and timestep summaries for conduit reporting.
Definition DynamicWave.cpp:4868
int unsteady_friction
Definition DynamicWave.hpp:342
NodeContinuity node_continuity
Definition DynamicWave.hpp:335
const DPSConfig & dpsConfig() const
Read-only access to DPS configuration (for tests/diagnostics).
Definition DynamicWave.hpp:1109
bool anderson_accel
Enable Anderson acceleration.
Definition DynamicWave.hpp:336
double omega
Definition DynamicWave.hpp:333
int execute(SimulationContext &ctx, double dt, NonConduitFlowFunc non_conduit_fn=nullptr)
Advance one dynamic-wave routing interval through the bounded Picard loop.
Definition DynamicWave.cpp:1326
std::vector< int8_t > uf_sg_dn_
+1 same sense, -1 opposed
Definition DynamicWave.hpp:360
double & nodeSumDqdh(int n)
Borrow mutable node flow/head sensitivity accumulation.
Definition DynamicWave.hpp:1084
uint8_t & nodeSurchargedFlag(int idx)
Borrow mutable per-node surcharge diagnostic state.
Definition DynamicWave.hpp:1045
void setNodeDepthForTest(SimulationContext &ctx, int node_idx, double dt, int step)
Apply the private continuity update directly for a test fixture.
Definition DynamicWave.hpp:1099
double * nodeNewSurfAreaDataMut()
Borrow writable per-node Picard surface-area accumulation storage.
Definition DynamicWave.hpp:1058
int max_trials
Definition DynamicWave.hpp:332
double getRoutingStep(SimulationContext &ctx, double fixed_step, double courant_factor)
Compute the next native routing interval from link/node/virtual-pair constraints.
Definition DynamicWave.cpp:4664
std::function< void(SimulationContext &, double, int)> NonConduitFlowFunc
Definition DynamicWave.hpp:258
const std::vector< uint8_t > & aaSkipFlags() const
Access per-node AA skip flags (read-only, for testing/diagnostics).
Definition DynamicWave.hpp:1104
bool isInitialized() const noexcept
Check whether the node head-sensitivity working array is nonempty.
Definition DynamicWave.hpp:1034
constexpr double MIN_SURFAREA
Definition Constants.hpp:95
constexpr double DEFAULT_HEAD_TOL
Definition Constants.hpp:128
constexpr double FUDGE
Definition Constants.hpp:91
constexpr double EXTRAN_CROWN_CUTOFF
Definition Constants.hpp:144
constexpr double MAX_VELOCITY
Definition Constants.hpp:136
constexpr double SLOT_WIDTH_FACTOR
Preissmann slot width factor (slot_width = y_full * this factor).
Definition Constants.hpp:150
constexpr double OMEGA
Definition Constants.hpp:124
constexpr int DEFAULT_MAX_TRIALS
Definition Constants.hpp:132
constexpr double MIN_TIMESTEP
Definition Constants.hpp:140
constexpr double SLOT_CROWN_CUTOFF
Preissmann slot crown cutoff fraction.
Definition Constants.hpp:147
Definition DynamicWave.cpp:127
constexpr double DEFAULT_HEAD_TOL
Definition Constants.hpp:128
constexpr double OMEGA
Definition Constants.hpp:124
constexpr int DEFAULT_MAX_TRIALS
Definition Constants.hpp:132
SurchargeMethod
Surcharge method: EXTRAN (classic) or SLOT (Preissmann).
Definition DynamicWave.hpp:182
@ SLOT
Preissmann slot — fictitious narrow slot above crown.
Definition DynamicWave.hpp:184
@ TPA
Definition DynamicWave.hpp:187
@ DYNAMIC_SLOT
Dynamic slot — slot width varies with flow conditions (experimental) Sharior, S., Hodges,...
Definition DynamicWave.hpp:185
@ EXTRAN
Classic EXTRAN approach — dQ/dH for surcharged nodes.
Definition DynamicWave.hpp:183
MomentumCategory
Momentum category for branch-free per-category kernel dispatch.
Definition DynamicWave.hpp:200
@ MANNING_OPEN
Standard Manning, open channel (Froude-based sigma)
Definition DynamicWave.hpp:202
@ MANNING_CLOSED_FULL
Manning, closed conduit, surcharged (fr=0, sig=0)
Definition DynamicWave.hpp:204
@ FORCE_MAIN_HW
Force main, Hazen-Williams friction.
Definition DynamicWave.hpp:205
@ FORCE_MAIN_DW
Force main, Darcy-Weisbach friction.
Definition DynamicWave.hpp:206
@ MANNING_CLOSED_FS
Manning, closed conduit, free surface.
Definition DynamicWave.hpp:203
@ N_CATEGORIES
Definition DynamicWave.hpp:207
@ SKIP_DRY
DRY/UP_DRY/DN_DRY, aMid<=FUDGE, or is_closed.
Definition DynamicWave.hpp:201
Definition ExchangeLaw.hpp:60
NodeContinuity
Node continuity formulation for depth update.
Definition SimulationOptions.hpp:145
@ EXPLICIT
Classic explicit two-branch (default)
Definition SimulationOptions.hpp:146
XsectShape
Conduit cross-section shape code.
Definition LinkData.hpp:64
double * y
Definition odesolve.c:37
Central, reentrant simulation context.
Definition SimulationContext.hpp:390
DPS configuration parameters (derived from SimulationOptions at init).
Definition DynamicWave.hpp:85
double alpha
Surcharge shock parameter (>= 2)
Definition DynamicWave.hpp:87
double c_pT_sq
c_pT^2 (pre-computed)
Definition DynamicWave.hpp:89
double c_pT
Target pressure celerity (ft/s, internal units)
Definition DynamicWave.hpp:86
double r
Decay time scale for P → 1 (seconds)
Definition DynamicWave.hpp:88
Definition DynamicWave.hpp:103
std::vector< uint8_t > surcharged
Currently surcharged flag.
Definition DynamicWave.hpp:112
std::vector< double > As
Accumulated slot area (ft²)
Definition DynamicWave.hpp:104
void resize(std::size_t n)
Reset every conduit DPS history array to the requested length.
Definition DynamicWave.hpp:124
std::vector< double > P_hat_0
Initial P for unpressurized conduit.
Definition DynamicWave.hpp:109
std::vector< double > P_hat
Provisional Preissmann Number (before smoothing)
Definition DynamicWave.hpp:108
std::vector< double > P
Current Preissmann Number (smoothed)
Definition DynamicWave.hpp:107
std::vector< double > t_s
Time when element last became surcharged (sec)
Definition DynamicWave.hpp:111
std::vector< double > T_s_target
g · A_C / c_pT² (cached at init)
Definition DynamicWave.hpp:110
std::vector< double > hs_prev_iter
hs at start of current timestep (ft)
Definition DynamicWave.hpp:106
std::vector< double > hs
Current surcharge head (ft)
Definition DynamicWave.hpp:105
Definition DynamicWave.hpp:143
std::vector< double > loss_factor
Affordable fraction of conduit loss.
Definition DynamicWave.hpp:149
std::vector< double > dYdT
Definition DynamicWave.hpp:147
std::vector< double > old_surf_area
Surface area from last non-surcharged state.
Definition DynamicWave.hpp:145
std::vector< double > conduit_loss
Incident net conduit loss (cfs)
Definition DynamicWave.hpp:148
std::vector< double > new_surf_area
Definition DynamicWave.hpp:144
void resize(std::size_t n)
Reset per-node Picard geometry, derivative and convergence state.
Definition DynamicWave.hpp:162
std::vector< uint8_t > is_surcharged
TRUE when node depth > crown elevation.
Definition DynamicWave.hpp:151
std::vector< double > sumdqdh
Definition DynamicWave.hpp:146
std::vector< uint8_t > converged
Definition DynamicWave.hpp:150