hydrobricks
Loading...
Searching...
No Matches
Processor.h
1#ifndef HYDROBRICKS_PROCESSOR_H
2#define HYDROBRICKS_PROCESSOR_H
3
4#include <memory>
5
6#include "Brick.h"
7#include "Includes.h"
8#include "Solver.h"
9
10class ModelHydro;
11class Splitter;
12
13class Processor {
14 public:
15 explicit Processor();
16
17 virtual ~Processor();
18
24 void Initialize(const SolverSettings& solverSettings);
25
31 void SetModel(ModelHydro* model);
32
37
43 [[nodiscard]] int GetStateVariableCount() const;
44
51 bool ProcessTimeStep(double timeStepInDays);
52
61 void GatherState(axd& state) const;
62
68 void ScatterState(const axd& state);
69
73 void ResetState();
74
88 void EvaluateRates(axd& rates, double timeStepInDays, bool applyConstraints = true);
89
97 void ConstrainRates(axd& rates, double timeStepInDays);
98
107 void EnforceConstraints(axd& rates, double timeStepInDays);
108
116 void ApplyRates(const axd& rates, double timeStepInDays);
117
121 void FinalizeTimeStep();
122
129 return _solvableConnectionCount;
130 }
131
137 const vector<Brick*>& GetSolvableBricks() const {
138 return _iterableBricks;
139 }
140
147 return _directConnectionCount;
148 }
149
154 Process* process; // non-owning
155 int connectionCount; // number of rates this process contributes
156 int rateOffset; // index of its first rate in the global rates vector
157 };
158
163 Brick* brick; // non-owning
164 int processStart; // first index in _solvableProcesses
165 int processEnd; // one past the last index in _solvableProcesses
166 };
167
173 Process* process; // non-owning
174 WaterContainer* container; // non-owning: the container the process draws from
175 int outputFluxCount; // number of output fluxes to link
176 int connectionCount; // number of rates the process produces
177 int rateOffset; // index of its first rate in _changeRatesNoSolver
178 };
179
184 Brick* brick; // non-owning
185 int processStart; // first index in _directProcesses
186 int processEnd; // one past the last index in _directProcesses
187 };
188
194 int splitterStart; // first index in _directSplitters
195 int splitterEnd; // one past the last index in _directSplitters
196 int brickStart; // first index in _directBricks
197 int brickEnd; // one past the last index in _directBricks
198 };
199
205 const vector<SolvableProcess>& GetSolvableProcesses() const {
206 return _solvableProcesses;
207 }
208
215 const vector<SolvableBrickEntry>& GetSolvableBrickEntries() const {
216 return _solvableBrickEntries;
217 }
218
219 protected:
220 std::unique_ptr<Solver> _solver; // owning
221 ModelHydro* _model; // non-owning reference
222 int _solvableConnectionCount;
223 int _directConnectionCount;
224 int _directRateCount; // size of the direct change-rate buffer (fixed slices)
225 vecDoublePt _stateVariableChanges;
226 vector<Brick*> _iterableBricks; // non-owning views into HydroUnits/SubBasin
227 // Flattened traversal of the solvable bricks and processes, built once at
228 // initialization: the model structure is fixed after the build, so the
229 // brick -> process -> connection hierarchy needs no virtual walk on every solver
230 // stage of every time step.
231 vector<SolvableProcess> _solvableProcesses;
232 vector<SolvableBrickEntry> _solvableBrickEntries;
233 // Same flattening for the direct (pre-solver) pass over the hydro units.
234 vector<Splitter*> _directSplitters; // non-owning, grouped by hydro unit
235 vector<DirectProcess> _directProcesses;
236 vector<DirectBrickEntry> _directBricks;
237 vector<DirectUnitEntry> _directUnits;
238 axd _changeRatesNoSolver;
239 axd _ratesBeforeSweep; // scratch buffer for the constraint fixpoint iteration
240
241 private:
248 void ValidateFluxTopology() const;
249
255 void StoreStateVariableChanges(std::span<double*> values);
256
261 void BuildTraversalTables();
262
269 void ApplyDirectChanges(const DirectBrickEntry& brickEntry, double timeStepInDays);
270};
271
272#endif // HYDROBRICKS_PROCESSOR_H
Definition Brick.h:22
Definition ModelHydro.h:14
Definition Process.h:16
Definition Processor.h:13
void ConnectToElementsToSolve()
Definition Processor.cpp:62
void EvaluateRates(axd &rates, double timeStepInDays, bool applyConstraints=true)
Definition Processor.cpp:219
const vector< SolvableProcess > & GetSolvableProcesses() const
Definition Processor.h:205
int GetDirectConnectionCount() const
Definition Processor.h:146
void ApplyRates(const axd &rates, double timeStepInDays)
Definition Processor.cpp:278
void ScatterState(const axd &state)
Definition Processor.cpp:199
int GetSolvableConnectionCount() const
Definition Processor.h:128
void SetModel(ModelHydro *model)
Definition Processor.cpp:58
int GetStateVariableCount() const
Definition Processor.cpp:188
const vector< SolvableBrickEntry > & GetSolvableBrickEntries() const
Definition Processor.h:215
void GatherState(axd &state) const
Definition Processor.cpp:192
void FinalizeTimeStep()
Definition Processor.cpp:295
void ResetState()
Definition Processor.cpp:206
void Initialize(const SolverSettings &solverSettings)
Definition Processor.cpp:18
const vector< Brick * > & GetSolvableBricks() const
Definition Processor.h:137
bool ProcessTimeStep(double timeStepInDays)
Definition Processor.cpp:304
void EnforceConstraints(axd &rates, double timeStepInDays)
Definition Processor.cpp:258
void ConstrainRates(axd &rates, double timeStepInDays)
Definition Processor.cpp:244
Definition Splitter.h:13
Definition WaterContainer.h:10
Definition Processor.h:183
Definition Processor.h:172
Definition Processor.h:193
Definition Processor.h:162
Definition Processor.h:153
Definition SettingsModel.h:13