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,
18 Urban,
21 Unknown
22};
23
24class Brick {
25 public:
26 explicit Brick();
27
28 virtual ~Brick() = default;
29
36 static std::unique_ptr<Brick> Factory(const BrickSettings& brickSettings);
37
44 static std::unique_ptr<Brick> Factory(BrickType type);
45
53 static bool HasParameter(const BrickSettings& brickSettings, std::string_view name);
54
62 static 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();
227
233 virtual void ApplyConstraints(double timeStep);
234
240 [[nodiscard]] WaterContainer* GetWaterContainer() const;
241
247 [[nodiscard]] size_t GetProcessCount() const noexcept {
248 return _processes.size();
249 }
250
257 [[nodiscard]] Process* GetProcess(size_t index) const;
258
264 [[nodiscard]] const string& GetName() const noexcept {
265 return _name;
266 }
267
273 void SetName(std::string_view name) {
274 _name = string(name);
275 }
276
283 assert(_hydroUnit);
284 return _hydroUnit;
285 }
286
292 void SetHydroUnit(HydroUnit* hydroUnit) {
293 assert(hydroUnit);
294 _hydroUnit = hydroUnit;
295 }
296
302 virtual vecDoublePt GetDynamicContentChanges();
303
310
316 int GetProcessConnectionCount() const;
317
323 double* GetBaseValuePointer(std::string_view name);
324
330 virtual double* GetValuePointer(std::string_view name);
331
332 protected:
333 string _name;
334 bool _needsSolver;
335 BrickCategory _category;
336 std::unique_ptr<WaterContainer> _water; // owning
337 std::vector<std::unique_ptr<Process>> _processes; // owning
338 HydroUnit* _hydroUnit; // non-owning back-reference
339};
340
341#endif // HYDROBRICKS_BRICK_H
Definition Brick.h:24
static bool HasParameter(const BrickSettings &brickSettings, std::string_view name)
Definition Brick.cpp:107
static std::unique_ptr< Brick > Factory(const BrickSettings &brickSettings)
Definition Brick.cpp:21
WaterContainer * GetWaterContainer() const
Definition Brick.cpp:177
size_t GetProcessCount() const noexcept
Definition Brick.h:247
void SetHydroUnit(HydroUnit *hydroUnit)
Definition Brick.h:292
double * GetBaseValuePointer(std::string_view name)
Definition Brick.cpp:211
virtual void UpdateContentFromInputs()
Definition Brick.cpp:169
const string & GetName() const noexcept
Definition Brick.h:264
bool HasProcesses() const
Definition Brick.h:181
virtual void ApplyConstraints(double timeStep)
Definition Brick.cpp:173
Process * GetProcess(size_t index) const
Definition Brick.cpp:123
virtual void Finalize()
Definition Brick.cpp:130
BrickCategory GetCategory() const
Definition Brick.h:145
HydroUnit * GetHydroUnit() const
Definition Brick.h:282
virtual void Reset()
Definition Brick.cpp:50
virtual void UpdateContent(double value, ContentType type)
Definition Brick.cpp:159
bool HasHydroUnit() const
Definition Brick.h:190
virtual bool CanHaveAreaFraction() const
Definition Brick.h:154
virtual void Validate() const
Definition Brick.cpp:76
bool NeedsSolver() const
Definition Brick.h:126
virtual void SetParameters(const BrickSettings &brickSettings)
Definition Brick.cpp:83
virtual bool IsNull() const
Definition Brick.h:172
void SetName(std::string_view name)
Definition Brick.h:273
virtual void AttachFluxIn(Flux *flux)
Definition Brick.cpp:89
virtual void SetInitialState(double value, ContentType type)
Definition Brick.cpp:140
virtual void SaveAsInitialState()
Definition Brick.cpp:57
virtual double * GetValuePointer(std::string_view name)
Definition Brick.cpp:219
static const float * GetParameterValuePointer(const BrickSettings &brickSettings, std::string_view name)
Definition Brick.cpp:112
int GetProcessConnectionCount() const
Definition Brick.cpp:201
virtual bool IsLandCover() const
Definition Brick.h:163
vecDoublePt GetStateVariableChangesFromProcesses()
Definition Brick.cpp:185
void SetNeedsSolver(bool needsSolver)
Definition Brick.h:136
virtual bool IsValid(bool checkProcesses=true) const
Definition Brick.cpp:61
virtual vecDoublePt GetDynamicContentChanges()
Definition Brick.cpp:181
void AddProcess(std::unique_ptr< Process > process)
Definition Brick.h:91
virtual double GetContent(ContentType type) const
Definition Brick.cpp:150
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 Urban.h:7
Definition Vegetation.h:7
Definition WaterContainer.h:9
Definition SettingsModel.h:47