hydrobricks
Loading...
Searching...
No Matches
Splitter.h
1#ifndef HYDROBRICKS_SPLITTER_H
2#define HYDROBRICKS_SPLITTER_H
3
4#include <memory>
5
6#include "Flux.h"
7#include "Forcing.h"
8#include "Includes.h"
9#include "SettingsModel.h"
10
11class HydroUnit;
12
13class Splitter {
14 public:
15 explicit Splitter();
16
17 virtual ~Splitter() = default;
18
25 static std::unique_ptr<Splitter> Factory(const SplitterSettings& splitterSettings);
26
32 [[nodiscard]] virtual bool IsValid() const = 0;
33
40 virtual void Validate() const;
41
47 virtual void SetParameters(const SplitterSettings& splitterSettings) = 0;
48
56 const float* GetParameterValuePointer(const SplitterSettings& splitterSettings, const string& name);
57
68 const float* GetParameterValuePointerOrUnit(const SplitterSettings& splitterSettings, const string& name);
69
75 virtual void AttachForcing(Forcing*) {
76 throw ShouldNotHappen("Splitter::AttachForcing - Should not be called (virtual)");
77 }
78
85 virtual void SetHydroUnitProperties(HydroUnit* /*unit*/) {}
86
92 void AttachFluxIn(Flux* flux) {
93 assert(flux);
94 _inputs.push_back(flux);
95 }
96
102 void AttachFluxOut(std::unique_ptr<Flux> flux) {
103 assert(flux);
104 _outputs.push_back(std::move(flux));
105 }
106
113 virtual double* GetValuePointer(const string& name) = 0;
114
118 virtual void Compute() = 0;
119
125 const string& GetName() const {
126 return _name;
127 }
128
134 void SetName(const string& name) {
135 _name = name;
136 }
137
138 protected:
139 string _name;
140 vector<Flux*> _inputs; // non-owning: owned by processes
141 std::vector<std::unique_ptr<Flux>> _outputs; // owning
142 const float _unitValue = 1.0f; // fallback for absent optional parameters
143};
144
145#endif // HYDROBRICKS_SPLITTER_H
Definition Flux.h:9
Definition Forcing.h:7
Definition HydroUnit.h:18
Exception for code paths that should never be reached.
Definition Exceptions.h:133
Definition Splitter.h:13
static std::unique_ptr< Splitter > Factory(const SplitterSettings &splitterSettings)
Definition Splitter.cpp:69
virtual void AttachForcing(Forcing *)
Definition Splitter.h:75
virtual void SetHydroUnitProperties(HydroUnit *)
Definition Splitter.h:85
virtual double * GetValuePointer(const string &name)=0
virtual void Compute()=0
virtual void SetParameters(const SplitterSettings &splitterSettings)=0
virtual bool IsValid() const =0
virtual void Validate() const
Definition Splitter.cpp:101
void AttachFluxIn(Flux *flux)
Definition Splitter.h:92
const string & GetName() const
Definition Splitter.h:125
void AttachFluxOut(std::unique_ptr< Flux > flux)
Definition Splitter.h:102
void SetName(const string &name)
Definition Splitter.h:134
const float * GetParameterValuePointerOrUnit(const SplitterSettings &splitterSettings, const string &name)
Definition Splitter.cpp:90
const float * GetParameterValuePointer(const SplitterSettings &splitterSettings, const string &name)
Definition Splitter.cpp:79
Definition SettingsModel.h:39