4template <
class T,
class Shortcuts>
6 const T*
const NOALIAS Q,
7 const tarch::la::Vector<DIMENSIONS, double>& x,
8 const tarch::la::Vector<DIMENSIONS, double>& h,
14 if (Q[Shortcuts::lsh] <= hThreshold) {
18 const auto Vn{Q[Shortcuts::lshu + normal] / Q[Shortcuts::lsh]};
19 F[Shortcuts::lsh] = Q[Shortcuts::lshu + normal];
20 F[Shortcuts::lshu] = Vn * Q[Shortcuts::lshu];
21 F[Shortcuts::lshv] = Vn * Q[Shortcuts::lshv];
25template <
class T,
class Shortcuts>
27 const T*
const NOALIAS Q,
28 const tarch::la::Vector<DIMENSIONS, double>& x,
29 const tarch::la::Vector<DIMENSIONS, double>& h,
36 if (Q[Shortcuts::lsh] > hThreshold) {
37 const auto Vn{Q[Shortcuts::lshu + normal] / Q[Shortcuts::lsh]};
38 const auto c{std::sqrt(g * Q[Shortcuts::lsh])};
39 sFlux = std::fmax(std::fabs(Vn + c), std::fabs(Vn - c));
44template <
class T,
class Shortcuts>
46 const T*
const NOALIAS Q,
47 const T*
const NOALIAS deltaQ,
48 const tarch::la::Vector<DIMENSIONS, double>& x,
49 const tarch::la::Vector<DIMENSIONS, double>& h,
53 T*
const NOALIAS BTimesDeltaQ
55 if (Q[Shortcuts::lsh] <= hThreshold) {
60 BTimesDeltaQ[Shortcuts::lshu + normal] =
g * Q[Shortcuts::lsh] * (deltaQ[Shortcuts::lsh] + deltaQ[Shortcuts::z]);
63 const auto momentumSQR{Q[Shortcuts::lshu] * Q[Shortcuts::lshu] + Q[Shortcuts::lshv] * Q[Shortcuts::lshv]};
64 const auto momentum{std::sqrt(momentumSQR)};
65 if (tarch::la::greater(momentum / Q[Shortcuts::lsh], 0.0)) {
66 const auto turbulentDrag{
g * momentumSQR * invXi / (Q[Shortcuts::lsh] * Q[Shortcuts::lsh])};
67 const auto directionVect{Q[Shortcuts::lshu + normal] / momentum};
68 BTimesDeltaQ[Shortcuts::lshu + normal] += h[normal] * turbulentDrag * directionVect;
71 BTimesDeltaQ[Shortcuts::hu + normal] +=
g * Q[Shortcuts::h] * deltaQ[Shortcuts::lsh];
74template <
class T,
class Shortcuts,
int NumberOfUnknowns,
int NumberOfAuxiliaryVariables>
76 [[maybe_unused]]
const T*
const NOALIAS Q,
77 [[maybe_unused]]
const T*
const NOALIAS deltaQ,
78 [[maybe_unused]]
const tarch::la::Vector<DIMENSIONS, double>& x,
79 [[maybe_unused]]
const tarch::la::Vector<DIMENSIONS, double>& h,
80 [[maybe_unused]]
const double t,
81 [[maybe_unused]]
const double dt,
82 [[maybe_unused]] T*
const NOALIAS S
85 for (
int n = 0; n < NumberOfUnknowns; n++) {
89 if (Q[Shortcuts::lsh] <= hThreshold) {
94 const auto dzx{deltaQ[Shortcuts::z]};
95 const auto dzy{deltaQ[Shortcuts::z + NumberOfUnknowns + NumberOfAuxiliaryVariables]};
96 const auto cF{1.0 / std::sqrt(1.0 + dzx * dzx + dzy * dzy)};
99 const auto momentumSQR{Q[Shortcuts::lshu] * Q[Shortcuts::lshu] + Q[Shortcuts::lshv] * Q[Shortcuts::lshv]};
100 const auto momentum{std::sqrt(momentumSQR)};
101 if (tarch::la::greater(momentum / Q[Shortcuts::lsh], 0.0)) {
102 const auto coulombFriction{mu * cF * Q[Shortcuts::lsh]};
103 const auto frictionTerm{-g * coulombFriction / momentum};
104 S[Shortcuts::lshu] = Q[Shortcuts::lshu] * frictionTerm;
105 S[Shortcuts::lshv] = Q[Shortcuts::lshv] * frictionTerm;
static GPU_CALLABLE_METHOD void diffusiveSourceTerm(const T *const NOALIAS Q, const T *const NOALIAS deltaQ, const tarch::la::Vector< DIMENSIONS, double > &x, const tarch::la::Vector< DIMENSIONS, double > &h, const double t, const double dt, T *const NOALIAS S)
static GPU_CALLABLE_METHOD double maxEigenvalue(const T *const NOALIAS Q, const tarch::la::Vector< DIMENSIONS, double > &x, const tarch::la::Vector< DIMENSIONS, double > &h, const double t, const double dt, const int normal)
static GPU_CALLABLE_METHOD void flux(const T *const NOALIAS Q, const tarch::la::Vector< DIMENSIONS, double > &x, const tarch::la::Vector< DIMENSIONS, double > &h, const double t, const double dt, const int normal, T *const NOALIAS F)
static GPU_CALLABLE_METHOD void nonconservativeProduct(const T *const NOALIAS Q, const T *const NOALIAS deltaQ, const tarch::la::Vector< DIMENSIONS, double > &x, const tarch::la::Vector< DIMENSIONS, double > &h, const double t, const double dt, const int normal, T *const NOALIAS BTimesDeltaQ)