hydrobricks
Loading...
Searching...
No Matches
HydroUnit.h
1#ifndef HYDROBRICKS_HYDRO_UNIT_H
2#define HYDROBRICKS_HYDRO_UNIT_H
3
4#include <memory>
5#include <unordered_map>
6#include <vector>
7
8#include "Brick.h"
9#include "Forcing.h"
10#include "HydroUnitLateralConnection.h"
11#include "HydroUnitProperty.h"
12#include "Includes.h"
13#include "LandCover.h"
14#include "Splitter.h"
15
17
18class HydroUnit : public wxObject {
19 public:
20 enum Types {
21 Distributed,
22 SemiDistributed,
23 Lumped,
24 Undefined
25 };
26
27 explicit HydroUnit(double area = UNDEFINED, Types type = Undefined);
28
29 ~HydroUnit() override;
30
34 void Reset();
35
39 void SaveAsInitialState();
40
46 void SetProperties(HydroUnitSettings& unitSettings);
47
53 void AddProperty(std::unique_ptr<HydroUnitProperty> property);
54
62 double GetPropertyDouble(const string& name, const string& unit = "") const;
63
71 float GetPropertyFloat(const string& name, const string& unit = "") const;
72
79 string GetPropertyString(const string& name) const;
80
86 void AddBrick(std::unique_ptr<Brick> brick);
87
93 void AddSplitter(std::unique_ptr<Splitter> splitter);
94
101 [[nodiscard]] bool HasForcing(VariableType type);
102
108 void AddForcing(std::unique_ptr<Forcing> forcing);
109
116 Forcing* GetForcing(VariableType type) const;
117
126 void AddLateralConnection(HydroUnit* receiver, double fraction, const string& type = "");
127
133 void ReserveBricks(size_t count);
134
140 void ReserveLandCoverBricks(size_t count);
141
147 void ReserveSplitters(size_t count);
148
154 void ReserveLateralConnections(size_t count);
155
161 void ReserveForcings(size_t count);
162
168 int GetBrickCount() const;
169
175 int GetSplitterCount() const;
176
183 Brick* GetBrick(size_t index) const;
184
191 [[nodiscard]] bool HasBrick(const string& name) const;
192
199 Brick* GetBrick(const string& name) const;
200
207 Brick* TryGetBrick(const string& name) const;
208
214 [[nodiscard]] std::vector<Brick*> GetSnowpacks() const {
215 std::vector<Brick*> snowBricks;
216 snowBricks.reserve(_bricks.size());
217 for (const auto& brick : _bricks) {
218 if (brick->GetCategory() == BrickCategory::Snowpack) {
219 snowBricks.push_back(brick.get());
220 }
221 }
222 return snowBricks;
223 }
224
231 LandCover* GetLandCover(const string& name) const;
232
239 LandCover* TryGetLandCover(const string& name) const;
240
247 Splitter* GetSplitter(size_t index) const;
248
255 [[nodiscard]] bool HasSplitter(const string& name) const;
256
263 Splitter* GetSplitter(const string& name) const;
264
271 Splitter* TryGetSplitter(const string& name) const;
272
278 [[nodiscard]] bool IsValid(bool checkProcesses = true) const;
279
286 void Validate() const;
287
295 bool ChangeLandCoverAreaFraction(const string& name, double fraction);
296
303
309 Types GetType() const {
310 return _type;
311 }
312
318 void SetId(int id) {
319 _id = id;
320 }
321
327 [[nodiscard]] double GetArea() const {
328 return _area;
329 }
330
336 [[nodiscard]] int GetId() const {
337 return _id;
338 }
339
345 [[nodiscard]] std::vector<HydroUnitLateralConnection*> GetLateralConnections() const;
346
347 protected:
348 Types _type;
349 int _id;
350 double _area; // [m²]
351 std::vector<std::unique_ptr<HydroUnitProperty>> _properties; // owning
352 std::vector<std::unique_ptr<HydroUnitLateralConnection>> _lateralConnections; // owning
353 std::vector<std::unique_ptr<Brick>> _bricks; // owning
354 std::unordered_map<string, Brick*> _brickMap; // non-owning view into _bricks
355 std::vector<LandCover*> _landCoverBricks; // non-owning view into _bricks
356 std::unordered_map<string, LandCover*> _landCoverMap; // non-owning view into _landCoverBricks
357 std::vector<std::unique_ptr<Splitter>> _splitters; // owning
358 std::unordered_map<string, Splitter*> _splitterMap; // non-owning view into _splitters
359 std::vector<std::unique_ptr<Forcing>> _forcing; // owning
360 std::unordered_map<VariableType, Forcing*> _forcingMap; // non-owning view into _forcing
361};
362
363#endif
Definition Brick.h:24
Definition Forcing.h:7
Definition HydroUnit.h:18
void Validate() const
Definition HydroUnit.cpp:252
Splitter * TryGetSplitter(const string &name) const
Definition HydroUnit.cpp:207
void ReserveForcings(size_t count)
Definition HydroUnit.cpp:32
void ReserveLandCoverBricks(size_t count)
Definition HydroUnit.cpp:20
float GetPropertyFloat(const string &name, const string &unit="") const
Definition HydroUnit.cpp:79
void SetId(int id)
Definition HydroUnit.h:318
double GetPropertyDouble(const string &name, const string &unit="") const
Definition HydroUnit.cpp:69
bool HasSplitter(const string &name) const
Definition HydroUnit.cpp:194
bool HasBrick(const string &name) const
Definition HydroUnit.cpp:155
Splitter * GetSplitter(size_t index) const
Definition HydroUnit.cpp:187
void SetProperties(HydroUnitSettings &unitSettings)
Definition HydroUnit.cpp:48
void SaveAsInitialState()
Definition HydroUnit.cpp:42
Types GetType() const
Definition HydroUnit.h:309
bool ChangeLandCoverAreaFraction(const string &name, double fraction)
Definition HydroUnit.cpp:259
LandCover * GetLandCover(const string &name) const
Definition HydroUnit.cpp:173
void AddSplitter(std::unique_ptr< Splitter > splitter)
Definition HydroUnit.cpp:106
int GetSplitterCount() const
Definition HydroUnit.cpp:144
void ReserveSplitters(size_t count)
Definition HydroUnit.cpp:24
string GetPropertyString(const string &name) const
Definition HydroUnit.cpp:83
void AddProperty(std::unique_ptr< HydroUnitProperty > property)
Definition HydroUnit.cpp:64
Brick * GetBrick(size_t index) const
Definition HydroUnit.cpp:148
bool IsValid(bool checkProcesses=true) const
Definition HydroUnit.cpp:212
void ReserveBricks(size_t count)
Definition HydroUnit.cpp:16
double GetArea() const
Definition HydroUnit.h:327
void AddForcing(std::unique_ptr< Forcing > forcing)
Definition HydroUnit.cpp:117
int GetBrickCount() const
Definition HydroUnit.cpp:140
Forcing * GetForcing(VariableType type) const
Definition HydroUnit.cpp:123
Brick * TryGetBrick(const string &name) const
Definition HydroUnit.cpp:168
bool FixLandCoverFractionsTotal()
Definition HydroUnit.cpp:273
std::vector< Brick * > GetSnowpacks() const
Definition HydroUnit.h:214
std::vector< HydroUnitLateralConnection * > GetLateralConnections() const
Definition HydroUnit.cpp:314
LandCover * TryGetLandCover(const string &name) const
Definition HydroUnit.cpp:182
void AddBrick(std::unique_ptr< Brick > brick)
Definition HydroUnit.cpp:93
void ReserveLateralConnections(size_t count)
Definition HydroUnit.cpp:28
void AddLateralConnection(HydroUnit *receiver, double fraction, const string &type="")
Definition HydroUnit.cpp:132
int GetId() const
Definition HydroUnit.h:336
void Reset()
Definition HydroUnit.cpp:36
bool HasForcing(VariableType type)
Definition HydroUnit.cpp:113
Definition LandCover.h:10
Definition Splitter.h:13
Definition SettingsBasin.h:30