10#ifndef PECLET_FLOW_MAC_PRESSURE_HPP
11#define PECLET_FLOW_MAC_PRESSURE_HPP
13#include <Kokkos_Core.hpp>
28 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
30 "peclet::flow::cc_build_op",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
32 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
52 "peclet::flow::diverg_open",
C3{g, g, g},
C3{e.x - g, e.y - g, e.z - g},
54 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
56 d(
i) = (ox(
i +
sx) * u(
i +
sx) - ox(
i) * u(
i)) + (oy(
i +
sy) * v(
i +
sy) - oy(
i) * v(
i)) +
57 (oz(
i +
sz) * w(
i +
sz) - oz(
i) * w(
i));
70 if constexpr (std::is_same_v<typename CCExec::memory_space, Kokkos::HostSpace>) {
71 const int nyi = e.y - 2 * g,
nzi = e.z - 2 * g;
74 const int ly = g + (int)(
t %
nyi),
lz = g + (int)(
t /
nyi);
75 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
76 const int P = (
color + og.x + og.y +
ly + og.z +
lz) & 1;
77 for (
int lx = g + ((
P ^ (g & 1)) & 1);
lx < e.x - g;
lx += 2) {
79 const double ac =
AC(
i);
82 const double s = AE(
i) * phi(
i +
sx) + AW(
i) * phi(
i -
sx) + AN(
i) * phi(
i +
sy) +
83 AS(
i) * phi(
i -
sy) + AT(
i) * phi(
i +
sz) + AB(
i) * phi(
i -
sz);
84 phi(
i) = (b(
i) - s) /
ac;
92 Kokkos::parallel_for(
"peclet::flow::cc_smooth",
96 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
98 "peclet::flow::cc_smooth",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
100 if (((og.x +
lx + og.y +
ly + og.z +
lz) & 1) !=
color)
102 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
104 const double ac =
AC(
i);
107 const double s = AE(
i) * phi(
i +
sx) + AW(
i) * phi(
i -
sx) + AN(
i) * phi(
i +
sy) +
108 AS(
i) * phi(
i -
sy) + AT(
i) * phi(
i +
sz) + AB(
i) * phi(
i -
sz);
109 phi(
i) = (b(
i) - s) /
ac;
126 if constexpr (std::is_same_v<typename CCExec::memory_space, Kokkos::HostSpace>) {
134 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
135 const int P = (
color + og.x + og.y +
ly + og.z +
lz) & 1;
140 const double ac =
AC(
i);
143 const double s = AE(
i) * phi(
i +
sx) + AW(
i) * phi(
i -
sx) + AN(
i) * phi(
i +
sy) +
144 AS(
i) * phi(
i -
sy) + AT(
i) * phi(
i +
sz) + AB(
i) * phi(
i -
sz);
145 phi(
i) = (b(
i) - s) /
ac;
153 Kokkos::parallel_for(
"peclet::flow::cc_smooth_box",
157 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
158 Kokkos::parallel_for(
163 if (((og.x +
lx + og.y +
ly + og.z +
lz) & 1) !=
color)
165 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
167 const double ac =
AC(
i);
170 const double s = AE(
i) * phi(
i +
sx) + AW(
i) * phi(
i -
sx) + AN(
i) * phi(
i +
sy) +
171 AS(
i) * phi(
i -
sy) + AT(
i) * phi(
i +
sz) + AB(
i) * phi(
i -
sz);
172 phi(
i) = (b(
i) - s) /
ac;
179 OpV AT,
C3 e,
int g) {
181 "peclet::flow::cc_apply",
C3{g, g, g},
C3{e.x - g, e.y - g, e.z - g},
183 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
185 y(
i) =
AC(
i) * x(
i) + AE(
i) * x(
i +
sx) + AW(
i) * x(
i -
sx) + AN(
i) * x(
i +
sy) +
186 AS(
i) * x(
i -
sy) + AT(
i) * x(
i +
sz) + AB(
i) * x(
i -
sz);
199 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
200 Kokkos::parallel_for(
205 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
207 y(
i) =
AC(
i) * x(
i) + AE(
i) * x(
i +
sx) + AW(
i) * x(
i -
sx) + AN(
i) * x(
i +
sy) +
208 AS(
i) * x(
i -
sy) + AT(
i) * x(
i +
sz) + AB(
i) * x(
i -
sz);
217 "peclet::flow::correct",
C3{g, g, g},
C3{e.x - g, e.y - g, e.z - g},
219 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
221 u(
i) -= phi(
i) - phi(
i -
sx);
222 v(
i) -= phi(
i) - phi(
i -
sy);
223 w(
i) -= phi(
i) - phi(
i -
sz);
232 double rho0,
C3 e,
int g) {
234 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
235 Kokkos::parallel_for(
236 "peclet::flow::correct_var",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
238 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
240 u(
i) -=
rho0 / (0.5 * (rho(
i) + rho(
i -
sx))) * (phi(
i) - phi(
i -
sx));
241 v(
i) -=
rho0 / (0.5 * (rho(
i) + rho(
i -
sy))) * (phi(
i) - phi(
i -
sy));
242 w(
i) -=
rho0 / (0.5 * (rho(
i) + rho(
i -
sz))) * (phi(
i) - phi(
i -
sz));
254 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
255 Kokkos::parallel_for(
256 "peclet::flow::rho_coeff",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
258 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
276 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
277 Kokkos::parallel_for(
278 "peclet::flow::diverg_open_eps",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
280 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
298 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
299 Kokkos::parallel_for(
300 "peclet::flow::porous_coeff",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
302 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
320 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
321 Kokkos::parallel_for(
322 "peclet::flow::porous_coeff_drag",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
324 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
326 cx(
i) = ox(
i) * 0.5 * (
eps(
i) +
eps(
i -
sx)) * idt / (idt + 0.5 * (beta(
i) + beta(
i -
sx)));
327 cy(
i) = oy(
i) * 0.5 * (
eps(
i) +
eps(
i -
sy)) * idt / (idt + 0.5 * (beta(
i) + beta(
i -
sy)));
328 cz(
i) = oz(
i) * 0.5 * (
eps(
i) +
eps(
i -
sz)) * idt / (idt + 0.5 * (beta(
i) + beta(
i -
sz)));
345 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
346 Kokkos::parallel_for(
347 "peclet::flow::porous_coeff_cons",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
349 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
351 auto cf = [&](
long s,
CCConst o) {
353 const double bF =
useBeta ? 0.5 * (beta(
i) + beta(
i - s)) : 0.0;
365 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
366 Kokkos::parallel_for(
367 "peclet::flow::correct_porous_cons",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
369 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
371 auto wf = [&](
long s) {
373 const double bF =
useBeta ? 0.5 * (beta(
i) + beta(
i - s)) : 0.0;
385 double idt,
C3 e,
int g) {
387 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
388 Kokkos::parallel_for(
389 "peclet::flow::correct_porous_drag",
MD(
space, {g, g, g}, {e.x - g, e.y - g, e.z - g}),
391 const long sx = 1,
sy = e.x,
sz = (
long)e.x * e.y;
393 u(
i) -= idt / (idt + 0.5 * (beta(
i) + beta(
i -
sx))) * (phi(
i) - phi(
i -
sx));
394 v(
i) -= idt / (idt + 0.5 * (beta(
i) + beta(
i -
sy))) * (phi(
i) - phi(
i -
sy));
395 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 buildPorousCoeffCons(CCField cx, CCField cy, CCField cz, CCConst ox, CCConst oy, CCConst oz, CCConst eps, CCConst beta, bool useBeta, double rhoidt, 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 cutcellSmoothColorBox(CCField phi, CCConst b, OpV AC, OpV AW, OpV AE, OpV AS, OpV AN, OpV AB, OpV AT, C3 e, C3 og, int color, C3 rlo, C3 rhi, C3 slo, C3 shi)
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 ccFor3(const char *name, C3 lo, C3 hi, F f)
void ibmFillEntry(const OV &o, int list_idx, int c_idx, float sdf_c, const float sdf_n[6], int bc_type, const float *thEx)
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)
void projectCorrectPorousCons(CCField u, CCField v, CCField w, CCConst phi, CCConst eps, CCConst beta, bool useBeta, double rhoidt, C3 e, int g)
bool hostRunSerial(long cells)
void applyCutcellOpBox(CCField y, CCConst x, OpV AC, OpV AW, OpV AE, OpV AS, OpV AN, OpV AB, OpV AT, C3 e, C3 rlo, C3 rhi, C3 slo, C3 shi)
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