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
81 if (c_hw <= 0.0 || hyd_rad <= 0.0)
83 const double v_abs = (velocity < 0.0) ? -velocity : velocity;
84 return std::pow(v_abs / (1.318 * c_hw * std::pow(hyd_rad, 0.63)), 1.0 / 0.54);
102 const double v_abs = (velocity < 0.0) ? -velocity : velocity;
103 const double diameter = 4.0 * hyd_rad;
105 const double re = v_abs * diameter /
kViscosity;
113 const double e_over_d = roughness / diameter;
114 const double arg = e_over_d / 3.7 + 5.74 / std::pow(re, 0.9);
117 const double logarg = std::log10(arg);
118 f = 0.25 / (logarg * logarg);
120 return f * v_abs * v_abs / (2.0 *
kGravity * diameter);
156 bool mitered,
double& dqdh)
noexcept {
158 if (head <= 0.0 || y_full <= 0.0 || a_full <= 0.0)
163 const double AD = a_full * std::sqrt(y_full);
164 const double y_norm = head / y_full;
165 const double scf = mitered ? (-7.0 * slope) : (0.5 * slope);
167 const double y1_norm = 0.95;
168 double y2_norm = 16.0 * cc.C + cc.Y - scf;
169 if (y2_norm < y1_norm)
170 y2_norm = y1_norm + 0.01;
173 if (y_norm <= y1_norm) {
174 const double arg = y_norm / cc.K;
177 q_inlet = AD * std::pow(arg, 1.0 / cc.M);
178 dqdh = q_inlet / (head * cc.M);
179 }
else if (y_norm >= y2_norm) {
180 const double arg = (y_norm - cc.Y + scf) / cc.C;
183 q_inlet = AD * std::sqrt(arg);
184 dqdh = 0.5 * q_inlet / (arg * y_full * cc.C);
186 const double arg1 = y1_norm / cc.K;
187 const double q1 = AD * std::pow(arg1, 1.0 / cc.M);
188 const double arg2 = (y2_norm - cc.Y + scf) / cc.C;
189 const double q2 = (arg2 > 0.0) ? AD * std::sqrt(arg2) : q1;
191 const double frac = (y_norm - y1_norm) / (y2_norm - y1_norm);
192 q_inlet = q1 + frac * (q2 - q1);
193 dqdh = (q2 - q1) / ((y2_norm - y1_norm) * y_full);
195 return (q_inlet < q_proposed) ? q_inlet : q_proposed;
#define OPENSWMM_KERNEL_FN
Definition ExplicitKokkosSurfaceSolver.cpp:22
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
Limit proposed culvert flow by a three-regime inlet-control curve.
Definition HydClosureKernels.hpp:154
constexpr double kViscosity
Definition HydClosureKernels.hpp:65
OPENSWMM_KERNEL_FN double fricSlopeHW(double velocity, double hyd_rad, double c_hw) noexcept
Compute Hazen-Williams friction slope from velocity and hydraulic radius.
Definition HydClosureKernels.hpp:80
OPENSWMM_KERNEL_FN double fricSlopeDW(double velocity, double hyd_rad, double roughness) noexcept
Compute Darcy-Weisbach slope with laminar or Swamee-Jain friction factor.
Definition HydClosureKernels.hpp:99
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:128
double M
Definition HydClosureKernels.hpp:130
double Y
Definition HydClosureKernels.hpp:132
double K
Definition HydClosureKernels.hpp:129
double C
Definition HydClosureKernels.hpp:131