11#ifndef PECLET_FLOW_MAC_IBM_HPP
12#define PECLET_FLOW_MAC_IBM_HPP
14#include <Kokkos_Core.hpp>
23using MConst = Kokkos::View<const float*, CCMem>;
33 for (
int k = 0;
k < 6; ++
k)
46 Kokkos::View<int*, CCMem> idMap, Kokkos::View<int, CCMem> counter,
50 Kokkos::deep_copy(
space, counter, 0);
51 Kokkos::deep_copy(
space, idMap, -1);
52 const bool hasEx =
tx.size() > 0;
53 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
55 "peclet::flow::ibm_build_overlay",
MD(
space, {g, g, g}, {ext.
x - g, ext.
y - g, ext.
z - g}),
59 const int d[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
61 for (
int k = 0;
k < 6; ++
k)
66 const int slot = Kokkos::atomic_fetch_add(&counter(), 1);
75 auto wrap = [](
int v,
int n) { v %=
n;
return v < 0 ? v +
n : v; };
77 for (
int a = 0;
a < 3; ++
a) {
79 const int mx =
a == 0 ? wrap(
ix - 1,
nn.x) :
ix;
80 const int my =
a == 1 ? wrap(
iy - 1,
nn.y) :
iy;
81 const int mz =
a == 2 ? wrap(
iz - 1,
nn.z) :
iz;
91 Kokkos::deep_copy(
cnt, counter);
98 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
100 "peclet::flow::ibm_volfrac",
MD(
space, {0, 0, 0}, {ext.
x, ext.
y, ext.
z}),
104 const double t = 0.5 +
sd;
105 theta(
i) =
t < 0.0 ? 0.0 : (
t > 1.0 ? 1.0 :
t);
112 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
113 Kokkos::parallel_for(
114 "peclet::flow::ibm_solid",
MD(
space, {0, 0, 0}, {ext.
x, ext.
y, ext.
z}),
118 mask(
i) = (
sd < 0.0) ? 1.0 : 0.0;
125 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
126 Kokkos::parallel_for(
127 "peclet::flow::ibm_clean",
MD(
space, {0, 0, 0}, {ext.
x, ext.
y, ext.
z}),
131 const int d[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
133 for (
int k = 0;
k < 6; ++
k)
136 const bool solid = (sc <= 0.0f);
152 if constexpr (std::is_same_v<typename CCExec::memory_space, Kokkos::HostSpace>) {
153 const int nyi = ext.
y - 2 * g,
nzi = ext.
z - 2 * g;
154 Kokkos::parallel_for(
155 "peclet::flow::ibm_rbgs", Kokkos::RangePolicy<CCExec>(
space, 0, (
long)
nyi *
nzi),
157 const int ly = g + (int)(
t %
nyi),
lz = g + (int)(
t /
nyi);
159 const int P = (
color + og.x + og.y +
ly + og.z +
lz) & 1;
160 for (
int lx = g + ((
P ^ (g & 1)) & 1);
lx < ext.
x - g;
lx += 2) {
166 const double ac =
AC(
i);
167 if (Kokkos::fabs(
ac) < 1e-30)
172 x(
i) = (b(
i) - s) /
ac;
177 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
178 Kokkos::parallel_for(
179 "peclet::flow::ibm_rbgs",
MD(
space, {g, g, g}, {ext.
x - g, ext.
y - g, ext.
z - g}),
181 if (((og.x +
lx + og.y +
ly + og.z +
lz) & 1) !=
color)
189 const double ac =
AC(
i);
190 if (Kokkos::fabs(
ac) < 1e-30)
195 x(
i) = (b(
i) - s) /
ac;
208 if constexpr (std::is_same_v<typename CCExec::memory_space, Kokkos::HostSpace>) {
209 const int nyi = ext.
y - 2 * g,
nzi = ext.
z - 2 * g;
210 Kokkos::parallel_reduce(
211 "peclet::flow::ibm_rbgs_du", Kokkos::RangePolicy<CCExec>(
space, 0, (
long)
nyi *
nzi),
213 const int ly = g + (int)(
t %
nyi),
lz = g + (int)(
t /
nyi);
215 const int P = (
color + og.x + og.y +
ly + og.z +
lz) & 1;
216 for (
int lx = g + ((
P ^ (g & 1)) & 1);
lx < ext.
x - g;
lx += 2) {
222 const double ac =
AC(
i);
223 if (Kokkos::fabs(
ac) < 1e-30)
228 const double xn = (b(
i) - s) /
ac;
229 const double d = Kokkos::fabs(
xn - x(
i));
235 Kokkos::Max<double>(du));
238 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
239 Kokkos::parallel_reduce(
240 "peclet::flow::ibm_rbgs_du",
MD(
space, {g, g, g}, {ext.
x - g, ext.
y - g, ext.
z - g}),
242 if (((og.x +
lx + og.y +
ly + og.z +
lz) & 1) !=
color)
250 const double ac =
AC(
i);
251 if (Kokkos::fabs(
ac) < 1e-30)
256 const double xn = (b(
i) - s) /
ac;
257 const double d = Kokkos::fabs(
xn - x(
i));
262 Kokkos::Max<double>(du));
277 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
278 Kokkos::parallel_for(
283 if (((og.x +
lx + og.y +
ly + og.z +
lz) & 1) !=
color)
291 const double ac =
AC(
i);
292 if (Kokkos::fabs(
ac) < 1e-30)
297 x(
i) = (b(
i) - s) /
ac;
314 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
315 Kokkos::parallel_reduce(
320 if (((og.x +
lx + og.y +
ly + og.z +
lz) & 1) !=
color)
328 const double ac =
AC(
i);
329 if (Kokkos::fabs(
ac) < 1e-30)
334 const double xn = (b(
i) - s) /
ac;
335 const double d = Kokkos::fabs(
xn - x(
i));
340 Kokkos::Max<double>(du));
346 ibmRbgsStencilColor(x, b,
AC, AW, AE, AS, AN, AB, AT,
solidmask, ext, og, g, 0);
347 ibmRbgsStencilColor(x, b,
AC, AW, AE, AS, AN, AB, AT,
solidmask, ext, og, g, 1);
flow — portable (Kokkos) Robust-Scaled cut-cell IBM primitives + per-cut-cell overlay build.
flow — portable (Kokkos) cut-cell pressure-operator face openness from an SDF.
void ibmSolidMask(CCField mask, CCConst sdf, C3 ext, Off3 off)
void ibmCleanFluidMask(CCField m, CCConst sdf, C3 ext, Off3 off)
double ibmRbgsStencilColorDuBox(CCField x, CCConst b, MConst AC, MConst AW, MConst AE, MConst AS, MConst AN, MConst AB, MConst AT, CCConst solidmask, C3 ext, C3 og, int color, C3 rlo, C3 rhi, C3 slo, C3 shi)
double ibmRbgsStencilColorDu(CCField x, CCConst b, MConst AC, MConst AW, MConst AE, MConst AS, MConst AN, MConst AB, MConst AT, CCConst solidmask, C3 ext, C3 og, int g, int color)
void ibmRbgsStencilColor(CCField x, CCConst b, MConst AC, MConst AW, MConst AE, MConst AS, MConst AN, MConst AB, MConst AT, CCConst solidmask, C3 ext, C3 og, int g, int color)
bool ibmIsCut(float sc, const float sn[6])
void ibmRbgsSweep(CCField x, CCConst b, MConst AC, MConst AW, MConst AE, MConst AS, MConst AN, MConst AB, MConst AT, CCConst solidmask, C3 ext, C3 og, int g)
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)
int buildIbmOverlay(CCConst sdf, C3 ext, int g, Off3 off, int bc_type, const IbmOverlay &ov, Kokkos::View< int *, CCMem > idMap, Kokkos::View< int, CCMem > counter, CCConst tx=CCConst(), CCConst ty=CCConst(), CCConst tz=CCConst(), C3 nn=C3{0, 0, 0})
Kokkos::View< double *, CCMem > CCField
Kokkos::DefaultExecutionSpace CCExec
void ibmRbgsStencilColorBox(CCField x, CCConst b, MConst AC, MConst AW, MConst AE, MConst AS, MConst AN, MConst AB, MConst AT, CCConst solidmask, C3 ext, C3 og, int color, C3 rlo, C3 rhi, C3 slo, C3 shi)
Kokkos::View< const float *, CCMem > MConst
double ccSampleExt(CCConst sdf, C3 ext, double x, double y, double z)
Kokkos::View< const double *, CCMem > CCConst
void ibmVolfrac(CCField theta, CCConst sdf, C3 ext, Off3 off)
static constexpr double AC