9#ifndef PECLET_FLOW_MAC_CUTCELL_HPP
10#define PECLET_FLOW_MAC_CUTCELL_HPP
13#include <Kokkos_Core.hpp>
14#include <Kokkos_MathematicalFunctions.hpp>
20using CCExec = Kokkos::DefaultExecutionSpace;
21using CCMem = CCExec::memory_space;
22using CCField = Kokkos::View<double*, CCMem>;
23using CCConst = Kokkos::View<const double*, CCMem>;
32 double sym,
double szp,
double szm,
int type,
33 double dx,
double dy,
double dz) {
42 double denom = (type == 1) ? (Kokkos::fabs(ny) *
dy + Kokkos::fabs(nz) *
dz)
43 : (type == 2) ? (Kokkos::fabs(nx) *
dx + Kokkos::fabs(nz) *
dz)
44 : (Kokkos::fabs(nx) *
dx + Kokkos::fabs(ny) *
dy);
56 const double fx = Kokkos::floor(x),
fy = Kokkos::floor(y),
fz = Kokkos::floor(z);
59 auto cl = [](
int v,
int n) {
return v < 0 ? 0 : (v >= n ? n - 1 : v); };
64 const long sy = ext.
x,
sz =
static_cast<long>(ext.
x) * ext.
y;
65 auto F = [&](
int xx,
int yy,
int zz) {
66 return sdf(
static_cast<long>(
xx) +
static_cast<long>(
yy) *
sy +
static_cast<long>(
zz) *
sz);
73 return c0 * (1 -
wz) + c1 *
wz;
77 int type,
double dx,
double dy,
double dz) {
83 sd,
ccSampleExt(sdf, ext,
fx + e,
fy,
fz),
ccSampleExt(sdf, ext,
fx - e,
fy,
fz),
84 ccSampleExt(sdf, ext,
fx,
fy + e,
fz),
ccSampleExt(sdf, ext,
fx,
fy - e,
fz),
85 ccSampleExt(sdf, ext,
fx,
fy,
fz + e),
ccSampleExt(sdf, ext,
fx,
fy,
fz - e), type,
dx,
dy,
93 const bool pa = a >= 0.0,
pb = b >= 0.0,
pc = c >= 0.0;
94 const int np = (
pa ? 1 : 0) + (
pb ? 1 : 0) + (
pc ? 1 : 0);
101 if (
pa) { x = a; y = b; z = c; }
else if (
pb) { x = b; y = c; z = a; }
else { x = c; y = a; z = b; }
102 const double den = (x - y) * (x - z);
103 return den > 1e-300 ? (x * x) /
den : 1.0;
106 if (!
pa) { x = a; y = b; z = c; }
else if (!
pb) { x = b; y = c; z = a; }
else { x = c; y = a; z = b; }
107 const double den = (x - y) * (x - z);
108 return 1.0 - (
den > 1e-300 ? (x * x) /
den : 1.0);
122 const double e = 0.5;
127 }
else if (type == 2) {
143 if (
frac > 1.0 - 1e-12)
152 double dy,
double dz,
int order = 1) {
154 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
156 Kokkos::parallel_for(
157 "peclet::flow::cc_open_ms",
MD(
space, {0, 0, 0}, {ext.
x, ext.
y, ext.
z}),
159 const long i =
static_cast<long>(
lx) +
static_cast<long>(
ly) * ext.
x +
160 static_cast<long>(
lz) *
static_cast<long>(ext.
x) * ext.
y;
167 Kokkos::parallel_for(
168 "peclet::flow::cc_open",
MD(
space, {0, 0, 0}, {ext.
x, ext.
y, ext.
z}),
170 const long i =
static_cast<long>(
lx) +
static_cast<long>(
ly) * ext.
x +
171 static_cast<long>(
lz) *
static_cast<long>(ext.
x) * ext.
y;
191 static const long n = [] {
192 const char* e = std::getenv(
"PECLET_FLOW_HOST_SERIAL_CELLS");
193 return e ? std::atol(e) : 8192L;
199 if constexpr (std::is_same_v<typename CCExec::memory_space, Kokkos::HostSpace>)
213 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
214 if constexpr (std::is_same_v<typename CCExec::memory_space, Kokkos::HostSpace>) {
222 Kokkos::parallel_for(
223 name,
MD(
space, {
lo.x,
lo.y,
lo.z}, {
hi.x,
hi.y,
hi.z}, {
hi.x -
lo.x, 2, 2}), f);
232template <
class F,
class R>
235 using MD = Kokkos::MDRangePolicy<CCExec, Kokkos::Rank<3>>;
236 if constexpr (std::is_same_v<typename CCExec::memory_space, Kokkos::HostSpace>) {
237 Kokkos::parallel_reduce(
238 name,
MD(
space, {
lo.x,
lo.y,
lo.z}, {
hi.x,
hi.y,
hi.z}, {
hi.x -
lo.x, 2, 2}), f,
long hostSerialCellCutoff()
CCExec::memory_space CCMem
double ccFaceOpen(CCConst sdf, C3 ext, double fx, double fy, double fz, int type, double dx, double dy, double dz)
double ccFaceOpenMS(CCConst sdf, C3 ext, double fx, double fy, double fz, int type)
double ccFractionCore(double sd, double sxp, double sxm, double syp, double sym, double szp, double szm, int type, double dx, double dy, double dz)
double ccTriFrac(double a, double b, double c)
void ccReduce3(const char *name, C3 lo, C3 hi, F f, R &&reducer)
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)
Kokkos::View< double *, CCMem > CCField
Kokkos::DefaultExecutionSpace CCExec
double ccSampleExt(CCConst sdf, C3 ext, double x, double y, double z)
void buildOpenness(CCField ox, CCField oy, CCField oz, CCConst sdf, C3 ext, double dx, double dy, double dz, int order=1)
bool hostRunSerial(long cells)
Kokkos::View< const double *, CCMem > CCConst
static constexpr double F