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;
9
11 public:
12 WaterContainer(Brick* brick);
13
14 virtual ~WaterContainer() = default;
15
21 [[nodiscard]] virtual bool IsValid(bool checkProcesses = true) const;
22
29 virtual void Validate() const;
30
37
43 void AddAmountToDynamicContentChange(double change);
44
50 void AddAmountToStaticContentChange(double change);
51
57 virtual void ApplyConstraints(double timeStep);
58
63
73 double BookIncomingFluxes(bool asStatic = false);
74
81 _inputsBooked = false;
82 }
83
87 void Finalize();
88
92 void Reset();
93
97 void SaveAsInitialState();
98
104 [[nodiscard]] vecDoublePt GetDynamicContentChanges();
105
111 [[nodiscard]] bool HasMaximumCapacity() const noexcept {
112 return _capacity != nullptr;
113 }
114
120 [[nodiscard]] double GetMaximumCapacity() const {
121 assert(_capacity);
122 return *_capacity;
123 }
124
130 void SetMaximumCapacity(const float* value) {
131 if (_infiniteStorage) {
132 throw ModelConfigError("Trying to set the maximum capacity of an infinite storage.");
133 }
134 _capacity = value;
135 }
136
141 _infiniteStorage = true;
142 }
143
154 void SetAllowNegativeContent(bool allow = true) {
155 _allowNegativeContent = allow;
156 }
157
163 [[nodiscard]] bool AllowsNegativeContent() const {
164 return _allowNegativeContent;
165 }
166
172 double GetContentWithChanges() const {
173 if (_infiniteStorage) {
174 return INFINITY;
175 }
176
177 return _content + _contentChangeDynamic + _contentChangeStatic;
178 }
179
186 if (_infiniteStorage) {
187 return INFINITY;
188 }
189
190 return _content + _contentChangeDynamic;
191 }
192
199 if (_infiniteStorage) {
200 return INFINITY;
201 }
202
203 return _content;
204 }
205
212 return &_content;
213 }
214
220 void SetInitialState(double value) {
221 _initialState = value;
222 }
223
229 void UpdateContent(double value) {
230 if (_infiniteStorage) {
231 throw ModelConfigError("Trying to set the content of an infinite storage.");
232 }
233
234 _content = value;
235 }
236
242 [[nodiscard]] double GetTargetFillingRatio() const;
243
249 bool IsNotEmpty() const {
250 double content = GetContentWithChanges();
251 return GreaterThan(content, 0, EPSILON_F) && GreaterThan(content, 0, PRECISION);
252 }
253
259 bool HasOverflow() const {
260 return _overflow != nullptr;
261 }
262
268 void LinkOverflow(Process* overflow) {
269 _overflow = overflow;
270 }
271
277 void AttachFluxIn(Flux* flux) {
278 assert(flux);
279 _inputs.push_back(flux);
280 }
281
288 void AttachFluxInOwned(std::unique_ptr<Flux> flux) {
289 assert(flux);
290 _inputs.push_back(flux.get());
291 _ownedInputFluxes.push_back(std::move(flux));
292 }
293
299 virtual double SumIncomingFluxes() const;
300
311 double SumIncomingChangeRates() const;
312
321 double SumIncomingAmounts() const;
322
328 virtual bool ContentAccessible() const;
329
336 return _parent;
337 }
338
344 [[nodiscard]] bool HasIncomingFluxes() const {
345 return !_inputs.empty();
346 }
347
353 [[nodiscard]] bool IsInfiniteStorage() const {
354 return _infiniteStorage;
355 }
356
362 [[nodiscard]] bool IsEmpty() const {
363 return !IsNotEmpty();
364 }
365
371 [[nodiscard]] bool HasParentBrick() const {
372 return _parent != nullptr;
373 }
374
380 [[nodiscard]] bool HasInitialState() const {
381 return !NearlyZero(_initialState, EPSILON_F);
382 }
383
384 private:
394 void BuildConstraintCache();
395
396 struct OutgoingLink {
397 Flux* flux;
398 Process* process; // non-owning; kept for error reporting
399 bool priority;
400 };
401
402 bool _constraintCacheBuilt; // the flux classification below is filled in
403 std::vector<OutgoingLink> _outgoingFluxes; // outgoing fluxes of this container's processes
404 std::vector<Flux*> _incomingRateFluxes; // incoming fluxes carrying a change rate
405 std::vector<Flux*> _incomingAmountFluxes; // incoming forcing / static fluxes (amounts)
406 std::vector<FluxToBrickInstantaneous*> _incomingInstantFluxes; // incoming instantaneous fluxes
407
408 double _content; // [mm]
409 double _contentChangeDynamic; // [mm]
410 double _contentChangeStatic; // [mm]
411 double _initialState; // [mm]
412 const float* _capacity; // non-owning reference
413 bool _infiniteStorage;
414 bool _allowNegativeContent;
415 bool _inputsBooked; // incoming amounts already in the content changes
416 Brick* _parent; // non-owning reference
417 Process* _overflow; // non-owning reference
418 vector<Flux*> _inputs; // non-owning references
419 std::vector<std::unique_ptr<Flux>> _ownedInputFluxes; // owning: forcing fluxes not owned by processes
420};
421
422#endif // HYDROBRICKS_WATER_CONTAINER_H
Definition Brick.h:22
Definition FluxToBrickInstantaneous.h:9
Definition Flux.h:9
Exception for model configuration or conception errors.
Definition Exceptions.h:88
Definition Process.h:16
Definition WaterContainer.h:10
void SetAsInfiniteStorage()
Definition WaterContainer.h:140
vecDoublePt GetDynamicContentChanges()
Definition WaterContainer.cpp:334
void UpdateContent(double value)
Definition WaterContainer.h:229
bool IsEmpty() const
Definition WaterContainer.h:362
double SumIncomingChangeRates() const
Definition WaterContainer.cpp:295
void Reset()
Definition WaterContainer.cpp:262
double GetTargetFillingRatio() const
Definition WaterContainer.cpp:338
void AddAmountToStaticContentChange(double change)
Definition WaterContainer.cpp:52
double GetContentWithoutChanges() const
Definition WaterContainer.h:198
void SetMaximumCapacity(const float *value)
Definition WaterContainer.h:130
void SubtractAmountFromDynamicContentChange(double change)
Definition WaterContainer.cpp:42
void SetOutgoingRatesToZero()
Definition WaterContainer.cpp:220
double * GetContentPointer()
Definition WaterContainer.h:211
void AddAmountToDynamicContentChange(double change)
Definition WaterContainer.cpp:47
double SumIncomingAmounts() const
Definition WaterContainer.cpp:312
virtual bool IsValid(bool checkProcesses=true) const
Definition WaterContainer.cpp:19
bool HasInitialState() const
Definition WaterContainer.h:380
bool HasMaximumCapacity() const noexcept
Definition WaterContainer.h:111
bool HasParentBrick() const
Definition WaterContainer.h:371
bool HasOverflow() const
Definition WaterContainer.h:259
virtual void Validate() const
Definition WaterContainer.cpp:35
virtual double SumIncomingFluxes() const
Definition WaterContainer.cpp:286
double BookIncomingFluxes(bool asStatic=false)
Definition WaterContainer.cpp:269
void LinkOverflow(Process *overflow)
Definition WaterContainer.h:268
bool HasIncomingFluxes() const
Definition WaterContainer.h:344
void Finalize()
Definition WaterContainer.cpp:239
virtual void ApplyConstraints(double timeStep)
Definition WaterContainer.cpp:84
void AttachFluxIn(Flux *flux)
Definition WaterContainer.h:277
double GetContentWithChanges() const
Definition WaterContainer.h:172
bool IsNotEmpty() const
Definition WaterContainer.h:249
void AttachFluxInOwned(std::unique_ptr< Flux > flux)
Definition WaterContainer.h:288
double GetContentWithDynamicChanges() const
Definition WaterContainer.h:185
bool AllowsNegativeContent() const
Definition WaterContainer.h:163
double GetMaximumCapacity() const
Definition WaterContainer.h:120
void SaveAsInitialState()
Definition WaterContainer.cpp:282
void SetInitialState(double value)
Definition WaterContainer.h:220
void SetAllowNegativeContent(bool allow=true)
Definition WaterContainer.h:154
void ResetInputBooking()
Definition WaterContainer.h:80
Brick * GetParentBrick() const
Definition WaterContainer.h:335
virtual bool ContentAccessible() const
Definition WaterContainer.cpp:330
bool IsInfiniteStorage() const
Definition WaterContainer.h:353