hydrobricks
Loading...
Searching...
No Matches
Process.h
1#ifndef HYDROBRICKS_PROCESS_H
2#define HYDROBRICKS_PROCESS_H
3
4#include <memory>
5
6#include "Flux.h"
7#include "Forcing.h"
8#include "Includes.h"
9#include "SettingsModel.h"
10
11class Brick;
12class HydroUnit;
13class TimeMachine;
14class WaterContainer;
15
16class Process {
17 public:
18 explicit Process(WaterContainer* container);
19
20 virtual ~Process() = default;
21
29 static std::unique_ptr<Process> Factory(const ProcessSettings& processSettings, Brick* brick);
30
38 [[nodiscard]] static bool RegisterSettings(SettingsModel* modelSettings, const string& processType);
39
43 virtual void Reset();
44
50 [[nodiscard]] virtual bool IsValid() const = 0;
51
58 virtual void Validate() const;
59
67 [[nodiscard]] static bool HasParameter(const ProcessSettings& processSettings, std::string_view name);
68
78 const float* GetParameterValuePointer(const ProcessSettings& processSettings, std::string_view name);
79
88 void SetParentContext(HydroUnit* unit, Brick* brick);
89
96 virtual void SetHydroUnitProperties(HydroUnit* unit, Brick* brick);
97
103 virtual void SetParameters(const ProcessSettings& processSettings);
104
110 virtual void AttachForcing(Forcing*) {
111 throw ShouldNotHappen("Process::AttachForcing - Should not be called (virtual)");
112 }
113
119 void AttachFluxOut(std::unique_ptr<Flux> flux) {
120 assert(flux);
121 _outputs.push_back(std::move(flux));
122 }
123
129 int GetOutputFluxCount() const {
130 return static_cast<int>(_outputs.size());
131 }
132
139 Flux* GetOutputFlux(size_t index) const {
140 assert(_outputs.size() > index);
141 assert(_outputs[index]);
142 return _outputs[index].get();
143 }
144
150 [[nodiscard]] virtual bool ToAtmosphere() const {
151 return false;
152 }
153
163 [[nodiscard]] virtual bool RequiresDailyTimeStep() const {
164 return false;
165 }
166
172 [[nodiscard]] virtual bool NeedsTargetBrickLinking() const {
173 return false;
174 }
175
183 [[nodiscard]] virtual bool NeedsGateBrickLinking() const {
184 return false;
185 }
186
195 [[nodiscard]] virtual bool HasConstraintPriority() const {
196 return false;
197 }
198
204 [[nodiscard]] virtual int GetConnectionCount() const = 0;
205
214 [[nodiscard]] virtual const vecDouble& GetChangeRates();
215
222 virtual void StoreInOutgoingFlux(double* rate, int index);
223
231 void ApplyChange(int connectionIndex, double rate, double timeStepInDays);
232
236 virtual void Finalize() {
237 // Nothing to do here.
238 }
239
245 virtual vecDoublePt GetStateVariables() {
246 return vecDoublePt{};
247 }
248
255 [[nodiscard]] virtual double* GetValuePointer(std::string_view name);
256
262 const string& GetName() const {
263 return _name;
264 }
265
271 void SetName(const string& name) {
272 _name = name;
273 }
274
281 void SetTimeMachine(TimeMachine* timeMachine) {
282 _timeMachine = timeMachine;
283 }
284
291 return _container;
292 }
293
299 virtual void SetTargetBrick(Brick*) {
300 throw ShouldNotHappen("Process::SetTargetBrick - Should not be called (virtual)");
301 }
302
309 virtual void AddGateBrick(Brick*) {
310 throw ShouldNotHappen("Process::AddGateBrick - Should not be called (virtual)");
311 }
312
318 [[nodiscard]] virtual bool LinksMultipleTargets() const {
319 return false;
320 }
321
329 virtual void AddTargetBrickWithWeights(Brick*, const std::vector<Brick*>&) {
330 throw ShouldNotHappen("Process::AddTargetBrickWithWeights - Should not be called (virtual)");
331 }
332
338 [[nodiscard]] virtual bool IsLateralProcess() const noexcept {
339 return false;
340 }
341
349 [[nodiscard]] virtual bool HasLinearResponse() const {
350 return false;
351 }
352
359 [[nodiscard]] virtual double GetLinearResponseRate() const {
360 throw ShouldNotHappen("Process::GetLinearResponseRate - Should not be called (virtual)");
361 }
362
371 [[nodiscard]] virtual double GetLinearResponseOffset() const {
372 return 0;
373 }
374
380 [[nodiscard]] bool HasOutputFluxes() const noexcept {
381 return !_outputs.empty();
382 }
383
389 [[nodiscard]] bool HasWaterContainer() const noexcept {
390 return _container != nullptr;
391 }
392
393 protected:
408 [[nodiscard]] double GetForcingRate(Forcing* forcing) const;
409
419 [[nodiscard]] double GetTimeStepInDays() const;
420
429 [[nodiscard]] int GetCurrentDayOfYear() const;
430
431 string _name;
432 WaterContainer* _container; // non-owning reference
433 TimeMachine* _timeMachine{nullptr}; // non-owning reference
434 HydroUnit* _hydroUnit{nullptr}; // non-owning back-reference (for per-unit overrides)
435 string _parentBrickName; // name of the brick owning this process
436 std::vector<std::unique_ptr<Flux>> _outputs; // owning
437 vecDouble _changeRates; // reusable buffer for the change rates (avoids per-call allocation)
438
448 const vecDouble& StoreRates(std::initializer_list<double> rates) {
449 _changeRates.assign(rates);
450 return _changeRates;
451 }
452
458 [[nodiscard]] double GetSumChangeRatesOtherProcesses() const;
459
469 [[nodiscard]] virtual const vecDouble& GetRates() = 0;
470};
471
472#endif // HYDROBRICKS_PROCESS_H
Definition Brick.h:22
Definition Flux.h:9
Definition Forcing.h:7
Definition HydroUnit.h:18
Definition Process.h:16
virtual bool NeedsGateBrickLinking() const
Definition Process.h:183
virtual void Finalize()
Definition Process.h:236
bool HasWaterContainer() const noexcept
Definition Process.h:389
const vecDouble & StoreRates(std::initializer_list< double > rates)
Definition Process.h:448
static std::unique_ptr< Process > Factory(const ProcessSettings &processSettings, Brick *brick)
Definition Process.cpp:542
virtual void SetHydroUnitProperties(HydroUnit *unit, Brick *brick)
Definition Process.cpp:576
void SetName(const string &name)
Definition Process.h:271
WaterContainer * GetWaterContainer() const
Definition Process.h:290
virtual double GetLinearResponseRate() const
Definition Process.h:359
virtual bool RequiresDailyTimeStep() const
Definition Process.h:163
virtual void AttachForcing(Forcing *)
Definition Process.h:110
const string & GetName() const
Definition Process.h:262
void AttachFluxOut(std::unique_ptr< Flux > flux)
Definition Process.h:119
virtual bool ToAtmosphere() const
Definition Process.h:150
virtual double GetLinearResponseOffset() const
Definition Process.h:371
virtual bool HasLinearResponse() const
Definition Process.h:349
double GetForcingRate(Forcing *forcing) const
Definition Process.cpp:673
virtual double * GetValuePointer(std::string_view name)
Definition Process.cpp:644
virtual void Validate() const
Definition Process.cpp:667
virtual bool IsLateralProcess() const noexcept
Definition Process.h:338
virtual void SetParameters(const ProcessSettings &processSettings)
Definition Process.cpp:580
int GetCurrentDayOfYear() const
Definition Process.cpp:696
double GetSumChangeRatesOtherProcesses() const
Definition Process.cpp:648
virtual bool NeedsTargetBrickLinking() const
Definition Process.h:172
void ApplyChange(int connectionIndex, double rate, double timeStepInDays)
Definition Process.cpp:629
double GetTimeStepInDays() const
Definition Process.cpp:687
virtual bool HasConstraintPriority() const
Definition Process.h:195
virtual vecDoublePt GetStateVariables()
Definition Process.h:245
static bool RegisterSettings(SettingsModel *modelSettings, const string &processType)
Definition Process.cpp:552
virtual void StoreInOutgoingFlux(double *rate, int index)
Definition Process.cpp:623
virtual int GetConnectionCount() const =0
virtual bool IsValid() const =0
static bool HasParameter(const ProcessSettings &processSettings, std::string_view name)
Definition Process.cpp:584
virtual void AddTargetBrickWithWeights(Brick *, const std::vector< Brick * > &)
Definition Process.h:329
virtual bool LinksMultipleTargets() const
Definition Process.h:318
virtual void AddGateBrick(Brick *)
Definition Process.h:309
int GetOutputFluxCount() const
Definition Process.h:129
void SetTimeMachine(TimeMachine *timeMachine)
Definition Process.h:281
virtual const vecDouble & GetRates()=0
virtual const vecDouble & GetChangeRates()
Definition Process.cpp:614
Flux * GetOutputFlux(size_t index) const
Definition Process.h:139
virtual void Reset()
Definition Process.cpp:563
bool HasOutputFluxes() const noexcept
Definition Process.h:380
virtual void SetTargetBrick(Brick *)
Definition Process.h:299
const float * GetParameterValuePointer(const ProcessSettings &processSettings, std::string_view name)
Definition Process.cpp:594
void SetParentContext(HydroUnit *unit, Brick *brick)
Definition Process.cpp:569
Definition SettingsModel.h:74
Exception for code paths that should never be reached.
Definition Exceptions.h:133
Definition TimeMachine.h:9
Definition WaterContainer.h:10
Definition SettingsModel.h:32