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 int spinupDays = 0;
21};
22
24 string target;
25 ContentType fluxType = ContentType::Water;
26 bool isInstantaneous = false;
27 bool isStatic = false;
28};
29
31 string name;
32 string type;
33 vecStr logItems;
34 vector<Parameter> parameters;
35 vector<VariableType> forcing;
36 vector<OutputSettings> outputs;
37};
38
40 string name;
41 string type;
42 vecStr logItems;
43 vector<Parameter> parameters;
44 vector<VariableType> forcing;
45 vector<OutputSettings> outputs;
46};
47
49 string name;
50 string type;
51 string parent;
52 vecStr logItems;
53 vector<Parameter> parameters;
54 vector<VariableType> forcing;
55 vector<ProcessSettings> processes;
56 bool computedDirectly = false; // if true, the brick is solved explicitly (no ODE solver)
57};
58
60 int id;
61 vecStr logItems;
62 vector<BrickSettings> hydroUnitBricks;
63 vector<BrickSettings> subBasinBricks;
64 vecInt landCoverBricks;
65 vecInt surfaceComponentBricks;
66 vector<SplitterSettings> hydroUnitSplitters;
67 vector<SplitterSettings> subBasinSplitters;
68};
69
71 public:
72 explicit SettingsModel();
73
74 virtual ~SettingsModel();
75
81 void SetSolver(const string& solverName);
82
91 void SetTimer(const string& start, const string& end, int timeStep, const string& timeStepUnit);
92
102 void SetSpinupDays(int days);
103
110 void AddHydroUnitBrick(const string& name, const std::string& type = "storage");
111
118 void AddSubBasinBrick(const string& name, const std::string& type = "storage");
119
126 void AddLandCoverBrick(const string& name, const string& type);
127
134 void AddSurfaceComponentBrick(const string& name, const string& type);
135
141 void SetSurfaceComponentParent(const string& name);
142
150 void AddBrickParameter(const string& name, float value, const std::string& type = "constant");
151
159 void SetBrickParameterValue(const string& name, float value, const std::string& type = "constant");
160
167
174 bool BrickHasParameter(const string& name);
175
181 void AddBrickForcing(const string& name);
182
191 void AddBrickProcess(const string& name, const string& type, const string& target = "", bool log = false);
192
200 void AddProcessParameter(const string& name, float value, const std::string& type = "constant");
201
209 void SetProcessParameterValue(const string& name, float value, const std::string& type = "constant");
210
216 void AddProcessForcing(const string& name);
217
224 void AddProcessOutput(const string& target, ContentType fluxType = ContentType::Water);
225
230
235
240
247 void AddHydroUnitSplitter(const string& name, const string& type);
248
255 void AddSubBasinSplitter(const string& name, const string& type);
256
264 void AddSplitterParameter(const string& name, float value, const std::string& type = "constant");
265
273 void SetSplitterParameterValue(const string& name, float value, const std::string& type = "constant");
274
280 void AddSplitterForcing(const string& name);
281
288 void AddSplitterOutput(const string& target, const ContentType fluxType = ContentType::Water);
289
296 void ChangeSplitterOutputTarget(const string& currentTarget, const string& newTarget);
297
306 bool ChangeSplitterOutputTargetIfFound(const string& currentTarget, const string& newTarget);
307
318 void GenerateCanopyInterception(const string& coverName, const string& throughfallTarget);
319
325 void AddLoggingToItem(const string& itemName);
326
332 void AddLoggingToItems(std::initializer_list<const string> items);
333
339 void AddBrickLogging(const string& itemName);
340
346 void AddBrickLogging(std::initializer_list<const string> items);
347
353 void AddProcessLogging(const string& itemName);
354
360 void AddSplitterLogging(const string& itemName);
361
368 void GeneratePrecipitationSplitters(bool withSnow, const string& splitterType = "snow_rain:linear");
369
375 void GenerateSnowpacks(const string& snowMeltProcess);
376
383 void AddSnowIceTransformation(const string& transformationProcess = "transform:snow_ice_swat");
384
391 void AddSnowRedistribution(const string& redistributionProcess = "transport:snow_slide", bool skipGlaciers = false);
392
403 void GenerateSnowpacksWithWaterRetention(const string& snowMeltProcess, const string& outflowProcess,
404 bool rainToSnowpack = false);
405
412 void AddSnowpackRefreezing(const string& refreezingProcess = "refreeze:degree_day");
413
419 void AddSnowpackSublimation(const string& sublimationProcess);
420
428 int AddStructure();
429
436 bool SelectStructure(int id);
437
443 void SelectHydroUnitBrick(int index);
444
450 void SelectSubBasinBrick(int index);
451
458 bool SelectHydroUnitBrickIfFound(const string& name);
459
466 bool SelectSubBasinBrickIfFound(const string& name);
467
473 void SelectHydroUnitBrick(const string& name);
474
481 void SelectHydroUnitBrickByName(const string& name);
482
488 void SelectSubBasinBrick(const string& name);
489
495 void SelectProcess(int index);
496
502 void SelectProcess(const string& name);
503
509 void SelectProcessWithParameter(const string& name);
510
516 void SelectHydroUnitSplitter(int index);
517
523 void SelectSubBasinSplitter(int index);
524
531 bool SelectHydroUnitSplitterIfFound(const string& name);
532
539 bool SelectSubBasinSplitterIfFound(const string& name);
540
546 void SelectHydroUnitSplitter(const string& name);
547
553 void SelectSubBasinSplitter(const string& name);
554
563 bool SetParameterValue(const string& component, const string& name, float value);
564
570 int GetStructureCount() const {
571 return static_cast<int>(_modelStructures.size());
572 }
573
580 assert(_selectedStructure);
581 return static_cast<int>(_selectedStructure->hydroUnitBricks.size());
582 }
583
590 assert(_selectedStructure);
591 return static_cast<int>(_selectedStructure->subBasinBricks.size());
592 }
593
600 assert(_selectedStructure);
601 return static_cast<int>(_selectedStructure->surfaceComponentBricks.size());
602 }
603
609 int GetProcessCount() const {
610 assert(_selectedBrick);
611 return static_cast<int>(_selectedBrick->processes.size());
612 }
613
620 assert(_selectedStructure);
621 return static_cast<int>(_selectedStructure->hydroUnitSplitters.size());
622 }
623
630 assert(_selectedStructure);
631 return static_cast<int>(_selectedStructure->subBasinSplitters.size());
632 }
633
640 return _solver;
641 }
642
649 return _timer;
650 }
651
658 const BrickSettings& GetHydroUnitBrickSettings(int index) const {
659 assert(_selectedStructure);
660 return _selectedStructure->hydroUnitBricks[index];
661 }
662
669 const BrickSettings& GetHydroUnitBrickSettings(const string& name) const {
670 assert(_selectedStructure);
671
672 for (const auto& brick : _selectedStructure->hydroUnitBricks) {
673 if (brick.name == name) {
674 return brick;
675 }
676 }
677
678 throw std::runtime_error("Brick not found.");
679 }
680
688 assert(_selectedStructure);
689 int brickIndex = _selectedStructure->surfaceComponentBricks[index];
690 return _selectedStructure->hydroUnitBricks[brickIndex];
691 }
692
699 assert(_selectedStructure);
700 return _selectedStructure->surfaceComponentBricks;
701 }
702
708 const vecInt& GetLandCoverBricksIndices() const {
709 assert(_selectedStructure);
710 return _selectedStructure->landCoverBricks;
711 }
712
718 vecStr GetLandCoverBricksNames() const;
719
726
733 const BrickSettings& GetSubBasinBrickSettings(int index) const {
734 assert(_selectedStructure);
735 return _selectedStructure->subBasinBricks[index];
736 }
737
744 const ProcessSettings& GetProcessSettings(int index) const {
745 assert(_selectedBrick);
746 return _selectedBrick->processes[index];
747 }
748
756 assert(_selectedStructure);
757 return _selectedStructure->hydroUnitSplitters[index];
758 }
759
767 assert(_selectedStructure);
768 return _selectedStructure->subBasinSplitters[index];
769 }
770
776 vecStr GetSubBasinLogLabels() const;
777
783 vecStr GetSubBasinGenericLogLabels() const;
784
790 vecStr GetHydroUnitLogLabels() const;
791
797 void SetLogAll(bool logAll = true) {
798 if (logAll) {
799 LogDebug("Logging all components.");
800 _recordFractions = true;
801 } else {
802 LogDebug("Minimal logging.");
803 }
804 _logAll = logAll;
805 }
806
812 bool LogAll() const {
813 return _logAll;
814 }
815
824 void SetRecordFractions(bool record = true) {
825 _recordFractions = record;
826 }
827
833 bool RecordsFractions() const {
834 return _recordFractions;
835 }
836
843 [[nodiscard]] bool IsValid() const;
844
851 void Validate() const;
852
853 protected:
859 bool SetParameterValueInSelectedStructure(const string& component, const string& name, float value);
860
861 bool _logAll;
862 bool _recordFractions;
863 vector<ModelStructure> _modelStructures;
864 SolverSettings _solver;
865 TimerSettings _timer;
866 ModelStructure* _selectedStructure; // non-owning reference
867 BrickSettings* _selectedBrick; // non-owning reference
868 ProcessSettings* _selectedProcess; // non-owning reference
869 SplitterSettings* _selectedSplitter; // non-owning reference
870
871 bool LogAll(const YAML::Node& settings);
872};
873
874#endif // HYDROBRICKS_SETTINGS_MODEL_H
Definition SettingsModel.h:70
void AddLoggingToItems(std::initializer_list< const string > items)
Definition SettingsModel.cpp:442
void AddHydroUnitBrick(const string &name, const std::string &type="storage")
Definition SettingsModel.cpp:45
void AddSnowpackSublimation(const string &sublimationProcess)
Definition SettingsModel.cpp:592
void AddSplitterParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:327
void AddSubBasinSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:316
void AddSplitterForcing(const string &name)
Definition SettingsModel.cpp:357
int GetHydroUnitSplitterCount() const
Definition SettingsModel.h:619
void GenerateCanopyInterception(const string &coverName, const string &throughfallTarget)
Definition SettingsModel.cpp:414
void AddSnowIceTransformation(const string &transformationProcess="transform:snow_ice_swat")
Definition SettingsModel.cpp:547
int GetHydroUnitBrickCount() const
Definition SettingsModel.h:579
bool SetParameterValue(const string &component, const string &name, float value)
Definition SettingsModel.cpp:923
void SetProcessOutputsAsStatic()
Definition SettingsModel.cpp:287
const vecInt & GetLandCoverBricksIndices() const
Definition SettingsModel.h:708
void SetSplitterParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:338
void AddProcessOutput(const string &target, ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:270
bool SetParameterValueInSelectedStructure(const string &component, const string &name, float value)
Definition SettingsModel.cpp:968
const SplitterSettings & GetHydroUnitSplitterSettings(int index) const
Definition SettingsModel.h:755
void AddBrickForcing(const string &name)
Definition SettingsModel.cpp:154
void AddHydroUnitSplitter(const string &name, const string &type)
Definition SettingsModel.cpp:305
void AddSplitterLogging(const string &itemName)
Definition SettingsModel.cpp:482
int GetSurfaceComponentBrickCount() const
Definition SettingsModel.h:599
void AddProcessParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:209
void SetLogAll(bool logAll=true)
Definition SettingsModel.h:797
bool BrickHasParameter(const string &name)
Definition SettingsModel.cpp:143
void SelectSubBasinSplitter(int index)
Definition SettingsModel.cpp:766
void SetTimer(const string &start, const string &end, int timeStep, const string &timeStepUnit)
Definition SettingsModel.cpp:31
void SelectProcess(int index)
Definition SettingsModel.cpp:727
void SelectProcessWithParameter(const string &name)
Definition SettingsModel.cpp:746
const BrickSettings & GetHydroUnitBrickSettings(int index) const
Definition SettingsModel.h:658
vecStr GetSubBasinGenericLogLabels() const
Definition SettingsModel.cpp:911
void AddBrickParameter(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:109
void SetCurrentBrickComputedDirectly()
Definition SettingsModel.cpp:138
bool SelectSubBasinBrickIfFound(const string &name)
Definition SettingsModel.cpp:696
void GenerateSnowpacksWithWaterRetention(const string &snowMeltProcess, const string &outflowProcess, bool rainToSnowpack=false)
Definition SettingsModel.cpp:606
bool SelectStructure(int id)
Definition SettingsModel.cpp:653
void AddSplitterOutput(const string &target, const ContentType fluxType=ContentType::Water)
Definition SettingsModel.cpp:378
void SelectHydroUnitBrickByName(const string &name)
Definition SettingsModel.cpp:716
void SetSpinupDays(int days)
Definition SettingsModel.cpp:38
void AddSnowpackRefreezing(const string &refreezingProcess="refreeze:degree_day")
Definition SettingsModel.cpp:574
SolverSettings GetSolverSettings() const
Definition SettingsModel.h:639
int GetStructureCount() const
Definition SettingsModel.h:570
int GetProcessCount() const
Definition SettingsModel.h:609
bool SelectHydroUnitSplitterIfFound(const string &name)
Definition SettingsModel.cpp:772
void AddLandCoverBrick(const string &name, const string &type)
Definition SettingsModel.cpp:85
vecStr GetSelectedStructureLandCoverNames() const
Definition SettingsModel.cpp:862
void SetProcessOutputsAsInstantaneous()
Definition SettingsModel.cpp:279
void AddLoggingToItem(const string &itemName)
Definition SettingsModel.cpp:433
int GetSubBasinBrickCount() const
Definition SettingsModel.h:589
void GenerateSnowpacks(const string &snowMeltProcess)
Definition SettingsModel.cpp:532
vecStr GetSubBasinLogLabels() const
Definition SettingsModel.cpp:873
vecInt GetSurfaceComponentBricksIndices() const
Definition SettingsModel.h:698
void AddSnowRedistribution(const string &redistributionProcess="transport:snow_slide", bool skipGlaciers=false)
Definition SettingsModel.cpp:560
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:387
bool RecordsFractions() const
Definition SettingsModel.h:833
void GeneratePrecipitationSplitters(bool withSnow, const string &splitterType="snow_rain:linear")
Definition SettingsModel.cpp:491
int AddStructure()
Definition SettingsModel.cpp:636
void SetRecordFractions(bool record=true)
Definition SettingsModel.h:824
void AddBrickLogging(const string &itemName)
Definition SettingsModel.cpp:453
const ProcessSettings & GetProcessSettings(int index) const
Definition SettingsModel.h:744
void SelectHydroUnitBrick(int index)
Definition SettingsModel.cpp:669
bool ChangeSplitterOutputTargetIfFound(const string &currentTarget, const string &newTarget)
Definition SettingsModel.cpp:401
void SetProcessParameterValue(const string &name, float value, const std::string &type="constant")
Definition SettingsModel.cpp:228
TimerSettings GetTimerSettings() const
Definition SettingsModel.h:648
bool SelectSubBasinSplitterIfFound(const string &name)
Definition SettingsModel.cpp:784
vecStr GetHydroUnitLogLabels() const
Definition SettingsModel.cpp:808
void AddProcessLogging(const string &itemName)
Definition SettingsModel.cpp:473
void SelectSubBasinBrick(int index)
Definition SettingsModel.cpp:676
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:733
void SelectHydroUnitSplitter(int index)
Definition SettingsModel.cpp:760
void SetSurfaceComponentParent(const string &name)
Definition SettingsModel.cpp:104
bool LogAll() const
Definition SettingsModel.h:812
const BrickSettings & GetHydroUnitBrickSettings(const string &name) const
Definition SettingsModel.h:669
vecStr GetLandCoverBricksNames() const
Definition SettingsModel.cpp:843
const BrickSettings & GetSurfaceComponentBrickSettings(int index) const
Definition SettingsModel.h:687
void AddProcessForcing(const string &name)
Definition SettingsModel.cpp:247
void OutputProcessToSameBrick()
Definition SettingsModel.cpp:295
bool IsValid() const
Definition SettingsModel.cpp:1047
int GetSubBasinSplitterCount() const
Definition SettingsModel.h:629
void Validate() const
Definition SettingsModel.cpp:1074
const SplitterSettings & GetSubBasinSplitterSettings(int index) const
Definition SettingsModel.h:766
bool SelectHydroUnitBrickIfFound(const string &name)
Definition SettingsModel.cpp:683
Definition SettingsModel.h:48
Definition SettingsModel.h:59
Definition SettingsModel.h:23
Definition SettingsModel.h:30
Definition SettingsModel.h:11
Definition SettingsModel.h:39
Definition SettingsModel.h:15