28#ifndef OPENSWMM_ENGINE_2D_POND_MODEL_HPP
29#define OPENSWMM_ENGINE_2D_POND_MODEL_HPP
33#if defined(KOKKOS_INLINE_FUNCTION)
34#define OPENSWMM_POND_HD KOKKOS_INLINE_FUNCTION
36#define OPENSWMM_POND_HD inline
55 if (!(band > 0.0) || x >= band)
57 const double t = x / band;
58 return a_eq * t * t * (3.0 - 2.0 * t);
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);
97 if (!(v > 0.0) || !(a_eq > 0.0))
101 const double full = 0.5 * a_eq * band;
103 return v / a_eq + 0.5 * band;
105 const double r = v / (a_eq * band);
106 double lo = 0.0, hi = 1.0, t = std::cbrt(r);
109 for (
int it = 0; it < 60; ++it) {
110 const double f = t * t * t * (1.0 - 0.5 * t) - r;
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) {
148 if (!(window > 0.0) || !(a1 > 0.0))
150 return std::fabs(dh) * a1 / window;
155#undef OPENSWMM_POND_HD
#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