hydrobricks
Loading...
Searching...
No Matches
Brick.h
1#ifndef HYDROBRICKS_BRICK_H
2#define HYDROBRICKS_BRICK_H
3
4#include <memory>
5
6#include "Flux.h"
7#include "Includes.h"
8#include "Process.h"
9#include "SettingsModel.h"
10#include "WaterContainer.h"
11
15enum class BrickCategory {
16 Snowpack,
17 Glacier,
19 Unknown
20};
21
22class Brick {
23 public:
24 explicit Brick();
25
26 virtual ~Brick() = default;
27
34 static std::unique_ptr<Brick> Factory(const BrickSettings& brickSettings);
35
42 static std::unique_ptr<Brick> Factory(BrickType type);
43
51 static bool HasParameter(const BrickSettings& brickSettings, std::string_view name);
52
62 const float* GetParameterValuePointer(const BrickSettings& brickSettings, std::string_view name);
63
69 virtual void SetParameters(const BrickSettings& brickSettings);
70
76 virtual void AttachFluxIn(Flux* flux);
77
84 virtual void AttachFluxIn(std::unique_ptr<Flux> flux);
85
91 void AddProcess(std::unique_ptr<Process> process) {
92 assert(process);
93 _processes.push_back(std::move(process));
94 }
95
99 virtual void Reset();
100
104 virtual void SaveAsInitialState();
105
111 [[nodiscard]] virtual bool IsValid(bool checkProcesses = true) const;
112
119 virtual void Validate() const;
120
126 [[nodiscard]] bool NeedsSolver() const {
127 return _needsSolver;
128 }
129
136 void SetNeedsSolver(bool needsSolver) {
137 _needsSolver = needsSolver;
138 }
139
145 [[nodiscard]] BrickCategory GetCategory() const {
146 return _category;
147 }
148
154 [[nodiscard]] virtual bool CanHaveAreaFraction() const {
155 return false;
156 }
157
163 [[nodiscard]] virtual bool IsLandCover() const {
164 return false;
165 }
166
172 [[nodiscard]] virtual bool IsNull() const {
173 return false;
174 }
175
181 [[nodiscard]] bool HasProcesses() const {
182 return !_processes.empty();
183 }
184
190 [[nodiscard]] bool HasHydroUnit() const {
191 return _hydroUnit != nullptr;
192 }
193
197 virtual void Finalize();
198
205 virtual void SetInitialState(double value, ContentType type);
206
213 [[nodiscard]] virtual double GetContent(ContentType type) const;
214
221 virtual void UpdateContent(double value, ContentType type);
222
226 virtual void UpdateContentFromInputs(double timeStepInDays = 1.0);
227
232 virtual void ResetInputBooking();
233
239 virtual void ApplyConstraints(double timeStep);
240
246 [[nodiscard]] WaterContainer* GetWaterContainer() const;
247
253 [[nodiscard]] size_t GetProcessCount() const noexcept {
254 return _processes.size();
255 }
256
263 [[nodiscard]] Process* GetProcess(size_t index) const;
264
270 [[nodiscard]] const string& GetName() const noexcept {
271 return _name;
272 }
273
279 void SetName(std::string_view name) {
280 _name = string(name);
281 }
282
289 assert(_hydroUnit);
290 return _hydroUnit;
291 }
292
298 void SetHydroUnit(HydroUnit* hydroUnit) {
299 assert(hydroUnit);
300 _hydroUnit = hydroUnit;
301 }
302
308 virtual vecDoublePt GetDynamicContentChanges();
309
316
322 int GetProcessConnectionCount() const;
323
330 double* GetBaseValuePointer(std::string_view name);
331
340 virtual double* GetValuePointer(std::string_view name);
341
342 protected:
343 string _name;
344 bool _needsSolver;
345 BrickCategory _category;
346 std::unique_ptr<WaterContainer> _water; // owning
347 std::vector<std::unique_ptr<Process>> _processes; // owning
348 HydroUnit* _hydroUnit; // non-owning back-reference
349};
350
351#endif // HYDROBRICKS_BRICK_H
Definition Brick.h:22
static bool HasParameter(const BrickSettings &brickSettings, std::string_view name)
Definition Brick.cpp:104
static std::unique_ptr< Brick > Factory(const BrickSettings &brickSettings)
Definition Brick.cpp:20
WaterContainer * GetWaterContainer() const
Definition Brick.cpp:187
virtual void ResetInputBooking()
Definition Brick.cpp:179
size_t GetProcessCount() const noexcept
Definition Brick.h:253
void SetHydroUnit(HydroUnit *hydroUnit)
Definition Brick.h:298
double * GetBaseValuePointer(std::string_view name)
Definition Brick.cpp:221
const string & GetName() const noexcept
Definition Brick.h:270
bool HasProcesses() const
Definition Brick.h:181
virtual void ApplyConstraints(double timeStep)
Definition Brick.cpp:183
virtual void UpdateContentFromInputs(double timeStepInDays=1.0)
Definition Brick.cpp:175
Process * GetProcess(size_t index) const
Definition Brick.cpp:129
virtual void Finalize()
Definition Brick.cpp:136
BrickCategory GetCategory() const
Definition Brick.h:145
HydroUnit * GetHydroUnit() const
Definition Brick.h:288
virtual void Reset()
Definition Brick.cpp:47
virtual void UpdateContent(double value, ContentType type)
Definition Brick.cpp:165
bool HasHydroUnit() const
Definition Brick.h:190
virtual bool CanHaveAreaFraction() const
Definition Brick.h:154
virtual void Validate() const
Definition Brick.cpp:73
bool NeedsSolver() const
Definition Brick.h:126
virtual void SetParameters(const BrickSettings &brickSettings)
Definition Brick.cpp:80
virtual bool IsNull() const
Definition Brick.h:172
void SetName(std::string_view name)
Definition Brick.h:279
virtual void AttachFluxIn(Flux *flux)
Definition Brick.cpp:86
virtual void SetInitialState(double value, ContentType type)
Definition Brick.cpp:146
virtual void SaveAsInitialState()
Definition Brick.cpp:54
virtual double * GetValuePointer(std::string_view name)
Definition Brick.cpp:229
const float * GetParameterValuePointer(const BrickSettings &brickSettings, std::string_view name)
Definition Brick.cpp:109
int GetProcessConnectionCount() const
Definition Brick.cpp:211
virtual bool IsLandCover() const
Definition Brick.h:163
vecDoublePt GetStateVariableChangesFromProcesses()
Definition Brick.cpp:195
void SetNeedsSolver(bool needsSolver)
Definition Brick.h:136
virtual bool IsValid(bool checkProcesses=true) const
Definition Brick.cpp:58
virtual vecDoublePt GetDynamicContentChanges()
Definition Brick.cpp:191
void AddProcess(std::unique_ptr< Process > process)
Definition Brick.h:91
virtual double GetContent(ContentType type) const
Definition Brick.cpp:156
Definition Flux.h:9
Definition GenericLandCover.h:7
Definition Glacier.h:11
Definition HydroUnit.h:18
Definition Process.h:16
Definition Snowpack.h:10
Definition WaterContainer.h:10
Definition SettingsModel.h:52