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
87 [[nodiscard]] bool HasProperty(std::string_view name) const;
88
97 void SetParameterOverride(const string& key, float value);
98
105 [[nodiscard]] bool HasParameterOverride(const string& key) const;
106
114 [[nodiscard]] const float* GetParameterOverridePointer(const string& key) const;
115
126 void SetParameterOverrideMonthly(const string& key, const vecFloat& values);
127
134 [[nodiscard]] vector<std::pair<float*, const vecFloat*>> GetMonthlyParameterOverrides();
135
141 void AddBrick(std::unique_ptr<Brick> brick);
142
148 void AddSplitter(std::unique_ptr<Splitter> splitter);
149
156 [[nodiscard]] bool HasForcing(VariableType type) const;
157
163 void AddForcing(std::unique_ptr<Forcing> forcing);
164
171 [[nodiscard]] Forcing* GetForcing(VariableType type) const;
172
176 void ResetForcingUpdates();
177
186 void AddLateralConnection(HydroUnit* receiver, double fraction, const string& type = "");
187
193 void ReserveBricks(size_t count);
194
200 void ReserveLandCoverBricks(size_t count);
201
207 void ReserveSplitters(size_t count);
208
214 void ReserveLateralConnections(size_t count);
215
221 void ReserveForcings(size_t count);
222
228 [[nodiscard]] int GetBrickCount() const;
229
235 [[nodiscard]] int GetSplitterCount() const;
236
243 [[nodiscard]] Brick* GetBrick(size_t index) const;
244
251 [[nodiscard]] bool HasBrick(std::string_view name) const;
252
259 [[nodiscard]] Brick* GetBrick(std::string_view name) const;
260
267 [[nodiscard]] Brick* TryGetBrick(std::string_view name) const;
268
274 [[nodiscard]] std::vector<Brick*> GetSnowpacks() const {
275 std::vector<Brick*> snowBricks;
276 snowBricks.reserve(_bricks.size());
277 for (const auto& brick : _bricks) {
278 if (brick->GetCategory() == BrickCategory::Snowpack) {
279 snowBricks.push_back(brick.get());
280 }
281 }
282 return snowBricks;
283 }
284
294 [[nodiscard]] double GetSnowCoverFraction(double sweThreshold = 0.1) const;
295
308 [[nodiscard]] double GetSnowAlbedo(double albedoLand, double sweThreshold = 0.1) const;
309
316 [[nodiscard]] LandCover* GetLandCover(std::string_view name) const;
317
324 [[nodiscard]] LandCover* TryGetLandCover(std::string_view name) const;
325
332 [[nodiscard]] Splitter* GetSplitter(size_t index) const;
333
340 [[nodiscard]] bool HasSplitter(std::string_view name) const;
341
348 [[nodiscard]] Splitter* GetSplitter(std::string_view name) const;
349
356 [[nodiscard]] Splitter* TryGetSplitter(std::string_view name) const;
357
363 [[nodiscard]] bool IsValid(bool checkProcesses = true) const;
364
371 void Validate() const;
372
381 bool ChangeLandCoverAreaFraction(std::string_view name, double fraction);
382
389
395
402 [[nodiscard]] LandCover* GetGenericLandCover() const;
403
409 Types GetType() const {
410 return _type;
411 }
412
418 void SetId(int id) {
419 _id = id;
420 }
421
427 [[nodiscard]] double GetArea() const {
428 return _area;
429 }
430
436 [[nodiscard]] int GetId() const {
437 return _id;
438 }
439
447 void SetStructureId(int structureId) {
448 _structureId = structureId;
449 }
450
456 [[nodiscard]] int GetStructureId() const {
457 return _structureId;
458 }
459
465 [[nodiscard]] std::vector<HydroUnitLateralConnection*> GetLateralConnections() const;
466
467 private:
482 void TransferLandCoverContent(LandCover* changed, double oldFraction, double newFraction, LandCover* generic,
483 double genericOldFraction, double genericNewFraction);
484
485 protected:
486 Types _type;
487 int _id;
488 int _structureId = 1; // model-structure variant used
489 double _area; // [m²]
490 std::vector<std::unique_ptr<HydroUnitProperty>> _properties; // owning
491 std::vector<std::unique_ptr<HydroUnitLateralConnection>> _lateralConnections; // owning
492 std::vector<std::unique_ptr<Brick>> _bricks; // owning
493 std::unordered_map<string, Brick*> _brickMap; // non-owning view into _bricks
494 std::vector<LandCover*> _landCoverBricks; // non-owning view into _bricks
495 std::unordered_map<string, LandCover*> _landCoverMap; // non-owning view into _landCoverBricks
496 std::vector<std::unique_ptr<Splitter>> _splitters; // owning
497 std::unordered_map<string, Splitter*> _splitterMap; // non-owning view into _splitters
498 std::vector<std::unique_ptr<Forcing>> _forcing; // owning
499 std::unordered_map<VariableType, Forcing*> _forcingMap; // non-owning view into _forcing
500 std::unordered_map<string, float> _paramOverrides; // per-unit spatial parameter values
501 std::unordered_map<string, vecFloat> _paramOverridesMonthly; // per-unit monthly values (Jan..Dec)
502};
503
504#endif
Definition Brick.h:22
Definition Forcing.h:7
Definition HydroUnit.h:18
void Validate() const
Definition HydroUnit.cpp:423
Splitter * TryGetSplitter(std::string_view name) const
Definition HydroUnit.cpp:377
string GetPropertyString(std::string_view name) const
Definition HydroUnit.cpp:154
bool ChangeLandCoverAreaFraction(std::string_view name, double fraction)
Definition HydroUnit.cpp:429
void ReserveForcings(size_t count)
Definition HydroUnit.cpp:103
void ReserveLandCoverBricks(size_t count)
Definition HydroUnit.cpp:91
void SetId(int id)
Definition HydroUnit.h:418
LandCover * TryGetLandCover(std::string_view name) const
Definition HydroUnit.cpp:352
void SetStructureId(int structureId)
Definition HydroUnit.h:447
LandCover * GetLandCover(std::string_view name) const
Definition HydroUnit.cpp:343
bool HasParameterOverride(const string &key) const
Definition HydroUnit.cpp:178
double GetSnowCoverFraction(double sweThreshold=0.1) const
Definition HydroUnit.cpp:215
Splitter * GetSplitter(size_t index) const
Definition HydroUnit.cpp:357
void SetProperties(HydroUnitSettings &unitSettings)
Definition HydroUnit.cpp:119
void SaveAsInitialState()
Definition HydroUnit.cpp:113
Types GetType() const
Definition HydroUnit.h:409
void AddSplitter(std::unique_ptr< Splitter > splitter)
Definition HydroUnit.cpp:270
void ResetForcingUpdates()
Definition HydroUnit.cpp:287
bool HasForcing(VariableType type) const
Definition HydroUnit.cpp:277
Brick * TryGetBrick(std::string_view name) const
Definition HydroUnit.cpp:338
double GetPropertyDouble(std::string_view name, std::string_view unit="") const
Definition HydroUnit.cpp:140
double GetSnowAlbedo(double albedoLand, double sweThreshold=0.1) const
Definition HydroUnit.cpp:233
int GetSplitterCount() const
Definition HydroUnit.cpp:314
void ReserveSplitters(size_t count)
Definition HydroUnit.cpp:95
void AddProperty(std::unique_ptr< HydroUnitProperty > property)
Definition HydroUnit.cpp:135
Brick * GetBrick(size_t index) const
Definition HydroUnit.cpp:318
const float * GetParameterOverridePointer(const string &key) const
Definition HydroUnit.cpp:182
bool IsValid(bool checkProcesses=true) const
Definition HydroUnit.cpp:382
void ReserveBricks(size_t count)
Definition HydroUnit.cpp:87
double GetArea() const
Definition HydroUnit.h:427
void AddForcing(std::unique_ptr< Forcing > forcing)
Definition HydroUnit.cpp:281
int GetBrickCount() const
Definition HydroUnit.cpp:310
vector< std::pair< float *, const vecFloat * > > GetMonthlyParameterOverrides()
Definition HydroUnit.cpp:204
Forcing * GetForcing(VariableType type) const
Definition HydroUnit.cpp:293
bool FixLandCoverFractionsTotal()
Definition HydroUnit.cpp:556
void SetParameterOverrideMonthly(const string &key, const vecFloat &values)
Definition HydroUnit.cpp:188
int GetStructureId() const
Definition HydroUnit.h:456
void RestoreInitialAreaFractions()
Definition HydroUnit.cpp:550
std::vector< Brick * > GetSnowpacks() const
Definition HydroUnit.h:274
LandCover * GetGenericLandCover() const
Definition HydroUnit.cpp:468
std::vector< HydroUnitLateralConnection * > GetLateralConnections() const
Definition HydroUnit.cpp:589
void AddBrick(std::unique_ptr< Brick > brick)
Definition HydroUnit.cpp:257
bool HasBrick(std::string_view name) const
Definition HydroUnit.cpp:325
void ReserveLateralConnections(size_t count)
Definition HydroUnit.cpp:99
void AddLateralConnection(HydroUnit *receiver, double fraction, const string &type="")
Definition HydroUnit.cpp:302
bool HasSplitter(std::string_view name) const
Definition HydroUnit.cpp:364
float GetPropertyFloat(std::string_view name, std::string_view unit="") const
Definition HydroUnit.cpp:150
int GetId() const
Definition HydroUnit.h:436
void Reset()
Definition HydroUnit.cpp:107
void SetParameterOverride(const string &key, float value)
Definition HydroUnit.cpp:174
bool HasProperty(std::string_view name) const
Definition HydroUnit.cpp:164
Definition LandCover.h:10
Definition Splitter.h:13
Definition SettingsBasin.h:30