OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
SourceWaterDriver.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 Caleb Buahin
3
12
13#ifndef OPENSWMM_SOURCE_WATER_DRIVER_HPP
14#define OPENSWMM_SOURCE_WATER_DRIVER_HPP
15#include "SourceClockGroups.hpp"
16#include "LID.hpp"
18#include <array>
19#include <memory>
20
21namespace openswmm::detail {
23}
24
25namespace openswmm::runoff {
26
28 double initial_storage = 0.0, rain = 0.0, evaporation = 0.0, infiltration = 0.0;
31 double aquifer_return = 0.0; // cumulative paired surface credits, ft3, never rainfall
32 double outfall_return = 0.0; // cumulative hydraulic receipts, ft3, never rainfall
33 double outlet = 0.0, captured = 0.0, runon = 0.0, pervious_return = 0.0;
34};
36 int source = -1, node = -1;
37 double start = 0.0, end = 0.0, volume = 0.0; // ft3; node -1 = unresolved external outlet
38 bool drain = false;
39 std::vector<double> mass; // pollutant concentration units times m3, paired with volume
40};
41
46 int source = -1, type = -1, unit = -1;
47 std::vector<std::array<double, 4>> layers;
49 std::vector<double> surface_mass, drain_mass; // last completed forcing segment
50 std::vector<double> impervious_mass, pervious_mass; // non-LID outlet pools before capture
51 std::vector<double> aquifer_return; // cumulative paired surface credits
52 std::vector<double> pending_routing,
53 incoming; // internal subarea queue; cumulative received transfers
54};
56 int source = -1, type = -1, unit = -1, pool = 2; // non-LID subarea or exact LID unit
57 double volume = 0; // ft3, consumed once at the next source segment
58 std::vector<double> mass; // pollutant concentration units times m3
59};
61 int source = -1;
62 double available = 0, volume = 0; // accepted hydraulic seconds, ft3
63};
67 int source = -1, type = -1, unit = -1;
68 double area = 0.0; // ft2, physical footprint (capture does not enlarge it)
69 bool soil_eligible = false;
70 double potential = 0.0, evaporation = 0.0; // cumulative completed ft3
71};
72
84public:
101 SourceWaterDriver& operator=(SourceWaterDriver&&) noexcept;
123 bool model); // internal accepted-boundary IO
129 using BottomCeiling = std::function<double(int type, int unit, double start, double end)>;
135 using ForcingTransform = std::function<void(SourceForcingInterval&)>;
159 std::string initialize(const SimulationContext& context, const std::vector<int>& seeds,
160 const std::vector<std::pair<int, double>>& non_lid_areas = {},
161 const lid::LIDSolver* initial_lids = nullptr,
162 bool hydraulic_returns = false);
170 std::string configureSpatialCoverage(const std::vector<double>& inside_fractions);
175 const std::vector<double>& spatialFractions() const;
189 std::string creditSurfaceReturns(double start, const std::vector<SourceSurfaceReturn>& returns);
201 std::string creditOutfallReturns(double start, double end, const std::vector<double>& volumes);
205 bool acceptsOutfallReturns() const;
209 double outfallReturnEnd() const;
214 const std::vector<SourceOutfallReturn>& pendingOutfallReturns() const;
237 std::string stage(int group, double end, double completed_through,
238 const RunoffSolver::InfiltrationBoundary* boundary = nullptr,
239 const BottomCeiling* bottom_ceiling = nullptr,
240 const ForcingTransform* forcing = nullptr);
246 std::string commit();
251 void cancel();
256 const SourceClockGroups& clocks() const { return clocks_; }
264 const surface::SourceSnow& snow(bool trial = false) const;
272 const SimulationContext& context(bool trial = false) const;
280 const RunoffSolver& runoff(bool trial = false) const;
288 const lid::LIDSolver& lids(bool trial = false) const;
296 const std::vector<SourceWaterLedger>& ledgers(bool trial = false) const;
304 const std::vector<SourceWaterDelivery>& deliveries(bool trial = false) const;
312 const std::vector<SourceAtmosphericLedger>& atmosphere(bool trial = false) const;
317 const std::vector<std::string>& pollutantNames() const;
325 const std::vector<SourcePollutantLedger>& pollutants(bool trial = false) const;
335 double pollutantBalanceResidual(int group, int pollutant, bool trial = false) const;
345 double pendingPollutantMass(int group, int pollutant, bool trial = false) const;
354 double pendingVolume(int group, bool trial = false) const;
360 double storedVolume(int source) const;
369 double balanceResidual(int group, bool trial = false) const;
370
371private:
372 struct State;
373 std::unique_ptr<State> state_, trial_;
374 SourceClockGroups clocks_;
375 int pending_group_ = -1;
381 const State& view(bool trial) const;
387 double storage(const State& state, int source) const;
405 void advance(State& state, const SourceForcingInterval& interval,
406 const RunoffSolver::InfiltrationBoundary* boundary, const BottomCeiling* ceiling);
407};
408}
409#endif
Low Impact Development (LID) control modules.
Scheduling of water sources with common integration clocks.
Snow processes associated with hydrological source owners.
Definition CompletedSourceArchive.hpp:25
Definition LID.hpp:316
Definition CompletedSourceArchive.hpp:25
Owned three-pool non-LID reservoir, native soil state and completed routing history....
Definition Runoff.hpp:195
std::function< bool(int, double, double, double &)> InfiltrationBoundary
Definition Runoff.hpp:204
Definition SourceClockGroups.hpp:54
double storedVolume(int source) const
Sum accepted physical runoff/LID stored water for one source.
Definition SourceWaterDriver.cpp:508
const std::vector< SourceOutfallReturn > & pendingOutfallReturns() const
Borrow accepted hydraulic receipts waiting for their source clock.
Definition SourceWaterDriver.cpp:396
const std::vector< double > & spatialFractions() const
Borrow accepted per-source inside physical-area fractions.
Definition SourceWaterDriver.cpp:331
void checkpoint(detail::CompletedSourceArchive &archive, bool model)
Stream private native model or accepted runtime source histories.
Definition SourceWaterDriver.cpp:1113
double balanceResidual(int group, bool trial=false) const
Read balanceResidual for one selected source-clock group.
Definition SourceWaterDriver.cpp:512
void cancel()
Drop an active water trial and its tracked pending group forcing. Retains accepted water/histories an...
Definition SourceWaterDriver.cpp:1107
~SourceWaterDriver()
Release private accepted/trial histories without committing a pending trial. Borrowed state/kernel/le...
double pendingPollutantMass(int group, int pollutant, bool trial=false) const
Read pendingPollutantMass for one selected source-clock group.
Definition SourceWaterDriver.cpp:468
std::string initialize(const SimulationContext &context, const std::vector< int > &seeds, const std::vector< std::pair< int, double > > &non_lid_areas={}, const lid::LIDSolver *initial_lids=nullptr, bool hydraulic_returns=false)
Build private source kernels/ledgers from a simulation-start model snapshot.
Definition SourceWaterDriver.cpp:522
std::string configureSpatialCoverage(const std::vector< double > &inside_fractions)
Bind uniform inside fractions once before any source advancement.
Definition SourceWaterDriver.cpp:334
double pollutantBalanceResidual(int group, int pollutant, bool trial=false) const
Read pollutantBalanceResidual for one selected source-clock group.
Definition SourceWaterDriver.cpp:454
const lid::LIDSolver & lids(bool trial=false) const
Borrow trial or accepted lids state without copying it.
Definition SourceWaterDriver.cpp:436
std::string creditSurfaceReturns(double start, const std::vector< SourceSurfaceReturn > &returns)
Validate and queue paired aquifer-return water/mass before source trials.
Definition SourceWaterDriver.cpp:349
double pendingVolume(int group, bool trial=false) const
Read pendingVolume for one selected source-clock group.
Definition SourceWaterDriver.cpp:495
std::string stage(int group, double end, double completed_through, const RunoffSolver::InfiltrationBoundary *boundary=nullptr, const BottomCeiling *bottom_ceiling=nullptr, const ForcingTransform *forcing=nullptr)
Advance one source group into a private completed-interval trial.
Definition SourceWaterDriver.cpp:1008
SourceWaterDriver waterTrial() const
Copy committed water, kernels, ledgers and clocks for an independent trial.
Definition SourceWaterDriver.cpp:312
std::string creditOutfallReturns(double start, double end, const std::vector< double > &volumes)
Queue one explicitly accepted hydraulic-return interval exactly once.
Definition SourceWaterDriver.cpp:399
const std::vector< SourceWaterDelivery > & deliveries(bool trial=false) const
Borrow trial or accepted deliveries state without copying it.
Definition SourceWaterDriver.cpp:442
double outfallReturnEnd() const
Read the last credited accepted hydraulic-return endpoint.
Definition SourceWaterDriver.cpp:393
SourceWaterDriver()
Construct an uninitialized driver without source state or IO. Most data accessors require successful ...
const std::vector< SourceAtmosphericLedger > & atmosphere(bool trial=false) const
Borrow trial or accepted atmosphere state without copying it.
Definition SourceWaterDriver.cpp:445
const SourceClockGroups & clocks() const
Borrow source membership, accepted endpoints and staged forcing clocks.
Definition SourceWaterDriver.hpp:256
const std::vector< SourcePollutantLedger > & pollutants(bool trial=false) const
Borrow trial or accepted pollutants state without copying it.
Definition SourceWaterDriver.cpp:451
const std::vector< std::string > & pollutantNames() const
Borrow ordered active source-pollutant identifiers from accepted state.
Definition SourceWaterDriver.cpp:448
const SimulationContext & context(bool trial=false) const
Borrow trial or accepted context state without copying it.
Definition SourceWaterDriver.cpp:430
std::string commit()
Adopt staged private water and its source-group endpoint together.
Definition SourceWaterDriver.cpp:1096
const std::vector< SourceWaterLedger > & ledgers(bool trial=false) const
Borrow trial or accepted ledgers state without copying it.
Definition SourceWaterDriver.cpp:439
std::function< void(SourceForcingInterval &)> ForcingTransform
Synchronous transform of a private resolved forcing-segment copy. Caller supplies completed-interval ...
Definition SourceWaterDriver.hpp:135
bool acceptsOutfallReturns() const
Read whether explicit water-only hydraulic receipts were enabled.
Definition SourceWaterDriver.cpp:390
std::function< double(int type, int unit, double start, double end)> BottomCeiling
Synchronous LID bottom-capacity callback; caller-owned, never retained. Receives LID type/group and u...
Definition SourceWaterDriver.hpp:129
SourceWaterDriver(SourceWaterDriver &&) noexcept
Move owned accepted/trial histories and source clocks without copying water. Transfers pending-group ...
Per-source-group native/UEB snow ownership and cumulative water balance. Liquid source delivery,...
Definition SourceSnow.hpp:38
Definition OutfallExchange.hpp:17
Definition ExplicitInertialSolver.hpp:68
SourceEtKind
Definition SourceWaterDriver.hpp:64
@ IMPERVIOUS
Definition SourceWaterDriver.hpp:64
@ LID
Definition SourceWaterDriver.hpp:64
@ PERVIOUS
Definition SourceWaterDriver.hpp:64
Definition DegreeDaySnow.cpp:36
Central, reentrant simulation context.
Definition SimulationContext.hpp:390
Definition SourceWaterDriver.hpp:65
SourceEtKind kind
Definition SourceWaterDriver.hpp:66
int source
Definition SourceWaterDriver.hpp:67
int type
Definition SourceWaterDriver.hpp:67
double area
Definition SourceWaterDriver.hpp:68
bool soil_eligible
Definition SourceWaterDriver.hpp:69
double evaporation
Definition SourceWaterDriver.hpp:70
double potential
Definition SourceWaterDriver.hpp:70
int unit
Definition SourceWaterDriver.hpp:67
Piecewise-constant forcing over [start,end) in elapsed seconds. month is zero-based; infil_factor/rec...
Definition SourceClockGroups.hpp:32
Definition SourceWaterDriver.hpp:60
double available
Definition SourceWaterDriver.hpp:62
double volume
Definition SourceWaterDriver.hpp:62
int source
Definition SourceWaterDriver.hpp:61
Definition SourceWaterDriver.hpp:45
int unit
Definition SourceWaterDriver.hpp:46
int type
Definition SourceWaterDriver.hpp:46
std::vector< double > outside_infiltration
Definition SourceWaterDriver.hpp:48
std::vector< double > surface_mass
Definition SourceWaterDriver.hpp:49
std::vector< double > impervious_mass
Definition SourceWaterDriver.hpp:50
std::vector< double > aquifer_return
Definition SourceWaterDriver.hpp:51
std::vector< double > outlet
Definition SourceWaterDriver.hpp:48
int source
Definition SourceWaterDriver.hpp:46
std::vector< std::array< double, 4 > > layers
Definition SourceWaterDriver.hpp:47
std::vector< double > pending_routing
Definition SourceWaterDriver.hpp:52
std::vector< double > drain_mass
Definition SourceWaterDriver.hpp:49
std::vector< double > spatial_infiltration
Definition SourceWaterDriver.hpp:48
std::vector< double > removed
Definition SourceWaterDriver.hpp:48
std::vector< double > incoming
Definition SourceWaterDriver.hpp:53
std::vector< double > pervious_mass
Definition SourceWaterDriver.hpp:50
std::vector< double > rain
Definition SourceWaterDriver.hpp:48
Definition SourceWaterDriver.hpp:55
int type
Definition SourceWaterDriver.hpp:56
int source
Definition SourceWaterDriver.hpp:56
std::vector< double > mass
Definition SourceWaterDriver.hpp:58
int pool
Definition SourceWaterDriver.hpp:56
double volume
Definition SourceWaterDriver.hpp:57
int unit
Definition SourceWaterDriver.hpp:56
Definition SourceWaterDriver.hpp:35
double end
Definition SourceWaterDriver.hpp:37
double volume
Definition SourceWaterDriver.hpp:37
bool drain
Definition SourceWaterDriver.hpp:38
std::vector< double > mass
Definition SourceWaterDriver.hpp:39
int source
Definition SourceWaterDriver.hpp:36
double start
Definition SourceWaterDriver.hpp:37
int node
Definition SourceWaterDriver.hpp:36
Definition SourceWaterDriver.hpp:27
double evaporation
Definition SourceWaterDriver.hpp:28
double initial_storage
Definition SourceWaterDriver.hpp:28
double spatial_infiltration
Completed destination split, ft3; sum equals infiltration.
Definition SourceWaterDriver.hpp:30
double aquifer_return
Definition SourceWaterDriver.hpp:31
double captured
Definition SourceWaterDriver.hpp:33
double outlet
Definition SourceWaterDriver.hpp:33
double infiltration
Definition SourceWaterDriver.hpp:28
double pervious_return
Definition SourceWaterDriver.hpp:33
double rain
Definition SourceWaterDriver.hpp:28
double outfall_return
Definition SourceWaterDriver.hpp:32
double outside_infiltration
Definition SourceWaterDriver.hpp:30
double runon
Definition SourceWaterDriver.hpp:33