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 {
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 virtual ~HydroUnit();
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 [[nodiscard]] double GetPropertyDouble(std::string_view name, std::string_view unit = "") const;
63
71 [[nodiscard]] float GetPropertyFloat(std::string_view name, std::string_view unit = "") const;
72
79 [[nodiscard]] string GetPropertyString(std::string_view 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) const;
102
108 void AddForcing(std::unique_ptr<Forcing> forcing);
109
116 [[nodiscard]] Forcing* GetForcing(VariableType type) const;
117
121 void ResetForcingUpdates();
122
131 void AddLateralConnection(HydroUnit* receiver, double fraction, const string& type = "");
132
138 void ReserveBricks(size_t count);
139
145 void ReserveLandCoverBricks(size_t count);
146
152 void ReserveSplitters(size_t count);
153
159 void ReserveLateralConnections(size_t count);
160
166 void ReserveForcings(size_t count);
167
173 [[nodiscard]] int GetBrickCount() const;
174
180 [[nodiscard]] int GetSplitterCount() const;
181
188 [[nodiscard]] Brick* GetBrick(size_t index) const;
189
196 [[nodiscard]] bool HasBrick(std::string_view name) const;
197
204 [[nodiscard]] Brick* GetBrick(std::string_view name) const;
205
212 [[nodiscard]] Brick* TryGetBrick(std::string_view name) const;
213
219 [[nodiscard]] std::vector<Brick*> GetSnowpacks() const {
220 std::vector<Brick*> snowBricks;
221 snowBricks.reserve(_bricks.size());
222 for (const auto& brick : _bricks) {
223 if (brick->GetCategory() == BrickCategory::Snowpack) {
224 snowBricks.push_back(brick.get());
225 }
226 }
227 return snowBricks;
228 }
229
236 [[nodiscard]] LandCover* GetLandCover(std::string_view name) const;
237
244 [[nodiscard]] LandCover* TryGetLandCover(std::string_view name) const;
245
252 [[nodiscard]] Splitter* GetSplitter(size_t index) const;
253
260 [[nodiscard]] bool HasSplitter(std::string_view name) const;
261
268 [[nodiscard]] Splitter* GetSplitter(std::string_view name) const;
269
276 [[nodiscard]] Splitter* TryGetSplitter(std::string_view name) const;
277
283 [[nodiscard]] bool IsValid(bool checkProcesses = true) const;
284
291 void Validate() const;
292
301 bool ChangeLandCoverAreaFraction(std::string_view name, double fraction);
302
309
315
322 [[nodiscard]] LandCover* GetGenericLandCover() const;
323
329 Types GetType() const {
330 return _type;
331 }
332
338 void SetId(int id) {
339 _id = id;
340 }
341
347 [[nodiscard]] double GetArea() const {
348 return _area;
349 }
350
356 [[nodiscard]] int GetId() const {
357 return _id;
358 }
359
367 void SetStructureId(int structureId) {
368 _structureId = structureId;
369 }
370
376 [[nodiscard]] int GetStructureId() const {
377 return _structureId;
378 }
379
385 [[nodiscard]] std::vector<HydroUnitLateralConnection*> GetLateralConnections() const;
386
387 private:
402 void TransferLandCoverContent(LandCover* changed, double oldFraction, double newFraction, LandCover* generic,
403 double genericOldFraction, double genericNewFraction);
404
405 protected:
406 Types _type;
407 int _id;
408 int _structureId = 1; // model-structure variant used
409 double _area; // [m²]
410 std::vector<std::unique_ptr<HydroUnitProperty>> _properties; // owning
411 std::vector<std::unique_ptr<HydroUnitLateralConnection>> _lateralConnections; // owning
412 std::vector<std::unique_ptr<Brick>> _bricks; // owning
413 std::unordered_map<string, Brick*> _brickMap; // non-owning view into _bricks
414 std::vector<LandCover*> _landCoverBricks; // non-owning view into _bricks
415 std::unordered_map<string, LandCover*> _landCoverMap; // non-owning view into _landCoverBricks
416 std::vector<std::unique_ptr<Splitter>> _splitters; // owning
417 std::unordered_map<string, Splitter*> _splitterMap; // non-owning view into _splitters
418 std::vector<std::unique_ptr<Forcing>> _forcing; // owning
419 std::unordered_map<VariableType, Forcing*> _forcingMap; // non-owning view into _forcing
420};
421
422#endif
Definition Brick.h:22
Definition Forcing.h:7
Definition HydroUnit.h:18
void Validate() const
Definition HydroUnit.cpp:326
Splitter * TryGetSplitter(std::string_view name) const
Definition HydroUnit.cpp:280
string GetPropertyString(std::string_view name) const
Definition HydroUnit.cpp:150
bool ChangeLandCoverAreaFraction(std::string_view name, double fraction)
Definition HydroUnit.cpp:332
void ReserveForcings(size_t count)
Definition HydroUnit.cpp:99
void ReserveLandCoverBricks(size_t count)
Definition HydroUnit.cpp:87
void SetId(int id)
Definition HydroUnit.h:338
LandCover * TryGetLandCover(std::string_view name) const
Definition HydroUnit.cpp:255
void SetStructureId(int structureId)
Definition HydroUnit.h:367
LandCover * GetLandCover(std::string_view name) const
Definition HydroUnit.cpp:246
Splitter * GetSplitter(size_t index) const
Definition HydroUnit.cpp:260
void SetProperties(HydroUnitSettings &unitSettings)
Definition HydroUnit.cpp:115
void SaveAsInitialState()
Definition HydroUnit.cpp:109
Types GetType() const
Definition HydroUnit.h:329
void AddSplitter(std::unique_ptr< Splitter > splitter)
Definition HydroUnit.cpp:173
void ResetForcingUpdates()
Definition HydroUnit.cpp:190
bool HasForcing(VariableType type) const
Definition HydroUnit.cpp:180
Brick * TryGetBrick(std::string_view name) const
Definition HydroUnit.cpp:241
double GetPropertyDouble(std::string_view name, std::string_view unit="") const
Definition HydroUnit.cpp:136
int GetSplitterCount() const
Definition HydroUnit.cpp:217
void ReserveSplitters(size_t count)
Definition HydroUnit.cpp:91
void AddProperty(std::unique_ptr< HydroUnitProperty > property)
Definition HydroUnit.cpp:131
Brick * GetBrick(size_t index) const
Definition HydroUnit.cpp:221
bool IsValid(bool checkProcesses=true) const
Definition HydroUnit.cpp:285
void ReserveBricks(size_t count)
Definition HydroUnit.cpp:83
double GetArea() const
Definition HydroUnit.h:347
void AddForcing(std::unique_ptr< Forcing > forcing)
Definition HydroUnit.cpp:184
int GetBrickCount() const
Definition HydroUnit.cpp:213
Forcing * GetForcing(VariableType type) const
Definition HydroUnit.cpp:196
bool FixLandCoverFractionsTotal()
Definition HydroUnit.cpp:459
int GetStructureId() const
Definition HydroUnit.h:376
void RestoreInitialAreaFractions()
Definition HydroUnit.cpp:453
std::vector< Brick * > GetSnowpacks() const
Definition HydroUnit.h:219
LandCover * GetGenericLandCover() const
Definition HydroUnit.cpp:371
std::vector< HydroUnitLateralConnection * > GetLateralConnections() const
Definition HydroUnit.cpp:492
void AddBrick(std::unique_ptr< Brick > brick)
Definition HydroUnit.cpp:160
bool HasBrick(std::string_view name) const
Definition HydroUnit.cpp:228
void ReserveLateralConnections(size_t count)
Definition HydroUnit.cpp:95
void AddLateralConnection(HydroUnit *receiver, double fraction, const string &type="")
Definition HydroUnit.cpp:205
bool HasSplitter(std::string_view name) const
Definition HydroUnit.cpp:267
float GetPropertyFloat(std::string_view name, std::string_view unit="") const
Definition HydroUnit.cpp:146
int GetId() const
Definition HydroUnit.h:356
void Reset()
Definition HydroUnit.cpp:103
Definition LandCover.h:10
Definition Splitter.h:13
Definition SettingsBasin.h:30