hydrobricks
Loading...
Searching...
No Matches
Subbasin.h
1#ifndef HYDROBRICKS_SUBBASIN_H
2#define HYDROBRICKS_SUBBASIN_H
3
4#include <memory>
5#include <unordered_map>
6#include <vector>
7
8#include "Connector.h"
9#include "HydroUnit.h"
10#include "HydroUnitProperty.h"
11#include "Includes.h"
12#include "SettingsBasin.h"
13#include "TimeMachine.h"
14
15class Reach;
16
17class Subbasin {
18 public:
19 Subbasin();
20
21 virtual ~Subbasin();
22
29 [[nodiscard]] ModelResult Initialize(SettingsBasin& basinSettings);
30
38
44 void SetNetworkProperties(const SubbasinSettings& subbasinSettings);
45
46 void SetId(int id) {
47 _id = id;
48 }
49
50 [[nodiscard]] int GetId() const {
51 return _id;
52 }
53
54 void SetDownstreamId(int id) {
55 _downstreamId = id;
56 }
57
63 [[nodiscard]] int GetDownstreamId() const {
64 return _downstreamId;
65 }
66
67 [[nodiscard]] bool IsTerminal() const {
68 return _downstreamId == 0;
69 }
70
71 void SetName(const string& name) {
72 _name = name;
73 }
74
75 [[nodiscard]] const string& GetName() const {
76 return _name;
77 }
78
84 void SetStructureId(int structureId) {
85 _structureId = structureId;
86 }
87
88 [[nodiscard]] int GetStructureId() const {
89 return _structureId;
90 }
91
97 [[nodiscard]] double GetLocalArea() const {
98 return _area;
99 }
100
101 void SetDrainedArea(double area) {
102 _drainedArea = area;
103 }
104
111 [[nodiscard]] double GetDrainedArea() const {
112 return _drainedArea;
113 }
114
119 void SetHasUpstream(bool value) {
120 _hasUpstream = value;
121 }
122
123 [[nodiscard]] bool HasUpstream() const {
124 return _hasUpstream;
125 }
126
127 void SetReach(Reach* reach) {
128 _reach = reach;
129 }
130
131 [[nodiscard]] Reach* GetReach() const {
132 return _reach;
133 }
134
140 void SetInflowVolume(double volume) {
141 _inflowVolume = volume;
142 }
143
144 [[nodiscard]] double GetInflowVolume() const {
145 return _inflowVolume;
146 }
147
153 [[nodiscard]] double GetLocalOutlet() const {
154 return _outletTotal;
155 }
156
163 [[nodiscard]] double GetOutletVolume() const {
164 return _outletVolume;
165 }
166
173 [[nodiscard]] double GetOutletDischarge() const {
174 return _outletDischarge;
175 }
176
183 [[nodiscard]] bool HasHydroUnit(int id) const {
184 return _hydroUnitMap.contains(id);
185 }
186
193 [[nodiscard]] bool HasProperty(std::string_view name) const;
194
202 [[nodiscard]] double GetPropertyDouble(std::string_view name, std::string_view unit = "") const;
203
210 [[nodiscard]] string GetPropertyString(std::string_view name) const;
211
217 void BuildBasin(SettingsBasin& basinSettings);
218
224 void ReserveHydroUnits(size_t count) {
225 _hydroUnits.reserve(_hydroUnits.size() + count);
226 }
227
233 void ReserveBricks(size_t count) {
234 _bricks.reserve(_bricks.size() + count);
235 }
236
242 void ReserveSplitters(size_t count) {
243 _splitters.reserve(_splitters.size() + count);
244 }
245
251 void ReserveInputConnectors(size_t count) {
252 _inConnectors.reserve(_inConnectors.size() + count);
253 }
254
260 void ReserveOutputConnectors(size_t count) {
261 _outConnectors.reserve(_outConnectors.size() + count);
262 }
263
269 void ReserveOutletFluxes(size_t count) {
270 _outletFluxes.reserve(_outletFluxes.size() + count);
271 }
272
279
286 [[nodiscard]] ModelResult AssignFractions(SettingsBasin& basinSettings);
287
291 void Reset();
292
296 void SaveAsInitialState();
297
303
309 [[nodiscard]] bool IsValid(bool checkProcesses = true) const;
310
317 void Validate() const;
318
324 void AddBrick(std::unique_ptr<Brick> brick);
325
331 void AddSplitter(std::unique_ptr<Splitter> splitter);
332
338 void AddHydroUnit(std::unique_ptr<HydroUnit> unit);
339
345 [[nodiscard]] int GetHydroUnitCount() const;
346
350 void ResetForcingUpdates();
351
358 [[nodiscard]] HydroUnit* GetHydroUnit(size_t index) const;
359
365 [[nodiscard]] bool HasHydroUnits() const noexcept {
366 return !_hydroUnits.empty();
367 }
368
375 [[nodiscard]] HydroUnit* GetHydroUnitById(int id) const;
376
382 [[nodiscard]] vecInt GetHydroUnitIds() const;
383
389 [[nodiscard]] vecDouble GetHydroUnitAreas() const;
390
396 [[nodiscard]] vecInt GetHydroUnitStructureIds() const;
397
403 [[nodiscard]] int GetBrickCount() const;
404
410 [[nodiscard]] int GetSplitterCount() const;
411
418 [[nodiscard]] Brick* GetBrick(size_t index) const;
419
426 [[nodiscard]] bool HasBrick(std::string_view name) const;
427
434 [[nodiscard]] Brick* GetBrick(std::string_view name) const;
435
442 [[nodiscard]] Splitter* GetSplitter(size_t index) const;
443
450 [[nodiscard]] bool HasSplitter(std::string_view name) const;
451
458 [[nodiscard]] Splitter* GetSplitter(std::string_view name) const;
459
465 [[nodiscard]] bool HasIncomingFlow() const;
466
472 void AddInputConnector(Connector* connector);
473
479 void AddOutputConnector(Connector* connector);
480
486 void AttachOutletFlux(Flux* pFlux);
487
494 double* GetValuePointer(std::string_view name);
495
503 [[nodiscard]] bool ComputeOutletDischarge(double timeStepInDays);
504
510 [[nodiscard]] double GetArea() const {
511 return _area;
512 }
513
514 protected:
515 int _id = 1;
516 int _downstreamId = 0; // 0: terminal outlet of the network
517 string _name;
518 int _structureId = 1; // model-structure variant of the subbasin-level components
519 double _area; // m2, own hydro units
520 double _drainedArea = 0; // m2, own + upstream (set by the network)
521 bool _hasUpstream = false; // other subbasins drain into this one
522 Reach* _reach = nullptr; // non-owning: owned by the river network
523 double _outletTotal; // mm over the local area, own runoff
524 double _inflowVolume = 0; // m3 per step, routed from upstream
525 double _outletVolume = 0; // m3 per step, at the outlet
526 double _outletDischarge = 0; // mm over the drained area, at the outlet
527 double _reachInflow = 0; // mm over the drained area: the volume entering the reach from upstream
528 double _reachOutflow = 0; // mm over the drained area: the routed volume reaching the outlet
529 double _reachStorage = 0; // mm over the drained area: the volume in transit in the reach
530 std::vector<std::unique_ptr<HydroUnitProperty>> _properties; // owning
531 std::vector<std::unique_ptr<Brick>> _bricks; // owning: Subbasin-level bricks
532 std::unordered_map<string, Brick*> _brickMap; // non-owning views into _bricks
533 std::vector<std::unique_ptr<Splitter>> _splitters; // owning: Subbasin-level splitters
534 std::unordered_map<string, Splitter*> _splitterMap; // non-owning views into _splitters
535 std::vector<std::unique_ptr<HydroUnit>> _hydroUnits; // owning
536 std::unordered_map<int, HydroUnit*> _hydroUnitMap; // non-owning views into _hydroUnits
537 std::vector<Connector*> _inConnectors; // non-owning: lifetime managed externally
538 std::vector<Connector*> _outConnectors; // non-owning: lifetime managed externally
539 std::vector<Flux*> _outletFluxes; // non-owning: lifetime managed by process owners
540};
541
542#endif
Definition Brick.h:22
Definition Connector.h:8
Definition Flux.h:9
Definition HydroUnit.h:18
Definition Reach.h:25
Definition SettingsBasin.h:62
Definition Splitter.h:13
Definition Subbasin.h:17
bool HasProperty(std::string_view name) const
Definition Subbasin.cpp:80
ModelResult Initialize(SettingsBasin &basinSettings)
Definition Subbasin.cpp:19
bool IsValid(bool checkProcesses=true) const
Definition Subbasin.cpp:197
void SetHasUpstream(bool value)
Definition Subbasin.h:119
bool HasBrick(std::string_view name) const
Definition Subbasin.cpp:315
vecDouble GetHydroUnitAreas() const
Definition Subbasin.cpp:280
void BuildBasin(SettingsBasin &basinSettings)
Definition Subbasin.cpp:29
void SaveAsInitialState()
Definition Subbasin.cpp:182
Brick * GetBrick(size_t index) const
Definition Subbasin.cpp:308
double GetLocalOutlet() const
Definition Subbasin.h:153
double GetOutletDischarge() const
Definition Subbasin.h:173
int GetDownstreamId() const
Definition Subbasin.h:63
void SetNetworkProperties(const SubbasinSettings &subbasinSettings)
Definition Subbasin.cpp:65
bool HasSplitter(std::string_view name) const
Definition Subbasin.cpp:335
double * GetValuePointer(std::string_view name)
Definition Subbasin.cpp:380
void RestoreInitialAreaFractions()
Definition Subbasin.cpp:191
void ReserveSplitters(size_t count)
Definition Subbasin.h:242
string GetPropertyString(std::string_view name) const
Definition Subbasin.cpp:100
HydroUnit * AddHydroUnitFromSettings(HydroUnitSettings &unitSettings)
Definition Subbasin.cpp:56
void AttachOutletFlux(Flux *pFlux)
Definition Subbasin.cpp:375
double GetLocalArea() const
Definition Subbasin.h:97
void SetStructureId(int structureId)
Definition Subbasin.h:84
void AddSplitter(std::unique_ptr< Splitter > splitter)
Definition Subbasin.cpp:229
bool HasIncomingFlow() const
Definition Subbasin.cpp:361
void Reset()
Definition Subbasin.cpp:163
void AddInputConnector(Connector *connector)
Definition Subbasin.cpp:365
void AddOutputConnector(Connector *connector)
Definition Subbasin.cpp:370
bool HasHydroUnit(int id) const
Definition Subbasin.h:183
vecInt GetHydroUnitIds() const
Definition Subbasin.cpp:270
double GetArea() const
Definition Subbasin.h:510
HydroUnit * GetHydroUnitById(int id) const
Definition Subbasin.cpp:261
void ReserveHydroUnits(size_t count)
Definition Subbasin.h:224
double GetPropertyDouble(std::string_view name, std::string_view unit="") const
Definition Subbasin.cpp:90
int GetBrickCount() const
Definition Subbasin.cpp:300
void AddBrick(std::unique_ptr< Brick > brick)
Definition Subbasin.cpp:222
ModelResult AssignFractions(SettingsBasin &basinSettings)
Definition Subbasin.cpp:110
int GetSplitterCount() const
Definition Subbasin.cpp:304
void SetInflowVolume(double volume)
Definition Subbasin.h:140
void ReserveOutletFluxes(size_t count)
Definition Subbasin.h:269
void ReserveOutputConnectors(size_t count)
Definition Subbasin.h:260
void Validate() const
Definition Subbasin.cpp:215
double GetOutletVolume() const
Definition Subbasin.h:163
Splitter * GetSplitter(size_t index) const
Definition Subbasin.cpp:328
bool ComputeOutletDischarge(double timeStepInDays)
Definition Subbasin.cpp:398
vecInt GetHydroUnitStructureIds() const
Definition Subbasin.cpp:290
void ReserveInputConnectors(size_t count)
Definition Subbasin.h:251
void ReserveLateralConnectionsForUnits(SettingsBasin &basinSettings)
Definition Subbasin.cpp:348
bool HasHydroUnits() const noexcept
Definition Subbasin.h:365
void ResetForcingUpdates()
Definition Subbasin.cpp:244
HydroUnit * GetHydroUnit(size_t index) const
Definition Subbasin.cpp:254
int GetHydroUnitCount() const
Definition Subbasin.cpp:250
void AddHydroUnit(std::unique_ptr< HydroUnit > unit)
Definition Subbasin.cpp:236
double GetDrainedArea() const
Definition Subbasin.h:111
void ReserveBricks(size_t count)
Definition Subbasin.h:233
Definition SettingsBasin.h:32
Definition SettingsBasin.h:54