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
9class WaterContainer : public wxObject {
10 public:
11 WaterContainer(Brick* brick);
12
13 ~WaterContainer() override = default;
14
20 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 vecDoublePt GetDynamicContentChanges();
84
90 [[nodiscard]] bool HasMaximumCapacity() const {
91 return _capacity != nullptr;
92 }
93
99 double GetMaximumCapacity() const {
100 wxASSERT(_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
128 double GetContentWithChanges() const {
129 if (_infiniteStorage) {
130 return INFINITY;
131 }
132
133 return _content + _contentChangeDynamic + _contentChangeStatic;
134 }
135
142 if (_infiniteStorage) {
143 return INFINITY;
144 }
145
146 return _content + _contentChangeDynamic;
147 }
148
155 if (_infiniteStorage) {
156 return INFINITY;
157 }
158
159 return _content;
160 }
161
168 return &_content;
169 }
170
176 void SetInitialState(double value) {
177 _initialState = value;
178 }
179
185 void UpdateContent(double value) {
186 if (_infiniteStorage) {
187 throw ModelConfigError(_("Trying to set the content of an infinite storage."));
188 }
189
190 _content = value;
191 }
192
198 double GetTargetFillingRatio() const;
199
205 bool IsNotEmpty() const {
206 double content = GetContentWithChanges();
207 return GreaterThan(content, 0, EPSILON_F) && GreaterThan(content, 0, PRECISION);
208 }
209
215 bool HasOverflow() const {
216 return _overflow != nullptr;
217 }
218
224 void LinkOverflow(Process* overflow) {
225 _overflow = overflow;
226 }
227
233 void AttachFluxIn(Flux* flux) {
234 wxASSERT(flux);
235 _inputs.push_back(flux);
236 }
237
243 virtual double SumIncomingFluxes() const;
244
248 virtual bool ContentAccessible() const;
249
256 return _parent;
257 }
258
264 [[nodiscard]] bool HasIncomingFluxes() const {
265 return !_inputs.empty();
266 }
267
273 [[nodiscard]] bool IsInfiniteStorage() const {
274 return _infiniteStorage;
275 }
276
282 [[nodiscard]] bool IsEmpty() const {
283 return !IsNotEmpty();
284 }
285
291 [[nodiscard]] bool HasParentBrick() const {
292 return _parent != nullptr;
293 }
294
300 [[nodiscard]] bool HasInitialState() const {
301 return !NearlyZero(_initialState, EPSILON_F);
302 }
303
304 private:
305 double _content; // [mm]
306 double _contentChangeDynamic; // [mm]
307 double _contentChangeStatic; // [mm]
308 double _initialState; // [mm]
309 const float* _capacity; // non-owning reference
310 bool _infiniteStorage;
311 Brick* _parent; // non-owning reference
312 Process* _overflow; // non-owning reference
313 vector<Flux*> _inputs; // non-owning references to fluxes owned by processes
314};
315
316#endif // HYDROBRICKS_WATER_CONTAINER_H
Definition Brick.h:24
Definition Flux.h:9
Exception for model configuration or conception errors.
Definition Exceptions.h:96
Definition Process.h:15
Definition WaterContainer.h:9
void SetAsInfiniteStorage()
Definition WaterContainer.h:119
vecDoublePt GetDynamicContentChanges()
Definition WaterContainer.cpp:223
void UpdateContent(double value)
Definition WaterContainer.h:185
bool IsEmpty() const
Definition WaterContainer.h:282
void Reset()
Definition WaterContainer.cpp:200
double GetTargetFillingRatio() const
Definition WaterContainer.cpp:227
void AddAmountToStaticContentChange(double change)
Definition WaterContainer.cpp:49
double GetContentWithoutChanges() const
Definition WaterContainer.h:154
void SetMaximumCapacity(const float *value)
Definition WaterContainer.h:109
void SubtractAmountFromDynamicContentChange(double change)
Definition WaterContainer.cpp:39
void SetOutgoingRatesToZero()
Definition WaterContainer.cpp:169
double * GetContentPointer()
Definition WaterContainer.h:167
void AddAmountToDynamicContentChange(double change)
Definition WaterContainer.cpp:44
virtual bool IsValid(bool checkProcesses=true) const
Definition WaterContainer.cpp:16
bool HasMaximumCapacity() const
Definition WaterContainer.h:90
bool HasInitialState() const
Definition WaterContainer.h:300
bool HasParentBrick() const
Definition WaterContainer.h:291
bool HasOverflow() const
Definition WaterContainer.h:215
virtual void Validate() const
Definition WaterContainer.cpp:32
virtual double SumIncomingFluxes() const
Definition WaterContainer.cpp:210
void LinkOverflow(Process *overflow)
Definition WaterContainer.h:224
bool HasIncomingFluxes() const
Definition WaterContainer.h:264
void Finalize()
Definition WaterContainer.cpp:188
virtual void ApplyConstraints(double timeStep)
Definition WaterContainer.cpp:54
void AttachFluxIn(Flux *flux)
Definition WaterContainer.h:233
double GetContentWithChanges() const
Definition WaterContainer.h:128
bool IsNotEmpty() const
Definition WaterContainer.h:205
double GetContentWithDynamicChanges() const
Definition WaterContainer.h:141
double GetMaximumCapacity() const
Definition WaterContainer.h:99
void SaveAsInitialState()
Definition WaterContainer.cpp:206
void SetInitialState(double value)
Definition WaterContainer.h:176
Brick * GetParentBrick() const
Definition WaterContainer.h:255
virtual bool ContentAccessible() const
Definition WaterContainer.cpp:219
bool IsInfiniteStorage() const
Definition WaterContainer.h:273