21#ifndef PECLET_FLOW_COLOCATED_ADVECTION_HPP
22#define PECLET_FLOW_COLOCATED_ADVECTION_HPP
24#include <Kokkos_Core.hpp>
25#include <Kokkos_MathematicalFunctions.hpp>
48KOKKOS_INLINE_FUNCTION
double adv_vel(
int ,
int fd,
int x,
int y,
int z, A
U, A V, A W,
51 return uf ?
U(x + 1, y, z) : 0.5 * (
U(x, y, z) +
U(x + 1, y, z));
53 return uf ? V(x, y + 1, z) : 0.5 * (V(x, y, z) + V(x, y + 1, z));
54 return uf ? W(x, y, z + 1) : 0.5 * (W(x, y, z) + W(x, y, z + 1));
60KOKKOS_INLINE_FUNCTION
double advect(
int comp,
int x,
int y,
int z, A
U, A V, A W, A PHI,
bool uf) {
62 for (
int fd = 0; fd < 3; ++fd) {
63 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
65 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz,
U, V, W, uf);
67 sadv::tvd(PHI(x - ox, y - oy, z - oz), PHI(x, y, z), PHI(x + ox, y + oy, z + oz),
68 PHI(x + 2 * ox, y + 2 * oy, z + 2 * oz), velp);
70 sadv::tvd(PHI(x - 2 * ox, y - 2 * oy, z - 2 * oz), PHI(x - ox, y - oy, z - oz),
71 PHI(x, y, z), PHI(x + ox, y + oy, z + oz), velm);
80KOKKOS_INLINE_FUNCTION
double advect_sou(
int comp,
int x,
int y,
int z, A
U, A V, A W, A PHI,
83 for (
int fd = 0; fd < 3; ++fd) {
84 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
86 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz,
U, V, W, uf);
88 sadv::sou(PHI(x - ox, y - oy, z - oz), PHI(x, y, z), PHI(x + ox, y + oy, z + oz),
89 PHI(x + 2 * ox, y + 2 * oy, z + 2 * oz), velp);
91 sadv::sou(PHI(x - 2 * ox, y - 2 * oy, z - 2 * oz), PHI(x - ox, y - oy, z - oz),
92 PHI(x, y, z), PHI(x + ox, y + oy, z + oz), velm);
102KOKKOS_INLINE_FUNCTION
void fou_operator(
int comp,
int x,
int y,
int z, A
U, A V, A W,
double dt,
103 double& cC,
double& cxm,
double& cxp,
double& cym,
104 double& cyp,
double& czm,
double& czp,
bool uf) {
105 for (
int fd = 0; fd < 3; ++fd) {
106 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
107 const double velp =
cadv::adv_vel(comp, fd, x, y, z,
U, V, W, uf);
108 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz,
U, V, W, uf);
109 cC += dt * (Kokkos::fmax(velp, 0.0) - Kokkos::fmin(velm, 0.0));
110 const double cp = dt * Kokkos::fmin(velp, 0.0), cm = dt * (-Kokkos::fmax(velm, 0.0));
114 }
else if (fd == 1) {
126KOKKOS_INLINE_FUNCTION
double advect_fou(
int comp,
int x,
int y,
int z, A
U, A V, A W, A PHI,
129 for (
int fd = 0; fd < 3; ++fd) {
130 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
131 const double velp =
cadv::adv_vel(comp, fd, x, y, z,
U, V, W, uf);
132 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz,
U, V, W, uf);
133 out +=
sadv::fou_flux(PHI(x, y, z), PHI(x + ox, y + oy, z + oz), velp) -
double adv_vel(int, int fd, int x, int y, int z, A U, A V, A W, bool uf)
void fou_operator(int comp, int x, int y, int z, A U, A V, A W, double dt, double &cC, double &cxm, double &cxp, double &cym, double &cyp, double &czm, double &czp, bool uf)
double advect_sou(int comp, int x, int y, int z, A U, A V, A W, A PHI, bool uf)
double advect_fou(int comp, int x, int y, int z, A U, A V, A W, A PHI, bool uf)
double fou_flux(double L, double R, double vel)
double tvd(double LL, double L, double R, double RR, double vel)
double sou(double LL, double L, double R, double RR, double vel)
flow — portable (Kokkos) staggered MAC momentum advection (Koren TVD + FOU).
static constexpr double U