58#ifndef OPENSWMM_ENGINE_2D_VFR_CLOSURE_HPP
59#define OPENSWMM_ENGINE_2D_VFR_CLOSURE_HPP
67#ifndef OPENSWMM_KERNEL_FN
68#define OPENSWMM_KERNEL_FN inline
118 const double relief = z3 - z1;
120 return (eta > z1) ? 1.0 : 0.0;
126 const double d21 = z2 - z1;
129 const double t = eta - z1;
130 return t * t / (d21 * relief);
133 const double d32 = z3 - z2;
134 const double t = z3 - eta;
135 return 1.0 - t * t / (relief * d32);
152 double eta)
noexcept {
153 const double zbar = (z1 + z2 + z3) / 3.0;
154 const double relief = z3 - z1;
156 return (eta > zbar) ? (eta - zbar) : 0.0;
162 const double d21 = z2 - z1;
165 const double t = eta - z1;
166 return t * t * t / (3.0 * d21 * relief);
168 const double d32 = z3 - z2;
169 const double t = z3 - eta;
170 return (eta - zbar) + t * t * t / (3.0 * relief * d32);
187 double eps)
noexcept {
188 const double relief = z3 - z1;
189 const double d21 = z2 - z1;
191 if (eps <= d21 / relief)
192 return z1 + std::sqrt(eps * d21 * relief);
193 const double d32 = z3 - z2;
194 return z3 - std::sqrt((1.0 - eps) * relief * d32);
215 double eps)
noexcept {
216 const double relief = z3 - z1;
223 const double h = h_s - eps * (eta_s - eta);
224 return (h > 0.0) ? h : 0.0;
250 double eps)
noexcept {
251 const double zbar = (z1 + z2 + z3) / 3.0;
252 const double relief = z3 - z1;
256 return zbar + ((mean_depth > 0.0) ? mean_depth : 0.0);
263 if (mean_depth >= z3 - zbar)
264 return zbar + mean_depth;
267 double eta_s = z1, h_s = 0.0;
271 const double h = (mean_depth > 0.0) ? mean_depth : 0.0;
273 return eta_s - (h_s - h) / eps;
274 }
else if (!(mean_depth > 0.0)) {
279 const double d21 = z2 - z1;
280 const double h_at_z2 = d21 * d21 / (3.0 * relief);
281 if (mean_depth <= h_at_z2)
282 return z1 + std::cbrt(3.0 * mean_depth * d21 * relief);
288 return zbar + mean_depth;
293 const double d32 = z3 - z2;
294 const double denom = 3.0 * relief * d32;
295 double lo = z2, hi = z3;
296 double eta = zbar + mean_depth;
297 if (eta <= lo || eta >= hi)
298 eta = 0.5 * (lo + hi);
299 for (
int it = 0; it < 64; ++it) {
300 const double dz3 = z3 - eta;
301 const double f = (eta - zbar) + dz3 * dz3 * dz3 / denom - mean_depth;
306 const double df = 1.0 - dz3 * dz3 / (relief * d32);
307 double next = (df > 1.0e-12) ? eta - f / df : 0.5 * (lo + hi);
308 if (next <= lo || next >= hi)
309 next = 0.5 * (lo + hi);
310 if (std::abs(next - eta) < 1.0e-12 * (1.0 + relief))
354 double eps)
noexcept {
#define OPENSWMM_KERNEL_FN
Definition ExplicitKokkosSurfaceSolver.cpp:22
Definition ExchangeLaw.hpp:60
OPENSWMM_KERNEL_FN double vfrMeanDepthFromEta(double z1, double z2, double z3, double eta, double eps) noexcept
Regularized cell-mean depth h̄(η): exact for η ≥ η_s (wet fraction ≥ eps), tangent-line continuation ...
Definition VfrClosure.hpp:214
OPENSWMM_KERNEL_FN void vfrSort3(double &z1, double &z2, double &z3) noexcept
Sort three vertex elevations in place so z1 <= z2 <= z3.
Definition VfrClosure.hpp:85
OPENSWMM_KERNEL_FN double vfrDryEta(double z1, double z2, double z3, double eps) noexcept
Dry-cell free surface of the regularized closure: η(V = 0). This is the value a dry cell's head must ...
Definition VfrClosure.hpp:332
constexpr double kVfrFlatRelief
Definition VfrClosure.hpp:75
OPENSWMM_KERNEL_FN double vfrWetFraction(double z1, double z2, double z3, double eta) noexcept
Wetted-area fraction A_wet/A of the planar-bed cell at stage eta. Piecewise C0, monotone from 0 (η ≤ ...
Definition VfrClosure.hpp:117
OPENSWMM_KERNEL_FN double vfrStageAtWetFraction(double z1, double z2, double z3, double eps) noexcept
Stage η_s at which the wetted-area fraction equals eps (0 < eps < 1). Inputs must be sorted and non-f...
Definition VfrClosure.hpp:186
OPENSWMM_KERNEL_FN double vfrDEtaDMeanDepth(double z1, double z2, double z3, double eta, double eps) noexcept
dη/dh̄ of the regularized closure at stage eta: 1/max(w(η), eps). Divide by the cell area A to get dη...
Definition VfrClosure.hpp:353
OPENSWMM_KERNEL_FN double vfrEtaFromMeanDepth(double z1, double z2, double z3, double mean_depth, double eps) noexcept
Regularized free-surface elevation η(h̄) — the solver closure.
Definition VfrClosure.hpp:249
OPENSWMM_KERNEL_FN double vfrMeanDepthFromEtaExact(double z1, double z2, double z3, double eta) noexcept
EXACT cell-mean depth h̄(η) of the planar-bed cell (per unit area; V = A·h̄). Returns 0 for η ≤ z1....
Definition VfrClosure.hpp:151