flow
Kokkos cut-cell IBM incompressible Navier-Stokes solver + pnm pore extraction
Loading...
Searching...
No Matches
colocated_advection.hpp
Go to the documentation of this file.
1
16#ifndef PECLET_FLOW_COLOCATED_ADVECTION_HPP
17#define PECLET_FLOW_COLOCATED_ADVECTION_HPP
18
19#include <Kokkos_Core.hpp>
20#include <Kokkos_MathematicalFunctions.hpp>
21
22#include "staggered_advection.hpp" // sadv::koren / tvd / fou_flux / ViewAcc (reused verbatim)
23
24namespace cadv {
25
26// Advecting (normal) velocity at the +fd face of the cell at (x,y,z): the cell->face average of the
27// fd-component. Independent of the advected component `comp` (all components are co-located at the
28// center).
29template <class A>
30KOKKOS_INLINE_FUNCTION double adv_vel(int /*comp*/, int fd, int x, int y, int z, A U, A V, A W) {
31 if (fd == 0)
32 return 0.5 * (U(x, y, z) + U(x + 1, y, z));
33 if (fd == 1)
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));
36}
37
38// Conservative Koren-TVD advection A = sum_dir (F_plus - F_minus) of component comp; PHI is its
39// field.
40template <class A>
41KOKKOS_INLINE_FUNCTION double advect(int comp, int x, int y, int z, A U, A V, A W, A PHI) {
42 double out = 0.0;
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);
47 const double Fp =
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);
50 const double Fm =
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);
53 out += Fp - Fm;
54 }
55 return out;
56}
57
58// Conservative second-order-upwind advection (SOU flux; same cell->face advecting
59// velocities as cadv::advect).
60template <class A>
61KOKKOS_INLINE_FUNCTION double advect_sou(int comp, int x, int y, int z, A U, A V, A W, A PHI) {
62 double out = 0.0;
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);
67 const double Fp =
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);
70 const double Fm =
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);
73 out += Fp - Fm;
74 }
75 return out;
76}
77
78// FOU advection OPERATOR coefficients added to a cell's 7-point stencil (consistent with
79// advect_fou): diagonal cC gets max(velp,0)-min(velm,0) >= 0, off-diagonals <= 0. Added (not
80// assigned) into out-params.
81template <class A>
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));
91 if (fd == 0) {
92 cxp += cp;
93 cxm += cm;
94 } else if (fd == 1) {
95 cyp += cp;
96 cym += cm;
97 } else {
98 czp += cp;
99 czm += cm;
100 }
101 }
102}
103
104// Conservative first-order-upwind advection of comp (low-order flux, same advecting velocities).
105template <class A>
106KOKKOS_INLINE_FUNCTION double advect_fou(int comp, int x, int y, int z, A U, A V, A W, A PHI) {
107 double out = 0.0;
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) -
113 sadv::fou_flux(PHI(x - ox, y - oy, z - oz), PHI(x, y, z), velm);
114 }
115 return out;
116}
117
118} // namespace cadv
119
120#endif // PECLET_FLOW_COLOCATED_ADVECTION_HPP
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).