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
135 [[nodiscard]] BrickCategory GetCategory() const {
136 return _category;
137 }
138
144 [[nodiscard]] virtual bool CanHaveAreaFraction() const {
145 return false;
146 }
147
153 [[nodiscard]] virtual bool IsLandCover() const {
154 return false;
155 }
156
162 [[nodiscard]] virtual bool IsNull() const {
163 return false;
164 }
165
171 [[nodiscard]] bool HasProcesses() const {
172 return !_processes.empty();
173 }
174
180 [[nodiscard]] bool HasHydroUnit() const {
181 return _hydroUnit != nullptr;
182 }
183
187 virtual void Finalize();
188
195 virtual void SetInitialState(double value, ContentType type);
196
203 [[nodiscard]] virtual double GetContent(ContentType type) const;
204
211 virtual void UpdateContent(double value, ContentType type);
212
216 virtual void UpdateContentFromInputs();
217
223 virtual void ApplyConstraints(double timeStep);
224
230 [[nodiscard]] WaterContainer* GetWaterContainer() const;
231
237 [[nodiscard]] size_t GetProcessCount() const noexcept {
238 return _processes.size();
239 }
240
247 [[nodiscard]] Process* GetProcess(size_t index) const;
248
254 [[nodiscard]] const string& GetName() const noexcept {
255 return _name;
256 }
257
263 void SetName(std::string_view name) {
264 _name = string(name);
265 }
266
273 assert(_hydroUnit);
274 return _hydroUnit;
275 }
276
282 void SetHydroUnit(HydroUnit* hydroUnit) {
283 assert(hydroUnit);
284 _hydroUnit = hydroUnit;
285 }
286
292 virtual vecDoublePt GetDynamicContentChanges();
293
300
306 int GetProcessConnectionCount() const;
307
313 double* GetBaseValuePointer(std::string_view name);
314
320 virtual double* GetValuePointer(std::string_view name);
321
322 protected:
323 string _name;
324 bool _needsSolver;
325 BrickCategory _category;
326 std::unique_ptr<WaterContainer> _water; // owning
327 std::vector<std::unique_ptr<Process>> _processes; // owning
328 HydroUnit* _hydroUnit; // non-owning back-reference
329};
330
331#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:171
size_t GetProcessCount() const noexcept
Definition Brick.h:237
void SetHydroUnit(HydroUnit *hydroUnit)
Definition Brick.h:282
double * GetBaseValuePointer(std::string_view name)
Definition Brick.cpp:205
virtual void UpdateContentFromInputs()
Definition Brick.cpp:163
const string & GetName() const noexcept
Definition Brick.h:254
bool HasProcesses() const
Definition Brick.h:171
virtual void ApplyConstraints(double timeStep)
Definition Brick.cpp:167
Process * GetProcess(size_t index) const
Definition Brick.cpp:123
virtual void Finalize()
Definition Brick.cpp:130
BrickCategory GetCategory() const
Definition Brick.h:135
HydroUnit * GetHydroUnit() const
Definition Brick.h:272
virtual void Reset()
Definition Brick.cpp:50
virtual void UpdateContent(double value, ContentType type)
Definition Brick.cpp:153
bool HasHydroUnit() const
Definition Brick.h:180
virtual bool CanHaveAreaFraction() const
Definition Brick.h:144
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:162
void SetName(std::string_view name)
Definition Brick.h:263
virtual void AttachFluxIn(Flux *flux)
Definition Brick.cpp:89
virtual void SetInitialState(double value, ContentType type)
Definition Brick.cpp:134
virtual void SaveAsInitialState()
Definition Brick.cpp:57
virtual double * GetValuePointer(std::string_view name)
Definition Brick.cpp:213
static const float * GetParameterValuePointer(const BrickSettings &brickSettings, std::string_view name)
Definition Brick.cpp:112
int GetProcessConnectionCount() const
Definition Brick.cpp:195
virtual bool IsLandCover() const
Definition Brick.h:153
vecDoublePt GetStateVariableChangesFromProcesses()
Definition Brick.cpp:179
virtual bool IsValid(bool checkProcesses=true) const
Definition Brick.cpp:61
virtual vecDoublePt GetDynamicContentChanges()
Definition Brick.cpp:175
void AddProcess(std::unique_ptr< Process > process)
Definition Brick.h:91
virtual double GetContent(ContentType type) const
Definition Brick.cpp:144
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