10#ifndef PECLET_FLOW_MAC_PRESSURE_HPP
11#define PECLET_FLOW_MAC_PRESSURE_HPP
13#include <Kokkos_Core.hpp>
27 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
29 "peclet::flow::cc_build_op", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
30 KOKKOS_LAMBDA(
int lx,
int ly,
int lz) {
31 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
32 const long i = (long)lx + (
long)ly * sy + (long)lz * sz;
33 const double tw = ox(i) * gfx, te = ox(i + sx) * gfx;
34 const double ts = oy(i) * gfy, tn = oy(i + sy) * gfy;
35 const double tb = oz(i) * gfz, tt = oz(i + sz) * gfz;
42 AC(i) = te + tw + tn + ts + tt + tb;
51 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
53 "peclet::flow::diverg_open", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
54 KOKKOS_LAMBDA(
int x,
int y,
int z) {
55 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
56 const long i = (long)x + (
long)y * sy + (long)z * sz;
57 d(i) = (ox(i + sx) * u(i + sx) - ox(i) * u(i)) + (oy(i + sy) * v(i + sy) - oy(i) * v(i)) +
58 (oz(i + sz) * w(i + sz) - oz(i) * w(i));
67 OpV AB,
OpV AT,
C3 e,
C3 og,
int g,
int color) {
69 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
71 "peclet::flow::cc_smooth", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
72 KOKKOS_LAMBDA(
int lx,
int ly,
int lz) {
73 if (((og.
x + lx + og.
y + ly + og.
z + lz) & 1) != color)
75 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
76 const long i = (long)lx + (
long)ly * sy + (long)lz * sz;
77 const double ac =
AC(i);
80 const double s = AE(i) * phi(i + sx) + AW(i) * phi(i - sx) + AN(i) * phi(i + sy) +
81 AS(i) * phi(i - sy) + AT(i) * phi(i + sz) + AB(i) * phi(i - sz);
82 phi(i) = (b(i) - s) / ac;
89 OpV AT,
C3 e,
int g) {
91 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
93 "peclet::flow::cc_apply", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
94 KOKKOS_LAMBDA(
int lx,
int ly,
int lz) {
95 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
96 const long i = (long)lx + (
long)ly * sy + (long)lz * sz;
97 y(i) =
AC(i) * x(i) + AE(i) * x(i + sx) + AW(i) * x(i - sx) + AN(i) * x(i + sy) +
98 AS(i) * x(i - sy) + AT(i) * x(i + sz) + AB(i) * x(i - sz);
107 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
108 Kokkos::parallel_for(
109 "peclet::flow::correct", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
110 KOKKOS_LAMBDA(
int x,
int y,
int z) {
111 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
112 const long i = (long)x + (
long)y * sy + (long)z * sz;
113 u(i) -= phi(i) - phi(i - sx);
114 v(i) -= phi(i) - phi(i - sy);
115 w(i) -= phi(i) - phi(i - sz);
124 double rho0,
C3 e,
int g) {
126 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
127 Kokkos::parallel_for(
128 "peclet::flow::correct_var", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
129 KOKKOS_LAMBDA(
int x,
int y,
int z) {
130 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
131 const long i = (long)x + (
long)y * sy + (long)z * sz;
132 u(i) -= rho0 / (0.5 * (rho(i) + rho(i - sx))) * (phi(i) - phi(i - sx));
133 v(i) -= rho0 / (0.5 * (rho(i) + rho(i - sy))) * (phi(i) - phi(i - sy));
134 w(i) -= rho0 / (0.5 * (rho(i) + rho(i - sz))) * (phi(i) - phi(i - sz));
146 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
147 Kokkos::parallel_for(
148 "peclet::flow::rho_coeff", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
149 KOKKOS_LAMBDA(
int x,
int y,
int z) {
150 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
151 const long i = (long)x + (
long)y * sy + (long)z * sz;
152 cx(i) = ox(i) * rho0 / (0.5 * (rho(i) + rho(i - sx)));
153 cy(i) = oy(i) * rho0 / (0.5 * (rho(i) + rho(i - sy)));
154 cz(i) = oz(i) * rho0 / (0.5 * (rho(i) + rho(i - sz)));
168 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
169 Kokkos::parallel_for(
170 "peclet::flow::diverg_open_eps", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
171 KOKKOS_LAMBDA(
int x,
int y,
int z) {
172 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
173 const long i = (long)x + (
long)y * sy + (long)z * sz;
174 const double exp = 0.5 * (eps(i) + eps(i + sx)), exm = 0.5 * (eps(i) + eps(i - sx));
175 const double eyp = 0.5 * (eps(i) + eps(i + sy)), eym = 0.5 * (eps(i) + eps(i - sy));
176 const double ezp = 0.5 * (eps(i) + eps(i + sz)), ezm = 0.5 * (eps(i) + eps(i - sz));
177 d(i) = (ox(i + sx) * exp * u(i + sx) - ox(i) * exm * u(i)) +
178 (oy(i + sy) * eyp * v(i + sy) - oy(i) * eym * v(i)) +
179 (oz(i + sz) * ezp * w(i + sz) - oz(i) * ezm * w(i));
190 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
191 Kokkos::parallel_for(
192 "peclet::flow::porous_coeff", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
193 KOKKOS_LAMBDA(
int x,
int y,
int z) {
194 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
195 const long i = (long)x + (
long)y * sy + (long)z * sz;
196 cx(i) = ox(i) * 0.5 * (eps(i) + eps(i - sx));
197 cy(i) = oy(i) * 0.5 * (eps(i) + eps(i - sy));
198 cz(i) = oz(i) * 0.5 * (eps(i) + eps(i - sz));
212 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
213 Kokkos::parallel_for(
214 "peclet::flow::porous_coeff_drag", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
215 KOKKOS_LAMBDA(
int x,
int y,
int z) {
216 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
217 const long i = (long)x + (
long)y * sy + (long)z * sz;
218 cx(i) = ox(i) * 0.5 * (eps(i) + eps(i - sx)) * idt / (idt + 0.5 * (beta(i) + beta(i - sx)));
219 cy(i) = oy(i) * 0.5 * (eps(i) + eps(i - sy)) * idt / (idt + 0.5 * (beta(i) + beta(i - sy)));
220 cz(i) = oz(i) * 0.5 * (eps(i) + eps(i - sz)) * idt / (idt + 0.5 * (beta(i) + beta(i - sz)));
227 double idt,
C3 e,
int g) {
229 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
230 Kokkos::parallel_for(
231 "peclet::flow::correct_porous_drag", MD(space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
232 KOKKOS_LAMBDA(
int x,
int y,
int z) {
233 const long sx = 1, sy = e.x, sz = (long)e.x * e.y;
234 const long i = (long)x + (
long)y * sy + (long)z * sz;
235 u(i) -= idt / (idt + 0.5 * (beta(i) + beta(i - sx))) * (phi(i) - phi(i - sx));
236 v(i) -= idt / (idt + 0.5 * (beta(i) + beta(i - sy))) * (phi(i) - phi(i - sy));
237 w(i) -= idt / (idt + 0.5 * (beta(i) + beta(i - sz))) * (phi(i) - phi(i - sz));
flow — portable (Kokkos) cut-cell pressure-operator face openness from an SDF.
void buildPorousCoeffDrag(CCField cx, CCField cy, CCField cz, CCConst ox, CCConst oy, CCConst oz, CCConst eps, CCConst beta, double idt, C3 e, int g)
void projectCorrectPorousDrag(CCField u, CCField v, CCField w, CCConst phi, CCConst beta, double idt, C3 e, int g)
void buildRhoCoeff(CCField cx, CCField cy, CCField cz, CCConst ox, CCConst oy, CCConst oz, CCConst rho, double rho0, C3 e, int g)
void divergOpen(CCConst u, CCConst v, CCConst w, CCConst ox, CCConst oy, CCConst oz, CCField d, C3 e, int g)
void applyCutcellOp(CCField y, CCConst x, OpV AC, OpV AW, OpV AE, OpV AS, OpV AN, OpV AB, OpV AT, C3 e, int g)
void projectCorrectVar(CCField u, CCField v, CCField w, CCConst phi, CCConst rho, double rho0, C3 e, int g)
void buildCutcellOp(OpV AC, OpV AW, OpV AE, OpV AS, OpV AN, OpV AB, OpV AT, CCConst ox, CCConst oy, CCConst oz, C3 e, int g, double gfx, double gfy, double gfz)
Kokkos::View< double *, CCMem > CCField
void cutcellSmoothColor(CCField phi, CCConst b, OpV AC, OpV AW, OpV AE, OpV AS, OpV AN, OpV AB, OpV AT, C3 e, C3 og, int g, int color)
void buildPorousCoeff(CCField cx, CCField cy, CCField cz, CCConst ox, CCConst oy, CCConst oz, CCConst eps, C3 e, int g)
Kokkos::DefaultExecutionSpace CCExec
void divergOpenEps(CCConst u, CCConst v, CCConst w, CCConst ox, CCConst oy, CCConst oz, CCConst eps, CCField d, C3 e, int g)
Kokkos::View< const double *, CCMem > CCConst
void projectCorrect(CCField u, CCField v, CCField w, CCConst phi, C3 e, int g)
static constexpr double AC
Kokkos::View< double *, peclet::flow::CCMem > OpV