29static std::vector<double>
packingSdf(
double rfrac = 0.18) {
30 const double R = rfrac *
N;
31 std::vector<double> sdf((std::size_t)
N *
N *
N);
32 const double cs[2] = {0.25 *
N, 0.75 *
N};
33 for (
int z = 0; z <
N; ++z)
34 for (
int y = 0; y <
N; ++y)
35 for (
int x = 0; x <
N; ++x) {
39 for (
double sz : cs) {
40 auto wrap = [](
double d) {
return d -
N * std::round(d /
N); };
41 const double dx = wrap(x - sx), dy = wrap(y - sy), dz = wrap(z - sz);
42 best = std::min(best, std::sqrt(dx * dx + dy * dy + dz * dz) - R);
44 sdf[(std::size_t)x + (std::size_t)y *
N + (std::size_t)z *
N *
N] = best;
61static std::vector<double>
localSdf(
const std::vector<double>& g,
const BlockDecomposer<3>& dec,
63 auto b = dec.block(rank);
64 const int ox = (int)b.origin[0], oy = (
int)b.origin[1], oz = (int)b.origin[2];
65 const int lnx = (int)b.size[0], lny = (
int)b.size[1], lnz = (int)b.size[2];
66 std::vector<double> l((std::size_t)lnx * lny * lnz);
67 for (
int z = 0; z < lnz; ++z)
68 for (
int y = 0; y < lny; ++y)
69 for (
int x = 0; x < lnx; ++x)
70 l[(std::size_t)x + (std::size_t)y * lnx + (std::size_t)z * lnx * lny] =
71 g[(std::size_t)(x + ox) + (std::size_t)(y + oy) *
N + (std::size_t)(z + oz) *
N *
N];
92int main(
int argc,
char** argv) {
93 MPI_Init(&argc, &argv);
94 Kokkos::initialize(argc, argv);
95 int fail = 0, size = 1, rank = 0;
97 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
98 MPI_Comm_size(MPI_COMM_WORLD, &size);
103 std::vector<peclet::core::Real> w((std::size_t)
N *
N *
N, 1.0);
104 for (
int z = 0; z <
N; ++z)
105 for (
int y = 0; y <
N; ++y)
106 for (
int x = 0; x <
N; ++x)
108 w[(std::size_t)x + (std::size_t)y *
N + (std::size_t)z *
N *
N] = 6.0;
109 BlockDecomposer<3> dec((std::size_t)size, IVec<3>{
N,
N,
N}, w);
111 const double k_amg =
perm(gsdf, dec, rank,
true, MPI_COMM_WORLD);
116 IbmSolver ref(
N,
N,
N);
118 ref.setSolid(gsdf,
true);
119 for (
int it = 0; it <
STEPS; ++it)
122 for (
double v : ref.getVelocity(0))
124 k_ref =
MU * (rs / ((double)
N *
N *
N)) /
F;
126 MPI_Bcast(&k_ref, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
128 const double reld = std::fabs(k_amg - k_ref) / (std::fabs(k_ref) + 1e-30);
129 const double tol = (size == 1) ? 1e-9 : 2e-4;
131 std::printf(
" GraphAMG on weighted ORB: k=%.8e ref=%.8e rel=%.2e (np=%d, tol %.0e)\n",
132 k_amg, k_ref, reld, size, tol);
133 if (!(reld < tol) || !std::isfinite(k_amg))
137 MPI_Allreduce(&fail, &tf, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
139 std::printf(tf == 0 ?
"OK (np=%d): decomposition-agnostic GraphAMG pressure solve\n"
140 :
"FAILED (np=%d)\n",
144 return tf == 0 ? 0 : 1;
static double perm(const std::vector< double > &gsdf, const BlockDecomposer< 3 > &dec, int rank, bool amg, MPI_Comm comm)