23 Kokkos::initialize(
argc, argv);
28 I3 e{inner.x + 2 * g, inner.y + 2 * g, inner.z + 2 * g};
30 const std::size_t n = (std::size_t)e.x * e.y * e.z;
33 std::uniform_real_distribution<double>
uf(-1.0, 1.0);
35 for (std::size_t i = 0; i < n; ++i) {
43 auto up = [&](
const char*
nm, std::vector<double>& h) {
45 auto m = Kokkos::create_mirror_view(v);
46 for (std::size_t i = 0; i < n; ++i)
48 Kokkos::deep_copy(v, m);
58 auto hp = Kokkos::create_mirror_view(phi);
59 Kokkos::deep_copy(hp, phi);
60 auto hdo = Kokkos::create_mirror_view(
dout);
66 for (
int z = g; z < e.z - g; ++z)
67 for (
int y = g; y < e.y - g; ++y)
68 for (
int x = g; x < e.x - g; ++x) {
69 if ((((x + og.x) + (y + og.y) + (z + og.z)) & 1) !=
color)
71 long i =
l3(x, y, z, e),
sx = 1, sy = e.x, sz = (
long)e.x * e.y;
74 rphi[i] = (s -
hd[i]) / 6.0;
76 auto close = [](
double a,
double b) {
77 return std::fabs(a - b) <= 1e-10 * (1.0 + std::fabs(b));
80 for (std::size_t i = 0; i < n; ++i)
83 for (
int z = g; z < e.z - g; ++z)
84 for (
int y = g; y < e.y - g; ++y)
85 for (
int x = g; x < e.x - g; ++x) {
86 long i =
l3(x, y, z, e),
sx = 1, sy = e.x, sz = (
long)e.x * e.y;
87 double rd = (
hu[i +
sx] -
hu[i]) + (
hv[i + sy] -
hv[i]) + (
hw[i + sz] -
hw[i]);
92 std::fprintf(
stderr,
"FAIL: %d cells differ (sweep/divergence)\n",
bad);
100 auto m = Kokkos::create_mirror_view(
phi2);
101 Kokkos::deep_copy(m,
phi2);
103 for (
int z = g; z < e.z - g; ++z)
104 for (
int y = g; y < e.y - g; ++y)
105 for (
int x = g; x < e.x - g; ++x) {
106 long i =
l3(x, y, z, e),
sx = 1, sy = e.x, sz = (
long)e.x * e.y;
107 double s = m(i +
sx) + m(i -
sx) + m(i + sy) + m(i - sy) + m(i + sz) + m(i - sz);
108 double res = (s - 6.0 * m(i)) -
hd[i];
114 for (
int it = 0; it < 100; ++it)
117 if (!(r1 < 0.2 * r0)) {
118 std::fprintf(
stderr,
"FAIL: smoother did not reduce residual (%.3e -> %.3e)\n", r0, r1);
124 "[mac_stencils] PASS: RB-GS sweep + divergence match host; residual %.2e -> %.2e (exec: "
126 r0, r1, SExec::name());
145 const int ex = 6, ey = 5, ez = 4;
146 const std::size_t n = (std::size_t)ex * ey * ez;
147 const C3 e3{ex, ey, ez};
148 const double mu = 0.1, idiag = 1.0 / 50.0;
151 FPV all[7] = {
AC, AW, AE, AS, AN, AB, AT};
152 for (
int k = 0; k < 7; ++k) {
153 auto m = Kokkos::create_mirror_view(all[k]);
154 Kokkos::deep_copy(m, all[k]);
158 FPV AC(
"AC", n), AW(
"AW", n), AE(
"AE", n), AS(
"AS", n), AN(
"AN", n), AB(
"AB", n), AT(
"AT", n);
162 const double w[3] = {1.0, 4.0, 0.25};
163 const double bx = mu * w[0],
by = mu * w[1],
bz = mu * w[2];
167 const char*
nm[7] = {
"AC",
"AW",
"AE",
"AS",
"AN",
"AB",
"AT"};
168 const char*
who[2] = {
"ibmBuildDiffusion",
"buildConstAniso"};
169 for (
int k = 0; k < 2; ++k) {
171 ibmBuildDiffusion(
AC, AW, AE, AS, AN, AB, AT, ex, ey, ez,
bx,
by,
bz, idiag);
173 buildConstAniso(
AC, AW, AE, AS, AN, AB, AT,
e3,
bx,
by,
bz, idiag);
176 for (
int b = 0; b < 7; ++b)
177 if (!(
got[b] == want[b])) {
178 std::fprintf(
stderr,
"FAIL: %s aniso %s = %.17g, want %.17g\n",
who[k],
nm[b],
179 (
double)
got[b], (
double)want[b]);
184 "[aniso_fold] %-17s w=(1,4,0.25): AC %.17g AW/AE %.17g AS/AN %.17g AB/AT %.17g\n",
185 who[k], (
double)
got[0], (
double)
got[1], (
double)
got[3], (
double)
got[5]);
191 const double beta = mu;
194 const char*
nm[7] = {
"AC",
"AW",
"AE",
"AS",
"AN",
"AB",
"AT"};
195 const char*
who[2] = {
"ibmBuildDiffusion",
"buildConstAniso"};
196 for (
int k = 0; k < 2; ++k) {
198 ibmBuildDiffusion(
AC, AW, AE, AS, AN, AB, AT, ex, ey, ez, beta, beta, beta, idiag);
200 buildConstAniso(
AC, AW, AE, AS, AN, AB, AT,
e3, beta, beta, beta, idiag);
203 for (
int b = 0; b < 7; ++b)
204 if (!(
got[b] == want[b])) {
205 std::fprintf(
stderr,
"FAIL: %s isotropic %s = %.17g, want (legacy) %.17g\n",
who[k],
206 nm[b], (
double)
got[b], (
double)want[b]);
210 std::printf(
"[aniso_fold] %-17s w=(1,1,1): AC %.17g == idiag+6*beta %.17g (bitwise)\n",
215 std::printf(
"[aniso_fold] PASS: per-axis viscous fold; isotropic == legacy bitwise\n");
void buildConstAniso(FPV AC, FPV AW, FPV AE, FPV AS, FPV AN, FPV AB, FPV AT, C3 e, double bx, double by, double bz, double idiag)
void ibmBuildDiffusion(MV AC, MV AW, MV AE, MV AS, MV AN, MV AB, MV AT, int ex, int ey, int ez, double bx, double by, double bz, double idiag)