18static int run(
int bc) {
20 std::mt19937 rng(100 + SCHEME * 7 + bc);
21 std::uniform_real_distribution<float> uc(0.05f, 0.95f);
22 std::uniform_real_distribution<float> us(-0.95f, -0.05f);
23 std::uniform_real_distribution<float> uf(0.05f, 0.95f);
24 std::uniform_real_distribution<float> u01(0.f, 1.f);
26 std::vector<float> hc(
N), hn((std::size_t)
N * 6);
27 for (
int i = 0; i <
N; ++i) {
30 bool sandwich_x = u01(rng) < 0.33f;
31 for (
int k = 0; k < 6; ++k) {
33 if (sandwich_x && (k == 0 || k == 1))
36 solid = u01(rng) < 0.5f;
37 hn[(std::size_t)i * 6 + k] = solid ? us(rng) : uf(rng);
42 Kokkos::View<float*, IMem> dc(
"dc",
N), dn(
"dn", (std::size_t)
N * 6);
44 auto m = Kokkos::create_mirror_view(dc);
45 for (
int i = 0; i <
N; ++i)
47 Kokkos::deep_copy(dc, m);
50 auto m = Kokkos::create_mirror_view(dn);
51 for (std::size_t i = 0; i < (std::size_t)
N * 6; ++i)
53 Kokkos::deep_copy(dn, m);
56 Kokkos::View<int*, IMem>(
"nb",
N),
57 Kokkos::View<float*, IMem>(
"dr",
N),
58 Kokkos::View<int*, IMem>(
"dirc", (std::size_t)
N * 6),
59 Kokkos::View<float*, IMem>(
"K", (std::size_t)
N * 6),
60 Kokkos::View<float*, IMem>(
"M", (std::size_t)
N * 6),
61 Kokkos::View<float*, IMem>(
"X", (std::size_t)
N * 6),
62 Kokkos::View<float*, IMem>(
"Nbc", (std::size_t)
N * 6),
63 Kokkos::View<float*, IMem>(
"R", (std::size_t)
N * 6)};
65 "ibm_build", Kokkos::RangePolicy<DSpace>(0,
N), KOKKOS_LAMBDA(
int i) {
67 for (
int k = 0; k < 6; ++k)
68 sn[k] = dn((std::size_t)i * 6 + k);
69 ibmFillEntry<SCHEME>(dev, i, i * 10, dc(i), sn, bc);
75 HOV h{Kokkos::View<int*, Kokkos::HostSpace>(
"hci",
N),
76 Kokkos::View<int*, Kokkos::HostSpace>(
"hnb",
N),
77 Kokkos::View<float*, Kokkos::HostSpace>(
"hdr",
N),
78 Kokkos::View<int*, Kokkos::HostSpace>(
"hdirc", (std::size_t)
N * 6),
79 Kokkos::View<float*, Kokkos::HostSpace>(
"hK", (std::size_t)
N * 6),
80 Kokkos::View<float*, Kokkos::HostSpace>(
"hM", (std::size_t)
N * 6),
81 Kokkos::View<float*, Kokkos::HostSpace>(
"hX", (std::size_t)
N * 6),
82 Kokkos::View<float*, Kokkos::HostSpace>(
"hNbc", (std::size_t)
N * 6),
83 Kokkos::View<float*, Kokkos::HostSpace>(
"hR", (std::size_t)
N * 6)};
84 for (
int i = 0; i <
N; ++i) {
86 for (
int k = 0; k < 6; ++k)
87 sn[k] = hn[(std::size_t)i * 6 + k];
88 ibmFillEntry<SCHEME>(h, i, i * 10, hc[i], sn, bc);
91 auto cmp1i = [&](Kokkos::View<int*, IMem> dv, Kokkos::View<int*, Kokkos::HostSpace> hv,
93 auto m = Kokkos::create_mirror_view(dv);
94 Kokkos::deep_copy(m, dv);
96 for (std::size_t i = 0; i < n; ++i)
101 auto cmp1f = [&](Kokkos::View<float*, IMem> dv, Kokkos::View<float*, Kokkos::HostSpace> hv,
103 auto m = Kokkos::create_mirror_view(dv);
104 Kokkos::deep_copy(m, dv);
106 for (std::size_t i = 0; i < n; ++i)
107 if (std::fabs((
double)m(i) - (
double)hv(i)) > 1e-5 * (1.0 + std::fabs((
double)hv(i))))
112 bad += cmp1i(dev.cell_index, h.cell_index,
N) + cmp1i(dev.num_boundaries, h.num_boundaries,
N) +
113 cmp1i(dev.dir_code, h.dir_code, (std::size_t)
N * 6);
114 bad += cmp1f(dev.D_rescale, h.D_rescale,
N);
115 bad += cmp1f(dev.K_val, h.K_val, (std::size_t)
N * 6) +
116 cmp1f(dev.M_val, h.M_val, (std::size_t)
N * 6) +
117 cmp1f(dev.X_val, h.X_val, (std::size_t)
N * 6) +
118 cmp1f(dev.Nbc_val, h.Nbc_val, (std::size_t)
N * 6) +
119 cmp1f(dev.R_val, h.R_val, (std::size_t)
N * 6);