hydrobricks
Loading...
Searching...
No Matches
SettingsModel.h
1#ifndef HYDROBRICKS_SETTINGS_MODEL_H
2#define HYDROBRICKS_SETTINGS_MODEL_H
3
4#include <yaml-cpp/yaml.h>
5
6#include <memory>
7
8#include "Includes.h"
9#include "Parameter.h"
10
12 string name;
13};
14
16 string start;
17 string end;
18 int timeStep = 1;
19 string timeStepUnit;
20};
21
23 string target;
24 ContentType fluxType = ContentType::Water;
25 bool isInstantaneous = false;
26 bool isStatic = false;
27};
28
30 string name;
31 string type;
32 vecStr logItems;
33 vector<Parameter> parameters;
34 vector<VariableType> forcing;
35 vector<OutputSettings> outputs;
36};
37
39 string name;
40 string type;
41 vecStr logItems;
42 vector<Parameter> parameters;
43 vector<VariableType> forcing;
44 vector<OutputSettings> outputs;
45};
46
48 string name;
49 string type;
50 string parent;
51 vecStr logItems;
52 vector<Parameter> parameters;
53 vector<VariableType> forcing;
54 vector<ProcessSettings> processes;
55 bool computedDirectly = false; // if true, the brick is solved explicitly (no ODE solver)
56};
57
59 int id;
60 vecStr logItems;
61 vector<BrickSettings> hydroUnitBricks;
62 vector<BrickSettings> subBasinBricks;
63 vecInt landCoverBricks;
64 vecInt surfaceComponentBricks;
65 vector<SplitterSettings> hydroUnitSplitters;
66 vector<SplitterSettings> subBasinSplitters;
67};
68
70 public:
71 explicit SettingsModel();
72
73 virtual ~SettingsModel();
74
80 void SetSolver(const string& solverName);
81
90 void SetTimer(const string& start, const string& end, int timeStep, const string& timeStepUnit);
91
98 void AddHydroUnitBrick(const string& name, const std::string& type = "storage");
99
106 void AddSubBasinBrick(const string& name, const std::string& type = "storage");
107
114 void AddLandCoverBrick(const string& name, const string& type);
115
122 void AddSurfaceComponentBrick(const string& name, const string& type);
123
129 void SetSurfaceComponentParent(const string& name);
130
138 void AddBrickParameter(const string& name, float value, const std::string& type = "constant");
139
147 void SetBrickParameterValue(const string& name, float value, const std::string& type = "constant");
148
155
162 bool BrickHasParameter(const string& name);
163
169 void AddBrickForcing(const string& name);
170
179 void AddBrickProcess(const string& name, const string& type, const string& target = "", bool log = false);
180
188 void AddProcessParameter(const string& name, float value, const std::string& type = "constant");
189
197 void SetProcessParameterValue(const string& name, float value, const std::string& type = "constant");
198
204 void AddProcessForcing(const string& name);
205
212 void AddProcessOutput(const string& target, ContentType fluxType = ContentType::Water);
213
218
223
228
235 void AddHydroUnitSplitter(const string& name, const string& type);
236
243 void AddSubBasinSplitter(const string& name, const string& type);
244
252 void AddSplitterParameter(const string& name, float value, const std::string& type = "constant");
253
261 void SetSplitterParameterValue(const string& name, float value, const std::string& type = "constant");
262
268 void AddSplitterForcing(const string& name);
269
276 void AddSplitterOutput(const string& target, const ContentType fluxType = ContentType::Water);
277
283 void AddLoggingToItem(const string& itemName);
284
290 void AddLoggingToItems(std::initializer_list<const string> items);
291
297 void AddBrickLogging(const string& itemName);
298
304 void AddBrickLogging(std::initializer_list<const string> items);
305
311 void AddProcessLogging(const string& itemName);
312
318 void AddSplitterLogging(const string& itemName);
319
326 void GeneratePrecipitationSplitters(bool withSnow, const string& splitterType = "snow_rain:linear");
327
333 void GenerateSnowpacks(const string& snowMeltProcess);
334
341 void AddSnowIceTransformation(const string& transformationProcess = "transform:snow_ice_swat");
342
349 void AddSnowRedistribution(const string& redistributionProcess = "transport:snow_slide", bool skipGlaciers = false);
350
357 void GenerateSnowpacksWithWaterRetention(const string& snowMeltProcess, const string& outflowProcess);
358
365 bool SelectStructure(int id);
366
372 void SelectHydroUnitBrick(int index);
373
379 void SelectSubBasinBrick(int index);
380
387 bool SelectHydroUnitBrickIfFound(const string& name);
388
395 bool SelectSubBasinBrickIfFound(const string& name);
396
402 void SelectHydroUnitBrick(const string& name);
403
410 void SelectHydroUnitBrickByName(const string& name);
411
417 void SelectSubBasinBrick(const string& name);
418
424 void SelectProcess(int index);
425
431 void SelectProcess(const string& name);
432
438 void SelectProcessWithParameter(const string& name);
439
445 void SelectHydroUnitSplitter(int index);
446
452 void SelectSubBasinSplitter(int index);
453
460 bool SelectHydroUnitSplitterIfFound(const string& name);
461
468 bool SelectSubBasinSplitterIfFound(const string& name);
469
475 void SelectHydroUnitSplitter(const string& name);
476
482 void SelectSubBasinSplitter(const string& name);
483
492 bool SetParameterValue(const string& component, const string& name, float value);
493
499 int GetStructureCount() const {
500 return static_cast<int>(_modelStructures.size());
501 }
502
509 assert(_selectedStructure);
510 return static_cast<int>(_selectedStructure->hydroUnitBricks.size());
511 }
512
519 assert(_selectedStructure);
520 return static_cast<int>(_selectedStructure->subBasinBricks.size());
521 }
522
529 assert(_selectedStructure);
530 return static_cast<int>(_selectedStructure->surfaceComponentBricks.size());
531 }
532
538 int GetProcessCount() const {
539 assert(_selectedBrick);
540 return static_cast<int>(_selectedBrick->processes.size());
541 }
542
549 assert(_selectedStructure);
550 return static_cast<int>(_selectedStructure->hydroUnitSplitters.size());
551 }
552
559 assert(_selectedStructure);
560 return static_cast<int>(_selectedStructure->subBasinSplitters.size());
561 }
562
569 return _solver;
570 }
571
578 return _timer;
579 }
580
587 const BrickSettings& GetHydroUnitBrickSettings(int index) const {
588 assert(_selectedStructure);
589 return _selectedStructure->hydroUnitBricks[index];
590 }
591
598 const BrickSettings& GetHydroUnitBrickSettings(const string& name) const {
599 assert(_selectedStructure);
600
601 for (const auto& brick : _selectedStructure->hydroUnitBricks) {
602 if (brick.name == name) {
603 return brick;
604 }
605 }
606
607 throw std::runtime_error("Brick not found.");
608 }
609
617 assert(_selectedStructure);
618 int brickIndex = _selectedStructure->surfaceComponentBricks[index];
619 return _selectedStructure->hydroUnitBricks[brickIndex];
620 }
621
628 assert(_selectedStructure);
629 return _selectedStructure->surfaceComponentBricks;
630 }
631
637 const vecInt& GetLandCoverBricksIndices() const {
638 assert(_selectedStructure);
639 return _selectedStructure->landCoverBricks;
640 }
641
647 vecStr GetLandCoverBricksNames() const;
648
655 const BrickSettings& GetSubBasinBrickSettings(int index) const {
656 assert(_selectedStructure);
657 return _selectedStructure->subBasinBricks[index];
658 }
659
666 const ProcessSettings& GetProcessSettings(int index) const {
667 assert(_selectedBrick);
668 return _selectedBrick->processes[index];
669 }
670
678 assert(_selectedStructure);
679 return _selectedStructure->hydroUnitSplitters[index];
680 }
681
689 assert(_selectedStructure);
690 return _selectedStructure->subBasinSplitters[index];
691 }
692
698 vecStr GetSubBasinLogLabels() const;
699
705 vecStr GetSubBasinGenericLogLabels() const;
706
712 vecStr GetHydroUnitLogLabels() const;
713
719 void SetLogAll(bool logAll = true) {
720 if (logAll) {
721 LogDebug("Logging all components.");
722 } else {
723 LogDebug("Minimal logging.");
724 }
725 _logAll = logAll;
726 }
727
733 bool LogAll() const {
734 return _logAll;
735 }
736
743 [[nodiscard]] bool IsValid() const;
744
751 void Validate() const;
752
753 protected:
754 bool _logAll;
755 vector<ModelStructure> _modelStructures;
756 SolverSettings _solver;
757 TimerSettings _timer;
758 ModelStructure* _selectedStructure; // non-owning reference
759 BrickSettings* _selectedBrick; // non-owning reference
760 ProcessSettings* _selectedProcess; // non-owning reference
761 SplitterSettings* _selectedSplitter; // non-owning reference
762
763 bool LogAll(const YAML::Node& settings);
764};
765
766#endif // HYDROBRICKS_SETTINGS_MODEL_H
Definition SettingsModel.h:69
void AddLoggingToItems(std::initializer_list< const string > items)
Definition SettingsModel.cpp:385
void AddHydroUnitBrick(const string &name, const std::string &type="storage")
Definition SettingsModel.cpp:34
void AddSplitterParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:316
void AddSubBasinSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:305
void AddSplitterForcing(const string &name)
Definition SettingsModel.cpp:346
int GetHydroUnitSplitterCount() const
Definition SettingsModel.h:548
void AddSnowIceTransformation(const string &transformationProcess="transform:snow_ice_swat")
Definition SettingsModel.cpp:483
int GetHydroUnitBrickCount() const
Definition SettingsModel.h:508
bool SetParameterValue(const string &component, const string &name, float value)
Definition SettingsModel.cpp:769
void SetProcessOutputsAsStatic()
Definition SettingsModel.cpp:276
const vecInt & GetLandCoverBricksIndices() const
Definition SettingsModel.h:637
void SetSplitterParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:327
void AddProcessOutput(const string &target, ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:259
const SplitterSettings & GetHydroUnitSplitterSettings(int index) const
Definition SettingsModel.h:677
void AddBrickForcing(const string &name)
Definition SettingsModel.cpp:143
void AddHydroUnitSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:294
void AddSplitterLogging(const string &itemName)
Definition SettingsModel.cpp:425
int GetSurfaceComponentBrickCount() const
Definition SettingsModel.h:528
void AddProcessParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:198
void GenerateSnowpacksWithWaterRetention(const string &snowMeltProcess, const string &outflowProcess)
Definition SettingsModel.cpp:510
void SetLogAll(bool logAll=true)
Definition SettingsModel.h:719
bool BrickHasParameter(const string &name)
Definition SettingsModel.cpp:132
void SelectSubBasinSplitter(int index)
Definition SettingsModel.cpp:645
void SetTimer(const string &start, const string &end, int timeStep, const string &timeStepUnit)
Definition SettingsModel.cpp:27
void SelectProcess(int index)
Definition SettingsModel.cpp:605
void SelectProcessWithParameter(const string &name)
Definition SettingsModel.cpp:624
const BrickSettings & GetHydroUnitBrickSettings(int index) const
Definition SettingsModel.h:587
vecStr GetSubBasinGenericLogLabels() const
Definition SettingsModel.cpp:756
void AddBrickParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:98
void SetCurrentBrickComputedDirectly()
Definition SettingsModel.cpp:127
bool SelectSubBasinBrickIfFound(const string &name)
Definition SettingsModel.cpp:574
bool SelectStructure(int id)
Definition SettingsModel.cpp:529
void AddSplitterOutput(const string &target, const ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:367
void SelectHydroUnitBrickByName(const string &name)
Definition SettingsModel.cpp:594
SolverSettings GetSolverSettings() const
Definition SettingsModel.h:568
int GetStructureCount() const
Definition SettingsModel.h:499
int GetProcessCount() const
Definition SettingsModel.h:538
bool SelectHydroUnitSplitterIfFound(const string &name)
Definition SettingsModel.cpp:652
void AddLandCoverBrick(const string &name, const string &type)
Definition SettingsModel.cpp:74
void SetProcessOutputsAsInstantaneous()
Definition SettingsModel.cpp:268
void AddLoggingToItem(const string &itemName)
Definition SettingsModel.cpp:376
int GetSubBasinBrickCount() const
Definition SettingsModel.h:518
void GenerateSnowpacks(const string &snowMeltProcess)
Definition SettingsModel.cpp:468
vecStr GetSubBasinLogLabels() const
Definition SettingsModel.cpp:725
vecInt GetSurfaceComponentBricksIndices() const
Definition SettingsModel.h:627
void AddSnowRedistribution(const string &redistributionProcess="transport:snow_slide", bool skipGlaciers=false)
Definition SettingsModel.cpp:496
void AddBrickProcess(const string &name, const string &type, const string &target="", bool log=false)
Definition SettingsModel.cpp:160
void SetSolver(const string &solverName)
Definition SettingsModel.cpp:23
void SetBrickParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:108
void GeneratePrecipitationSplitters(bool withSnow, const string &splitterType="snow_rain:linear")
Definition SettingsModel.cpp:434
void AddBrickLogging(const string &itemName)
Definition SettingsModel.cpp:396
const ProcessSettings & GetProcessSettings(int index) const
Definition SettingsModel.h:666
void SelectHydroUnitBrick(int index)
Definition SettingsModel.cpp:545
void SetProcessParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:217
TimerSettings GetTimerSettings() const
Definition SettingsModel.h:577
bool SelectSubBasinSplitterIfFound(const string &name)
Definition SettingsModel.cpp:664
vecStr GetHydroUnitLogLabels() const
Definition SettingsModel.cpp:688
void AddProcessLogging(const string &itemName)
Definition SettingsModel.cpp:416
void SelectSubBasinBrick(int index)
Definition SettingsModel.cpp:553
void AddSurfaceComponentBrick(const string &name, const string &type)
Definition SettingsModel.cpp:85
void AddSubBasinBrick(const string &name, const std::string &type="storage")
Definition SettingsModel.cpp:54
const BrickSettings & GetSubBasinBrickSettings(int index) const
Definition SettingsModel.h:655
void SelectHydroUnitSplitter(int index)
Definition SettingsModel.cpp:638
void SetSurfaceComponentParent(const string &name)
Definition SettingsModel.cpp:93
bool LogAll() const
Definition SettingsModel.h:733
const BrickSettings & GetHydroUnitBrickSettings(const string &name) const
Definition SettingsModel.h:598
vecStr GetLandCoverBricksNames() const
Definition SettingsModel.cpp:715
const BrickSettings & GetSurfaceComponentBrickSettings(int index) const
Definition SettingsModel.h:616
void AddProcessForcing(const string &name)
Definition SettingsModel.cpp:236
void OutputProcessToSameBrick()
Definition SettingsModel.cpp:284
bool IsValid() const
Definition SettingsModel.cpp:853
int GetSubBasinSplitterCount() const
Definition SettingsModel.h:558
void Validate() const
Definition SettingsModel.cpp:880
const SplitterSettings & GetSubBasinSplitterSettings(int index) const
Definition SettingsModel.h:688
bool SelectHydroUnitBrickIfFound(const string &name)
Definition SettingsModel.cpp:561
Definition SettingsModel.h:47
Definition SettingsModel.h:58
Definition SettingsModel.h:22
Definition SettingsModel.h:29
Definition SettingsModel.h:11
Definition SettingsModel.h:38
Definition SettingsModel.h:15