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 "Includes.h"
11#include "SettingsBasin.h"
12#include "TimeMachine.h"
13
14class SubBasin : public wxObject {
15 public:
16 SubBasin();
17
18 ~SubBasin() override;
19
26 [[nodiscard]] bool Initialize(SettingsBasin& basinSettings);
27
33 void BuildBasin(SettingsBasin& basinSettings);
34
40 void ReserveHydroUnits(size_t count) {
41 _hydroUnits.reserve(_hydroUnits.size() + count);
42 }
43
49 void ReserveBricks(size_t count) {
50 _bricks.reserve(_bricks.size() + count);
51 }
52
58 void ReserveSplitters(size_t count) {
59 _splitters.reserve(_splitters.size() + count);
60 }
61
67 void ReserveInputConnectors(size_t count) {
68 _inConnectors.reserve(_inConnectors.size() + count);
69 }
70
76 void ReserveOutputConnectors(size_t count) {
77 _outConnectors.reserve(_outConnectors.size() + count);
78 }
79
85 void ReserveOutletFluxes(size_t count) {
86 _outletFluxes.reserve(_outletFluxes.size() + count);
87 }
88
95
102 [[nodiscard]] bool AssignFractions(SettingsBasin& basinSettings);
103
107 void Reset();
108
112 void SaveAsInitialState();
113
119 [[nodiscard]] bool IsValid(bool checkProcesses = true) const;
120
127 void Validate() const;
128
134 void AddBrick(std::unique_ptr<Brick> brick);
135
141 void AddSplitter(std::unique_ptr<Splitter> splitter);
142
148 void AddHydroUnit(std::unique_ptr<HydroUnit> unit);
149
155 int GetHydroUnitCount() const;
156
163 HydroUnit* GetHydroUnit(size_t index) const;
164
170 bool HasHydroUnits() const {
171 return !_hydroUnits.empty();
172 }
173
180 HydroUnit* GetHydroUnitById(int id) const;
181
187 vecInt GetHydroUnitIds() const;
188
194 vecDouble GetHydroUnitAreas() const;
195
201 int GetBrickCount() const;
202
208 int GetSplitterCount() const;
209
216 Brick* GetBrick(size_t index) const;
217
224 [[nodiscard]] bool HasBrick(const string& name) const;
225
232 Brick* GetBrick(const string& name) const;
233
240 Splitter* GetSplitter(size_t index) const;
241
248 [[nodiscard]] bool HasSplitter(const string& name) const;
249
256 Splitter* GetSplitter(const string& name) const;
257
263 [[nodiscard]] bool HasIncomingFlow() const;
264
270 void AddInputConnector(Connector* connector);
271
277 void AddOutputConnector(Connector* connector);
278
284 void AttachOutletFlux(Flux* pFlux);
285
292 double* GetValuePointer(const string& name);
293
299 [[nodiscard]] bool ComputeOutletDischarge();
300
306 [[nodiscard]] double GetArea() const {
307 return _area;
308 }
309
310 protected:
311 double _area; // m2
312 double _outletTotal;
313 std::vector<std::unique_ptr<Brick>> _bricks; // owning: SubBasin-level bricks
314 std::unordered_map<string, Brick*> _brickMap; // non-owning views into _bricks
315 std::vector<std::unique_ptr<Splitter>> _splitters; // owning: SubBasin-level splitters
316 std::unordered_map<string, Splitter*> _splitterMap; // non-owning views into _splitters
317 std::vector<std::unique_ptr<HydroUnit>> _hydroUnits; // owning
318 std::unordered_map<int, HydroUnit*> _hydroUnitMap; // non-owning views into _hydroUnits
319 std::vector<Connector*> _inConnectors; // non-owning: lifetime managed externally
320 std::vector<Connector*> _outConnectors; // non-owning: lifetime managed externally
321 std::vector<Flux*> _outletFluxes; // non-owning: lifetime managed by process owners
322};
323
324#endif
Definition Brick.h:24
Definition Connector.h:8
Definition Flux.h:9
Definition HydroUnit.h:18
Definition SettingsBasin.h:47
Definition Splitter.h:13
Definition SubBasin.h:14
bool ComputeOutletDischarge()
Definition SubBasin.cpp:288
void ReserveInputConnectors(size_t count)
Definition SubBasin.h:67
void AddSplitter(std::unique_ptr< Splitter > splitter)
Definition SubBasin.cpp:144
int GetSplitterCount() const
Definition SubBasin.cpp:203
vecInt GetHydroUnitIds() const
Definition SubBasin.cpp:179
bool IsValid(bool checkProcesses=true) const
Definition SubBasin.cpp:112
void SaveAsInitialState()
Definition SubBasin.cpp:103
void AddHydroUnit(std::unique_ptr< HydroUnit > unit)
Definition SubBasin.cpp:151
void ReserveOutletFluxes(size_t count)
Definition SubBasin.h:85
int GetBrickCount() const
Definition SubBasin.cpp:199
void BuildBasin(SettingsBasin &basinSettings)
Definition SubBasin.cpp:29
void Validate() const
Definition SubBasin.cpp:130
double GetArea() const
Definition SubBasin.h:306
vecDouble GetHydroUnitAreas() const
Definition SubBasin.cpp:189
int GetHydroUnitCount() const
Definition SubBasin.cpp:159
void AddBrick(std::unique_ptr< Brick > brick)
Definition SubBasin.cpp:137
void Reset()
Definition SubBasin.cpp:91
HydroUnit * GetHydroUnitById(int id) const
Definition SubBasin.cpp:170
bool AssignFractions(SettingsBasin &basinSettings)
Definition SubBasin.cpp:58
void ReserveBricks(size_t count)
Definition SubBasin.h:49
bool HasSplitter(const string &name) const
Definition SubBasin.cpp:234
bool HasHydroUnits() const
Definition SubBasin.h:170
void ReserveHydroUnits(size_t count)
Definition SubBasin.h:40
void ReserveSplitters(size_t count)
Definition SubBasin.h:58
Brick * GetBrick(size_t index) const
Definition SubBasin.cpp:207
HydroUnit * GetHydroUnit(size_t index) const
Definition SubBasin.cpp:163
bool HasIncomingFlow() const
Definition SubBasin.cpp:260
bool Initialize(SettingsBasin &basinSettings)
Definition SubBasin.cpp:18
Splitter * GetSplitter(size_t index) const
Definition SubBasin.cpp:227
void AttachOutletFlux(Flux *pFlux)
Definition SubBasin.cpp:274
bool HasBrick(const string &name) const
Definition SubBasin.cpp:214
void AddInputConnector(Connector *connector)
Definition SubBasin.cpp:264
void ReserveLateralConnectionsForUnits(SettingsBasin &basinSettings)
Definition SubBasin.cpp:247
void AddOutputConnector(Connector *connector)
Definition SubBasin.cpp:269
void ReserveOutputConnectors(size_t count)
Definition SubBasin.h:76
double * GetValuePointer(const string &name)
Definition SubBasin.cpp:279