16#ifndef PECLET_FLOW_COLOCATED_ADVECTION_HPP
17#define PECLET_FLOW_COLOCATED_ADVECTION_HPP
19#include <Kokkos_Core.hpp>
20#include <Kokkos_MathematicalFunctions.hpp>
30KOKKOS_INLINE_FUNCTION
double adv_vel(
int ,
int fd,
int x,
int y,
int z, A U, A V, A W) {
32 return 0.5 * (U(x, y, z) + U(x + 1, y, z));
34 return 0.5 * (V(x, y, z) + V(x, y + 1, z));
35 return 0.5 * (W(x, y, z) + W(x, y, z + 1));
41KOKKOS_INLINE_FUNCTION
double advect(
int comp,
int x,
int y,
int z, A U, A V, A W, A PHI) {
43 for (
int fd = 0; fd < 3; ++fd) {
44 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
45 const double velp =
cadv::adv_vel(comp, fd, x, y, z, U, V, W);
46 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz, U, V, W);
48 sadv::tvd(PHI(x - ox, y - oy, z - oz), PHI(x, y, z), PHI(x + ox, y + oy, z + oz),
49 PHI(x + 2 * ox, y + 2 * oy, z + 2 * oz), velp);
51 sadv::tvd(PHI(x - 2 * ox, y - 2 * oy, z - 2 * oz), PHI(x - ox, y - oy, z - oz),
52 PHI(x, y, z), PHI(x + ox, y + oy, z + oz), velm);
61KOKKOS_INLINE_FUNCTION
double advect_sou(
int comp,
int x,
int y,
int z, A U, A V, A W, A PHI) {
63 for (
int fd = 0; fd < 3; ++fd) {
64 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
65 const double velp =
cadv::adv_vel(comp, fd, x, y, z, U, V, W);
66 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz, U, V, W);
68 sadv::sou(PHI(x - ox, y - oy, z - oz), PHI(x, y, z), PHI(x + ox, y + oy, z + oz),
69 PHI(x + 2 * ox, y + 2 * oy, z + 2 * oz), velp);
71 sadv::sou(PHI(x - 2 * ox, y - 2 * oy, z - 2 * oz), PHI(x - ox, y - oy, z - oz),
72 PHI(x, y, z), PHI(x + ox, y + oy, z + oz), velm);
82KOKKOS_INLINE_FUNCTION
void fou_operator(
int comp,
int x,
int y,
int z, A U, A V, A W,
double dt,
83 double& cC,
double& cxm,
double& cxp,
double& cym,
84 double& cyp,
double& czm,
double& czp) {
85 for (
int fd = 0; fd < 3; ++fd) {
86 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
87 const double velp =
cadv::adv_vel(comp, fd, x, y, z, U, V, W);
88 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz, U, V, W);
89 cC += dt * (Kokkos::fmax(velp, 0.0) - Kokkos::fmin(velm, 0.0));
90 const double cp = dt * Kokkos::fmin(velp, 0.0), cm = dt * (-Kokkos::fmax(velm, 0.0));
106KOKKOS_INLINE_FUNCTION
double advect_fou(
int comp,
int x,
int y,
int z, A U, A V, A W, A PHI) {
108 for (
int fd = 0; fd < 3; ++fd) {
109 const int ox = (fd == 0), oy = (fd == 1), oz = (fd == 2);
110 const double velp =
cadv::adv_vel(comp, fd, x, y, z, U, V, W);
111 const double velm =
cadv::adv_vel(comp, fd, x - ox, y - oy, z - oz, U, V, W);
112 out +=
sadv::fou_flux(PHI(x, y, z), PHI(x + ox, y + oy, z + oz), velp) -
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)
double advect_fou(int comp, int x, int y, int z, A U, A V, A W, A PHI)
double adv_vel(int, int fd, int x, int y, int z, A U, A V, A W)
double advect_sou(int comp, int x, int y, int z, A U, A V, A W, A PHI)
double advect(int comp, int x, int y, int z, A U, A V, A W, A PHI)
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).