44#ifndef OPENSWMM_ENGINE_HYD_CLOSURE_KERNELS_HPP
45#define OPENSWMM_ENGINE_HYD_CLOSURE_KERNELS_HPP
52#ifndef OPENSWMM_KERNEL_FN
53#define OPENSWMM_KERNEL_FN inline
73 double c_hw)
noexcept {
74 if (c_hw <= 0.0 || hyd_rad <= 0.0)
return 0.0;
75 const double v_abs = (velocity < 0.0) ? -velocity : velocity;
76 return std::pow(v_abs / (1.318 * c_hw * std::pow(hyd_rad, 0.63)),
84 double roughness)
noexcept {
85 if (hyd_rad <= 0.0)
return 0.0;
86 const double v_abs = (velocity < 0.0) ? -velocity : velocity;
87 const double diameter = 4.0 * hyd_rad;
89 const double re = v_abs * diameter /
kViscosity;
90 if (re <= 0.0)
return 0.0;
96 const double e_over_d = roughness / diameter;
97 const double arg = e_over_d / 3.7 + 5.74 / std::pow(re, 0.9);
98 if (arg <= 0.0)
return 0.0;
99 const double logarg = std::log10(arg);
100 f = 0.25 / (logarg * logarg);
102 return f * v_abs * v_abs / (2.0 *
kGravity * diameter);
132 double y_full,
double a_full,
134 bool mitered,
double& dqdh)
noexcept {
136 if (head <= 0.0 || y_full <= 0.0 || a_full <= 0.0)
return q_proposed;
137 if (cc.K == 0.0)
return q_proposed;
139 const double AD = a_full * std::sqrt(y_full);
140 const double y_norm = head / y_full;
141 const double scf = mitered ? (-7.0 * slope) : (0.5 * slope);
143 const double y1_norm = 0.95;
144 double y2_norm = 16.0 * cc.C + cc.Y - scf;
145 if (y2_norm < y1_norm) y2_norm = y1_norm + 0.01;
148 if (y_norm <= y1_norm) {
149 const double arg = y_norm / cc.K;
150 if (arg <= 0.0)
return q_proposed;
151 q_inlet = AD * std::pow(arg, 1.0 / cc.M);
152 dqdh = q_inlet / (head * cc.M);
153 }
else if (y_norm >= y2_norm) {
154 const double arg = (y_norm - cc.Y + scf) / cc.C;
155 if (arg <= 0.0)
return q_proposed;
156 q_inlet = AD * std::sqrt(arg);
157 dqdh = 0.5 * q_inlet / (arg * y_full * cc.C);
159 const double arg1 = y1_norm / cc.K;
160 const double q1 = AD * std::pow(arg1, 1.0 / cc.M);
161 const double arg2 = (y2_norm - cc.Y + scf) / cc.C;
162 const double q2 = (arg2 > 0.0) ? AD * std::sqrt(arg2) : q1;
164 const double frac = (y_norm - y1_norm) / (y2_norm - y1_norm);
165 q_inlet = q1 + frac * (q2 - q1);
166 dqdh = (q2 - q1) / ((y2_norm - y1_norm) * y_full);
168 return (q_inlet < q_proposed) ? q_inlet : q_proposed;
#define OPENSWMM_KERNEL_FN
Definition ExplicitKokkosSurfaceSolver.cpp:18
Definition HydClosureKernels.hpp:56
OPENSWMM_KERNEL_FN double culvertInflow(double q_proposed, double head, double y_full, double a_full, double slope, const CulvertCurve &cc, bool mitered, double &dqdh) noexcept
Inlet-controlled discharge for one culvert.
Definition HydClosureKernels.hpp:131
constexpr double kViscosity
Definition HydClosureKernels.hpp:65
OPENSWMM_KERNEL_FN double fricSlopeHW(double velocity, double hyd_rad, double c_hw) noexcept
Definition HydClosureKernels.hpp:72
OPENSWMM_KERNEL_FN double fricSlopeDW(double velocity, double hyd_rad, double roughness) noexcept
Definition HydClosureKernels.hpp:83
constexpr double kGravity
Gravity in internal units, matching constants::GRAVITY.
Definition HydClosureKernels.hpp:68
Inlet-control curve coefficients for one culvert type code.
Definition HydClosureKernels.hpp:110
double M
Definition HydClosureKernels.hpp:112
double Y
Definition HydClosureKernels.hpp:114
double K
Definition HydClosureKernels.hpp:111
double C
Definition HydClosureKernels.hpp:113