OpenSWMM Engine  6.0.0-alpha.4
Data-oriented, plugin-extensible SWMM Engine (6.0.0-alpha.4)
Loading...
Searching...
No Matches
MomentumPhysics2D.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2026 Caleb Buahin
3#ifndef OPENSWMM_MOMENTUM_PHYSICS_2D_HPP
4#define OPENSWMM_MOMENTUM_PHYSICS_2D_HPP
5
6#include <array>
7#include <algorithm>
8#include <cmath>
9#include <limits>
10#include <cstdint>
11#include <vector>
12
13namespace openswmm::twoD {
14struct MeshData;
15struct InertialEdges;
16struct BoundaryData;
17
26public:
27 std::vector<double> viscosity, strain, vorticity;
30 std::vector<double> wall_distance;
31 static constexpr double kappa = 0.41;
32 double last_limit = std::numeric_limits<double>::infinity();
33 uint64_t substeps = 0, retries = 0;
34
40 static double wallDrag(const MeshData& m, const BoundaryData& b,
41 const std::vector<int>& slots, const std::vector<double>& h,
42 const std::vector<double>& eta, std::vector<double>& qx,
43 std::vector<double>& qy, double dry, double seconds, bool vfr);
44
45 static void rotate(std::vector<double>& qx, std::vector<double>& qy, double angle);
46
54 double evaluate(const MeshData& m, const InertialEdges& edges, const std::vector<double>& h,
55 const std::vector<double>& eta, const std::vector<double>& qx,
56 const std::vector<double>& qy, double dry, double cs, std::vector<double>& rx,
57 std::vector<double>& ry, double fixed_viscosity = -1, double background = 0,
58 double depth_coefficient = 0);
59
65 void advance(const MeshData& m, const InertialEdges& edges, const std::vector<double>& h,
66 const std::vector<double>& eta, std::vector<double>& qx, std::vector<double>& qy,
67 double dry, double cs, double seconds, double background = 0,
68 double depth_coefficient = 0);
69
71 void computeWallDistance(const MeshData& m);
72
73 static double energy(const MeshData& m, const std::vector<double>& h,
74 const std::vector<double>& qx, const std::vector<double>& qy, double dry);
75
76private:
77 struct Stencil {
78 std::array<int, 5> ids{};
79 std::array<double, 5> gx{}, gy{};
80 int count = 0;
81 };
82 std::vector<Stencil> stencils_;
83 std::vector<uint8_t> connected_;
84 std::vector<double> bound_x_, bound_y_, rx_, ry_, sx_, sy_, tx_, ty_;
85};
86} // namespace openswmm::twoD
87#endif
Definition MomentumPhysics2D.hpp:25
static double energy(const MeshData &m, const std::vector< double > &h, const std::vector< double > &qx, const std::vector< double > &qy, double dry)
Definition MomentumPhysics2D.cpp:290
uint64_t substeps
Definition MomentumPhysics2D.hpp:33
double evaluate(const MeshData &m, const InertialEdges &edges, const std::vector< double > &h, const std::vector< double > &eta, const std::vector< double > &qx, const std::vector< double > &qy, double dry, double cs, std::vector< double > &rx, std::vector< double > &ry, double fixed_viscosity=-1, double background=0, double depth_coefficient=0)
Definition MomentumPhysics2D.cpp:22
uint64_t retries
Definition MomentumPhysics2D.hpp:33
double last_limit
Definition MomentumPhysics2D.hpp:32
void computeWallDistance(const MeshData &m)
Definition MomentumPhysics2D.cpp:268
std::vector< double > strain
Definition MomentumPhysics2D.hpp:27
std::vector< double > vorticity
Definition MomentumPhysics2D.hpp:27
static double wallDrag(const MeshData &m, const BoundaryData &b, const std::vector< int > &slots, const std::vector< double > &h, const std::vector< double > &eta, std::vector< double > &qx, std::vector< double > &qy, double dry, double seconds, bool vfr)
Definition MomentumPhysics2D.cpp:302
static constexpr double kappa
Definition MomentumPhysics2D.hpp:31
static void rotate(std::vector< double > &qx, std::vector< double > &qy, double angle)
Definition MomentumPhysics2D.cpp:11
std::vector< double > viscosity
Definition MomentumPhysics2D.hpp:27
std::vector< double > wall_distance
Definition MomentumPhysics2D.hpp:30
void advance(const MeshData &m, const InertialEdges &edges, const std::vector< double > &h, const std::vector< double > &eta, std::vector< double > &qx, std::vector< double > &qy, double dry, double cs, double seconds, double background=0, double depth_coefficient=0)
Definition MomentumPhysics2D.cpp:208
Definition ExchangeLaw.hpp:60
SoA storage for per-edge boundary conditions.
Definition BoundaryData.hpp:73
Canonical unique interior-edge layout + per-cell incidence for the local-inertial scheme.
Definition InertialEdges.hpp:60
SoA storage for 2D mixed triangle/quad mesh geometry and topology.
Definition MeshData.hpp:65