14int main(
int argc,
char** argv) {
15 Kokkos::initialize(argc, argv);
19 const double dx = 1.0, dy = 1.0, dz = 1.0;
20 const std::size_t n = (std::size_t)ext.
x * ext.y * ext.z;
21 auto IDX = [&](
int x,
int y,
int z) {
22 return (std::size_t)x + (std::size_t)y * ext.x + (std::size_t)z * (std::size_t)ext.x * ext.y;
26 std::vector<double> hsdf(n);
27 const double cx = 8, cy = 8, cz = 8, R = 5;
28 for (
int z = 0; z < ext.z; ++z)
29 for (
int y = 0; y < ext.y; ++y)
30 for (
int x = 0; x < ext.x; ++x)
32 std::sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy) + (z - cz) * (z - cz)) - R;
34 auto upC = [&](
const char* nm, std::vector<double>& h) {
36 auto m = Kokkos::create_mirror_view(v);
37 for (std::size_t i = 0; i < n; ++i)
39 Kokkos::deep_copy(v, m);
43 std::vector<double> o(n);
44 auto m = Kokkos::create_mirror_view(v);
45 Kokkos::deep_copy(m, v);
46 for (std::size_t i = 0; i < n; ++i)
51 CCField sdf = upC(
"sdf", hsdf), ox(
"ox", n), oy(
"oy", n), oz(
"oz", n);
53 auto gox = getC(ox), goy = getC(oy), goz = getC(oz);
56 auto close = [](
double a,
double b) {
57 return std::fabs(a - b) <= 1e-10 * (1.0 + std::fabs(b));
61 auto sampleH = [&](
double X,
double Y,
double Z) {
62 double fx = std::floor(X), fy = std::floor(Y), fz = std::floor(Z);
63 double wx = X - fx, wy = Y - fy, wz = Z - fz;
64 int x0 = (int)fx, y0 = (
int)fy, z0 = (int)fz;
65 auto cl = [&](
int v,
int nn) {
return v < 0 ? 0 : (v >= nn ? nn - 1 : v); };
66 int x1 = cl(x0 + 1, ext.x), y1 = cl(y0 + 1, ext.y), z1 = cl(z0 + 1, ext.z);
70 auto F = [&](
int xx,
int yy,
int zz) {
return hsdf[IDX(xx, yy, zz)]; };
71 double c00 =
F(x0, y0, z0) * (1 - wx) +
F(x1, y0, z0) * wx,
72 c10 =
F(x0, y1, z0) * (1 - wx) +
F(x1, y1, z0) * wx;
73 double c01 =
F(x0, y0, z1) * (1 - wx) +
F(x1, y0, z1) * wx,
74 c11 =
F(x0, y1, z1) * (1 - wx) +
F(x1, y1, z1) * wx;
75 double c0 = c00 * (1 - wy) + c10 * wy, c1 = c01 * (1 - wy) + c11 * wy;
76 return c0 * (1 - wz) + c1 * wz;
78 auto faceH = [&](
double X,
double Y,
double Z,
int type) {
79 double sd = sampleH(X, Y, Z);
83 return ccFractionCore(sd, sampleH(X + e, Y, Z), sampleH(X - e, Y, Z), sampleH(X, Y + e, Z),
84 sampleH(X, Y - e, Z), sampleH(X, Y, Z + e), sampleH(X, Y, Z - e), type,
87 for (
int z = 0; z < ext.z; ++z)
88 for (
int y = 0; y < ext.y; ++y)
89 for (
int x = 0; x < ext.x; ++x) {
90 std::size_t i = IDX(x, y, z);
91 if (!close(gox[i], faceH(x - 0.5, y, z, 1)))
93 if (!close(goy[i], faceH(x, y - 0.5, z, 2)))
95 if (!close(goz[i], faceH(x, y, z - 0.5, 3)))
99 std::fprintf(stderr,
"FAIL: %d openness faces differ\n", bad);
104 int cut = 0, open1 = 0, closed0 = 0;
105 for (std::size_t i = 0; i < n; ++i) {
107 if (v > 1e-9 && v < 1 - 1e-9)
109 else if (v > 1 - 1e-9)
116 std::vector<double> allf(n, 100.0), alls(n, -100.0);
117 CCField sf = upC(
"sf", allf), so = upC(
"so", alls), a(
"a", n), b(
"b", n), c(
"c", n);
120 for (std::size_t i = 0; i < n; ++i)
121 if (!close(ga[i], 1.0))
125 for (std::size_t i = 0; i < n; ++i)
126 if (!close(ga2[i], 0.0))
128 if (bad && !status) {
129 std::fprintf(stderr,
"FAIL: all-fluid/all-solid property\n");
135 "[mac_cutcell] PASS: openness matches host (%d cut / %d open / %d closed x-faces) + "
136 "properties (exec: %s)\n",
137 cut, open1, closed0, CCExec::name());