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
79 if (z1 > z2) {
const double t = z1; z1 = z2; z2 = t; }
80 if (z2 > z3) {
const double t = z2; z2 = z3; z3 = t; }
81 if (z1 > z2) {
const double t = z1; z1 = z2; z2 = t; }
88 double eta)
noexcept {
89 const double relief = z3 - z1;
91 if (eta <= z1)
return 0.0;
92 if (eta >= z3)
return 1.0;
94 const double d21 = z2 - z1;
96 const double t = eta - z1;
97 return t * t / (d21 * relief);
100 const double d32 = z3 - z2;
101 const double t = z3 - eta;
102 return 1.0 - t * t / (relief * d32);
108 double eta)
noexcept {
109 const double zbar = (z1 + z2 + z3) / 3.0;
110 const double relief = z3 - z1;
112 return (eta > zbar) ? (eta - zbar) : 0.0;
113 if (eta <= z1)
return 0.0;
114 if (eta >= z3)
return eta - zbar;
116 const double d21 = z2 - z1;
118 const double t = eta - z1;
119 return t * t * t / (3.0 * d21 * relief);
121 const double d32 = z3 - z2;
122 const double t = z3 - eta;
123 return (eta - zbar) + t * t * t / (3.0 * relief * d32);
129 double eps)
noexcept {
130 const double relief = z3 - z1;
131 const double d21 = z2 - z1;
133 if (eps <= d21 / relief)
134 return z1 + std::sqrt(eps * d21 * relief);
135 const double d32 = z3 - z2;
136 return z3 - std::sqrt((1.0 - eps) * relief * d32);
145 double eta,
double eps)
noexcept {
146 const double relief = z3 - z1;
153 const double h = h_s - eps * (eta_s - eta);
154 return (h > 0.0) ? h : 0.0;
166 double mean_depth,
double eps)
noexcept {
167 const double zbar = (z1 + z2 + z3) / 3.0;
168 const double relief = z3 - z1;
172 return zbar + ((mean_depth > 0.0) ? mean_depth : 0.0);
179 if (mean_depth >= z3 - zbar)
return zbar + mean_depth;
182 double eta_s = z1, h_s = 0.0;
186 const double h = (mean_depth > 0.0) ? mean_depth : 0.0;
187 if (h <= h_s)
return eta_s - (h_s - h) / eps;
188 }
else if (!(mean_depth > 0.0)) {
193 const double d21 = z2 - z1;
194 const double h_at_z2 = d21 * d21 / (3.0 * relief);
195 if (mean_depth <= h_at_z2)
196 return z1 + std::cbrt(3.0 * mean_depth * d21 * relief);
206 const double d32 = z3 - z2;
207 const double denom = 3.0 * relief * d32;
208 double lo = z2, hi = z3;
209 double eta = zbar + mean_depth;
210 if (eta <= lo || eta >= hi) eta = 0.5 * (lo + hi);
211 for (
int it = 0; it < 64; ++it) {
212 const double dz3 = z3 - eta;
213 const double f = (eta - zbar) + dz3 * dz3 * dz3 / denom - mean_depth;
214 if (f > 0.0) hi = eta;
else lo = eta;
215 const double df = 1.0 - dz3 * dz3 / (relief * d32);
216 double next = (df > 1.0e-12) ? eta - f / df : 0.5 * (lo + hi);
217 if (next <= lo || next >= hi) next = 0.5 * (lo + hi);
218 if (std::abs(next - eta) < 1.0e-12 * (1.0 + relief))
return next;
237 double eta,
double eps)
noexcept {
239 if (w < eps) w = eps;
240 if (w < 1.0e-12) w = 1.0e-12;
#define OPENSWMM_KERNEL_FN
Definition ExplicitKokkosSurfaceSolver.cpp:18
Definition NodeCoupling.cpp:16
OPENSWMM_KERNEL_FN double vfrMeanDepthFromEta(double z1, double z2, double z3, double eta, double eps) noexcept
Definition VfrClosure.hpp:144
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:78
OPENSWMM_KERNEL_FN double vfrDryEta(double z1, double z2, double z3, double eps) noexcept
Definition VfrClosure.hpp:228
constexpr double kVfrFlatRelief
Definition VfrClosure.hpp:75
OPENSWMM_KERNEL_FN double vfrWetFraction(double z1, double z2, double z3, double eta) noexcept
Definition VfrClosure.hpp:87
OPENSWMM_KERNEL_FN double vfrStageAtWetFraction(double z1, double z2, double z3, double eps) noexcept
Definition VfrClosure.hpp:128
OPENSWMM_KERNEL_FN double vfrDEtaDMeanDepth(double z1, double z2, double z3, double eta, double eps) noexcept
Definition VfrClosure.hpp:236
OPENSWMM_KERNEL_FN double vfrEtaFromMeanDepth(double z1, double z2, double z3, double mean_depth, double eps) noexcept
Definition VfrClosure.hpp:165
OPENSWMM_KERNEL_FN double vfrMeanDepthFromEtaExact(double z1, double z2, double z3, double eta) noexcept
Definition VfrClosure.hpp:107