OpenSWMM Engine  6.0.0-alpha.1
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.1)
Loading...
Searching...
No Matches
SimulationContext.hpp
Go to the documentation of this file.
1
60#ifndef OPENSWMM_ENGINE_SIMULATION_CONTEXT_HPP
61#define OPENSWMM_ENGINE_SIMULATION_CONTEXT_HPP
62
63#include <cmath>
64#include <functional>
65#include "../data/GageData.hpp"
66#include "../data/LinkData.hpp"
67#include "../data/NameIndex.hpp"
68#include "../data/NodeData.hpp"
69#include "../data/PollutantData.hpp"
70#include "../data/SubcatchData.hpp"
71#include "../data/TableData.hpp"
72#include "SimulationOptions.hpp"
73#include "SpatialFrame.hpp"
74#include "UserFlags.hpp"
75#include "../data/QualityData.hpp"
76#include "../data/InflowData.hpp"
77#include "../data/InfraData.hpp"
78#include "../hydraulics/Transect.hpp"
79#include "../data/HydrologyData.hpp"
80#include "../data/ForcingData.hpp"
81#include "../hydrology/Climate.hpp"
82
83#include <algorithm>
84#include <cstdint>
85#include <string>
86#include <vector>
87
88namespace openswmm {
89
90// ============================================================================
91// Plugin specification (from [PLUGINS] section)
92// ============================================================================
93
104 std::string path;
105 std::vector<std::string> init_args;
106};
107
108// ============================================================================
109// [FILES] section spec — secondary file references
110// ============================================================================
111
121enum class FileMode {
122 NONE,
123 SAVE,
124 USE
125};
126
148 std::string path;
151 double datetime = 0.0;
152};
153
154struct FilesSpec {
156 std::string rainfall_path;
157
159 std::string runoff_path;
160
162 std::string rdii_path;
163
165 std::string inflows_path;
166
168 std::string outflows_path;
169
171 std::string hotstart_use_path;
172
176 std::vector<HotstartSaveEntry> hotstart_saves;
177
180 [[nodiscard]] bool has_any() const noexcept {
184 || !inflows_path.empty()
185 || !outflows_path.empty()
186 || !hotstart_use_path.empty()
187 || !hotstart_saves.empty();
188 }
189};
190
191// ============================================================================
192// Engine state enumeration
193// ============================================================================
194
203enum class EngineState : int32_t {
204 CREATED = 0,
205 OPENED = 1,
206 INITIALIZED = 2,
207 RUNNING = 3,
208 PAUSED = 4,
209 ENDED = 5,
210 REPORTED = 6,
211 CLOSED = 7,
212 ERROR_STATE = 8,
213 BUILDING = 9
214};
215
216// ============================================================================
217// StateAccessors
218// ============================================================================
219
239 std::function<bool(int subcatch_index, int& out_model, double* out_infil)> get_infil_state;
240
243 std::function<bool(int subcatch_index, int model, const double* infil)> set_infil_state;
244
246 std::function<bool(int subcatch_index, double& out_theta, double& out_lower_depth)> get_gw_state;
247
249 std::function<bool(int subcatch_index, double theta, double lower_depth)> set_gw_state;
250
252 bool can_read() const noexcept {
253 return static_cast<bool>(get_infil_state) || static_cast<bool>(get_gw_state);
254 }
255
257 bool can_write() const noexcept {
258 return static_cast<bool>(set_infil_state) || static_cast<bool>(set_gw_state);
259 }
260};
261
262// ============================================================================
263// SimulationContext
264// ============================================================================
265
275
276 // =========================================================================
277 // Engine state
278 // =========================================================================
279
282
283 // =========================================================================
284 // Project title / notes
285 // =========================================================================
286
296 std::vector<std::string> title_notes;
297
298 // =========================================================================
299 // Options & configuration
300 // =========================================================================
301
307
320
321 // =========================================================================
322 // Simulation clock
323 // =========================================================================
324
343 double current_time = 0.0;
344
352 double current_date = 0.0;
353
363
371
372 // =========================================================================
373 // Object data stores (Structure-of-Arrays)
374 // =========================================================================
375
381
387
393
399
405
411
412 // =========================================================================
413 // Name-to-index lookup (O(1))
414 // =========================================================================
415
421
427
433
439
445
451
452 // =========================================================================
453 // Quality data (landuse, buildup, washoff, treatment)
454 // =========================================================================
455
461
462 // =========================================================================
463 // Inflow data (external, DWF, RDII, patterns)
464 // =========================================================================
465
472
473 // =========================================================================
474 // Infrastructure data (transects, streets, inlets, controls)
475 // =========================================================================
476
479 std::vector<transect::TransectData> transect_tables;
484
485 // =========================================================================
486 // Events (from [EVENTS] section)
487 // =========================================================================
488
494 struct Event {
495 double start = 0.0;
496 double end = 0.0;
497 };
498 std::vector<Event> events;
499
500 // =========================================================================
501 // Subcatchment adjustment patterns (from [ADJUSTMENTS] section)
502 // =========================================================================
503
510 double adjust_temp[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
511 double adjust_evap[12] = {1,1,1,1,1,1,1,1,1,1,1,1};
512 double adjust_rain[12] = {1,1,1,1,1,1,1,1,1,1,1,1};
513 double adjust_hydcon[12] = {1,1,1,1,1,1,1,1,1,1,1,1};
514
520 std::vector<int> subcatch_n_perv_pattern;
521 std::vector<int> subcatch_d_store_pattern;
522 std::vector<int> subcatch_infil_pattern;
523
525 std::vector<double> base_n_perv;
526 std::vector<double> base_ds_perv;
528
529 // =========================================================================
530 // Hydrology data (snowpacks, aquifers, LID)
531 // =========================================================================
532
540
541 // =========================================================================
542 // Spatial data
543 // =========================================================================
544
550
551 // =========================================================================
552 // User-defined flags
553 // =========================================================================
554
561
562 // =========================================================================
563 // Object tags (from [TAGS] section)
564 // =========================================================================
565
566 // Tags from the [TAGS] section now live per-index on
567 // NodeData::tags / LinkData::tags / SubcatchData::tags. Storing
568 // them name-keyed here was a latent rename bug — a tagged node
569 // would lose its tag the moment `swmm_node_rename` was called.
570
571 // =========================================================================
572 // Runtime forcing data
573 // =========================================================================
574
584
585 // =========================================================================
586 // Plugin specifications (from [PLUGINS] section)
587 // =========================================================================
588
594 std::vector<PluginSpec> plugin_specs;
595
605
615
616 // =========================================================================
617 // Error / warning tracking
618 // =========================================================================
619
624 int error_code = 0;
625
631
635 std::string error_message;
636
644 std::vector<std::string> warnings;
645
653 std::vector<std::string> errors;
654
655 // =========================================================================
656 // Mass balance accumulators (SoA — vectorisable batch updates)
657 // =========================================================================
658
668 struct MassBalance {
669 // Runoff totals
670 double runoff_rainfall = 0.0;
671 double runoff_evap = 0.0;
672 double runoff_infil = 0.0;
673 double runoff_runoff = 0.0;
674 double runoff_snowremov = 0.0;
675 double runoff_init_store = 0.0;
676 double runoff_final_store= 0.0;
677
678 // Routing totals
681 double routing_gw_inflow = 0.0;
682 double routing_rdii = 0.0;
683 double routing_external = 0.0;
684 double routing_flooding = 0.0;
685 double routing_outflow = 0.0;
686 double routing_evap_loss = 0.0;
687 double routing_seep_loss = 0.0;
690
691 // User-forced volumes (diagnostic — subset of routing_external)
693
694 // User-forced quality mass (diagnostic — cumulative mass injected via user_conc_mass_flux)
695 std::vector<double> routing_forcing_qual_inflow;
696
697 // Groundwater mass balance totals (all in feet — depth per unit area)
698 // Matches legacy TGwaterTotals
699 double gw_infil = 0.0;
700 double gw_upper_evap = 0.0;
701 double gw_lower_evap = 0.0;
702 double gw_lower_perc = 0.0;
703 double gw_lateral_flow = 0.0;
704 double gw_init_storage = 0.0;
705 double gw_final_storage = 0.0;
706
707 // Per-step accumulators (reset each step for reporting)
708 double step_flooding = 0.0;
709 double step_outflow = 0.0;
710 double step_dw_inflow = 0.0;
711 double step_gw_inflow = 0.0;
712 double step_rdii_inflow = 0.0;
713 double step_ext_inflow = 0.0;
714
715 // Quality mass balance (per-pollutant, in mass units)
716 std::vector<double> qual_init_buildup;
717 std::vector<double> qual_final_buildup;
718 std::vector<double> qual_surface_buildup;
719 std::vector<double> qual_wet_deposition;
720 std::vector<double> qual_sweeping;
721 std::vector<double> qual_bmp_removal;
722 std::vector<double> qual_infil_loss;
723 std::vector<double> qual_runoff_load;
724 std::vector<double> qual_routing_wet;
725 std::vector<double> qual_routing_outflow;
726 std::vector<double> qual_routing_flood;
727 std::vector<double> qual_routing_init;
728 std::vector<double> qual_routing_final;
729 std::vector<double> qual_routing_reacted;
730 std::vector<double> qual_routing_ii_in;
731 std::vector<double> qual_routing_seep;
732 std::vector<double> qual_routing_evap;
733
735 auto np = static_cast<std::size_t>(n_pollutants);
736 qual_init_buildup.assign(np, 0.0);
737 qual_final_buildup.assign(np, 0.0);
738 qual_surface_buildup.assign(np, 0.0);
739 qual_wet_deposition.assign(np, 0.0);
740 qual_sweeping.assign(np, 0.0);
741 qual_bmp_removal.assign(np, 0.0);
742 qual_infil_loss.assign(np, 0.0);
743 qual_runoff_load.assign(np, 0.0);
744 qual_routing_wet.assign(np, 0.0);
745 qual_routing_outflow.assign(np, 0.0);
746 qual_routing_flood.assign(np, 0.0);
747 qual_routing_init.assign(np, 0.0);
748 qual_routing_final.assign(np, 0.0);
749 qual_routing_reacted.assign(np, 0.0);
750 qual_routing_ii_in.assign(np, 0.0);
751 qual_routing_seep.assign(np, 0.0);
752 qual_routing_evap.assign(np, 0.0);
753 routing_forcing_qual_inflow.assign(np, 0.0);
754 }
755
756 void reset() {
757 // Save quality vectors, reset scalars, restore vectors
758 auto qi = std::move(qual_init_buildup);
759 auto qf = std::move(qual_final_buildup);
760 auto qsb = std::move(qual_surface_buildup);
761 auto qwd = std::move(qual_wet_deposition);
762 auto qsw = std::move(qual_sweeping);
763 auto qbmp = std::move(qual_bmp_removal);
764 auto qil = std::move(qual_infil_loss);
765 auto qrl = std::move(qual_runoff_load);
766 auto qrw = std::move(qual_routing_wet);
767 auto qro = std::move(qual_routing_outflow);
768 auto qrf = std::move(qual_routing_flood);
769 auto qri = std::move(qual_routing_init);
770 auto qrfi = std::move(qual_routing_final);
771 auto qrr = std::move(qual_routing_reacted);
772 auto qrii = std::move(qual_routing_ii_in);
773 auto qrseep = std::move(qual_routing_seep);
774 auto qrevap = std::move(qual_routing_evap);
775 auto qrfqi = std::move(routing_forcing_qual_inflow);
776 *this = MassBalance{};
777 qual_init_buildup = std::move(qi);
778 qual_final_buildup = std::move(qf);
779 qual_surface_buildup = std::move(qsb);
780 qual_wet_deposition = std::move(qwd);
781 qual_sweeping = std::move(qsw);
782 qual_bmp_removal = std::move(qbmp);
783 qual_infil_loss = std::move(qil);
784 qual_runoff_load = std::move(qrl);
785 qual_routing_wet = std::move(qrw);
786 qual_routing_outflow = std::move(qro);
787 qual_routing_flood = std::move(qrf);
788 qual_routing_init = std::move(qri);
789 qual_routing_final = std::move(qrfi);
790 qual_routing_reacted = std::move(qrr);
791 qual_routing_ii_in = std::move(qrii);
792 qual_routing_seep = std::move(qrseep);
793 qual_routing_evap = std::move(qrevap);
794 routing_forcing_qual_inflow = std::move(qrfqi);
795 // Zero out the quality vectors (except init_buildup which is
796 // computed once during initQuality and must survive reset)
797 for (auto* v : {&qual_final_buildup,
808 std::fill(v->begin(), v->end(), 0.0);
809 }
810 }
811
813 double runoff_error() const {
814 double total_in = runoff_rainfall + runoff_init_store;
816 return (total_in > 0.0) ? (total_in - total_out) / total_in : 0.0;
817 }
818
820 double routing_error() const {
821 double total_in = routing_dry_weather + routing_wet_weather +
824 double total_out = routing_flooding + routing_outflow +
827 return (total_in > 0.0) ? (total_in - total_out) / total_in : 0.0;
828 }
829
831 double gw_error() const {
832 double total_in = gw_infil + gw_init_storage;
833 double total_out = gw_upper_evap + gw_lower_evap + gw_lower_perc +
835 return (total_in > 0.0) ? (total_in - total_out) / total_in : 0.0;
836 }
838
839 // =========================================================================
840 // Routing time-step statistics
841 // =========================================================================
842
844 struct MaxStats {
845 int obj_type = -1;
846 int index = -1;
847 double value = 0.0;
848 };
849
850 static constexpr int MAX_STATS = 5;
851
860
862 double min_step = 1.0e30;
863 double max_step = 0.0;
864 double sum_step = 0.0;
865 long n_steps = 0;
866 double steady_pct = 0.0;
867
869 static constexpr int N_TIME_BINS = 5;
870 long step_counts[N_TIME_BINS + 1] = {};
871 double step_intervals[N_TIME_BINS + 1] = {};
872
875 double sum_iterations = 0.0;
876 double max_courant = 0.0;
877
878 void update(double dt) {
879 min_step = std::min(min_step, dt);
880 max_step = std::max(max_step, dt);
881 sum_step += dt;
882 ++n_steps;
883 }
884
886 void update_iterations(int iters, bool converged) {
887 sum_iterations += iters;
888 if (!converged) ++n_non_converged;
889 }
890
894 void init_histogram(double route_step, double min_route_step) {
895 if (route_step <= 0.0) return;
896 if (min_route_step <= 0.0) min_route_step = route_step;
897 double log_hi = std::log10(route_step);
898 double log_lo = std::log10(min_route_step);
899 double delta = (log_hi - log_lo) / static_cast<double>(N_TIME_BINS);
900 step_intervals[0] = route_step;
901 for (int i = 1; i <= N_TIME_BINS; ++i)
902 step_intervals[i] = std::pow(10.0, log_hi - i * delta);
903 step_intervals[N_TIME_BINS] = min_route_step;
904 }
905
909 if (n_steps == 0 || max_step <= 0.0) return;
910 double hi = max_step;
911 double lo = (min_step < 1.0e30) ? min_step : 0.0;
912 if (lo <= 0.0) lo = hi;
913 init_histogram(hi, lo);
914 }
915
917 void record_step_bin(double dt) {
918 for (int i = 0; i < N_TIME_BINS; ++i) {
919 if (dt >= step_intervals[i+1]) {
920 step_counts[i]++;
921 return;
922 }
923 }
925 }
926
927 double avg_step() const {
928 return (n_steps > 0) ? sum_step / static_cast<double>(n_steps) : 0.0;
929 }
930
931 double pct_non_converged() const {
932 return (n_steps > 0) ? 100.0 * static_cast<double>(n_non_converged) / static_cast<double>(n_steps) : 0.0;
933 }
934
935 double computed_avg_iterations() const {
936 return (n_steps > 0) ? sum_iterations / static_cast<double>(n_steps) : 0.0;
937 }
939
940 // =========================================================================
941 // Control action log — Gap #67
942 // Populated by ControlEngine::applyPendingActions() when rpt_controls is on.
943 // =========================================================================
944
948 std::string rule_name;
949 double new_setting;
950 double date;
951 };
952
954 std::vector<ControlLogEntry> control_log;
955
956 // =========================================================================
957 // Input file path (for model write / hot start)
958 // =========================================================================
959
964 std::string inp_file_path;
965
966 // =========================================================================
967 // Context-level operations
968 // =========================================================================
969
974 static void updateMaxStats(MaxStats arr[], int obj_type, int idx, double value) {
975 MaxStats candidate;
976 candidate.obj_type = obj_type;
977 candidate.index = idx;
978 candidate.value = value;
979 for (int k = 0; k < MAX_STATS; ++k) {
980 if (std::fabs(candidate.value) > std::fabs(arr[k].value)) {
981 MaxStats tmp = arr[k];
982 arr[k] = candidate;
983 candidate = tmp;
984 }
985 }
986 }
987
994 long step_count = routing_stats.n_steps;
995 if (step_count <= 0) return;
996 double inv_steps = 1.0 / static_cast<double>(step_count);
997
998 // CFL-critical elements: percentage of steps each element was critical
999 for (int j = 0; j < n_nodes(); ++j) {
1000 double x = nodes.stat_time_courant_critical[static_cast<std::size_t>(j)] * inv_steps;
1001 updateMaxStats(max_courant_crit, 0, j, 100.0 * x);
1002 }
1003 for (int j = 0; j < n_links(); ++j) {
1004 double x = links.stat_time_courant_critical[static_cast<std::size_t>(j)] * inv_steps;
1005 updateMaxStats(max_courant_crit, 1, j, 100.0 * x);
1006 }
1007
1008 // Flow instability index (matching legacy normalization)
1009 long rpt_steps = routing_stats.n_steps;
1010 if (rpt_steps > 2) {
1011 double z = 100.0 / (2.0 / 3.0 * static_cast<double>(rpt_steps - 2));
1012 for (int j = 0; j < n_links(); ++j) {
1013 double x = static_cast<double>(links.stat_flow_turns[static_cast<std::size_t>(j)]) * z;
1015 }
1016 }
1017
1018 // Non-convergence: fraction of total steps each node failed to converge
1019 for (int j = 0; j < n_nodes(); ++j) {
1020 double x = static_cast<double>(nodes.stat_non_converged_count[static_cast<std::size_t>(j)]) * inv_steps;
1022 }
1023 }
1024
1032 void reset() {
1034 control_log.clear();
1035 current_time = 0.0;
1036 current_date = 0.0;
1037 dt_output_remaining = 0.0;
1039 error_code = 0;
1040 warning_code = 0;
1041 error_message.clear();
1042 warnings.clear();
1043 errors.clear();
1044 title_notes.clear();
1045
1046 // Clear SoA stores
1047 nodes = NodeData{};
1048 links = LinkData{};
1050 gages = GageData{};
1052 tables = TableData{};
1053
1054 // Clear name indices
1055 node_names.clear();
1056 link_names.clear();
1058 gage_names.clear();
1061
1062 // Clear inflow-related stores that aren't reset by their owning solvers
1064
1065 // Clear daily climate state (re-initialized by SWMMEngine on next run)
1067
1068 // Clear spatial, flags, events, and forcing. Per-object tags
1069 // are owned by NodeData/LinkData/SubcatchData and cleared when
1070 // those SoAs are resized/cleared by the wider reset path.
1072 user_flags.clear();
1073 events.clear();
1074 std::fill(std::begin(adjust_temp), std::end(adjust_temp), 0.0);
1075 std::fill(std::begin(adjust_evap), std::end(adjust_evap), 1.0);
1076 std::fill(std::begin(adjust_rain), std::end(adjust_rain), 1.0);
1077 std::fill(std::begin(adjust_hydcon), std::end(adjust_hydcon), 1.0);
1080 subcatch_infil_pattern.clear();
1081 base_n_perv.clear();
1082 base_ds_perv.clear();
1084 forcing = ForcingData{};
1085 }
1086
1093 void save_state() noexcept {
1094 nodes.save_state();
1095 links.save_state();
1097 }
1098
1116
1133 int np = static_cast<int>(pollutant_names.size());
1137
1138 // Resize spatial coordinate arrays
1139 spatial.node_x.assign(static_cast<std::size_t>(node_names.size()), 0.0);
1140 spatial.node_y.assign(static_cast<std::size_t>(node_names.size()), 0.0);
1141 spatial.link_x.assign(static_cast<std::size_t>(link_names.size()), 0.0);
1142 spatial.link_y.assign(static_cast<std::size_t>(link_names.size()), 0.0);
1143 spatial.subcatch_x.assign(static_cast<std::size_t>(subcatch_names.size()), 0.0);
1144 spatial.subcatch_y.assign(static_cast<std::size_t>(subcatch_names.size()), 0.0);
1145
1146 // Resize link vertex and subcatchment polygon arrays
1147 spatial.link_vertices_x.resize(static_cast<std::size_t>(link_names.size()));
1148 spatial.link_vertices_y.resize(static_cast<std::size_t>(link_names.size()));
1149 spatial.subcatch_polygon_x.resize(static_cast<std::size_t>(subcatch_names.size()));
1150 spatial.subcatch_polygon_y.resize(static_cast<std::size_t>(subcatch_names.size()));
1151
1152 // Resize gage coordinates
1153 spatial.gage_x.assign(static_cast<std::size_t>(gage_names.size()), 0.0);
1154 spatial.gage_y.assign(static_cast<std::size_t>(gage_names.size()), 0.0);
1155 }
1156
1177
1178 // =========================================================================
1179 // Convenience accessors
1180 // =========================================================================
1181
1183 int n_nodes() const noexcept { return node_names.size(); }
1184
1186 int n_links() const noexcept { return link_names.size(); }
1187
1189 int n_subcatches() const noexcept { return subcatch_names.size(); }
1190
1192 int n_gages() const noexcept { return gage_names.size(); }
1193
1195 int n_pollutants() const noexcept { return pollutant_names.size(); }
1196 int n_landuses() const noexcept { return landuse_names.size(); }
1197
1199 int n_tables() const noexcept { return table_names.size(); }
1200};
1201
1202} /* namespace openswmm */
1203
1204#endif /* OPENSWMM_ENGINE_SIMULATION_CONTEXT_HPP */
Simulation options parsed from the [OPTIONS] section.
Spatial frame — CRS specification and coordinate data for nodes/links.
User-defined model flags (InfoWorks ICM-style, two-section design).
Bidirectional name↔index registry for SWMM objects.
Definition NameIndex.hpp:45
int size() const noexcept
Number of registered names.
Definition NameIndex.hpp:109
void clear() noexcept
Remove all entries.
Definition NameIndex.hpp:123
Stores the full user-flags data: schema definitions + per-object values.
Definition UserFlags.hpp:127
void clear() noexcept
Clear both schema definitions and per-object value assignments.
Definition UserFlags.hpp:246
FileMode
Mode keyword for one [FILES] row — SAVE or USE.
Definition SimulationContext.hpp:121
EngineState
High-level engine lifecycle state.
Definition SimulationContext.hpp:203
@ CLOSED
Resources released.
@ ENDED
Simulation loop completed.
@ ERROR_STATE
Fatal error; call swmm_engine_last_error()
@ RUNNING
Simulation loop in progress.
@ REPORTED
Summary report written.
@ BUILDING
Programmatic model construction in progress (no .inp)
@ CREATED
Context allocated, no input loaded.
@ PAUSED
Simulation paused (future hot-swap support)
@ INITIALIZED
Initial conditions applied.
@ OPENED
Input file parsed, objects allocated.
Definition NodeCoupling.cpp:15
SoA storage for aquifer parameter sets.
Definition HydrologyData.hpp:66
Definition QualityData.hpp:63
void shrink_to_fit()
Definition QualityData.hpp:85
Definition InfraData.hpp:123
Definition InflowData.hpp:68
Definition InflowData.hpp:27
Definition SimulationContext.hpp:154
FileMode runoff_mode
Definition SimulationContext.hpp:158
std::string runoff_path
Definition SimulationContext.hpp:159
std::string inflows_path
Legacy semantics: USE only.
Definition SimulationContext.hpp:165
FileMode rainfall_mode
Definition SimulationContext.hpp:155
std::vector< HotstartSaveEntry > hotstart_saves
Definition SimulationContext.hpp:176
std::string rdii_path
Definition SimulationContext.hpp:162
bool has_any() const noexcept
Definition SimulationContext.hpp:180
std::string outflows_path
Legacy semantics: SAVE only.
Definition SimulationContext.hpp:168
std::string hotstart_use_path
Legacy semantics: USE — single hot-start input file.
Definition SimulationContext.hpp:171
FileMode rdii_mode
Definition SimulationContext.hpp:161
std::string rainfall_path
Definition SimulationContext.hpp:156
Definition ForcingData.hpp:52
Structure-of-Arrays storage for all rain gages.
Definition GageData.hpp:75
void reset_state() noexcept
Definition GageData.hpp:315
void shrink_to_fit()
Release excess vector capacity accumulated during parsing.
Definition GageData.hpp:290
void resize(int n)
Definition GageData.hpp:211
Configuration parsed from the [FILES] section.
Definition SimulationContext.hpp:147
double datetime
Definition SimulationContext.hpp:151
std::string path
Definition SimulationContext.hpp:148
Definition InfraData.hpp:74
Definition InfraData.hpp:90
Definition QualityData.hpp:29
void shrink_to_fit()
Definition QualityData.hpp:51
SoA storage for LID control type definitions.
Definition HydrologyData.hpp:99
SoA storage for LID usage assignments to subcatchments.
Definition HydrologyData.hpp:140
Structure-of-Arrays storage for all nodes.
Definition NodeData.hpp:90
std::vector< double > stat_time_courant_critical
CFL time-step critical count per node.
Definition NodeData.hpp:598
void reset_state() noexcept
Reset state variables, applying init_depth from input.
Definition NodeData.hpp:996
void shrink_to_fit()
Release excess vector capacity accumulated during parsing.
Definition NodeData.hpp:882
void save_state() noexcept
Snapshot current state into old-step arrays before solving.
Definition NodeData.hpp:979
void resize(int n)
Resize all arrays to hold exactly n nodes.
Definition NodeData.hpp:623
std::vector< int > stat_non_converged_count
Count of non-converging steps per node.
Definition NodeData.hpp:589
void resize_quality(int n_pollutants)
Resize per-node quality arrays after pollutant count is known.
Definition NodeData.hpp:861
Definition InflowData.hpp:197
One plugin entry from the [PLUGINS] section.
Definition SimulationContext.hpp:103
std::string path
Shared library path.
Definition SimulationContext.hpp:104
std::vector< std::string > init_args
Extra tokens from the [PLUGINS] row.
Definition SimulationContext.hpp:105
Static properties for each pollutant species.
Definition PollutantData.hpp:55
void shrink_to_fit()
Release excess vector capacity.
Definition PollutantData.hpp:152
void resize_pollutants(int n)
Resize pollutant definition arrays to hold n pollutants.
Definition PollutantData.hpp:136
Definition InflowData.hpp:105
Definition InflowData.hpp:185
One entry per control rule action that changed a link setting.
Definition SimulationContext.hpp:946
double new_setting
The new target setting value (0-1)
Definition SimulationContext.hpp:949
std::string rule_name
Name of the rule that triggered the change.
Definition SimulationContext.hpp:948
double date
OADate when the change occurred.
Definition SimulationContext.hpp:950
int link_idx
Index of the link whose setting changed.
Definition SimulationContext.hpp:947
Event time periods for event-based analysis/reporting.
Definition SimulationContext.hpp:494
double end
Event end (DateTime decimal days)
Definition SimulationContext.hpp:496
double start
Event start (DateTime decimal days)
Definition SimulationContext.hpp:495
Cumulative mass balance totals for runoff and routing.
Definition SimulationContext.hpp:668
double routing_rdii
Definition SimulationContext.hpp:682
double gw_infil
Cumulative infiltration to GW (ft)
Definition SimulationContext.hpp:699
double routing_gw_inflow
Definition SimulationContext.hpp:681
double routing_init_storage
Definition SimulationContext.hpp:688
double routing_evap_loss
Definition SimulationContext.hpp:686
std::vector< double > qual_surface_buildup
Accumulated buildup during sim.
Definition SimulationContext.hpp:718
double routing_dry_weather
Definition SimulationContext.hpp:679
std::vector< double > qual_routing_final
Final stored quality mass.
Definition SimulationContext.hpp:728
double runoff_runoff
Total surface runoff volume (ft3)
Definition SimulationContext.hpp:673
std::vector< double > qual_init_buildup
Initial buildup mass.
Definition SimulationContext.hpp:716
std::vector< double > qual_routing_init
Initial stored quality mass.
Definition SimulationContext.hpp:727
std::vector< double > qual_runoff_load
Mass load in surface runoff.
Definition SimulationContext.hpp:723
std::vector< double > qual_final_buildup
Final buildup mass.
Definition SimulationContext.hpp:717
double routing_final_storage
Definition SimulationContext.hpp:689
double runoff_init_store
Initial surface storage (ft3)
Definition SimulationContext.hpp:675
double gw_lower_perc
Cumulative deep percolation (ft)
Definition SimulationContext.hpp:702
double routing_seep_loss
Definition SimulationContext.hpp:687
std::vector< double > qual_routing_flood
Quality mass lost to flooding.
Definition SimulationContext.hpp:726
double runoff_snowremov
Total snow removal volume (ft3)
Definition SimulationContext.hpp:674
double gw_upper_evap
Cumulative upper zone evaporation (ft)
Definition SimulationContext.hpp:700
double routing_external
Definition SimulationContext.hpp:683
std::vector< double > qual_infil_loss
Mass lost to infiltration.
Definition SimulationContext.hpp:722
double runoff_final_store
Final surface storage (ft3)
Definition SimulationContext.hpp:676
std::vector< double > qual_routing_reacted
Quality mass lost to decay.
Definition SimulationContext.hpp:729
double routing_wet_weather
Definition SimulationContext.hpp:680
std::vector< double > qual_wet_deposition
Wet deposition mass.
Definition SimulationContext.hpp:719
double gw_final_storage
Final GW storage (ft)
Definition SimulationContext.hpp:705
std::vector< double > qual_routing_seep
Quality mass lost to seepage.
Definition SimulationContext.hpp:731
double step_gw_inflow
Definition SimulationContext.hpp:711
double runoff_rainfall
Total rainfall volume (ft3)
Definition SimulationContext.hpp:670
void reset()
Definition SimulationContext.hpp:756
double gw_lateral_flow
Cumulative lateral GW flow (ft)
Definition SimulationContext.hpp:703
std::vector< double > qual_routing_ii_in
RDII quality mass inflow.
Definition SimulationContext.hpp:730
double routing_flooding
Definition SimulationContext.hpp:684
void resize_quality(int n_pollutants)
Definition SimulationContext.hpp:734
double gw_error() const
Groundwater continuity error (fraction). Gap #72.
Definition SimulationContext.hpp:831
double runoff_evap
Total evaporation volume (ft3)
Definition SimulationContext.hpp:671
double gw_init_storage
Initial GW storage (ft)
Definition SimulationContext.hpp:704
double step_flooding
Definition SimulationContext.hpp:708
std::vector< double > qual_sweeping
Mass removed by sweeping.
Definition SimulationContext.hpp:720
std::vector< double > routing_forcing_qual_inflow
Per-pollutant cumulative user-forced quality mass.
Definition SimulationContext.hpp:695
double routing_error() const
Routing continuity error (fraction).
Definition SimulationContext.hpp:820
double gw_lower_evap
Cumulative lower zone evaporation (ft)
Definition SimulationContext.hpp:701
std::vector< double > qual_routing_outflow
Quality mass leaving at outfalls.
Definition SimulationContext.hpp:725
double routing_forcing_inflow
Cumulative user-forced lateral inflow (ft3)
Definition SimulationContext.hpp:692
double step_rdii_inflow
Definition SimulationContext.hpp:712
double runoff_infil
Total infiltration volume (ft3)
Definition SimulationContext.hpp:672
double step_outflow
Definition SimulationContext.hpp:709
std::vector< double > qual_bmp_removal
BMP treatment removal.
Definition SimulationContext.hpp:721
double routing_outflow
Definition SimulationContext.hpp:685
double runoff_error() const
Runoff continuity error (fraction).
Definition SimulationContext.hpp:813
std::vector< double > qual_routing_wet
Wet weather quality inflow to routing.
Definition SimulationContext.hpp:724
std::vector< double > qual_routing_evap
Quality mass lost to evaporation.
Definition SimulationContext.hpp:732
double step_dw_inflow
Definition SimulationContext.hpp:710
double step_ext_inflow
Definition SimulationContext.hpp:713
Top-N element statistic entry (matching legacy TMaxStats).
Definition SimulationContext.hpp:844
int index
element index (-1 = unused slot)
Definition SimulationContext.hpp:846
int obj_type
0 = NODE, 1 = LINK
Definition SimulationContext.hpp:845
double value
statistic value (percentage or index)
Definition SimulationContext.hpp:847
Definition SimulationContext.hpp:861
void update_iterations(int iters, bool converged)
Record iteration count for a routing step.
Definition SimulationContext.hpp:886
double sum_step
Sum of all routing time steps (sec)
Definition SimulationContext.hpp:864
double sum_iterations
Sum of iterations for averaging.
Definition SimulationContext.hpp:875
static constexpr int N_TIME_BINS
Number of time step histogram bins (matching legacy TIMELEVELS=5).
Definition SimulationContext.hpp:869
long n_steps
Total number of routing steps.
Definition SimulationContext.hpp:865
double avg_step() const
Definition SimulationContext.hpp:927
void init_histogram(double route_step, double min_route_step)
Definition SimulationContext.hpp:894
double max_step
Maximum routing time step used (sec)
Definition SimulationContext.hpp:863
double min_step
Minimum routing time step used (sec)
Definition SimulationContext.hpp:862
void update(double dt)
Definition SimulationContext.hpp:878
double steady_pct
Percent of time in steady state.
Definition SimulationContext.hpp:866
double step_intervals[N_TIME_BINS+1]
Histogram bin edges.
Definition SimulationContext.hpp:871
void record_step_bin(double dt)
Add a step to the histogram (call during simulation or post-process)
Definition SimulationContext.hpp:917
long step_counts[N_TIME_BINS+1]
Histogram bin counts.
Definition SimulationContext.hpp:870
double max_courant
Maximum Courant number observed.
Definition SimulationContext.hpp:876
double pct_non_converged() const
Definition SimulationContext.hpp:931
void build_histogram()
Definition SimulationContext.hpp:908
long n_non_converged
Non-convergence and iteration tracking.
Definition SimulationContext.hpp:874
double computed_avg_iterations() const
Definition SimulationContext.hpp:935
Central, reentrant simulation context.
Definition SimulationContext.hpp:274
struct openswmm::SimulationContext::MassBalance mass_balance
NameIndex aquifer_names
Definition SimulationContext.hpp:536
TransectStore transects
Definition SimulationContext.hpp:477
UserFlags user_flags
User-defined flags from [USER_FLAGS] section.
Definition SimulationContext.hpp:560
void save_state() noexcept
Snapshot current state into old-step arrays before solving.
Definition SimulationContext.hpp:1093
NameIndex subcatch_names
Subcatchment name → subcatchment index.
Definition SimulationContext.hpp:432
NameIndex node_names
Node name → node index.
Definition SimulationContext.hpp:420
InletUsageStore inlet_usages
Definition SimulationContext.hpp:482
MaxStats max_courant_crit[MAX_STATS]
Top-5 CFL time-step critical elements.
Definition SimulationContext.hpp:853
int n_nodes() const noexcept
Number of nodes.
Definition SimulationContext.hpp:1183
ExtInflowData ext_inflows
Definition SimulationContext.hpp:466
static void updateMaxStats(MaxStats arr[], int obj_type, int idx, double value)
Insertion sort into a descending-by-absolute-value top-N array.
Definition SimulationContext.hpp:974
NodeData nodes
All node state and properties.
Definition SimulationContext.hpp:380
double adjust_rain[12]
Definition SimulationContext.hpp:512
MaxStats max_non_converged[MAX_STATS]
Top-5 nodes with highest non-convergence frequency.
Definition SimulationContext.hpp:857
TableData tables
All time series and rating curves.
Definition SimulationContext.hpp:410
double adjust_temp[12]
Monthly climate adjustment factors from [ADJUSTMENTS] section.
Definition SimulationContext.hpp:510
MaxStats max_mass_bal_errs[MAX_STATS]
Top-5 nodes with highest continuity errors.
Definition SimulationContext.hpp:859
int error_code
Most recent error code (0 = no error).
Definition SimulationContext.hpp:624
RDIIAssignData rdii_assigns
Definition SimulationContext.hpp:468
AquiferStore aquifers
Definition SimulationContext.hpp:535
NameIndex snowpack_names
Definition SimulationContext.hpp:534
std::vector< int > subcatch_d_store_pattern
Definition SimulationContext.hpp:521
InletStore inlets
Definition SimulationContext.hpp:481
GageData gages
All rain gage state and properties.
Definition SimulationContext.hpp:398
FilesSpec files
Secondary file references parsed from [FILES].
Definition SimulationContext.hpp:604
std::vector< ControlLogEntry > control_log
Chronological log of all control actions taken during the simulation.
Definition SimulationContext.hpp:954
DwfData dwf_inflows
Definition SimulationContext.hpp:467
NameIndex gage_names
Rain gage name → gage index.
Definition SimulationContext.hpp:438
BuildupData buildup
Definition SimulationContext.hpp:458
int n_gages() const noexcept
Number of rain gages.
Definition SimulationContext.hpp:1192
std::string inp_file_path
Path to the input .inp file (empty if not opened from a file).
Definition SimulationContext.hpp:964
NameIndex table_names
Time series / curve name → table index.
Definition SimulationContext.hpp:450
std::vector< std::string > errors
Accumulated error messages written to report file.
Definition SimulationContext.hpp:653
RDIIDecayData rdii_decay
Parsed [RDII_DECAY] data (exponential IA model)
Definition SimulationContext.hpp:470
EngineState state
Current lifecycle state of the engine.
Definition SimulationContext.hpp:281
WashoffData washoff
Definition SimulationContext.hpp:459
int warning_code
Most recent warning code (0 = no warning).
Definition SimulationContext.hpp:630
NameIndex landuse_names
Definition SimulationContext.hpp:456
int n_tables() const noexcept
Number of tables (time series + curves).
Definition SimulationContext.hpp:1199
double dt_output_remaining
Time remaining until the next output boundary (seconds).
Definition SimulationContext.hpp:362
struct openswmm::SimulationContext::RoutingStepStats routing_stats
LidControlStore lid_controls
Definition SimulationContext.hpp:537
std::vector< int > subcatch_infil_pattern
Definition SimulationContext.hpp:522
double adjust_hydcon[12]
Definition SimulationContext.hpp:513
std::vector< std::string > title_notes
Project title and notes (from [TITLE] section).
Definition SimulationContext.hpp:296
std::vector< std::string > warnings
Accumulated warning messages written to report file.
Definition SimulationContext.hpp:644
ControlRuleStore control_rules
Definition SimulationContext.hpp:483
TreatmentData treatment
Definition SimulationContext.hpp:460
bool has_subcatch_adj_patterns
True if any pattern index >= 0.
Definition SimulationContext.hpp:527
void finalize_max_stats()
Compute top-5 arrays for CFL-critical, flow turns, and non-convergence.
Definition SimulationContext.hpp:993
LinkData links
All link state and properties.
Definition SimulationContext.hpp:386
UnitHydData unit_hyds
Parsed [HYDROGRAPHS] data.
Definition SimulationContext.hpp:469
double dt_controls_remaining
Time remaining until the next control rule event (seconds).
Definition SimulationContext.hpp:370
void reset()
Fully reset the context to a CREATED state.
Definition SimulationContext.hpp:1032
int n_pollutants() const noexcept
Number of pollutants.
Definition SimulationContext.hpp:1195
LidUsageStore lid_usage
Definition SimulationContext.hpp:539
climate::ClimateState climate_state
Daily climate state — temperature, evaporation, wind, humidity.
Definition SimulationContext.hpp:319
MaxStats max_flow_turns[MAX_STATS]
Top-5 links with highest flow instability index.
Definition SimulationContext.hpp:855
void allocate_objects()
Allocate all object arrays after input parsing is complete.
Definition SimulationContext.hpp:1127
StateAccessors state_accessors
Solver-neutral accessors for reading and writing solver-internal state at hot-start save/load time.
Definition SimulationContext.hpp:614
int n_subcatches() const noexcept
Number of subcatchments.
Definition SimulationContext.hpp:1189
int n_links() const noexcept
Number of links.
Definition SimulationContext.hpp:1186
std::vector< double > base_ds_perv
Definition SimulationContext.hpp:526
NameIndex link_names
Link name → link index.
Definition SimulationContext.hpp:426
std::vector< PluginSpec > plugin_specs
Plugin library specs parsed from [PLUGINS].
Definition SimulationContext.hpp:594
StreetStore streets
Definition SimulationContext.hpp:480
double current_time
Current simulation time in SECONDS from start_date.
Definition SimulationContext.hpp:343
ForcingData forcing
Per-element runtime forcing state (lateral inflows, head boundaries, rainfall, evap,...
Definition SimulationContext.hpp:583
int n_landuses() const noexcept
Definition SimulationContext.hpp:1196
std::vector< double > base_n_perv
Base values for pattern-adjusted parameters (populated at init).
Definition SimulationContext.hpp:525
double adjust_evap[12]
Definition SimulationContext.hpp:511
std::string error_message
Human-readable message for the last error/warning.
Definition SimulationContext.hpp:635
SpatialFrame spatial
Coordinate reference system and georeferenced coordinates.
Definition SimulationContext.hpp:549
std::vector< transect::TransectData > transect_tables
Built transect geometry tables (indexed same as transects).
Definition SimulationContext.hpp:479
SnowpackStore snowpacks
Definition SimulationContext.hpp:533
std::vector< int > subcatch_n_perv_pattern
Per-subcatchment pattern indices for N-PERV, DSTORE, INFIL adjustments.
Definition SimulationContext.hpp:520
PatternData patterns
Definition SimulationContext.hpp:471
static constexpr int MAX_STATS
Definition SimulationContext.hpp:850
NameIndex lid_names
Definition SimulationContext.hpp:538
NameIndex pollutant_names
Pollutant name → pollutant index.
Definition SimulationContext.hpp:444
void shrink_all_to_fit()
Release excess vector capacity on all owned SoA data stores.
Definition SimulationContext.hpp:1165
void reset_state() noexcept
Reset all state variables to initial conditions (cold start).
Definition SimulationContext.hpp:1105
std::vector< Event > events
Definition SimulationContext.hpp:498
SubcatchData subcatches
All subcatchment state and properties.
Definition SimulationContext.hpp:392
LanduseData landuses
Definition SimulationContext.hpp:457
SimulationOptions options
Parsed simulation options (from [OPTIONS] section).
Definition SimulationContext.hpp:306
PollutantData pollutants
Pollutant definitions and per-object quality state.
Definition SimulationContext.hpp:404
double current_date
Absolute current date/time (decimal days, OADate (days since 12/30/1899)).
Definition SimulationContext.hpp:352
All SWMM simulation options parsed from [OPTIONS] section.
Definition SimulationOptions.hpp:122
double start_date
Simulation start date/time (decimal days, OADate (days since 12/30/1899)).
Definition SimulationOptions.hpp:129
double report_step
Reporting output interval in seconds.
Definition SimulationOptions.hpp:150
SoA storage for snowpack parameter sets.
Definition HydrologyData.hpp:36
Spatial frame containing CRS and georeferenced coordinates.
Definition SpatialFrame.hpp:82
std::vector< double > link_x
Link centroid X coordinates.
Definition SpatialFrame.hpp:145
void shrink_to_fit()
Release excess vector capacity accumulated during parsing.
Definition SpatialFrame.hpp:224
std::vector< double > subcatch_x
Subcatchment centroid X.
Definition SpatialFrame.hpp:155
std::vector< double > node_x
Node X coordinates (easting or longitude).
Definition SpatialFrame.hpp:135
std::vector< double > gage_x
Gage X coordinates.
Definition SpatialFrame.hpp:185
std::vector< double > gage_y
Gage Y coordinates.
Definition SpatialFrame.hpp:188
std::vector< std::vector< double > > subcatch_polygon_y
Per-subcatchment polygon Y vertices.
Definition SpatialFrame.hpp:178
std::vector< std::vector< double > > link_vertices_x
Per-link X vertices. link_vertices_x[link_idx] is a vector of X coords.
Definition SpatialFrame.hpp:165
std::vector< double > link_y
Link centroid Y coordinates.
Definition SpatialFrame.hpp:148
std::vector< std::vector< double > > subcatch_polygon_x
Per-subcatchment polygon X vertices.
Definition SpatialFrame.hpp:175
std::vector< double > node_y
Node Y coordinates (northing or latitude).
Definition SpatialFrame.hpp:138
std::vector< double > subcatch_y
Subcatchment centroid Y.
Definition SpatialFrame.hpp:158
std::vector< std::vector< double > > link_vertices_y
Per-link Y vertices. link_vertices_y[link_idx] is a vector of Y coords.
Definition SpatialFrame.hpp:168
Solver-neutral hooks for reading and writing solver-internal state (infiltration, groundwater) at hot...
Definition SimulationContext.hpp:236
std::function< bool(int subcatch_index, int model, const double *infil)> set_infil_state
Definition SimulationContext.hpp:243
std::function< bool(int subcatch_index, int &out_model, double *out_infil)> get_infil_state
Definition SimulationContext.hpp:239
bool can_write() const noexcept
True iff the write-side accessors are wired.
Definition SimulationContext.hpp:257
std::function< bool(int subcatch_index, double theta, double lower_depth)> set_gw_state
Apply groundwater zone state to a subcatchment.
Definition SimulationContext.hpp:249
std::function< bool(int subcatch_index, double &out_theta, double &out_lower_depth)> get_gw_state
Read groundwater zone state (upper-zone moisture and lower-zone depth).
Definition SimulationContext.hpp:246
bool can_read() const noexcept
True iff the read-side accessors are wired.
Definition SimulationContext.hpp:252
Definition InfraData.hpp:54
Structure-of-Arrays storage for all subcatchments.
Definition SubcatchData.hpp:41
void reset_state() noexcept
Definition SubcatchData.hpp:817
void resize_quality(int n_pollutants)
Resize per-subcatch quality arrays after pollutant count is known.
Definition SubcatchData.hpp:712
void resize(int n)
Definition SubcatchData.hpp:501
void shrink_to_fit()
Release excess vector capacity accumulated during parsing.
Definition SubcatchData.hpp:735
void save_state() noexcept
Definition SubcatchData.hpp:811
SoA collection of all time series and curves in the model.
Definition TableData.hpp:637
void reset_cursors() noexcept
Reset all cursors (call before re-running a simulation).
Definition TableData.hpp:657
Definition InfraData.hpp:26
Definition QualityData.hpp:133
void shrink_to_fit()
Definition QualityData.hpp:163
Definition InflowData.hpp:143
Definition QualityData.hpp:98
void shrink_to_fit()
Definition QualityData.hpp:120
Definition Climate.hpp:71