1#ifndef HYDROBRICKS_SUBBASIN_H
2#define HYDROBRICKS_SUBBASIN_H
5#include <unordered_map>
10#include "HydroUnitProperty.h"
12#include "SettingsBasin.h"
13#include "TimeMachine.h"
50 [[nodiscard]]
int GetId()
const {
54 void SetDownstreamId(
int id) {
67 [[nodiscard]]
bool IsTerminal()
const {
68 return _downstreamId == 0;
71 void SetName(
const string& name) {
75 [[nodiscard]]
const string& GetName()
const {
85 _structureId = structureId;
88 [[nodiscard]]
int GetStructureId()
const {
101 void SetDrainedArea(
double area) {
120 _hasUpstream = value;
123 [[nodiscard]]
bool HasUpstream()
const {
127 void SetReach(
Reach* reach) {
131 [[nodiscard]]
Reach* GetReach()
const {
141 _inflowVolume = volume;
144 [[nodiscard]]
double GetInflowVolume()
const {
145 return _inflowVolume;
164 return _outletVolume;
174 return _outletDischarge;
184 return _hydroUnitMap.contains(
id);
193 [[nodiscard]]
bool HasProperty(std::string_view name)
const;
202 [[nodiscard]]
double GetPropertyDouble(std::string_view name, std::string_view unit =
"")
const;
225 _hydroUnits.reserve(_hydroUnits.size() + count);
234 _bricks.reserve(_bricks.size() + count);
243 _splitters.reserve(_splitters.size() + count);
252 _inConnectors.reserve(_inConnectors.size() + count);
261 _outConnectors.reserve(_outConnectors.size() + count);
270 _outletFluxes.reserve(_outletFluxes.size() + count);
309 [[nodiscard]]
bool IsValid(
bool checkProcesses =
true)
const;
324 void AddBrick(std::unique_ptr<Brick> brick);
331 void AddSplitter(std::unique_ptr<Splitter> splitter);
366 return !_hydroUnits.empty();
426 [[nodiscard]]
bool HasBrick(std::string_view name)
const;
450 [[nodiscard]]
bool HasSplitter(std::string_view name)
const;
516 int _downstreamId = 0;
518 int _structureId = 1;
520 double _drainedArea = 0;
521 bool _hasUpstream =
false;
522 Reach* _reach =
nullptr;
524 double _inflowVolume = 0;
525 double _outletVolume = 0;
526 double _outletDischarge = 0;
527 double _reachInflow = 0;
528 double _reachOutflow = 0;
529 double _reachStorage = 0;
530 std::vector<std::unique_ptr<HydroUnitProperty>> _properties;
531 std::vector<std::unique_ptr<Brick>> _bricks;
532 std::unordered_map<string, Brick*> _brickMap;
533 std::vector<std::unique_ptr<Splitter>> _splitters;
534 std::unordered_map<string, Splitter*> _splitterMap;
535 std::vector<std::unique_ptr<HydroUnit>> _hydroUnits;
536 std::unordered_map<int, HydroUnit*> _hydroUnitMap;
537 std::vector<Connector*> _inConnectors;
538 std::vector<Connector*> _outConnectors;
539 std::vector<Flux*> _outletFluxes;
Definition HydroUnit.h:18
Definition SettingsBasin.h:62
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