hydrobricks
Loading...
Searching...
No Matches
ModelHydro.h
1#ifndef HYDROBRICKS_MODEL_HYDRO_H
2#define HYDROBRICKS_MODEL_HYDRO_H
3
4#include <functional>
5#include <memory>
6
7#include "ActionsManager.h"
8#include "Includes.h"
9#include "Logger.h"
10#include "Processor.h"
11#include "RiverNetwork.h"
12#include "SettingsModel.h"
13#include "Subbasin.h"
14#include "TimeSeries.h"
15
17 public:
18 ModelHydro(Subbasin* subbasin = nullptr);
19
20 virtual ~ModelHydro();
21
29 ModelResult InitializeWithBasin(SettingsModel& modelSettings, SettingsBasin& basinSettings);
30
39 ModelResult Initialize(SettingsModel& modelSettings, SettingsBasin& basinSettings, bool checkProcesses = true);
40
46 void UpdateParameters(SettingsModel& modelSettings);
47
53 [[nodiscard]] bool IsValid() const;
54
61 void Validate() const;
62
68 [[nodiscard]] bool ForcingLoaded() const;
69
75 [[nodiscard]] ModelResult Run();
76
84 void OpenLog(const string& directory);
85
89 void CloseLog();
90
94 void Reset();
95
99 void SaveAsInitialState();
100
107 bool DumpOutputs(const string& path);
108
114 axd GetOutletDischarge() const;
115
122 [[nodiscard]] axd GetSubbasinDischarge(int subbasinId) const;
123
124 [[nodiscard]] int GetSubbasinCount() const;
125
126 [[nodiscard]] vecInt GetSubbasinIds() const;
127
128 [[nodiscard]] vecInt GetSubbasinDownstreamIds() const;
129
130 [[nodiscard]] axd GetSubbasinLocalAreas() const;
131
132 [[nodiscard]] axd GetSubbasinDrainedAreas() const;
133
139 [[nodiscard]] axd GetReachLengths() const;
140
146 [[nodiscard]] axd GetReachSlopes() const;
147
154 [[nodiscard]] axd GetReachTravelTimes() const;
155
162 [[nodiscard]] vecInt GetReachSubreachCounts() const;
163
169 [[nodiscard]] string GetChannelRoutingScheme() const;
170
177 [[nodiscard]] HydroUnit* GetHydroUnitById(int id) const;
178
184 [[nodiscard]] std::vector<HydroUnit*> GetHydroUnits() const;
185
191 [[nodiscard]] double GetTotalOutletDischarge() const;
192
198 [[nodiscard]] double GetTotalET() const;
199
205 [[nodiscard]] double GetTotalWaterStorageChanges() const;
206
212 [[nodiscard]] double GetTotalSnowStorageChanges() const;
213
214 /*
215 * Get the total change in glacier storage.
216 *
217 * @return total change in glacier storage.
218 */
219 [[nodiscard]] double GetTotalGlacierStorageChanges() const;
220
227 bool AddTimeSeries(std::unique_ptr<TimeSeries> timeSeries);
228
235 bool AddAction(Action* action);
236
242 [[nodiscard]] int GetActionCount() const;
243
249 [[nodiscard]] int GetSporadicActionItemCount() const;
250
260 bool CreateTimeSeries(const string& varName, const axd& time, const axi& ids, const axxd& data);
261
265 void ClearTimeSeries();
266
273
280 return _subbasin; // Return raw pointer from unique_ptr
281 }
282
288 void SetSubbasin(Subbasin* subbasin) {
289 _network.reset();
290 _subbasin = subbasin;
291 }
292
299 return _network.get();
300 }
301
308 return &_timer;
309 }
310
322 return _processors.empty() ? nullptr : _processors.back().get();
323 }
324
331 return &_logger;
332 }
333
340 return &_actionsManager;
341 }
342
351 [[nodiscard]] axxd GetHydroUnitValues(const string& label) const;
352
360 [[nodiscard]] axxd GetHydroUnitFractions(const string& label) const;
361
367 [[nodiscard]] vecStr GetRecordedHydroUnitLabels() const;
368
374 [[nodiscard]] vecStr GetRecordedHydroUnitFractionLabels() const;
375
381 [[nodiscard]] vecInt GetHydroUnitIds() const;
382
388 [[nodiscard]] axd GetHydroUnitAreas() const;
389
397 [[nodiscard]] string GetHydroUnitLabelBasis(const string& label) const;
398
404 [[nodiscard]] axd GetHydroUnitSubbasinFractions() const;
405
406 protected:
407 std::vector<std::unique_ptr<Processor>> _processors; // owning: one per subbasin, in processing order
408 std::unique_ptr<RiverNetwork> _network; // owning: set only when ModelHydro builds the network from settings
409 Subbasin* _subbasin; // non-owning view (the network outlet or an external Subbasin)
410 std::vector<Subbasin*> _subbasins; // non-owning: the subbasins to process, upstream first
411 TimeMachine _timer;
412 Logger _logger;
413 ActionsManager _actionsManager;
414 ParametersUpdater _parametersUpdater;
415 std::vector<std::unique_ptr<TimeSeries>> _timeSeries; // owning
416 int _spinupSteps = 0; // time steps replayed as spin-up at the start of each run
417 LogFile _log; // this model's own log file (see OpenLog)
418
419 private:
427 [[nodiscard]] axd GetReachProperty(const std::function<double(const Reach&)>& get) const;
428
432 [[nodiscard]] std::vector<Subbasin*> CollectSubbasins() const;
433
439 bool ProcessTimeStep();
440
447 [[nodiscard]] ModelResult CheckTimeStepCompatibility();
448
449 ModelResult InitializeTimeSeries();
450
451 ModelResult UpdateForcing();
452
453 ModelResult RunSpinup();
454
455 ModelResult RewindAfterSpinup();
456};
457
458#endif // HYDROBRICKS_MODEL_HYDRO_H
Definition Action.h:7
Definition ActionsManager.h:11
Definition HydroUnit.h:18
Definition Log.h:20
Definition Logger.h:13
Definition ModelHydro.h:16
axxd GetHydroUnitFractions(const string &label) const
Definition ModelHydro.cpp:497
axd GetHydroUnitSubbasinFractions() const
Definition ModelHydro.cpp:535
TimeMachine * GetTimeMachine()
Definition ModelHydro.h:307
void CloseLog()
Definition ModelHydro.cpp:327
Logger * GetLogger()
Definition ModelHydro.h:330
vecStr GetRecordedHydroUnitLabels() const
Definition ModelHydro.cpp:508
void OpenLog(const string &directory)
Definition ModelHydro.cpp:321
void Validate() const
Definition ModelHydro.cpp:204
bool ForcingLoaded() const
Definition ModelHydro.cpp:226
bool AttachTimeSeriesToHydroUnits()
Definition ModelHydro.cpp:616
Subbasin * GetSubbasin() const
Definition ModelHydro.h:279
void SaveAsInitialState()
Definition ModelHydro.cpp:349
bool IsValid() const
Definition ModelHydro.cpp:193
axd GetReachTravelTimes() const
Definition ModelHydro.cpp:400
vecInt GetReachSubreachCounts() const
Definition ModelHydro.cpp:420
double GetTotalWaterStorageChanges() const
Definition ModelHydro.cpp:474
bool AddTimeSeries(std::unique_ptr< TimeSeries > timeSeries)
Definition ModelHydro.cpp:539
Processor * GetProcessor()
Definition ModelHydro.h:321
RiverNetwork * GetNetwork() const
Definition ModelHydro.h:298
axxd GetHydroUnitValues(const string &label) const
Definition ModelHydro.cpp:486
vecStr GetRecordedHydroUnitFractionLabels() const
Definition ModelHydro.cpp:512
bool DumpOutputs(const string &path)
Definition ModelHydro.cpp:359
void UpdateParameters(SettingsModel &modelSettings)
Definition ModelHydro.cpp:114
int GetActionCount() const
Definition ModelHydro.cpp:589
double GetTotalSnowStorageChanges() const
Definition ModelHydro.cpp:478
string GetChannelRoutingScheme() const
Definition ModelHydro.cpp:436
HydroUnit * GetHydroUnitById(int id) const
Definition ModelHydro.cpp:448
bool AddAction(Action *action)
Definition ModelHydro.cpp:584
ActionsManager * GetActionsManager()
Definition ModelHydro.h:339
axd GetHydroUnitAreas() const
Definition ModelHydro.cpp:520
double GetTotalET() const
Definition ModelHydro.cpp:470
vecInt GetHydroUnitIds() const
Definition ModelHydro.cpp:516
void SetSubbasin(Subbasin *subbasin)
Definition ModelHydro.h:288
std::vector< HydroUnit * > GetHydroUnits() const
Definition ModelHydro.cpp:455
ModelResult Run()
Definition ModelHydro.cpp:230
axd GetSubbasinDischarge(int subbasinId) const
Definition ModelHydro.cpp:368
bool CreateTimeSeries(const string &varName, const axd &time, const axi &ids, const axxd &data)
Definition ModelHydro.cpp:597
ModelResult Initialize(SettingsModel &modelSettings, SettingsBasin &basinSettings, bool checkProcesses=true)
Definition ModelHydro.cpp:44
void ClearTimeSeries()
Definition ModelHydro.cpp:612
axd GetReachSlopes() const
Definition ModelHydro.cpp:396
axd GetReachLengths() const
Definition ModelHydro.cpp:392
double GetTotalOutletDischarge() const
Definition ModelHydro.cpp:466
ModelResult InitializeWithBasin(SettingsModel &modelSettings, SettingsBasin &basinSettings)
Definition ModelHydro.cpp:19
int GetSporadicActionItemCount() const
Definition ModelHydro.cpp:593
string GetHydroUnitLabelBasis(const string &label) const
Definition ModelHydro.cpp:524
axd GetOutletDischarge() const
Definition ModelHydro.cpp:364
void Reset()
Definition ModelHydro.cpp:331
Definition ParametersUpdater.h:8
Definition Processor.h:13
Definition Reach.h:25
Definition RiverNetwork.h:24
Definition SettingsBasin.h:62
Definition SettingsModel.h:87
Definition Subbasin.h:17
Definition TimeMachine.h:9