15int main(
int argc,
char** argv) {
16 Kokkos::initialize(argc, argv);
19 const int N = 64, g = 1;
20 I3 e{
N + 2 * g,
N + 2 * g,
N + 2 * g};
21 const std::size_t n = (std::size_t)e.x * e.y * e.z;
25 std::uniform_real_distribution<double> uf(-1.0, 1.0);
26 std::vector<double> hd(n, 0.0);
29 for (
int z = g; z < e.z - g; ++z)
30 for (
int y = g; y < e.y - g; ++y)
31 for (
int x = g; x < e.x - g; ++x) {
32 long i = (long)x + (
long)y * e.x + (long)z * (
long)e.x * e.y;
37 double mean = sum / cnt;
38 for (
int z = g; z < e.z - g; ++z)
39 for (
int y = g; y < e.y - g; ++y)
40 for (
int x = g; x < e.x - g; ++x) {
41 long i = (long)x + (
long)y * e.x + (long)z * (
long)e.x * e.y;
47 auto m = Kokkos::create_mirror_view(d);
48 for (std::size_t i = 0; i < n; ++i)
50 Kokkos::deep_copy(d, m);
54 std::printf(
"[mg] N=%d levels=%d\n",
N, mg.
numLevels());
57 for (
int nv = 1; nv <= 6; ++nv) {
61 double factor = (nv > 1) ? res / prev : 0.0;
62 std::printf(
"[mg] %d V-cycle(s): max|resid|=%.3e (factor vs prev %.3f)\n", nv, res, factor);
71 std::fprintf(stderr,
"FAIL: 8 V-cycles did not converge (resid %.3e)\n", res8);
74 std::printf(
"[mg] PASS: 8 V-cycles -> max|resid|=%.3e (exec %s)\n", res8, SExec::name());