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
60 static const float* GetParameterValuePointer(const BrickSettings& brickSettings, std::string_view name);
61
67 virtual void SetParameters(const BrickSettings& brickSettings);
68
74 virtual void AttachFluxIn(Flux* flux);
75
82 virtual void AttachFluxIn(std::unique_ptr<Flux> flux);
83
89 void AddProcess(std::unique_ptr<Process> process) {
90 assert(process);
91 _processes.push_back(std::move(process));
92 }
93
97 virtual void Reset();
98
102 virtual void SaveAsInitialState();
103
109 [[nodiscard]] virtual bool IsValid(bool checkProcesses = true) const;
110
117 virtual void Validate() const;
118
124 [[nodiscard]] bool NeedsSolver() const {
125 return _needsSolver;
126 }
127
134 void SetNeedsSolver(bool needsSolver) {
135 _needsSolver = needsSolver;
136 }
137
143 [[nodiscard]] BrickCategory GetCategory() const {
144 return _category;
145 }
146
152 [[nodiscard]] virtual bool CanHaveAreaFraction() const {
153 return false;
154 }
155
161 [[nodiscard]] virtual bool IsLandCover() const {
162 return false;
163 }
164
170 [[nodiscard]] virtual bool IsNull() const {
171 return false;
172 }
173
179 [[nodiscard]] bool HasProcesses() const {
180 return !_processes.empty();
181 }
182
188 [[nodiscard]] bool HasHydroUnit() const {
189 return _hydroUnit != nullptr;
190 }
191
195 virtual void Finalize();
196
203 virtual void SetInitialState(double value, ContentType type);
204
211 [[nodiscard]] virtual double GetContent(ContentType type) const;
212
219 virtual void UpdateContent(double value, ContentType type);
220
224 virtual void UpdateContentFromInputs();
225
231 virtual void ApplyConstraints(double timeStep);
232
238 [[nodiscard]] WaterContainer* GetWaterContainer() const;
239
245 [[nodiscard]] size_t GetProcessCount() const noexcept {
246 return _processes.size();
247 }
248
255 [[nodiscard]] Process* GetProcess(size_t index) const;
256
262 [[nodiscard]] const string& GetName() const noexcept {
263 return _name;
264 }
265
271 void SetName(std::string_view name) {
272 _name = string(name);
273 }
274
281 assert(_hydroUnit);
282 return _hydroUnit;
283 }
284
290 void SetHydroUnit(HydroUnit* hydroUnit) {
291 assert(hydroUnit);
292 _hydroUnit = hydroUnit;
293 }
294
300 virtual vecDoublePt GetDynamicContentChanges();
301
308
314 int GetProcessConnectionCount() const;
315
322 double* GetBaseValuePointer(std::string_view name);
323
332 virtual double* GetValuePointer(std::string_view name);
333
334 protected:
335 string _name;
336 bool _needsSolver;
337 BrickCategory _category;
338 std::unique_ptr<WaterContainer> _water; // owning
339 std::vector<std::unique_ptr<Process>> _processes; // owning
340 HydroUnit* _hydroUnit; // non-owning back-reference
341};
342
343#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:174
size_t GetProcessCount() const noexcept
Definition Brick.h:245
void SetHydroUnit(HydroUnit *hydroUnit)
Definition Brick.h:290
double * GetBaseValuePointer(std::string_view name)
Definition Brick.cpp:208
virtual void UpdateContentFromInputs()
Definition Brick.cpp:166
const string & GetName() const noexcept
Definition Brick.h:262
bool HasProcesses() const
Definition Brick.h:179
virtual void ApplyConstraints(double timeStep)
Definition Brick.cpp:170
Process * GetProcess(size_t index) const
Definition Brick.cpp:120
virtual void Finalize()
Definition Brick.cpp:127
BrickCategory GetCategory() const
Definition Brick.h:143
HydroUnit * GetHydroUnit() const
Definition Brick.h:280
virtual void Reset()
Definition Brick.cpp:47
virtual void UpdateContent(double value, ContentType type)
Definition Brick.cpp:156
bool HasHydroUnit() const
Definition Brick.h:188
virtual bool CanHaveAreaFraction() const
Definition Brick.h:152
virtual void Validate() const
Definition Brick.cpp:73
bool NeedsSolver() const
Definition Brick.h:124
virtual void SetParameters(const BrickSettings &brickSettings)
Definition Brick.cpp:80
virtual bool IsNull() const
Definition Brick.h:170
void SetName(std::string_view name)
Definition Brick.h:271
virtual void AttachFluxIn(Flux *flux)
Definition Brick.cpp:86
virtual void SetInitialState(double value, ContentType type)
Definition Brick.cpp:137
virtual void SaveAsInitialState()
Definition Brick.cpp:54
virtual double * GetValuePointer(std::string_view name)
Definition Brick.cpp:216
static const float * GetParameterValuePointer(const BrickSettings &brickSettings, std::string_view name)
Definition Brick.cpp:109
int GetProcessConnectionCount() const
Definition Brick.cpp:198
virtual bool IsLandCover() const
Definition Brick.h:161
vecDoublePt GetStateVariableChangesFromProcesses()
Definition Brick.cpp:182
void SetNeedsSolver(bool needsSolver)
Definition Brick.h:134
virtual bool IsValid(bool checkProcesses=true) const
Definition Brick.cpp:58
virtual vecDoublePt GetDynamicContentChanges()
Definition Brick.cpp:178
void AddProcess(std::unique_ptr< Process > process)
Definition Brick.h:89
virtual double GetContent(ContentType type) const
Definition Brick.cpp:147
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:9
Definition SettingsModel.h:47