OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
PondModel.hpp
Go to the documentation of this file.
1
27
28#ifndef OPENSWMM_ENGINE_2D_POND_MODEL_HPP
29#define OPENSWMM_ENGINE_2D_POND_MODEL_HPP
30
31#include <cmath>
32
33#if defined(KOKKOS_INLINE_FUNCTION)
34#define OPENSWMM_POND_HD KOKKOS_INLINE_FUNCTION
35#else
36#define OPENSWMM_POND_HD inline
37#endif
38
40
52OPENSWMM_POND_HD double area(double x, double a_eq, double band) {
53 if (!(x > 0.0))
54 return 0.0;
55 if (!(band > 0.0) || x >= band)
56 return a_eq;
57 const double t = x / band;
58 return a_eq * t * t * (3.0 - 2.0 * t);
59}
60
72OPENSWMM_POND_HD double volume(double x, double a_eq, double band) {
73 if (!(x > 0.0))
74 return 0.0;
75 if (!(band > 0.0))
76 return a_eq * x;
77 if (x >= band)
78 return a_eq * (x - 0.5 * band);
79 const double t = x / band;
80 return a_eq * band * t * t * t * (1.0 - 0.5 * t);
81}
82
96OPENSWMM_POND_HD double depthForVolume(double v, double a_eq, double band) {
97 if (!(v > 0.0) || !(a_eq > 0.0))
98 return 0.0;
99 if (!(band > 0.0))
100 return v / a_eq;
101 const double full = 0.5 * a_eq * band; // volume at x = band
102 if (v >= full)
103 return v / a_eq + 0.5 * band;
104 // t³ − t⁴/2 = r on [0, 1], monotone: safeguarded Newton from t ≈ ∛r.
105 const double r = v / (a_eq * band);
106 double lo = 0.0, hi = 1.0, t = std::cbrt(r);
107 if (t > 1.0)
108 t = 1.0;
109 for (int it = 0; it < 60; ++it) {
110 const double f = t * t * t * (1.0 - 0.5 * t) - r;
111 if (f > 0.0)
112 hi = t;
113 else
114 lo = t;
115 const double df = t * t * (3.0 - 2.0 * t);
116 double tn = (df > 0.0) ? t - f / df : 0.5 * (lo + hi);
117 if (!(tn > lo && tn < hi))
118 tn = 0.5 * (lo + hi);
119 if (std::fabs(tn - t) <= 1e-15) {
120 t = tn;
121 break;
122 }
123 t = tn;
124 }
125 return t * band;
126}
127
147OPENSWMM_POND_HD double equalizeCap(double dh, double window, double a1) {
148 if (!(window > 0.0) || !(a1 > 0.0))
149 return HUGE_VAL;
150 return std::fabs(dh) * a1 / window;
151}
152
153} // namespace openswmm::twoD::pond
154
155#undef OPENSWMM_POND_HD
156
157#endif // OPENSWMM_ENGINE_2D_POND_MODEL_HPP
#define OPENSWMM_POND_HD
Definition PondModel.hpp:36
Definition PondModel.hpp:39
OPENSWMM_POND_HD double equalizeCap(double dh, double window, double a1)
Head-equalisation cap on one exchange (the generalised Rubinato Eq. 10 limiter). The 1D head is froze...
Definition PondModel.hpp:147
OPENSWMM_POND_HD double area(double x, double a_eq, double band)
Pond surface area at depth x above the rim.
Definition PondModel.hpp:52
OPENSWMM_POND_HD double volume(double x, double a_eq, double band)
Pond volume held between the rim and depth x above it.
Definition PondModel.hpp:72
OPENSWMM_POND_HD double depthForVolume(double v, double a_eq, double band)
Depth above the rim at which the pond holds v (inverse of volume()).
Definition PondModel.hpp:96