39#ifndef OPENSWMM_ENGINE_LINK_SUBTYPES_HPP
40#define OPENSWMM_ENGINE_LINK_SUBTYPES_HPP
88 int count() const noexcept {
return static_cast<int>(
link_idx.size()); }
100 const auto un =
static_cast<std::size_t
>(n);
112 const auto p =
static_cast<std::ptrdiff_t
>(
134 return static_cast<int>(p);
138 const auto p =
static_cast<std::ptrdiff_t
>(r);
182 const auto un =
static_cast<std::size_t
>(n);
188 const auto p =
static_cast<std::ptrdiff_t
>(
196 return static_cast<int>(p);
200 const auto p =
static_cast<std::ptrdiff_t
>(r);
217 std::vector<double>
cd;
226 const auto un =
static_cast<std::size_t
>(n);
230 const auto p =
static_cast<std::ptrdiff_t
>(
234 cd.insert(
cd.begin() + p, 0.0);
236 return static_cast<int>(p);
239 const auto p =
static_cast<std::ptrdiff_t
>(r);
242 cd.erase(
cd.begin() + p);
254 std::vector<double>
cd;
268 const auto un =
static_cast<std::size_t
>(n);
274 const auto p =
static_cast<std::ptrdiff_t
>(
278 cd.insert(
cd.begin() + p, 0.0);
281 cd2.insert(
cd2.begin() + p, 0.0);
283 return static_cast<int>(p);
286 const auto p =
static_cast<std::ptrdiff_t
>(r);
289 cd.erase(
cd.begin() + p);
292 cd2.erase(
cd2.begin() + p);
318 const auto un =
static_cast<std::size_t
>(n);
323 const auto p =
static_cast<std::ptrdiff_t
>(
331 return static_cast<int>(p);
334 const auto p =
static_cast<std::ptrdiff_t
>(r);
373 const int n = L.
count();
374 for (
int i = 0; i < n; ++i) {
375 switch (L.
type[
static_cast<std::size_t
>(i)]) {
393 subtype_row.assign(
static_cast<std::size_t
>(n_links), -1);
394 auto idx = [&](
const std::vector<int>& keys) {
395 for (
int r = 0; r < static_cast<int>(keys.size()); ++r)
396 subtype_row[
static_cast<std::size_t
>(keys[
static_cast<std::size_t
>(r)])] = r;
406 const auto ui =
static_cast<std::size_t
>(i);
408 subtype_row.resize(
static_cast<std::size_t
>(i) + 1, -1);
412 if (old == t && existing >= 0)
415 bool shifted =
false;
432 if (row !=
conduits.count() - 1) shifted =
true;
break;
434 if (row !=
pumps.count() - 1) shifted =
true;
break;
436 if (row !=
orifices.count() - 1) shifted =
true;
break;
438 if (row !=
weirs.count() - 1) shifted =
true;
break;
440 if (row !=
outlets.count() - 1) shifted =
true;
break;
454 auto drop = [i](
auto& tbl) ->
bool {
455 for (
int r = 0; r < tbl.count(); ++r)
456 if (tbl.link_idx[
static_cast<std::size_t
>(r)] == i) { tbl.erase_at(r);
return true; }
461 auto shift = [i](std::vector<int>& keys) {
for (
auto& k : keys)
if (k > i) --k; };
476 int row_in(
int i,
const std::vector<int>& keys)
const noexcept {
477 if (i >= 0 && i <
static_cast<int>(
subtype_row.size())) {
478 const int r =
subtype_row[
static_cast<std::size_t
>(i)];
479 if (r >= 0 && r <
static_cast<int>(keys.size()) &&
480 keys[
static_cast<std::size_t
>(r)] == i)
Structure-of-Arrays (SoA) storage for all link types.
Definition NodeCoupling.cpp:15
LinkType
Link type codes.
Definition LinkData.hpp:42
@ CONDUIT
Definition LinkData.hpp:43
@ PUMP
Definition LinkData.hpp:44
@ WEIR
Definition LinkData.hpp:46
@ ORIFICE
Definition LinkData.hpp:45
@ OUTLET
Definition LinkData.hpp:47
Dense SoA for conduit-only properties (one row per CONDUIT link).
Definition LinkSubtypes.hpp:63
std::vector< int > link_idx
Base LinkData index (join key)
Definition LinkSubtypes.hpp:64
int add_default(int i)
Definition LinkSubtypes.hpp:111
void erase_at(int r)
Definition LinkSubtypes.hpp:137
void clear() noexcept
Definition LinkSubtypes.hpp:90
std::vector< double > evap_loss_rate
per-step evaporation loss
Definition LinkSubtypes.hpp:82
std::vector< double > beta
Definition LinkSubtypes.hpp:71
std::vector< double > roughness
Definition LinkSubtypes.hpp:66
std::vector< int > culvert_code
Definition LinkSubtypes.hpp:79
std::vector< double > rough_factor
Definition LinkSubtypes.hpp:72
std::vector< double > q_full
Definition LinkSubtypes.hpp:73
std::vector< double > mod_length
Definition LinkSubtypes.hpp:69
int count() const noexcept
Definition LinkSubtypes.hpp:88
std::vector< int8_t > full_state
per-step up/down full bitmask
Definition LinkSubtypes.hpp:86
std::vector< double > loss_outlet
Definition LinkSubtypes.hpp:76
std::vector< int > barrels
Definition LinkSubtypes.hpp:70
std::vector< double > loss_avg
Definition LinkSubtypes.hpp:77
std::vector< double > q_max
Definition LinkSubtypes.hpp:74
void reserve(int n)
Definition LinkSubtypes.hpp:99
std::vector< double > loss_inlet
Definition LinkSubtypes.hpp:75
std::vector< double > seep_loss_rate
per-step seepage loss
Definition LinkSubtypes.hpp:83
std::vector< uint8_t > normal_flow_limited
per-step flag (reset each step)
Definition LinkSubtypes.hpp:84
std::vector< double > slope
Definition LinkSubtypes.hpp:68
std::vector< double > length
Definition LinkSubtypes.hpp:67
std::vector< double > seep_rate
Definition LinkSubtypes.hpp:78
std::vector< uint8_t > inlet_control
per-step culvert inlet-control flag
Definition LinkSubtypes.hpp:85
Structure-of-Arrays storage for all links.
Definition LinkData.hpp:109
int count() const noexcept
Definition LinkData.hpp:539
std::vector< LinkType > type
Link type.
Definition LinkData.hpp:116
Owns the five link subtype side-tables plus the reverse index map.
Definition LinkSubtypes.hpp:354
WeirData weirs
Definition LinkSubtypes.hpp:358
int set_link_type(LinkData &links, int i, LinkType t)
Definition LinkSubtypes.hpp:405
OrificeData orifices
Definition LinkSubtypes.hpp:357
PumpData pumps
Definition LinkSubtypes.hpp:356
void clear() noexcept
Definition LinkSubtypes.hpp:386
int pump_row(int i) const noexcept
Definition LinkSubtypes.hpp:470
std::vector< int > subtype_row
base link index → row in its subtype table (-1 if unset).
Definition LinkSubtypes.hpp:362
void build_default_rows(const LinkData &L)
Create a fresh default subtype row for every link, keyed by links.type[i], and rebuild the reverse in...
Definition LinkSubtypes.hpp:371
OutletData outlets
Definition LinkSubtypes.hpp:359
int outlet_row(int i) const noexcept
Definition LinkSubtypes.hpp:473
ConduitData conduits
Definition LinkSubtypes.hpp:355
int conduit_row(int i) const noexcept
Definition LinkSubtypes.hpp:469
int weir_row(int i) const noexcept
Definition LinkSubtypes.hpp:472
int orifice_row(int i) const noexcept
Definition LinkSubtypes.hpp:471
void erase_link(int i, int n_after)
Definition LinkSubtypes.hpp:453
void rebuild_index(int n_links)
Recompute subtype_row from each table's link_idx (no row data touched).
Definition LinkSubtypes.hpp:392
Definition LinkSubtypes.hpp:214
void reserve(int n)
Definition LinkSubtypes.hpp:225
std::vector< double > orate
Open/close time (s)
Definition LinkSubtypes.hpp:218
void erase_at(int r)
Definition LinkSubtypes.hpp:238
int count() const noexcept
Definition LinkSubtypes.hpp:220
std::vector< int > link_idx
Definition LinkSubtypes.hpp:215
std::vector< double > orifice_type
0 = BOTTOM, 1 = SIDE (legacy param1)
Definition LinkSubtypes.hpp:216
void clear() noexcept
Definition LinkSubtypes.hpp:222
int add_default(int i)
Definition LinkSubtypes.hpp:229
std::vector< double > cd
Discharge coefficient.
Definition LinkSubtypes.hpp:217
Definition LinkSubtypes.hpp:303
std::vector< double > crest_height
Offset/crest.
Definition LinkSubtypes.hpp:306
int count() const noexcept
Definition LinkSubtypes.hpp:311
std::vector< int > link_idx
Definition LinkSubtypes.hpp:304
void erase_at(int r)
Definition LinkSubtypes.hpp:333
void reserve(int n)
Definition LinkSubtypes.hpp:317
std::vector< double > expon
Functional C2 exponent (legacy param2)
Definition LinkSubtypes.hpp:308
std::vector< double > outlet_type
Rating type (legacy param1)
Definition LinkSubtypes.hpp:305
std::vector< double > coeff
Functional C1 (legacy cd)
Definition LinkSubtypes.hpp:307
void clear() noexcept
Definition LinkSubtypes.hpp:313
int add_default(int i)
Definition LinkSubtypes.hpp:322
std::vector< int > curve
TABULAR rating-curve index (legacy pump_curve reuse; -1 = functional)
Definition LinkSubtypes.hpp:309
Definition LinkSubtypes.hpp:166
void reserve(int n)
Definition LinkSubtypes.hpp:181
std::vector< int > curve_type
Pump curve type (1-5, 6=ideal; -1 unset)
Definition LinkSubtypes.hpp:172
std::vector< uint8_t > init_state
Initial on/off (was vector<bool>)
Definition LinkSubtypes.hpp:169
void erase_at(int r)
Definition LinkSubtypes.hpp:199
std::vector< double > shutoff
Shutoff depth.
Definition LinkSubtypes.hpp:171
std::vector< double > startup
Startup depth.
Definition LinkSubtypes.hpp:170
std::vector< int > link_idx
Definition LinkSubtypes.hpp:167
int add_default(int i)
Definition LinkSubtypes.hpp:187
int count() const noexcept
Definition LinkSubtypes.hpp:174
void clear() noexcept
Definition LinkSubtypes.hpp:176
std::vector< int > curve
Pump curve table index (-1 = ideal)
Definition LinkSubtypes.hpp:168
Definition LinkSubtypes.hpp:251
void reserve(int n)
Definition LinkSubtypes.hpp:267
void clear() noexcept
Definition LinkSubtypes.hpp:262
std::vector< double > crest_height
Definition LinkSubtypes.hpp:256
void erase_at(int r)
Definition LinkSubtypes.hpp:285
std::vector< double > cd2
End-section discharge coeff (legacy cDisch2)
Definition LinkSubtypes.hpp:257
std::vector< uint8_t > can_surcharge
Surcharge YES/NO (legacy Weir.canSurcharge, default YES)
Definition LinkSubtypes.hpp:258
std::vector< double > weir_type
TRANSVERSE/SIDEFLOW/V-NOTCH/TRAPEZOIDAL (legacy param1)
Definition LinkSubtypes.hpp:253
std::vector< double > cd
Discharge coefficient.
Definition LinkSubtypes.hpp:254
int add_default(int i)
Definition LinkSubtypes.hpp:273
std::vector< int > link_idx
Definition LinkSubtypes.hpp:252
std::vector< double > end_contractions
End contractions (legacy param2)
Definition LinkSubtypes.hpp:255
int count() const noexcept
Definition LinkSubtypes.hpp:260