53#ifndef OPENSWMM_ENGINE_2D_INERTIAL_KERNELS_HPP
54#define OPENSWMM_ENGINE_2D_INERTIAL_KERNELS_HPP
71#ifndef OPENSWMM_KERNEL_FN
72#define OPENSWMM_KERNEL_FN inline
97 return std::sqrt(x * x +
y *
y);
103 double z1,
double z2,
double z3,
104 bool vfr,
double vfr_min_wet_frac,
105 double V,
double& eta,
106 double& depth)
noexcept {
107 const double v = (V > 0.0) ? V : 0.0;
108 depth = (area > 1.0e-30) ? v / area : 0.0;
119 double z1,
double z2,
double z3,
120 bool vfr,
double vfr_min_wet_frac,
121 double eta)
noexcept {
126 const double d = eta - cz;
127 return (d > 0.0) ? area * d : 0.0;
133 const double* zs,
double A1,
double A2,
134 bool vfr,
double vfr_min_wet_frac,
135 double V,
double& eta,
136 double& depth)
noexcept {
137 const double v = (V > 0.0) ? V : 0.0;
138 depth = (area > 1.0e-30) ? v / area : 0.0;
140 else eta = cz + depth;
145 const double* zs,
double A1,
147 double vfr_min_wet_frac,
148 double eta)
noexcept {
150 const double d = eta - cz;
151 return (d > 0.0) ? area * d : 0.0;
154#if defined(__GNUC__) || defined(__clang__)
155#define OPENSWMM_2D_NOINLINE __attribute__((noinline))
156#elif defined(_MSC_VER)
157#define OPENSWMM_2D_NOINLINE __declspec(noinline)
159#define OPENSWMM_2D_NOINLINE
170 int i,
double V,
double& eta,
171 double& depth)
noexcept {
173 &m.quad_vfr_z[
static_cast<std::size_t
>(i) *
kQuadVfrZ],
174 m.quad_vfr_a[
static_cast<std::size_t
>(i) * 2],
175 m.quad_vfr_a[
static_cast<std::size_t
>(i) * 2 + 1],
176 true, o.vfr_min_wet_frac, V, eta, depth);
184 int i,
double V,
double& eta,
double& depth)
noexcept {
191 false, o.vfr_min_wet_frac, V, eta, depth);
194 if (m.cell_nv[
static_cast<std::size_t
>(i)] == 4) {
199 m.vz[m.cell_vertex(i, 0)], m.vz[m.cell_vertex(i, 1)],
200 m.vz[m.cell_vertex(i, 2)],
201 true, o.vfr_min_wet_frac, V, eta, depth);
208 int i,
double eta)
noexcept {
209 if (m.cell_nv[
static_cast<std::size_t
>(i)] == 4) {
211 m.tri_area[i], m.tri_cz[i],
212 &m.quad_vfr_z[
static_cast<std::size_t
>(i) *
kQuadVfrZ],
213 m.quad_vfr_a[
static_cast<std::size_t
>(i) * 2],
214 m.quad_vfr_a[
static_cast<std::size_t
>(i) * 2 + 1],
218 m.vz[m.cell_vertex(i, 0)], m.vz[m.cell_vertex(i, 1)],
219 m.vz[m.cell_vertex(i, 2)],
221 o.vfr_min_wet_frac, eta);
231 return std::max(etaL, etaR) - zface;
246 if (eta <= z_lo)
return 0.0;
247 const double dz = z_hi - z_lo;
248 if (dz < 1.0e-9)
return eta - z_lo;
250 const double t = eta - z_lo;
251 return t * t / (2.0 * dz);
253 return eta - 0.5 * (z_lo + z_hi);
263 double z_lo,
double z_hi)
noexcept {
283 double slope,
double n2,
284 double q_mag,
double adv = 0.0) noexcept {
285 const double h73 = hf * hf * std::cbrt(hf);
286 const double num = qhat - dt * (
kGravity * hf * slope + adv);
287 const double den = 1.0 +
kGravity * dt * n2 * q_mag / h73;
307 double unR,
double hR,
308 double inv_dx_normal)
noexcept {
309 const double FL = unL * ((unL > 0.0) ? hL * unL : q_f);
310 const double FR = unR * ((unR > 0.0) ? q_f : hR * unR);
311 return (FR - FL) * inv_dx_normal;
318 const double qcap = fr_max * hf * std::sqrt(
kGravity * hf);
319 return std::clamp(q, -qcap, qcap);
326 double speed)
noexcept {
327 const double c = std::sqrt(
kGravity * h) + speed;
328 return (c > 1.0e-12) ? alpha * lchar / c : 1.0e30;
336 double beta)
noexcept {
337 if (outflow_m3s <= 0.0 || dt <= 0.0)
return 1.0;
338 const double avail = beta * std::max(V, 0.0);
339 const double take = outflow_m3s * dt;
340 return (take <= avail) ? 1.0 : avail / take;
#define OPENSWMM_KERNEL_FN
Definition ExplicitKokkosSurfaceSolver.cpp:18
#define OPENSWMM_2D_NOINLINE
Definition InertialKernels.hpp:159
Structure-of-Arrays (SoA) storage for 2D triangular mesh geometry.
Volume–free-surface relationship (VFR) for a quadrilateral cell.
Configuration options for the 2D surface routing solver.
Volume–free-surface (VFR) closure for a planar-bed triangular cell.
Definition InertialKernels.hpp:75
void cellEtaDepth(const MeshData &m, const SolverOptions2D &o, int i, double V, double &eta, double &depth) noexcept
Definition InertialKernels.hpp:183
OPENSWMM_KERNEL_FN double froudeCap(double q, double hf, double fr_max) noexcept
Definition InertialKernels.hpp:317
OPENSWMM_KERNEL_FN double qMagnitude(double x, double y) noexcept
Definition InertialKernels.hpp:96
double cellVolumeFromEta(const MeshData &m, const SolverOptions2D &o, int i, double eta) noexcept
Definition InertialKernels.hpp:207
OPENSWMM_KERNEL_FN double inertialAdvection(double q_f, double unL, double hL, double unR, double hR, double inv_dx_normal) noexcept
Definition InertialKernels.hpp:306
OPENSWMM_KERNEL_FN double cellCflDt(double alpha, double lchar, double h, double speed) noexcept
Definition InertialKernels.hpp:325
constexpr double kEtaDeadband
Definition InertialKernels.hpp:85
OPENSWMM_KERNEL_FN double volumeFromEtaScalar(double area, double cz, double z1, double z2, double z3, bool vfr, double vfr_min_wet_frac, double eta) noexcept
Scalar core of the η → V inverse (device-callable).
Definition InertialKernels.hpp:118
OPENSWMM_2D_NOINLINE void cellEtaDepthQuad(const MeshData &m, const SolverOptions2D &o, int i, double V, double &eta, double &depth) noexcept
Definition InertialKernels.hpp:168
OPENSWMM_KERNEL_FN void etaDepthScalar(double area, double cz, double z1, double z2, double z3, bool vfr, double vfr_min_wet_frac, double V, double &eta, double &depth) noexcept
Definition InertialKernels.hpp:102
OPENSWMM_KERNEL_FN double positivityScale(double V, double outflow_m3s, double dt, double beta) noexcept
Definition InertialKernels.hpp:335
OPENSWMM_KERNEL_FN double faceFlowDepth(double etaL, double etaR, double zface) noexcept
Definition InertialKernels.hpp:230
OPENSWMM_KERNEL_FN double volumeFromEtaQuadScalar(double area, double cz, const double *zs, double A1, double A2, bool vfr, double vfr_min_wet_frac, double eta) noexcept
Quad η → V inverse (device-callable).
Definition InertialKernels.hpp:144
OPENSWMM_KERNEL_FN double inertialFaceUpdate(double q, double qhat, double hf, double dt, double slope, double n2, double q_mag, double adv=0.0) noexcept
Definition InertialKernels.hpp:282
OPENSWMM_KERNEL_FN void etaDepthQuadScalar(double area, double cz, const double *zs, double A1, double A2, bool vfr, double vfr_min_wet_frac, double V, double &eta, double &depth) noexcept
Definition InertialKernels.hpp:132
constexpr double kGravity
matches the existing kernels
Definition InertialKernels.hpp:77
OPENSWMM_KERNEL_FN double faceDepthFromEta(double eta, double z_lo, double z_hi) noexcept
Definition InertialKernels.hpp:245
OPENSWMM_KERNEL_FN double faceFlowDepthVfr(double etaL, double etaR, double z_lo, double z_hi) noexcept
Definition InertialKernels.hpp:262
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
constexpr int kQuadVfrZ
Definition QuadVfr.hpp:73
OPENSWMM_KERNEL_FN double quadEtaFromMeanDepth(const double *zs, double A1, double A2, double mean_depth, double eps) noexcept
Definition QuadVfr.hpp:125
OPENSWMM_KERNEL_FN double quadMeanDepthFromEta(const double *zs, double A1, double A2, double eta, double eps) noexcept
Definition QuadVfr.hpp:86
OPENSWMM_KERNEL_FN double vfrEtaFromMeanDepth(double z1, double z2, double z3, double mean_depth, double eps) noexcept
Definition VfrClosure.hpp:165
@ VFR
Planar-bed VFR closure (regularized), CPU solvers only.
Definition SolverOptions2D.hpp:61
double * y
Definition odesolve.c:28
SoA storage for 2D mixed triangle/quad mesh geometry and topology.
Definition MeshData.hpp:67
Configuration for the 2D surface routing solver.
Definition SolverOptions2D.hpp:208