hydrobricks
Loading...
Searching...
No Matches
Process.h
1#ifndef HYDROBRICKS_PROCESS_H
2#define HYDROBRICKS_PROCESS_H
3
4#include <memory>
5
6#include "Flux.h"
7#include "Forcing.h"
8#include "Includes.h"
9#include "SettingsModel.h"
10
11class Brick;
12class HydroUnit;
13class TimeMachine;
14class WaterContainer;
15
16class Process {
17 public:
18 explicit Process(WaterContainer* container);
19
20 virtual ~Process() = default;
21
29 static std::unique_ptr<Process> Factory(const ProcessSettings& processSettings, Brick* brick);
30
38 [[nodiscard]] static bool RegisterSettings(SettingsModel* modelSettings, const string& processType);
39
43 virtual void Reset();
44
50 [[nodiscard]] virtual bool IsValid() const = 0;
51
58 virtual void Validate() const;
59
67 [[nodiscard]] static bool HasParameter(const ProcessSettings& processSettings, std::string_view name);
68
76 static const float* GetParameterValuePointer(const ProcessSettings& processSettings, std::string_view name);
77
84 virtual void SetHydroUnitProperties(HydroUnit* unit, Brick* brick);
85
91 virtual void SetParameters(const ProcessSettings& processSettings);
92
98 virtual void AttachForcing(Forcing*) {
99 throw ShouldNotHappen("Process::AttachForcing - Should not be called (virtual)");
100 }
101
107 void AttachFluxOut(std::unique_ptr<Flux> flux) {
108 assert(flux);
109 _outputs.push_back(std::move(flux));
110 }
111
117 int GetOutputFluxCount() const {
118 return static_cast<int>(_outputs.size());
119 }
120
127 Flux* GetOutputFlux(size_t index) const {
128 assert(_outputs.size() > index);
129 assert(_outputs[index]);
130 return _outputs[index].get();
131 }
132
138 [[nodiscard]] virtual bool ToAtmosphere() const {
139 return false;
140 }
141
147 [[nodiscard]] virtual bool NeedsTargetBrickLinking() const {
148 return false;
149 }
150
156 [[nodiscard]] virtual int GetConnectionCount() const = 0;
157
166 [[nodiscard]] virtual const vecDouble& GetChangeRates();
167
174 virtual void StoreInOutgoingFlux(double* rate, int index);
175
183 void ApplyChange(int connectionIndex, double rate, double timeStepInDays);
184
188 virtual void Finalize() {
189 // Nothing to do here.
190 }
191
197 virtual vecDoublePt GetStateVariables() {
198 return vecDoublePt{};
199 }
200
207 [[nodiscard]] virtual double* GetValuePointer(std::string_view name);
208
214 const string& GetName() const {
215 return _name;
216 }
217
223 void SetName(const string& name) {
224 _name = name;
225 }
226
233 void SetTimeMachine(TimeMachine* timeMachine) {
234 _timeMachine = timeMachine;
235 }
236
243 return _container;
244 }
245
251 virtual void SetTargetBrick(Brick*) {
252 throw ShouldNotHappen("Process::SetTargetBrick - Should not be called (virtual)");
253 }
254
260 [[nodiscard]] virtual bool LinksMultipleTargets() const {
261 return false;
262 }
263
271 virtual void AddTargetBrickWithWeights(Brick*, const std::vector<Brick*>&) {
272 throw ShouldNotHappen("Process::AddTargetBrickWithWeights - Should not be called (virtual)");
273 }
274
280 [[nodiscard]] virtual bool IsLateralProcess() const noexcept {
281 return false;
282 }
283
289 [[nodiscard]] bool HasOutputFluxes() const noexcept {
290 return !_outputs.empty();
291 }
292
298 [[nodiscard]] bool HasWaterContainer() const noexcept {
299 return _container != nullptr;
300 }
301
302 protected:
303 string _name;
304 WaterContainer* _container; // non-owning reference
305 TimeMachine* _timeMachine{nullptr}; // non-owning reference
306 std::vector<std::unique_ptr<Flux>> _outputs; // owning
307 vecDouble _changeRates; // reusable buffer for the change rates (avoids per-call allocation)
308
318 const vecDouble& StoreRates(std::initializer_list<double> rates) {
319 _changeRates.assign(rates);
320 return _changeRates;
321 }
322
328 [[nodiscard]] double GetSumChangeRatesOtherProcesses() const;
329
339 [[nodiscard]] virtual const vecDouble& GetRates() = 0;
340};
341
342#endif // HYDROBRICKS_PROCESS_H
Definition Brick.h:22
Definition Flux.h:9
Definition Forcing.h:7
Definition HydroUnit.h:18
Definition Process.h:16
virtual void Finalize()
Definition Process.h:188
bool HasWaterContainer() const noexcept
Definition Process.h:298
const vecDouble & StoreRates(std::initializer_list< double > rates)
Definition Process.h:318
static std::unique_ptr< Process > Factory(const ProcessSettings &processSettings, Brick *brick)
Definition Process.cpp:424
virtual void SetHydroUnitProperties(HydroUnit *unit, Brick *brick)
Definition Process.cpp:451
void SetName(const string &name)
Definition Process.h:223
WaterContainer * GetWaterContainer() const
Definition Process.h:242
virtual void AttachForcing(Forcing *)
Definition Process.h:98
const string & GetName() const
Definition Process.h:214
void AttachFluxOut(std::unique_ptr< Flux > flux)
Definition Process.h:107
virtual bool ToAtmosphere() const
Definition Process.h:138
virtual double * GetValuePointer(std::string_view name)
Definition Process.cpp:510
virtual void Validate() const
Definition Process.cpp:533
virtual bool IsLateralProcess() const noexcept
Definition Process.h:280
virtual void SetParameters(const ProcessSettings &processSettings)
Definition Process.cpp:455
double GetSumChangeRatesOtherProcesses() const
Definition Process.cpp:514
virtual bool NeedsTargetBrickLinking() const
Definition Process.h:147
void ApplyChange(int connectionIndex, double rate, double timeStepInDays)
Definition Process.cpp:495
virtual vecDoublePt GetStateVariables()
Definition Process.h:197
static bool RegisterSettings(SettingsModel *modelSettings, const string &processType)
Definition Process.cpp:434
virtual void StoreInOutgoingFlux(double *rate, int index)
Definition Process.cpp:489
virtual int GetConnectionCount() const =0
virtual bool IsValid() const =0
static bool HasParameter(const ProcessSettings &processSettings, std::string_view name)
Definition Process.cpp:459
virtual void AddTargetBrickWithWeights(Brick *, const std::vector< Brick * > &)
Definition Process.h:271
virtual bool LinksMultipleTargets() const
Definition Process.h:260
int GetOutputFluxCount() const
Definition Process.h:117
void SetTimeMachine(TimeMachine *timeMachine)
Definition Process.h:233
virtual const vecDouble & GetRates()=0
virtual const vecDouble & GetChangeRates()
Definition Process.cpp:480
Flux * GetOutputFlux(size_t index) const
Definition Process.h:127
virtual void Reset()
Definition Process.cpp:445
bool HasOutputFluxes() const noexcept
Definition Process.h:289
virtual void SetTargetBrick(Brick *)
Definition Process.h:251
static const float * GetParameterValuePointer(const ProcessSettings &processSettings, std::string_view name)
Definition Process.cpp:469
Definition SettingsModel.h:70
Exception for code paths that should never be reached.
Definition Exceptions.h:133
Definition TimeMachine.h:9
Definition WaterContainer.h:9
Definition SettingsModel.h:30