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
18 string start;
19 string end;
20 int timeStep = 1;
21 string timeStepUnit;
22 int spinupDays = 0;
23};
24
26 string target;
27 ContentType fluxType = ContentType::Water;
28 bool isInstantaneous = false;
29 bool isStatic = false;
30};
31
33 string name;
34 string type;
35 vecStr gateBricks; // bricks whose state modulates the process rate (no flux; e.g.
36 // percolation:prevah). Several are aggregated by the process.
37 vecStr logItems;
38 vector<Parameter> parameters;
39 vector<VariableType> forcing;
40 vector<OutputSettings> outputs;
41};
42
44 string name;
45 string type;
46 vecStr logItems;
47 vector<Parameter> parameters;
48 vector<VariableType> forcing;
49 vector<OutputSettings> outputs;
50};
51
53 string name;
54 string type;
55 string parent;
56 vecStr logItems;
57 vector<Parameter> parameters;
58 vector<VariableType> forcing;
59 vector<ProcessSettings> processes;
60 bool computedDirectly = false; // if true, the brick is solved explicitly (no ODE solver)
61};
62
64 int id;
65 vecStr logItems;
66 vector<BrickSettings> hydroUnitBricks;
67 vector<BrickSettings> subBasinBricks;
68 vecInt landCoverBricks;
69 vecInt surfaceComponentBricks;
70 vector<SplitterSettings> hydroUnitSplitters;
71 vector<SplitterSettings> subBasinSplitters;
72};
73
75 public:
76 explicit SettingsModel();
77
78 virtual ~SettingsModel();
79
85 void SetSolver(const string& solverName);
86
95 void SetTimer(const string& start, const string& end, int timeStep, const string& timeStepUnit);
96
106 void SetSpinupDays(int days);
107
114 void AddHydroUnitBrick(const string& name, const std::string& type = "storage");
115
122 void AddSubBasinBrick(const string& name, const std::string& type = "storage");
123
130 void AddLandCoverBrick(const string& name, const string& type);
131
138 void AddSurfaceComponentBrick(const string& name, const string& type);
139
145 void SetSurfaceComponentParent(const string& name);
146
154 void AddBrickParameter(const string& name, float value, const std::string& type = "constant");
155
163 void SetBrickParameterValue(const string& name, float value, const std::string& type = "constant");
164
171
178 bool BrickHasParameter(const string& name);
179
185 void AddBrickForcing(const string& name);
186
195 void AddBrickProcess(const string& name, const string& type, const string& target = "", bool log = false);
196
204 void AddProcessParameter(const string& name, float value, const std::string& type = "constant");
205
213 void SetProcessParameterValue(const string& name, float value, const std::string& type = "constant");
214
220 void AddProcessForcing(const string& name);
221
228 void AddProcessOutput(const string& target, ContentType fluxType = ContentType::Water);
229
237 void SetProcessGateBrick(const string& name);
238
243
248
253
260 void AddHydroUnitSplitter(const string& name, const string& type);
261
268 void AddSubBasinSplitter(const string& name, const string& type);
269
277 void AddSplitterParameter(const string& name, float value, const std::string& type = "constant");
278
286 void SetSplitterParameterValue(const string& name, float value, const std::string& type = "constant");
287
293 void AddSplitterForcing(const string& name);
294
301 void AddSplitterOutput(const string& target, const ContentType fluxType = ContentType::Water);
302
309 void ChangeSplitterOutputTarget(const string& currentTarget, const string& newTarget);
310
319 bool ChangeSplitterOutputTargetIfFound(const string& currentTarget, const string& newTarget);
320
337 void GenerateCanopyInterception(const string& coverName, const string& throughfallTarget,
338 const string& throughfallProcess = "outflow:threshold",
339 const string& interceptionEtProcess = "et:open_water");
340
346 void AddLoggingToItem(const string& itemName);
347
353 void AddLoggingToItems(std::initializer_list<const string> items);
354
360 void AddBrickLogging(const string& itemName);
361
367 void AddBrickLogging(std::initializer_list<const string> items);
368
374 void AddProcessLogging(const string& itemName);
375
381 void AddSplitterLogging(const string& itemName);
382
389 void GeneratePrecipitationSplitters(bool withSnow, const string& splitterType = "snow_rain:linear");
390
396 void GenerateSnowpacks(const string& snowMeltProcess);
397
404 void AddSnowIceTransformation(const string& transformationProcess = "transform:snow_ice_swat");
405
412 void AddSnowRedistribution(const string& redistributionProcess = "transport:snow_slide", bool skipGlaciers = false);
413
424 void GenerateSnowpacksWithWaterRetention(const string& snowMeltProcess, const string& outflowProcess,
425 bool rainToSnowpack = false);
426
433 void AddSnowpackRefreezing(const string& refreezingProcess = "refreeze:degree_day");
434
440 void AddSnowpackSublimation(const string& sublimationProcess);
441
449 int AddStructure();
450
457 bool SelectStructure(int id);
458
464 void SelectHydroUnitBrick(int index);
465
471 void SelectSubBasinBrick(int index);
472
479 bool SelectHydroUnitBrickIfFound(const string& name);
480
487 bool SelectSubBasinBrickIfFound(const string& name);
488
494 void SelectHydroUnitBrick(const string& name);
495
502 void SelectHydroUnitBrickByName(const string& name);
503
509 void SelectSubBasinBrick(const string& name);
510
516 void SelectProcess(int index);
517
523 void SelectProcess(const string& name);
524
530 void SelectProcessWithParameter(const string& name);
531
537 void SelectHydroUnitSplitter(int index);
538
544 void SelectSubBasinSplitter(int index);
545
552 bool SelectHydroUnitSplitterIfFound(const string& name);
553
560 bool SelectSubBasinSplitterIfFound(const string& name);
561
567 void SelectHydroUnitSplitter(const string& name);
568
574 void SelectSubBasinSplitter(const string& name);
575
584 bool SetParameterValue(const string& component, const string& name, float value);
585
598 bool SetParameterMonthlyValues(const string& component, const string& name, const vecFloat& values);
599
606 vector<Parameter*> GetParametersWithModifier();
607
617 void SetParameterSpatialFromProperty(const string& component, const string& name, const string& property);
618
624 const std::map<std::pair<string, string>, string>& GetSpatialParameterBindings() const {
625 return _spatialParameterBindings;
626 }
627
638 void SetParameterSpatialMonthlyFromProperties(const string& component, const string& name,
639 const vecStr& properties);
640
646 const std::map<std::pair<string, string>, vecStr>& GetSpatialMonthlyParameterBindings() const {
647 return _spatialMonthlyParameterBindings;
648 }
649
655 int GetStructureCount() const {
656 return static_cast<int>(_modelStructures.size());
657 }
658
665 assert(_selectedStructure);
666 return static_cast<int>(_selectedStructure->hydroUnitBricks.size());
667 }
668
675 assert(_selectedStructure);
676 return static_cast<int>(_selectedStructure->subBasinBricks.size());
677 }
678
685 assert(_selectedStructure);
686 return static_cast<int>(_selectedStructure->surfaceComponentBricks.size());
687 }
688
694 int GetProcessCount() const {
695 assert(_selectedBrick);
696 return static_cast<int>(_selectedBrick->processes.size());
697 }
698
705 assert(_selectedStructure);
706 return static_cast<int>(_selectedStructure->hydroUnitSplitters.size());
707 }
708
715 assert(_selectedStructure);
716 return static_cast<int>(_selectedStructure->subBasinSplitters.size());
717 }
718
725 return _solver;
726 }
727
734 return _timer;
735 }
736
743 const BrickSettings& GetHydroUnitBrickSettings(int index) const {
744 assert(_selectedStructure);
745 return _selectedStructure->hydroUnitBricks[index];
746 }
747
754 const BrickSettings& GetHydroUnitBrickSettings(const string& name) const {
755 assert(_selectedStructure);
756
757 for (const auto& brick : _selectedStructure->hydroUnitBricks) {
758 if (brick.name == name) {
759 return brick;
760 }
761 }
762
763 throw std::runtime_error("Brick not found.");
764 }
765
773 assert(_selectedStructure);
774 int brickIndex = _selectedStructure->surfaceComponentBricks[index];
775 return _selectedStructure->hydroUnitBricks[brickIndex];
776 }
777
784 assert(_selectedStructure);
785 return _selectedStructure->surfaceComponentBricks;
786 }
787
793 const vecInt& GetLandCoverBricksIndices() const {
794 assert(_selectedStructure);
795 return _selectedStructure->landCoverBricks;
796 }
797
803 vecStr GetLandCoverBricksNames() const;
804
811
818 const BrickSettings& GetSubBasinBrickSettings(int index) const {
819 assert(_selectedStructure);
820 return _selectedStructure->subBasinBricks[index];
821 }
822
829 const ProcessSettings& GetProcessSettings(int index) const {
830 assert(_selectedBrick);
831 return _selectedBrick->processes[index];
832 }
833
841 assert(_selectedStructure);
842 return _selectedStructure->hydroUnitSplitters[index];
843 }
844
852 assert(_selectedStructure);
853 return _selectedStructure->subBasinSplitters[index];
854 }
855
861 vecStr GetSubBasinLogLabels() const;
862
868 vecStr GetSubBasinGenericLogLabels() const;
869
875 vecStr GetHydroUnitLogLabels() const;
876
882 void SetLogAll(bool logAll = true) {
883 if (logAll) {
884 LogDebug("Logging all components.");
885 _recordFractions = true;
886 } else {
887 LogDebug("Minimal logging.");
888 }
889 _logAll = logAll;
890 }
891
897 bool LogAll() const {
898 return _logAll;
899 }
900
909 void SetRecordFractions(bool record = true) {
910 _recordFractions = record;
911 }
912
918 bool RecordsFractions() const {
919 return _recordFractions;
920 }
921
928 [[nodiscard]] bool IsValid() const;
929
936 void Validate() const;
937
938 protected:
944 bool SetParameterValueInSelectedStructure(const string& component, const string& name, float value);
945
952 Parameter* FindParameterInSelectedStructure(const string& component, const string& name);
953
954 bool _logAll;
955 bool _recordFractions;
956 vector<ModelStructure> _modelStructures;
957 SolverSettings _solver;
958 TimerSettings _timer;
959 ModelStructure* _selectedStructure; // non-owning reference
960 BrickSettings* _selectedBrick; // non-owning reference
961 ProcessSettings* _selectedProcess; // non-owning reference
962 SplitterSettings* _selectedSplitter; // non-owning reference
963 // Spatial parameter bindings: (component, name) -> hydro-unit property name.
964 std::map<std::pair<string, string>, string> _spatialParameterBindings;
965 std::map<std::pair<string, string>, vecStr> _spatialMonthlyParameterBindings;
966
967 bool LogAll(const YAML::Node& settings);
968};
969
970#endif // HYDROBRICKS_SETTINGS_MODEL_H
Definition Parameter.h:7
Definition SettingsModel.h:74
void AddLoggingToItems(std::initializer_list< const string > items)
Definition SettingsModel.cpp:451
void AddHydroUnitBrick(const string &name, const std::string &type="storage")
Definition SettingsModel.cpp:45
void AddSnowpackSublimation(const string &sublimationProcess)
Definition SettingsModel.cpp:601
void AddSplitterParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:333
void AddSubBasinSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:322
void AddSplitterForcing(const string &name)
Definition SettingsModel.cpp:363
int GetHydroUnitSplitterCount() const
Definition SettingsModel.h:704
void AddSnowIceTransformation(const string &transformationProcess="transform:snow_ice_swat")
Definition SettingsModel.cpp:556
int GetHydroUnitBrickCount() const
Definition SettingsModel.h:664
bool SetParameterValue(const string &component, const string &name, float value)
Definition SettingsModel.cpp:943
void SetProcessOutputsAsStatic()
Definition SettingsModel.cpp:293
vector< Parameter * > GetParametersWithModifier()
Definition SettingsModel.cpp:1186
const vecInt & GetLandCoverBricksIndices() const
Definition SettingsModel.h:793
void SetSplitterParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:344
void AddProcessOutput(const string &target, ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:270
const std::map< std::pair< string, string >, vecStr > & GetSpatialMonthlyParameterBindings() const
Definition SettingsModel.h:646
bool SetParameterValueInSelectedStructure(const string &component, const string &name, float value)
Definition SettingsModel.cpp:988
Parameter * FindParameterInSelectedStructure(const string &component, const string &name)
Definition SettingsModel.cpp:1054
const SplitterSettings & GetHydroUnitSplitterSettings(int index) const
Definition SettingsModel.h:840
void AddBrickForcing(const string &name)
Definition SettingsModel.cpp:154
void AddHydroUnitSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:311
void AddSplitterLogging(const string &itemName)
Definition SettingsModel.cpp:491
int GetSurfaceComponentBrickCount() const
Definition SettingsModel.h:684
void AddProcessParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:209
void SetLogAll(bool logAll=true)
Definition SettingsModel.h:882
bool BrickHasParameter(const string &name)
Definition SettingsModel.cpp:143
void SelectSubBasinSplitter(int index)
Definition SettingsModel.cpp:786
void SetTimer(const string &start, const string &end, int timeStep, const string &timeStepUnit)
Definition SettingsModel.cpp:31
void SelectProcess(int index)
Definition SettingsModel.cpp:747
void SelectProcessWithParameter(const string &name)
Definition SettingsModel.cpp:766
const BrickSettings & GetHydroUnitBrickSettings(int index) const
Definition SettingsModel.h:743
vecStr GetSubBasinGenericLogLabels() const
Definition SettingsModel.cpp:931
void AddBrickParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:109
void SetCurrentBrickComputedDirectly()
Definition SettingsModel.cpp:138
void GenerateCanopyInterception(const string &coverName, const string &throughfallTarget, const string &throughfallProcess="outflow:threshold", const string &interceptionEtProcess="et:open_water")
Definition SettingsModel.cpp:420
bool SelectSubBasinBrickIfFound(const string &name)
Definition SettingsModel.cpp:716
void GenerateSnowpacksWithWaterRetention(const string &snowMeltProcess, const string &outflowProcess, bool rainToSnowpack=false)
Definition SettingsModel.cpp:626
bool SelectStructure(int id)
Definition SettingsModel.cpp:673
void AddSplitterOutput(const string &target, const ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:384
void SelectHydroUnitBrickByName(const string &name)
Definition SettingsModel.cpp:736
void SetSpinupDays(int days)
Definition SettingsModel.cpp:38
void AddSnowpackRefreezing(const string &refreezingProcess="refreeze:degree_day")
Definition SettingsModel.cpp:583
SolverSettings GetSolverSettings() const
Definition SettingsModel.h:724
int GetStructureCount() const
Definition SettingsModel.h:655
int GetProcessCount() const
Definition SettingsModel.h:694
bool SelectHydroUnitSplitterIfFound(const string &name)
Definition SettingsModel.cpp:792
void SetProcessGateBrick(const string &name)
Definition SettingsModel.cpp:279
void AddLandCoverBrick(const string &name, const string &type)
Definition SettingsModel.cpp:85
vecStr GetSelectedStructureLandCoverNames() const
Definition SettingsModel.cpp:882
void SetProcessOutputsAsInstantaneous()
Definition SettingsModel.cpp:285
const std::map< std::pair< string, string >, string > & GetSpatialParameterBindings() const
Definition SettingsModel.h:624
void SetParameterSpatialFromProperty(const string &component, const string &name, const string &property)
Definition SettingsModel.cpp:1143
void AddLoggingToItem(const string &itemName)
Definition SettingsModel.cpp:442
int GetSubBasinBrickCount() const
Definition SettingsModel.h:674
void GenerateSnowpacks(const string &snowMeltProcess)
Definition SettingsModel.cpp:541
vecStr GetSubBasinLogLabels() const
Definition SettingsModel.cpp:893
vecInt GetSurfaceComponentBricksIndices() const
Definition SettingsModel.h:783
void AddSnowRedistribution(const string &redistributionProcess="transport:snow_slide", bool skipGlaciers=false)
Definition SettingsModel.cpp:569
void AddBrickProcess(const string &name, const string &type, const string &target="", bool log=false)
Definition SettingsModel.cpp:171
void SetSolver(const string &solverName)
Definition SettingsModel.cpp:27
void SetBrickParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:119
void ChangeSplitterOutputTarget(const string &currentTarget, const string &newTarget)
Definition SettingsModel.cpp:393
bool RecordsFractions() const
Definition SettingsModel.h:918
void GeneratePrecipitationSplitters(bool withSnow, const string &splitterType="snow_rain:linear")
Definition SettingsModel.cpp:500
bool SetParameterMonthlyValues(const string &component, const string &name, const vecFloat &values)
Definition SettingsModel.cpp:1083
int AddStructure()
Definition SettingsModel.cpp:656
void SetRecordFractions(bool record=true)
Definition SettingsModel.h:909
void AddBrickLogging(const string &itemName)
Definition SettingsModel.cpp:462
const ProcessSettings & GetProcessSettings(int index) const
Definition SettingsModel.h:829
void SetParameterSpatialMonthlyFromProperties(const string &component, const string &name, const vecStr &properties)
Definition SettingsModel.cpp:1162
void SelectHydroUnitBrick(int index)
Definition SettingsModel.cpp:689
bool ChangeSplitterOutputTargetIfFound(const string &currentTarget, const string &newTarget)
Definition SettingsModel.cpp:407
void SetProcessParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:228
TimerSettings GetTimerSettings() const
Definition SettingsModel.h:733
bool SelectSubBasinSplitterIfFound(const string &name)
Definition SettingsModel.cpp:804
vecStr GetHydroUnitLogLabels() const
Definition SettingsModel.cpp:828
void AddProcessLogging(const string &itemName)
Definition SettingsModel.cpp:482
void SelectSubBasinBrick(int index)
Definition SettingsModel.cpp:696
void AddSurfaceComponentBrick(const string &name, const string &type)
Definition SettingsModel.cpp:96
void AddSubBasinBrick(const string &name, const std::string &type="storage")
Definition SettingsModel.cpp:65
const BrickSettings & GetSubBasinBrickSettings(int index) const
Definition SettingsModel.h:818
void SelectHydroUnitSplitter(int index)
Definition SettingsModel.cpp:780
void SetSurfaceComponentParent(const string &name)
Definition SettingsModel.cpp:104
bool LogAll() const
Definition SettingsModel.h:897
const BrickSettings & GetHydroUnitBrickSettings(const string &name) const
Definition SettingsModel.h:754
vecStr GetLandCoverBricksNames() const
Definition SettingsModel.cpp:863
const BrickSettings & GetSurfaceComponentBrickSettings(int index) const
Definition SettingsModel.h:772
void AddProcessForcing(const string &name)
Definition SettingsModel.cpp:247
void OutputProcessToSameBrick()
Definition SettingsModel.cpp:301
bool IsValid() const
Definition SettingsModel.cpp:1239
int GetSubBasinSplitterCount() const
Definition SettingsModel.h:714
void Validate() const
Definition SettingsModel.cpp:1266
const SplitterSettings & GetSubBasinSplitterSettings(int index) const
Definition SettingsModel.h:851
bool SelectHydroUnitBrickIfFound(const string &name)
Definition SettingsModel.cpp:703
Definition SettingsModel.h:52
Definition SettingsModel.h:63
Definition SettingsModel.h:25
Definition SettingsModel.h:32
Definition SettingsModel.h:13
Definition SettingsModel.h:43
Definition SettingsModel.h:17