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
122 [[nodiscard]] double GetMaximumCapacity() const {
123 assert(_capacity);
124 if (_areaFraction != nullptr) {
125 return *_capacity * *_areaFraction;
126 }
127 return *_capacity;
128 }
129
136 [[nodiscard]] double GetAreaFraction() const {
137 return _areaFraction != nullptr ? *_areaFraction : 1.0;
138 }
139
149 void SetAreaFraction(const double* areaFraction) {
150 _areaFraction = areaFraction;
151 }
152
158 void SetMaximumCapacity(const float* value) {
159 if (_infiniteStorage) {
160 throw ModelConfigError("Trying to set the maximum capacity of an infinite storage.");
161 }
162 _capacity = value;
163 }
164
169 _infiniteStorage = true;
170 }
171
182 void SetAllowNegativeContent(bool allow = true) {
183 _allowNegativeContent = allow;
184 }
185
191 [[nodiscard]] bool AllowsNegativeContent() const {
192 return _allowNegativeContent;
193 }
194
200 double GetContentWithChanges() const {
201 if (_infiniteStorage) {
202 return INFINITY;
203 }
204
205 return _content + _contentChangeDynamic + _contentChangeStatic;
206 }
207
214 if (_infiniteStorage) {
215 return INFINITY;
216 }
217
218 return _content + _contentChangeDynamic;
219 }
220
227 if (_infiniteStorage) {
228 return INFINITY;
229 }
230
231 return _content;
232 }
233
240 return &_content;
241 }
242
248 void SetInitialState(double value) {
249 _initialState = value;
250 }
251
257 void UpdateContent(double value) {
258 if (_infiniteStorage) {
259 throw ModelConfigError("Trying to set the content of an infinite storage.");
260 }
261
262 _content = value;
263 }
264
270 [[nodiscard]] double GetTargetFillingRatio() const;
271
277 bool IsNotEmpty() const {
278 double content = GetContentWithChanges();
279 return GreaterThan(content, 0, EPSILON_F) && GreaterThan(content, 0, PRECISION);
280 }
281
287 bool HasOverflow() const {
288 return _overflow != nullptr;
289 }
290
296 void LinkOverflow(Process* overflow) {
297 _overflow = overflow;
298 }
299
305 void AttachFluxIn(Flux* flux) {
306 assert(flux);
307 _inputs.push_back(flux);
308 }
309
316 void AttachFluxInOwned(std::unique_ptr<Flux> flux) {
317 assert(flux);
318 _inputs.push_back(flux.get());
319 _ownedInputFluxes.push_back(std::move(flux));
320 }
321
327 virtual double SumIncomingFluxes() const;
328
339 double SumIncomingChangeRates() const;
340
349 double SumIncomingAmounts() const;
350
356 virtual bool ContentAccessible() const;
357
364 return _parent;
365 }
366
372 [[nodiscard]] bool HasIncomingFluxes() const {
373 return !_inputs.empty();
374 }
375
381 [[nodiscard]] bool IsInfiniteStorage() const {
382 return _infiniteStorage;
383 }
384
390 [[nodiscard]] bool IsEmpty() const {
391 return !IsNotEmpty();
392 }
393
399 [[nodiscard]] bool HasParentBrick() const {
400 return _parent != nullptr;
401 }
402
408 [[nodiscard]] bool HasInitialState() const {
409 return !NearlyZero(_initialState, EPSILON_F);
410 }
411
412 private:
422 void BuildConstraintCache();
423
424 struct OutgoingLink {
425 Flux* flux;
426 Process* process; // non-owning; kept for error reporting
427 bool priority;
428 };
429
430 bool _constraintCacheBuilt; // the flux classification below is filled in
431 std::vector<OutgoingLink> _outgoingFluxes; // outgoing fluxes of this container's processes
432 std::vector<Flux*> _incomingRateFluxes; // incoming fluxes carrying a change rate
433 std::vector<Flux*> _incomingAmountFluxes; // incoming forcing / static fluxes (amounts)
434 std::vector<FluxToBrickInstantaneous*> _incomingInstantFluxes; // incoming instantaneous fluxes
435
436 double _content; // [mm]
437 double _contentChangeDynamic; // [mm]
438 double _contentChangeStatic; // [mm]
439 double _initialState; // [mm]
440 const float* _capacity; // non-owning reference
441 const double* _areaFraction; // area fraction of the land cover represented (non-owning)
442 bool _infiniteStorage;
443 bool _allowNegativeContent;
444 bool _inputsBooked; // incoming amounts already in the content changes
445 Brick* _parent; // non-owning reference
446 Process* _overflow; // non-owning reference
447 vector<Flux*> _inputs; // non-owning references
448 std::vector<std::unique_ptr<Flux>> _ownedInputFluxes; // owning: forcing fluxes not owned by processes
449};
450
451#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:168
vecDoublePt GetDynamicContentChanges()
Definition WaterContainer.cpp:352
void UpdateContent(double value)
Definition WaterContainer.h:257
bool IsEmpty() const
Definition WaterContainer.h:390
double SumIncomingChangeRates() const
Definition WaterContainer.cpp:313
void SetAreaFraction(const double *areaFraction)
Definition WaterContainer.h:149
void Reset()
Definition WaterContainer.cpp:280
double GetTargetFillingRatio() const
Definition WaterContainer.cpp:356
void AddAmountToStaticContentChange(double change)
Definition WaterContainer.cpp:55
double GetContentWithoutChanges() const
Definition WaterContainer.h:226
void SetMaximumCapacity(const float *value)
Definition WaterContainer.h:158
void SubtractAmountFromDynamicContentChange(double change)
Definition WaterContainer.cpp:45
void SetOutgoingRatesToZero()
Definition WaterContainer.cpp:238
double * GetContentPointer()
Definition WaterContainer.h:239
void AddAmountToDynamicContentChange(double change)
Definition WaterContainer.cpp:50
double SumIncomingAmounts() const
Definition WaterContainer.cpp:330
virtual bool IsValid(bool checkProcesses=true) const
Definition WaterContainer.cpp:22
bool HasInitialState() const
Definition WaterContainer.h:408
bool HasMaximumCapacity() const noexcept
Definition WaterContainer.h:111
bool HasParentBrick() const
Definition WaterContainer.h:399
bool HasOverflow() const
Definition WaterContainer.h:287
virtual void Validate() const
Definition WaterContainer.cpp:38
virtual double SumIncomingFluxes() const
Definition WaterContainer.cpp:304
double BookIncomingFluxes(bool asStatic=false)
Definition WaterContainer.cpp:287
void LinkOverflow(Process *overflow)
Definition WaterContainer.h:296
bool HasIncomingFluxes() const
Definition WaterContainer.h:372
void Finalize()
Definition WaterContainer.cpp:257
virtual void ApplyConstraints(double timeStep)
Definition WaterContainer.cpp:87
void AttachFluxIn(Flux *flux)
Definition WaterContainer.h:305
double GetContentWithChanges() const
Definition WaterContainer.h:200
bool IsNotEmpty() const
Definition WaterContainer.h:277
void AttachFluxInOwned(std::unique_ptr< Flux > flux)
Definition WaterContainer.h:316
double GetContentWithDynamicChanges() const
Definition WaterContainer.h:213
bool AllowsNegativeContent() const
Definition WaterContainer.h:191
double GetMaximumCapacity() const
Definition WaterContainer.h:122
double GetAreaFraction() const
Definition WaterContainer.h:136
void SaveAsInitialState()
Definition WaterContainer.cpp:300
void SetInitialState(double value)
Definition WaterContainer.h:248
void SetAllowNegativeContent(bool allow=true)
Definition WaterContainer.h:182
void ResetInputBooking()
Definition WaterContainer.h:80
Brick * GetParentBrick() const
Definition WaterContainer.h:363
virtual bool ContentAccessible() const
Definition WaterContainer.cpp:348
bool IsInfiniteStorage() const
Definition WaterContainer.h:381