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 WaterContainer;
14
15class Process : public wxObject {
16 public:
17 explicit Process(WaterContainer* container);
18
19 ~Process() override = default;
20
28 static Process* Factory(const ProcessSettings& processSettings, Brick* brick);
29
37 [[nodiscard]] static bool RegisterParametersAndForcing(SettingsModel* modelSettings, const string& processType);
38
42 void Reset();
43
49 [[nodiscard]] virtual bool IsValid() const = 0;
50
57 virtual void Validate() const;
58
66 [[nodiscard]] static bool HasParameter(const ProcessSettings& processSettings, const string& name);
67
75 static const float* GetParameterValuePointer(const ProcessSettings& processSettings, const string& name);
76
83 virtual void SetHydroUnitProperties(HydroUnit* unit, Brick* brick);
84
90 virtual void SetParameters(const ProcessSettings& processSettings);
91
97 virtual void AttachForcing(Forcing*) {
98 throw ShouldNotHappen("Process::AttachForcing - Should not be called (virtual)");
99 }
100
106 void AttachFluxOut(std::unique_ptr<Flux> flux) {
107 wxASSERT(flux);
108 _outputs.push_back(std::move(flux));
109 }
110
116 int GetOutputFluxCount() const {
117 return static_cast<int>(_outputs.size());
118 }
119
126 Flux* GetOutputFlux(size_t index) const {
127 wxASSERT(_outputs.size() > index);
128 wxASSERT(_outputs[index]);
129 return _outputs[index].get();
130 }
131
137 [[nodiscard]] virtual bool ToAtmosphere() const {
138 return false;
139 }
140
146 [[nodiscard]] virtual bool NeedsTargetBrickLinking() const {
147 return false;
148 }
149
155 virtual int GetConnectionCount() const = 0;
156
162 virtual vecDouble GetChangeRates();
163
170 virtual void StoreInOutgoingFlux(double* rate, int index);
171
179 void ApplyChange(int connectionIndex, double rate, double timeStepInDays);
180
184 virtual void Finalize() {
185 // Nothing to do here.
186 }
187
193 virtual vecDoublePt GetStateVariables() {
194 return vecDoublePt{};
195 }
196
203 virtual double* GetValuePointer(const string& name);
204
210 const string& GetName() const {
211 return _name;
212 }
213
219 void SetName(const string& name) {
220 _name = name;
221 }
222
229 return _container;
230 }
231
237 virtual void SetTargetBrick(Brick*) {
238 throw ShouldNotHappen("Process::SetTargetBrick - Should not be called (virtual)");
239 }
240
246 [[nodiscard]] virtual bool IsLateralProcess() const {
247 return false;
248 }
249
255 [[nodiscard]] bool HasOutputFluxes() const {
256 return !_outputs.empty();
257 }
258
264 [[nodiscard]] bool HasWaterContainer() const {
265 return _container != nullptr;
266 }
267
268 protected:
269 string _name;
270 WaterContainer* _container; // non-owning reference
271 std::vector<std::unique_ptr<Flux>> _outputs; // owning
272
278 double GetSumChangeRatesOtherProcesses() const;
279
285 virtual vecDouble GetRates() = 0;
286};
287
288#endif // HYDROBRICKS_PROCESS_H
Definition Brick.h:24
Definition Flux.h:9
Definition Forcing.h:7
Definition HydroUnit.h:18
Definition Process.h:15
virtual void Finalize()
Definition Process.h:184
static const float * GetParameterValuePointer(const ProcessSettings &processSettings, const string &name)
Definition Process.cpp:209
virtual vecDouble GetChangeRates()
Definition Process.cpp:220
virtual void SetHydroUnitProperties(HydroUnit *unit, Brick *brick)
Definition Process.cpp:191
virtual vecDouble GetRates()=0
void SetName(const string &name)
Definition Process.h:219
WaterContainer * GetWaterContainer() const
Definition Process.h:228
virtual void AttachForcing(Forcing *)
Definition Process.h:97
const string & GetName() const
Definition Process.h:210
void AttachFluxOut(std::unique_ptr< Flux > flux)
Definition Process.h:106
virtual bool ToAtmosphere() const
Definition Process.h:137
static bool RegisterParametersAndForcing(SettingsModel *modelSettings, const string &processType)
Definition Process.cpp:152
virtual void Validate() const
Definition Process.cpp:274
virtual void SetParameters(const ProcessSettings &processSettings)
Definition Process.cpp:195
static bool HasParameter(const ProcessSettings &processSettings, const string &name)
Definition Process.cpp:199
bool HasWaterContainer() const
Definition Process.h:264
virtual bool IsLateralProcess() const
Definition Process.h:246
double GetSumChangeRatesOtherProcesses() const
Definition Process.cpp:255
virtual bool NeedsTargetBrickLinking() const
Definition Process.h:146
void ApplyChange(int connectionIndex, double rate, double timeStepInDays)
Definition Process.cpp:236
bool HasOutputFluxes() const
Definition Process.h:255
static Process * Factory(const ProcessSettings &processSettings, Brick *brick)
Definition Process.cpp:60
virtual double * GetValuePointer(const string &name)
Definition Process.cpp:251
virtual vecDoublePt GetStateVariables()
Definition Process.h:193
virtual void StoreInOutgoingFlux(double *rate, int index)
Definition Process.cpp:230
virtual int GetConnectionCount() const =0
virtual bool IsValid() const =0
int GetOutputFluxCount() const
Definition Process.h:116
Flux * GetOutputFlux(size_t index) const
Definition Process.h:126
void Reset()
Definition Process.cpp:185
virtual void SetTargetBrick(Brick *)
Definition Process.h:237
Definition SettingsModel.h:68
Exception for code paths that should never be reached.
Definition Exceptions.h:147
Definition WaterContainer.h:9
Definition SettingsModel.h:29