hydrobricks
Loading...
Searching...
No Matches
WaterContainer.h
1#ifndef HYDROBRICKS_WATER_CONTAINER_H
2#define HYDROBRICKS_WATER_CONTAINER_H
3
4#include "Includes.h"
5#include "Process.h"
6
7class Brick;
8
10 public:
11 WaterContainer(Brick* brick);
12
13 virtual ~WaterContainer() = default;
14
20 [[nodiscard]] virtual bool IsValid(bool checkProcesses = true) const;
21
28 virtual void Validate() const;
29
36
42 void AddAmountToDynamicContentChange(double change);
43
49 void AddAmountToStaticContentChange(double change);
50
56 virtual void ApplyConstraints(double timeStep);
57
62
66 void Finalize();
67
71 void Reset();
72
76 void SaveAsInitialState();
77
83 [[nodiscard]] vecDoublePt GetDynamicContentChanges();
84
90 [[nodiscard]] bool HasMaximumCapacity() const noexcept {
91 return _capacity != nullptr;
92 }
93
99 [[nodiscard]] double GetMaximumCapacity() const {
100 assert(_capacity);
101 return *_capacity;
102 }
103
109 void SetMaximumCapacity(const float* value) {
110 if (_infiniteStorage) {
111 throw ModelConfigError("Trying to set the maximum capacity of an infinite storage.");
112 }
113 _capacity = value;
114 }
115
120 _infiniteStorage = true;
121 }
122
133 void SetAllowNegativeContent(bool allow = true) {
134 _allowNegativeContent = allow;
135 }
136
142 [[nodiscard]] bool AllowsNegativeContent() const {
143 return _allowNegativeContent;
144 }
145
151 double GetContentWithChanges() const {
152 if (_infiniteStorage) {
153 return INFINITY;
154 }
155
156 return _content + _contentChangeDynamic + _contentChangeStatic;
157 }
158
165 if (_infiniteStorage) {
166 return INFINITY;
167 }
168
169 return _content + _contentChangeDynamic;
170 }
171
178 if (_infiniteStorage) {
179 return INFINITY;
180 }
181
182 return _content;
183 }
184
191 return &_content;
192 }
193
199 void SetInitialState(double value) {
200 _initialState = value;
201 }
202
208 void UpdateContent(double value) {
209 if (_infiniteStorage) {
210 throw ModelConfigError("Trying to set the content of an infinite storage.");
211 }
212
213 _content = value;
214 }
215
221 [[nodiscard]] double GetTargetFillingRatio() const;
222
228 bool IsNotEmpty() const {
229 double content = GetContentWithChanges();
230 return GreaterThan(content, 0, EPSILON_F) && GreaterThan(content, 0, PRECISION);
231 }
232
238 bool HasOverflow() const {
239 return _overflow != nullptr;
240 }
241
247 void LinkOverflow(Process* overflow) {
248 _overflow = overflow;
249 }
250
256 void AttachFluxIn(Flux* flux) {
257 assert(flux);
258 _inputs.push_back(flux);
259 }
260
267 void AttachFluxInOwned(std::unique_ptr<Flux> flux) {
268 assert(flux);
269 _inputs.push_back(flux.get());
270 _ownedInputFluxes.push_back(std::move(flux));
271 }
272
278 virtual double SumIncomingFluxes() const;
279
283 virtual bool ContentAccessible() const;
284
291 return _parent;
292 }
293
299 [[nodiscard]] bool HasIncomingFluxes() const {
300 return !_inputs.empty();
301 }
302
308 [[nodiscard]] bool IsInfiniteStorage() const {
309 return _infiniteStorage;
310 }
311
317 [[nodiscard]] bool IsEmpty() const {
318 return !IsNotEmpty();
319 }
320
326 [[nodiscard]] bool HasParentBrick() const {
327 return _parent != nullptr;
328 }
329
335 [[nodiscard]] bool HasInitialState() const {
336 return !NearlyZero(_initialState, EPSILON_F);
337 }
338
339 private:
340 double _content; // [mm]
341 double _contentChangeDynamic; // [mm]
342 double _contentChangeStatic; // [mm]
343 double _initialState; // [mm]
344 const float* _capacity; // non-owning reference
345 bool _infiniteStorage;
346 bool _allowNegativeContent;
347 Brick* _parent; // non-owning reference
348 Process* _overflow; // non-owning reference
349 vector<Flux*> _inputs; // non-owning references
350 std::vector<std::unique_ptr<Flux>> _ownedInputFluxes; // owning: forcing fluxes not owned by processes
351};
352
353#endif // HYDROBRICKS_WATER_CONTAINER_H
Definition Brick.h:24
Definition Flux.h:9
Exception for model configuration or conception errors.
Definition Exceptions.h:88
Definition Process.h:16
Definition WaterContainer.h:9
void SetAsInfiniteStorage()
Definition WaterContainer.h:119
vecDoublePt GetDynamicContentChanges()
Definition WaterContainer.cpp:228
void UpdateContent(double value)
Definition WaterContainer.h:208
bool IsEmpty() const
Definition WaterContainer.h:317
void Reset()
Definition WaterContainer.cpp:205
double GetTargetFillingRatio() const
Definition WaterContainer.cpp:232
void AddAmountToStaticContentChange(double change)
Definition WaterContainer.cpp:50
double GetContentWithoutChanges() const
Definition WaterContainer.h:177
void SetMaximumCapacity(const float *value)
Definition WaterContainer.h:109
void SubtractAmountFromDynamicContentChange(double change)
Definition WaterContainer.cpp:40
void SetOutgoingRatesToZero()
Definition WaterContainer.cpp:171
double * GetContentPointer()
Definition WaterContainer.h:190
void AddAmountToDynamicContentChange(double change)
Definition WaterContainer.cpp:45
virtual bool IsValid(bool checkProcesses=true) const
Definition WaterContainer.cpp:17
bool HasInitialState() const
Definition WaterContainer.h:335
bool HasMaximumCapacity() const noexcept
Definition WaterContainer.h:90
bool HasParentBrick() const
Definition WaterContainer.h:326
bool HasOverflow() const
Definition WaterContainer.h:238
virtual void Validate() const
Definition WaterContainer.cpp:33
virtual double SumIncomingFluxes() const
Definition WaterContainer.cpp:215
void LinkOverflow(Process *overflow)
Definition WaterContainer.h:247
bool HasIncomingFluxes() const
Definition WaterContainer.h:299
void Finalize()
Definition WaterContainer.cpp:190
virtual void ApplyConstraints(double timeStep)
Definition WaterContainer.cpp:55
void AttachFluxIn(Flux *flux)
Definition WaterContainer.h:256
double GetContentWithChanges() const
Definition WaterContainer.h:151
bool IsNotEmpty() const
Definition WaterContainer.h:228
void AttachFluxInOwned(std::unique_ptr< Flux > flux)
Definition WaterContainer.h:267
double GetContentWithDynamicChanges() const
Definition WaterContainer.h:164
bool AllowsNegativeContent() const
Definition WaterContainer.h:142
double GetMaximumCapacity() const
Definition WaterContainer.h:99
void SaveAsInitialState()
Definition WaterContainer.cpp:211
void SetInitialState(double value)
Definition WaterContainer.h:199
void SetAllowNegativeContent(bool allow=true)
Definition WaterContainer.h:133
Brick * GetParentBrick() const
Definition WaterContainer.h:290
virtual bool ContentAccessible() const
Definition WaterContainer.cpp:224
bool IsInfiniteStorage() const
Definition WaterContainer.h:308