OpenSWMM Engine  6.0.0-alpha.3
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.3)
Loading...
Searching...
No Matches
LID.hpp
Go to the documentation of this file.
1
25
26#ifndef OPENSWMM_LID_HPP
27#define OPENSWMM_LID_HPP
28
29#include <vector>
30#include <cstddef>
31
32namespace openswmm {
33
35
36namespace lid {
37
38// ============================================================================
39// LID type codes
40// ============================================================================
41
52
53// ============================================================================
54// Layer state (per LID unit)
55// ============================================================================
56
57constexpr int SURF = 0;
58constexpr int SOIL = 1;
59constexpr int STOR = 2;
60constexpr int PAVE = 3;
61constexpr int N_LAYERS = 4;
62
63// ============================================================================
64// LID unit parameters (SoA for batch processing)
65// ============================================================================
66
69 int count = 0;
70
71 std::vector<int> subcatch_idx;
72 std::vector<int> control_idx;
73 std::vector<double> area;
74 std::vector<double> from_imperv;
75 std::vector<double> from_perv;
76 std::vector<int> to_perv;
77 std::vector<int> drain_node;
78 std::vector<int> drain_subcatch;
79 std::vector<double> inflow;
80 std::vector<double> evap_rate_unit;
81
82 // Surface layer
83 std::vector<double> surf_store;
84 std::vector<double> surf_rough;
85 std::vector<double> surf_slope;
86
87 // Soil layer
88 std::vector<double> soil_thick;
89 std::vector<double> soil_poros;
90 std::vector<double> soil_fc;
91 std::vector<double> soil_wp;
92 std::vector<double> soil_ksat;
93 std::vector<double> soil_kslope;
94 std::vector<double> soil_suction;
95
96 // Storage layer
97 std::vector<double> stor_thick;
98 std::vector<double> stor_void;
99 std::vector<double> stor_ksat;
100 std::vector<double> stor_clog;
101 std::vector<int> stor_covered;
102
103 // Drain
104 std::vector<double> drain_coeff;
105 std::vector<double> drain_expon;
106 std::vector<double> drain_offset;
107 std::vector<double> drain_delay;
108 std::vector<double> drain_hopen;
109 std::vector<double> drain_hclose;
110 std::vector<int> drain_open;
111
112 // Pavement layer (PERM_PAVEMENT)
113 std::vector<double> pave_thick;
114 std::vector<double> pave_void;
115 std::vector<double> pave_imperv_frac;
116 std::vector<double> pave_ksat;
117 std::vector<double> pave_clog_factor;
118 std::vector<double> pave_regen_days;
119 std::vector<double> pave_regen_deg;
120 std::vector<double> next_regen_day;
121
122 // Drainage mat layer (GREEN_ROOF)
123 std::vector<double> drainmat_thick;
124 std::vector<double> drainmat_void;
125 std::vector<double> drainmat_rough;
126
127 // Surface geometry (for Manning's outflow)
128 std::vector<double> surf_void_frac;
129 std::vector<double> surf_alpha;
130 std::vector<double> surf_side_slope;
131 std::vector<double> full_width;
132 std::vector<double> dry_time;
133
134 // State variables (updated each step)
135 std::vector<double> surf_depth;
136 std::vector<double> soil_moist;
137 std::vector<double> stor_depth;
138 std::vector<double> pave_depth;
139
140 // Outputs (per unit)
141 std::vector<double> surface_runoff;
142 std::vector<double> drain_flow;
143 std::vector<double> evap_loss;
144 std::vector<double> infil_loss;
145
146 // Pollutant drain removal fractions: drain_rmvl[unit * n_pollutants + pollutant]
147 std::vector<double> drain_rmvl;
148 int n_pollutants = 0;
149
150 // Previous flux rates (for Modified Puls time weighting)
151 std::vector<double> f_old_surf;
152 std::vector<double> f_old_soil;
153 std::vector<double> f_old_stor;
154 std::vector<double> f_old_pave;
155
156 // Water balance tracking (cumulative per unit)
157 std::vector<double> wb_inflow;
158 std::vector<double> wb_evap;
159 std::vector<double> wb_infil;
160 std::vector<double> wb_surf_flow;
161 std::vector<double> wb_drain_flow;
162 std::vector<double> wb_init_vol;
163 std::vector<double> wb_final_vol;
164 std::vector<double> vol_treated;
165
166 void resize(int n);
167};
168
169// ============================================================================
170// LID solver
171// ============================================================================
172
174public:
175 void init(SimulationContext& ctx);
176
178 LIDGroupSoA& group(int type_index) { return groups_[static_cast<size_t>(type_index)]; }
179 const LIDGroupSoA& group(int type_index) const { return groups_[static_cast<size_t>(type_index)]; }
180 int numGroups() const { return static_cast<int>(groups_.size()); }
181
198 void execute(SimulationContext& ctx, double dt,
199 double rainfall, double evap_rate);
200
202 static void batchBioCellFlux(LIDGroupSoA& g, double rainfall,
203 const double* evap_rate, double dt);
204
206 static void batchBarrelFlux(LIDGroupSoA& g, double rainfall, double dt);
207
209 static void batchSwaleFlux(LIDGroupSoA& g, double rainfall,
210 const double* evap_rate, double dt);
211
213 static void batchGreenRoofFlux(LIDGroupSoA& g, double rainfall,
214 const double* evap_rate, double dt);
215
218 static void batchInfilTrenchFlux(LIDGroupSoA& g, double rainfall,
219 const double* evap_rate, double dt);
220
222 static void batchPavementFlux(LIDGroupSoA& g, double rainfall,
223 const double* evap_rate, double dt);
224
226 static void batchRoofDisconFlux(LIDGroupSoA& g, double rainfall,
227 const double* evap_rate, double dt);
228
231 static void batchSwaleModPuls(LIDGroupSoA& g, double rainfall,
232 const double* evap_rate, double dt);
233
234private:
235 std::vector<LIDGroupSoA> groups_;
236};
237
238} // namespace lid
239} // namespace openswmm
240
241#endif // OPENSWMM_LID_HPP
Definition LID.hpp:173
static void batchGreenRoofFlux(LIDGroupSoA &g, double rainfall, const double *evap_rate, double dt)
Batch green roof flux rates — VECTORISABLE.
Definition LID.cpp:793
int numGroups() const
Definition LID.hpp:180
void execute(SimulationContext &ctx, double dt, double rainfall, double evap_rate)
Compute LID performance for all units (batch by type).
Definition LID.cpp:1327
static void batchPavementFlux(LIDGroupSoA &g, double rainfall, const double *evap_rate, double dt)
Batch permeable pavement flux rates — VECTORISABLE.
Definition LID.cpp:969
static void batchSwaleFlux(LIDGroupSoA &g, double rainfall, const double *evap_rate, double dt)
Batch vegetative swale flux rates — VECTORISABLE.
Definition LID.cpp:652
static void batchSwaleModPuls(LIDGroupSoA &g, double rainfall, const double *evap_rate, double dt)
Definition LID.cpp:703
LIDGroupSoA & group(int type_index)
Access a type group (for testing or external queries).
Definition LID.hpp:178
const LIDGroupSoA & group(int type_index) const
Definition LID.hpp:179
static void batchInfilTrenchFlux(LIDGroupSoA &g, double rainfall, const double *evap_rate, double dt)
Definition LID.cpp:541
void init(SimulationContext &ctx)
Definition LID.cpp:162
static void batchBioCellFlux(LIDGroupSoA &g, double rainfall, const double *evap_rate, double dt)
Batch bio-cell flux rates — VECTORISABLE.
Definition LID.cpp:383
static void batchBarrelFlux(LIDGroupSoA &g, double rainfall, double dt)
Batch rain barrel flux rates — VECTORISABLE (simplest)
Definition LID.cpp:470
static void batchRoofDisconFlux(LIDGroupSoA &g, double rainfall, const double *evap_rate, double dt)
Batch roof disconnection flux rates — VECTORISABLE.
Definition LID.cpp:1257
Definition LID.cpp:18
constexpr int STOR
Definition LID.hpp:59
constexpr int SOIL
Definition LID.hpp:58
constexpr int N_LAYERS
Definition LID.hpp:61
LIDType
Definition LID.hpp:42
@ ROOF_DISCON
Definition LID.hpp:50
@ INFIL_TRENCH
Definition LID.hpp:46
@ VEG_SWALE
Definition LID.hpp:49
@ RAIN_BARREL
Definition LID.hpp:48
@ BIO_CELL
Definition LID.hpp:43
@ RAIN_GARDEN
Definition LID.hpp:44
@ GREEN_ROOF
Definition LID.hpp:45
@ PERM_PAVEMENT
Definition LID.hpp:47
constexpr int PAVE
Definition LID.hpp:60
constexpr int SURF
Definition LID.hpp:57
Definition NodeCoupling.cpp:15
Central, reentrant simulation context.
Definition SimulationContext.hpp:292
Definition LID.hpp:67
std::vector< double > soil_wp
Soil wilting point.
Definition LID.hpp:91
std::vector< double > pave_void
Pavement void fraction.
Definition LID.hpp:114
std::vector< double > pave_imperv_frac
Impervious fraction of pavement.
Definition LID.hpp:115
std::vector< double > surface_runoff
Definition LID.hpp:141
std::vector< double > soil_thick
Soil thickness (ft)
Definition LID.hpp:88
std::vector< double > wb_evap
Total evaporation volume (ft)
Definition LID.hpp:158
std::vector< int > control_idx
LID control index (into ctx.lid_controls)
Definition LID.hpp:72
std::vector< double > surf_alpha
Surface Manning alpha = sqrt(slope)/n.
Definition LID.hpp:129
std::vector< double > pave_regen_days
Pavement regeneration interval (days)
Definition LID.hpp:118
std::vector< int > drain_subcatch
Resolved drain-to subcatch index (-1=none)
Definition LID.hpp:78
std::vector< double > drain_coeff
Drain coefficient.
Definition LID.hpp:104
std::vector< double > drain_hopen
Head to open drain valve (ft)
Definition LID.hpp:108
std::vector< int > drain_node
Resolved drain-to node index (-1=none)
Definition LID.hpp:77
std::vector< double > inflow
Per-unit inflow rate (ft/sec) — set before execute()
Definition LID.hpp:79
std::vector< int > drain_open
Current drain valve state (1=open, 0=closed)
Definition LID.hpp:110
std::vector< double > f_old_stor
Previous storage flux rate.
Definition LID.hpp:153
std::vector< double > drain_hclose
Head to close drain valve (ft)
Definition LID.hpp:109
std::vector< double > drain_expon
Drain exponent.
Definition LID.hpp:105
std::vector< double > wb_surf_flow
Total surface outflow volume (ft)
Definition LID.hpp:160
std::vector< double > pave_thick
Pavement thickness (ft)
Definition LID.hpp:113
std::vector< double > surf_depth
Current surface ponded depth.
Definition LID.hpp:135
std::vector< double > pave_ksat
Pavement saturated K (ft/sec)
Definition LID.hpp:116
std::vector< double > stor_ksat
Storage exfiltration K (ft/sec)
Definition LID.hpp:99
std::vector< double > surf_slope
Surface slope.
Definition LID.hpp:85
std::vector< double > stor_void
Storage void fraction.
Definition LID.hpp:98
std::vector< double > wb_final_vol
Final stored volume (ft)
Definition LID.hpp:163
std::vector< double > soil_kslope
Conductivity slope.
Definition LID.hpp:93
int n_pollutants
Number of pollutants (for indexing drain_rmvl)
Definition LID.hpp:148
std::vector< double > soil_poros
Soil porosity.
Definition LID.hpp:89
std::vector< double > dry_time
Seconds since last rainfall.
Definition LID.hpp:132
std::vector< double > stor_thick
Storage thickness (ft)
Definition LID.hpp:97
std::vector< double > surf_store
Surface storage depth (ft)
Definition LID.hpp:83
std::vector< double > drainmat_thick
Drainage mat thickness (ft)
Definition LID.hpp:123
std::vector< double > soil_ksat
Soil saturated K (ft/sec)
Definition LID.hpp:92
std::vector< double > f_old_surf
Previous surface flux rate.
Definition LID.hpp:151
std::vector< double > drain_flow
Definition LID.hpp:142
void resize(int n)
Definition LID.cpp:61
std::vector< double > wb_infil
Total exfiltration volume (ft)
Definition LID.hpp:159
std::vector< double > wb_init_vol
Initial stored volume (ft)
Definition LID.hpp:162
std::vector< double > f_old_pave
Previous pavement flux rate.
Definition LID.hpp:154
std::vector< double > surf_rough
Surface Manning's n.
Definition LID.hpp:84
std::vector< double > soil_suction
Suction head for Green-Ampt (ft)
Definition LID.hpp:94
std::vector< double > pave_regen_deg
Pavement regeneration degree (0-1)
Definition LID.hpp:119
std::vector< double > full_width
Full width for Manning's flow (ft)
Definition LID.hpp:131
std::vector< double > wb_inflow
Total inflow volume (ft)
Definition LID.hpp:157
std::vector< double > f_old_soil
Previous soil flux rate.
Definition LID.hpp:152
std::vector< double > pave_clog_factor
Pavement clog factor (ft of treated volume)
Definition LID.hpp:117
std::vector< int > stor_covered
1 if rain barrel is covered (blocks rainfall)
Definition LID.hpp:101
std::vector< double > wb_drain_flow
Total drain outflow volume (ft)
Definition LID.hpp:161
std::vector< double > drainmat_rough
Drainage mat Manning's roughness.
Definition LID.hpp:125
std::vector< int > subcatch_idx
Which subcatchment this unit belongs to.
Definition LID.hpp:71
std::vector< double > pave_depth
Current pavement depth.
Definition LID.hpp:138
std::vector< double > stor_depth
Current storage depth.
Definition LID.hpp:137
std::vector< double > infil_loss
Definition LID.hpp:144
std::vector< double > surf_void_frac
Surface void fraction (default 1.0)
Definition LID.hpp:128
LIDType type
Definition LID.hpp:68
std::vector< double > evap_rate_unit
Per-unit effective PET rate (ft/sec) — filled by execute()
Definition LID.hpp:80
std::vector< int > to_perv
Route surface outflow to pervious area (1=yes)
Definition LID.hpp:76
std::vector< double > drain_delay
Drain delay time (sec, rain barrel)
Definition LID.hpp:107
std::vector< double > area
Unit area (ft2)
Definition LID.hpp:73
std::vector< double > evap_loss
Definition LID.hpp:143
int count
Definition LID.hpp:69
std::vector< double > from_perv
Fraction of pervious runoff treated (0-1)
Definition LID.hpp:75
std::vector< double > stor_clog
Storage clogging factor (ft)
Definition LID.hpp:100
std::vector< double > next_regen_day
Next day for pavement regeneration (OADate)
Definition LID.hpp:120
std::vector< double > soil_fc
Soil field capacity.
Definition LID.hpp:90
std::vector< double > surf_side_slope
Swale side slope (run/rise)
Definition LID.hpp:130
std::vector< double > vol_treated
Cumulative volume treated (ft, for clog model)
Definition LID.hpp:164
std::vector< double > drainmat_void
Drainage mat void fraction.
Definition LID.hpp:124
std::vector< double > from_imperv
Fraction of impervious runoff treated (0-1)
Definition LID.hpp:74
std::vector< double > drain_rmvl
Removal fraction per unit per pollutant.
Definition LID.hpp:147
std::vector< double > drain_offset
Drain offset depth (ft)
Definition LID.hpp:106
std::vector< double > soil_moist
Current soil moisture (0-porosity)
Definition LID.hpp:136