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 RegisterParametersAndForcing(SettingsModel* modelSettings, const string& processType);
39
43 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
163 [[nodiscard]] virtual vecDouble GetChangeRates();
164
171 virtual void StoreInOutgoingFlux(double* rate, int index);
172
180 void ApplyChange(int connectionIndex, double rate, double timeStepInDays);
181
185 virtual void Finalize() {
186 // Nothing to do here.
187 }
188
194 virtual vecDoublePt GetStateVariables() {
195 return vecDoublePt{};
196 }
197
204 [[nodiscard]] virtual double* GetValuePointer(std::string_view name);
205
211 const string& GetName() const {
212 return _name;
213 }
214
220 void SetName(const string& name) {
221 _name = name;
222 }
223
230 void SetTimeMachine(TimeMachine* timeMachine) {
231 _timeMachine = timeMachine;
232 }
233
240 return _container;
241 }
242
248 virtual void SetTargetBrick(Brick*) {
249 throw ShouldNotHappen("Process::SetTargetBrick - Should not be called (virtual)");
250 }
251
257 [[nodiscard]] virtual bool IsLateralProcess() const noexcept {
258 return false;
259 }
260
266 [[nodiscard]] bool HasOutputFluxes() const noexcept {
267 return !_outputs.empty();
268 }
269
275 [[nodiscard]] bool HasWaterContainer() const noexcept {
276 return _container != nullptr;
277 }
278
279 protected:
280 string _name;
281 WaterContainer* _container; // non-owning reference
282 TimeMachine* _timeMachine{nullptr}; // non-owning reference
283 std::vector<std::unique_ptr<Flux>> _outputs; // owning
284
290 [[nodiscard]] double GetSumChangeRatesOtherProcesses() const;
291
297 [[nodiscard]] virtual vecDouble GetRates() = 0;
298};
299
300#endif // HYDROBRICKS_PROCESS_H
Definition Brick.h:24
Definition Flux.h:9
Definition Forcing.h:7
Definition HydroUnit.h:18
Definition Process.h:16
virtual void Finalize()
Definition Process.h:185
virtual vecDouble GetChangeRates()
Definition Process.cpp:250
bool HasWaterContainer() const noexcept
Definition Process.h:275
static std::unique_ptr< Process > Factory(const ProcessSettings &processSettings, Brick *brick)
Definition Process.cpp:194
virtual void SetHydroUnitProperties(HydroUnit *unit, Brick *brick)
Definition Process.cpp:221
virtual vecDouble GetRates()=0
void SetName(const string &name)
Definition Process.h:220
WaterContainer * GetWaterContainer() const
Definition Process.h:239
virtual void AttachForcing(Forcing *)
Definition Process.h:98
const string & GetName() const
Definition Process.h:211
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:281
static bool RegisterParametersAndForcing(SettingsModel *modelSettings, const string &processType)
Definition Process.cpp:204
virtual void Validate() const
Definition Process.cpp:304
virtual bool IsLateralProcess() const noexcept
Definition Process.h:257
virtual void SetParameters(const ProcessSettings &processSettings)
Definition Process.cpp:225
double GetSumChangeRatesOtherProcesses() const
Definition Process.cpp:285
virtual bool NeedsTargetBrickLinking() const
Definition Process.h:147
void ApplyChange(int connectionIndex, double rate, double timeStepInDays)
Definition Process.cpp:266
virtual vecDoublePt GetStateVariables()
Definition Process.h:194
virtual void StoreInOutgoingFlux(double *rate, int index)
Definition Process.cpp:260
virtual int GetConnectionCount() const =0
virtual bool IsValid() const =0
static bool HasParameter(const ProcessSettings &processSettings, std::string_view name)
Definition Process.cpp:229
int GetOutputFluxCount() const
Definition Process.h:117
void SetTimeMachine(TimeMachine *timeMachine)
Definition Process.h:230
Flux * GetOutputFlux(size_t index) const
Definition Process.h:127
void Reset()
Definition Process.cpp:215
bool HasOutputFluxes() const noexcept
Definition Process.h:266
virtual void SetTargetBrick(Brick *)
Definition Process.h:248
static const float * GetParameterValuePointer(const ProcessSettings &processSettings, std::string_view name)
Definition Process.cpp:239
Definition SettingsModel.h:68
Exception for code paths that should never be reached.
Definition Exceptions.h:133
Definition TimeMachine.h:9
Definition WaterContainer.h:9
Definition SettingsModel.h:29