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 <map>
7#include <memory>
8#include <utility>
9
10#include "Includes.h"
11#include "Parameter.h"
12
14 string name;
15};
16
24 string scheme = "none";
25 bool routeLocalRunoff = false;
26 vector<Parameter> parameters;
27};
28
30 string start;
31 string end;
32 int timeStep = 1;
33 string timeStepUnit;
34 int spinupDays = 0;
35};
36
38 string target;
39 ContentType fluxType = ContentType::Water;
40 bool isInstantaneous = false;
41 bool isStatic = false;
42};
43
45 string name;
46 string type;
47 vecStr gateBricks; // bricks whose state modulates the process rate (no flux; e.g.
48 // percolation:prevah). Several are aggregated by the process.
49 vecStr logItems;
50 vector<Parameter> parameters;
51 vector<VariableType> forcing;
52 vector<OutputSettings> outputs;
53};
54
56 string name;
57 string type;
58 vecStr logItems;
59 vector<Parameter> parameters;
60 vector<VariableType> forcing;
61 vector<OutputSettings> outputs;
62};
63
65 string name;
66 string type;
67 string parent;
68 vecStr logItems;
69 vector<Parameter> parameters;
70 vector<VariableType> forcing;
71 vector<ProcessSettings> processes;
72 bool computedDirectly = false; // if true, the brick is solved explicitly (no ODE solver)
73 string areaOf; // land cover whose area the brick represents (empty: the whole unit)
74};
75
77 int id;
78 vecStr logItems;
79 vector<BrickSettings> hydroUnitBricks;
80 vector<BrickSettings> subbasinBricks;
81 vecInt landCoverBricks;
82 vecInt surfaceComponentBricks;
83 vector<SplitterSettings> hydroUnitSplitters;
84 vector<SplitterSettings> subbasinSplitters;
85};
86
88 public:
89 explicit SettingsModel();
90
91 virtual ~SettingsModel();
92
98 void SetSolver(const string& solverName);
99
109 void SetChannelRouting(const string& scheme, bool routeLocalRunoff = false);
110
119 void SetTimer(const string& start, const string& end, int timeStep, const string& timeStepUnit);
120
130 void SetSpinupDays(int days);
131
138 void AddHydroUnitBrick(const string& name, const std::string& type = "storage");
139
146 void AddSubbasinBrick(const string& name, const std::string& type = "storage");
147
154 void AddLandCoverBrick(const string& name, const string& type);
155
162 void AddSurfaceComponentBrick(const string& name, const string& type);
163
169 void SetSurfaceComponentParent(const string& name);
170
178 void AddBrickParameter(const string& name, float value, const std::string& type = "constant");
179
187 void SetBrickParameterValue(const string& name, float value, const std::string& type = "constant");
188
195
203 void SetCurrentBrickAreaOf(const string& landCover);
204
211 bool BrickHasParameter(const string& name);
212
218 void AddBrickForcing(const string& name);
219
228 void AddBrickProcess(const string& name, const string& type, const string& target = "", bool log = false);
229
237 void AddProcessParameter(const string& name, float value, const std::string& type = "constant");
238
246 void SetProcessParameterValue(const string& name, float value, const std::string& type = "constant");
247
253 void AddProcessForcing(const string& name);
254
261 void AddProcessOutput(const string& target, ContentType fluxType = ContentType::Water);
262
270 void SetProcessGateBrick(const string& name);
271
276
281
286
293 void AddHydroUnitSplitter(const string& name, const string& type);
294
301 void AddSubbasinSplitter(const string& name, const string& type);
302
310 void AddSplitterParameter(const string& name, float value, const std::string& type = "constant");
311
319 void SetSplitterParameterValue(const string& name, float value, const std::string& type = "constant");
320
326 void AddSplitterForcing(const string& name);
327
334 void AddSplitterOutput(const string& target, const ContentType fluxType = ContentType::Water);
335
342 void ChangeSplitterOutputTarget(const string& currentTarget, const string& newTarget);
343
352 bool ChangeSplitterOutputTargetIfFound(const string& currentTarget, const string& newTarget);
353
370 void GenerateCanopyInterception(const string& coverName, const string& throughfallTarget,
371 const string& throughfallProcess = "outflow:threshold",
372 const string& interceptionEtProcess = "et:open_water");
373
379 void AddLoggingToItem(const string& itemName);
380
386 void AddLoggingToItems(std::initializer_list<const string> items);
387
393 void AddBrickLogging(const string& itemName);
394
400 void AddBrickLogging(std::initializer_list<const string> items);
401
407 void AddProcessLogging(const string& itemName);
408
414 void AddSplitterLogging(const string& itemName);
415
422 void GeneratePrecipitationSplitters(bool withSnow, const string& splitterType = "snow_rain:linear");
423
429 void GenerateSnowpacks(const string& snowMeltProcess);
430
437 void AddSnowIceTransformation(const string& transformationProcess = "transform:snow_ice_swat");
438
445 void AddSnowRedistribution(const string& redistributionProcess = "transport:snow_slide", bool skipGlaciers = false);
446
457 void GenerateSnowpacksWithWaterRetention(const string& snowMeltProcess, const string& outflowProcess,
458 bool rainToSnowpack = false);
459
466 void AddSnowpackRefreezing(const string& refreezingProcess = "refreeze:degree_day");
467
473 void AddSnowpackSublimation(const string& sublimationProcess);
474
482 int AddStructure();
483
490 bool SelectStructure(int id);
491
497 void SelectHydroUnitBrick(int index);
498
504 void SelectSubbasinBrick(int index);
505
512 bool SelectHydroUnitBrickIfFound(const string& name);
513
520 bool SelectSubbasinBrickIfFound(const string& name);
521
527 void SelectHydroUnitBrick(const string& name);
528
535 void SelectHydroUnitBrickByName(const string& name);
536
542 void SelectSubbasinBrick(const string& name);
543
549 void SelectProcess(int index);
550
556 void SelectProcess(const string& name);
557
563 void SelectProcessWithParameter(const string& name);
564
570 void SelectHydroUnitSplitter(int index);
571
577 void SelectSubbasinSplitter(int index);
578
585 bool SelectHydroUnitSplitterIfFound(const string& name);
586
593 bool SelectSubbasinSplitterIfFound(const string& name);
594
600 void SelectHydroUnitSplitter(const string& name);
601
607 void SelectSubbasinSplitter(const string& name);
608
617 bool SetParameterValue(const string& component, const string& name, float value);
618
631 bool SetParameterMonthlyValues(const string& component, const string& name, const vecFloat& values);
632
639 vector<Parameter*> GetParametersWithModifier();
640
650 void SetParameterSpatialFromProperty(const string& component, const string& name, const string& property);
651
657 const std::map<std::pair<string, string>, string>& GetSpatialParameterBindings() const {
658 return _spatialParameterBindings;
659 }
660
671 void SetParameterSpatialMonthlyFromProperties(const string& component, const string& name,
672 const vecStr& properties);
673
679 const std::map<std::pair<string, string>, vecStr>& GetSpatialMonthlyParameterBindings() const {
680 return _spatialMonthlyParameterBindings;
681 }
682
689 assert(_selectedStructure);
690 return _selectedStructure->id;
691 }
692
698 int GetStructureCount() const {
699 return static_cast<int>(_modelStructures.size());
700 }
701
708 assert(_selectedStructure);
709 return static_cast<int>(_selectedStructure->hydroUnitBricks.size());
710 }
711
718 assert(_selectedStructure);
719 return static_cast<int>(_selectedStructure->subbasinBricks.size());
720 }
721
728 assert(_selectedStructure);
729 return static_cast<int>(_selectedStructure->surfaceComponentBricks.size());
730 }
731
737 int GetProcessCount() const {
738 assert(_selectedBrick);
739 return static_cast<int>(_selectedBrick->processes.size());
740 }
741
748 assert(_selectedStructure);
749 return static_cast<int>(_selectedStructure->hydroUnitSplitters.size());
750 }
751
758 assert(_selectedStructure);
759 return static_cast<int>(_selectedStructure->subbasinSplitters.size());
760 }
761
768 return _solver;
769 }
770
778 return _channelRouting;
779 }
780
787 return _timer;
788 }
789
796 const BrickSettings& GetHydroUnitBrickSettings(int index) const {
797 assert(_selectedStructure);
798 return _selectedStructure->hydroUnitBricks[index];
799 }
800
807 const BrickSettings& GetHydroUnitBrickSettings(const string& name) const {
808 assert(_selectedStructure);
809
810 for (const auto& brick : _selectedStructure->hydroUnitBricks) {
811 if (brick.name == name) {
812 return brick;
813 }
814 }
815
816 throw std::runtime_error("Brick not found.");
817 }
818
826 assert(_selectedStructure);
827 int brickIndex = _selectedStructure->surfaceComponentBricks[index];
828 return _selectedStructure->hydroUnitBricks[brickIndex];
829 }
830
837 assert(_selectedStructure);
838 return _selectedStructure->surfaceComponentBricks;
839 }
840
846 const vecInt& GetLandCoverBricksIndices() const {
847 assert(_selectedStructure);
848 return _selectedStructure->landCoverBricks;
849 }
850
856 vecStr GetLandCoverBricksNames() const;
857
864
871 const BrickSettings& GetSubbasinBrickSettings(int index) const {
872 assert(_selectedStructure);
873 return _selectedStructure->subbasinBricks[index];
874 }
875
882 const ProcessSettings& GetProcessSettings(int index) const {
883 assert(_selectedBrick);
884 return _selectedBrick->processes[index];
885 }
886
894 assert(_selectedStructure);
895 return _selectedStructure->hydroUnitSplitters[index];
896 }
897
905 assert(_selectedStructure);
906 return _selectedStructure->subbasinSplitters[index];
907 }
908
914 vecStr GetSubbasinLogLabels() const;
915
921 vecStr GetSubbasinGenericLogLabels() const;
922
928 vecStr GetHydroUnitLogLabels() const;
929
935 void SetLogAll(bool logAll = true) {
936 if (logAll) {
937 LogDebug("Logging all components.");
938 _recordFractions = true;
939 } else {
940 LogDebug("Minimal logging.");
941 }
942 _logAll = logAll;
943 }
944
950 bool LogAll() const {
951 return _logAll;
952 }
953
962 void SetRecordFractions(bool record = true) {
963 _recordFractions = record;
964 }
965
971 bool RecordsFractions() const {
972 return _recordFractions;
973 }
974
981 [[nodiscard]] bool IsValid() const;
982
989 void Validate() const;
990
991 protected:
997 bool SetParameterValueInSelectedStructure(const string& component, const string& name, float value);
998
1005 Parameter* FindParameterInSelectedStructure(const string& component, const string& name);
1006
1007 bool _logAll;
1008 bool _recordFractions;
1009 vector<ModelStructure> _modelStructures;
1010 SolverSettings _solver;
1011 ChannelRoutingSettings _channelRouting;
1012 TimerSettings _timer;
1013 ModelStructure* _selectedStructure; // non-owning reference
1014 BrickSettings* _selectedBrick; // non-owning reference
1015 ProcessSettings* _selectedProcess; // non-owning reference
1016 SplitterSettings* _selectedSplitter; // non-owning reference
1017 // Spatial parameter bindings: (component, name) -> hydro-unit property name.
1018 std::map<std::pair<string, string>, string> _spatialParameterBindings;
1019 std::map<std::pair<string, string>, vecStr> _spatialMonthlyParameterBindings;
1020
1021 bool LogAll(const YAML::Node& settings);
1022};
1023
1024#endif // HYDROBRICKS_SETTINGS_MODEL_H
Definition Parameter.h:7
Definition SettingsModel.h:87
void AddLoggingToItems(std::initializer_list< const string > items)
Definition SettingsModel.cpp:471
int GetSelectedStructureId() const
Definition SettingsModel.h:688
void AddHydroUnitBrick(const string &name, const std::string &type="storage")
Definition SettingsModel.cpp:60
void AddSnowpackSublimation(const string &sublimationProcess)
Definition SettingsModel.cpp:621
int GetSubbasinSplitterCount() const
Definition SettingsModel.h:757
void AddSplitterParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:353
void AddSplitterForcing(const string &name)
Definition SettingsModel.cpp:383
int GetHydroUnitSplitterCount() const
Definition SettingsModel.h:747
void AddSnowIceTransformation(const string &transformationProcess="transform:snow_ice_swat")
Definition SettingsModel.cpp:576
int GetHydroUnitBrickCount() const
Definition SettingsModel.h:707
bool SetParameterValue(const string &component, const string &name, float value)
Definition SettingsModel.cpp:963
vecStr GetSubbasinGenericLogLabels() const
Definition SettingsModel.cpp:951
void SetProcessOutputsAsStatic()
Definition SettingsModel.cpp:313
vector< Parameter * > GetParametersWithModifier()
Definition SettingsModel.cpp:1216
const vecInt & GetLandCoverBricksIndices() const
Definition SettingsModel.h:846
void SetSplitterParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:364
void AddProcessOutput(const string &target, ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:290
const std::map< std::pair< string, string >, vecStr > & GetSpatialMonthlyParameterBindings() const
Definition SettingsModel.h:679
bool SetParameterValueInSelectedStructure(const string &component, const string &name, float value)
Definition SettingsModel.cpp:1018
Parameter * FindParameterInSelectedStructure(const string &component, const string &name)
Definition SettingsModel.cpp:1084
const SplitterSettings & GetHydroUnitSplitterSettings(int index) const
Definition SettingsModel.h:893
void AddBrickForcing(const string &name)
Definition SettingsModel.cpp:174
void AddHydroUnitSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:331
void AddSplitterLogging(const string &itemName)
Definition SettingsModel.cpp:511
int GetSurfaceComponentBrickCount() const
Definition SettingsModel.h:727
void AddProcessParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:229
void SetLogAll(bool logAll=true)
Definition SettingsModel.h:935
bool BrickHasParameter(const string &name)
Definition SettingsModel.cpp:163
void SetTimer(const string &start, const string &end, int timeStep, const string &timeStepUnit)
Definition SettingsModel.cpp:46
void SelectProcess(int index)
Definition SettingsModel.cpp:767
void SelectProcessWithParameter(const string &name)
Definition SettingsModel.cpp:786
const BrickSettings & GetHydroUnitBrickSettings(int index) const
Definition SettingsModel.h:796
void AddSubbasinBrick(const string &name, const std::string &type="storage")
Definition SettingsModel.cpp:80
void AddBrickParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:124
void SetCurrentBrickComputedDirectly()
Definition SettingsModel.cpp:153
void GenerateCanopyInterception(const string &coverName, const string &throughfallTarget, const string &throughfallProcess="outflow:threshold", const string &interceptionEtProcess="et:open_water")
Definition SettingsModel.cpp:440
void GenerateSnowpacksWithWaterRetention(const string &snowMeltProcess, const string &outflowProcess, bool rainToSnowpack=false)
Definition SettingsModel.cpp:646
bool SelectStructure(int id)
Definition SettingsModel.cpp:693
void AddSplitterOutput(const string &target, const ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:404
void SelectHydroUnitBrickByName(const string &name)
Definition SettingsModel.cpp:756
bool SelectSubbasinSplitterIfFound(const string &name)
Definition SettingsModel.cpp:824
void SetSpinupDays(int days)
Definition SettingsModel.cpp:53
const SplitterSettings & GetSubbasinSplitterSettings(int index) const
Definition SettingsModel.h:904
void AddSnowpackRefreezing(const string &refreezingProcess="refreeze:degree_day")
Definition SettingsModel.cpp:603
void AddSubbasinSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:342
SolverSettings GetSolverSettings() const
Definition SettingsModel.h:767
int GetStructureCount() const
Definition SettingsModel.h:698
int GetProcessCount() const
Definition SettingsModel.h:737
const BrickSettings & GetSubbasinBrickSettings(int index) const
Definition SettingsModel.h:871
bool SelectHydroUnitSplitterIfFound(const string &name)
Definition SettingsModel.cpp:812
void SelectSubbasinBrick(int index)
Definition SettingsModel.cpp:716
void SetProcessGateBrick(const string &name)
Definition SettingsModel.cpp:299
void AddLandCoverBrick(const string &name, const string &type)
Definition SettingsModel.cpp:100
vecStr GetSelectedStructureLandCoverNames() const
Definition SettingsModel.cpp:902
void SetProcessOutputsAsInstantaneous()
Definition SettingsModel.cpp:305
const std::map< std::pair< string, string >, string > & GetSpatialParameterBindings() const
Definition SettingsModel.h:657
void SetParameterSpatialFromProperty(const string &component, const string &name, const string &property)
Definition SettingsModel.cpp:1173
int GetSubbasinBrickCount() const
Definition SettingsModel.h:717
void AddLoggingToItem(const string &itemName)
Definition SettingsModel.cpp:462
void SetCurrentBrickAreaOf(const string &landCover)
Definition SettingsModel.cpp:158
void GenerateSnowpacks(const string &snowMeltProcess)
Definition SettingsModel.cpp:561
vecInt GetSurfaceComponentBricksIndices() const
Definition SettingsModel.h:836
void AddSnowRedistribution(const string &redistributionProcess="transport:snow_slide", bool skipGlaciers=false)
Definition SettingsModel.cpp:589
void AddBrickProcess(const string &name, const string &type, const string &target="", bool log=false)
Definition SettingsModel.cpp:191
void SetSolver(const string &solverName)
Definition SettingsModel.cpp:27
void SelectSubbasinSplitter(int index)
Definition SettingsModel.cpp:806
void SetBrickParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:134
void ChangeSplitterOutputTarget(const string &currentTarget, const string &newTarget)
Definition SettingsModel.cpp:413
bool RecordsFractions() const
Definition SettingsModel.h:971
void GeneratePrecipitationSplitters(bool withSnow, const string &splitterType="snow_rain:linear")
Definition SettingsModel.cpp:520
bool SetParameterMonthlyValues(const string &component, const string &name, const vecFloat &values)
Definition SettingsModel.cpp:1113
int AddStructure()
Definition SettingsModel.cpp:676
const ChannelRoutingSettings & GetChannelRoutingSettings() const
Definition SettingsModel.h:777
bool SelectSubbasinBrickIfFound(const string &name)
Definition SettingsModel.cpp:736
void SetRecordFractions(bool record=true)
Definition SettingsModel.h:962
void AddBrickLogging(const string &itemName)
Definition SettingsModel.cpp:482
const ProcessSettings & GetProcessSettings(int index) const
Definition SettingsModel.h:882
void SetParameterSpatialMonthlyFromProperties(const string &component, const string &name, const vecStr &properties)
Definition SettingsModel.cpp:1192
void SelectHydroUnitBrick(int index)
Definition SettingsModel.cpp:709
bool ChangeSplitterOutputTargetIfFound(const string &currentTarget, const string &newTarget)
Definition SettingsModel.cpp:427
vecStr GetSubbasinLogLabels() const
Definition SettingsModel.cpp:913
void SetProcessParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:248
TimerSettings GetTimerSettings() const
Definition SettingsModel.h:786
void SetChannelRouting(const string &scheme, bool routeLocalRunoff=false)
Definition SettingsModel.cpp:31
vecStr GetHydroUnitLogLabels() const
Definition SettingsModel.cpp:848
void AddProcessLogging(const string &itemName)
Definition SettingsModel.cpp:502
void AddSurfaceComponentBrick(const string &name, const string &type)
Definition SettingsModel.cpp:111
void SelectHydroUnitSplitter(int index)
Definition SettingsModel.cpp:800
void SetSurfaceComponentParent(const string &name)
Definition SettingsModel.cpp:119
bool LogAll() const
Definition SettingsModel.h:950
const BrickSettings & GetHydroUnitBrickSettings(const string &name) const
Definition SettingsModel.h:807
vecStr GetLandCoverBricksNames() const
Definition SettingsModel.cpp:883
const BrickSettings & GetSurfaceComponentBrickSettings(int index) const
Definition SettingsModel.h:825
void AddProcessForcing(const string &name)
Definition SettingsModel.cpp:267
void OutputProcessToSameBrick()
Definition SettingsModel.cpp:321
bool IsValid() const
Definition SettingsModel.cpp:1269
void Validate() const
Definition SettingsModel.cpp:1296
bool SelectHydroUnitBrickIfFound(const string &name)
Definition SettingsModel.cpp:723
Definition SettingsModel.h:64
Definition SettingsModel.h:23
Definition SettingsModel.h:76
Definition SettingsModel.h:37
Definition SettingsModel.h:44
Definition SettingsModel.h:13
Definition SettingsModel.h:55
Definition SettingsModel.h:29