31static std::vector<double>
packingSdf(
double rfrac = 0.18) {
32 const double R = rfrac *
N;
33 std::vector<double> sdf((std::size_t)
N *
N *
N);
34 const double cs[2] = {0.25 *
N, 0.75 *
N};
35 for (
int z = 0; z <
N; ++z)
36 for (
int y = 0; y <
N; ++y)
37 for (
int x = 0; x <
N; ++x) {
41 for (
double sz : cs) {
42 auto wrap = [](
double d) {
return d -
N * std::round(d /
N); };
43 const double dx = wrap(x - sx), dy = wrap(y - sy), dz = wrap(z - sz);
44 best = std::min(best, std::sqrt(dx * dx + dy * dy + dz * dz) - R);
46 sdf[(std::size_t)x + (std::size_t)y *
N + (std::size_t)z *
N *
N] = best;
70int main(
int argc,
char** argv) {
71 MPI_Init(&argc, &argv);
72 Kokkos::initialize(argc, argv);
73 int fail = 0, size = 1, rank = 0;
75 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
76 MPI_Comm_size(MPI_COMM_WORLD, &size);
78 const double gcells = (double)
N *
N *
N;
81 peclet::core::decomp::BlockDecomposer<3> dec(
static_cast<std::size_t
>(size), IVec<3>{
N,
N,
N});
82 auto blk = dec.block(rank);
83 const int ox = (int)blk.origin[0], oy = (
int)blk.origin[1], oz = (int)blk.origin[2];
84 const int lnx = (int)blk.size[0], lny = (
int)blk.size[1], lnz = (int)blk.size[2];
85 std::vector<double> lsdf((std::size_t)lnx * lny * lnz);
86 for (
int z = 0; z < lnz; ++z)
87 for (
int y = 0; y < lny; ++y)
88 for (
int x = 0; x < lnx; ++x)
89 lsdf[(std::size_t)x + (std::size_t)y * lnx + (std::size_t)z * lnx * lny] =
90 gsdf[(std::size_t)(x + ox) + (std::size_t)(y + oy) *
N +
91 (std::size_t)(z + oz) *
N *
N];
93 Colo sd(lnx, lny, lnz);
94 sd.initMpi(
N,
N,
N, MPI_COMM_WORLD);
97 for (
int it = 0; it <
STEPS; ++it)
100 MPI_Allreduce(&lsum, &gsum, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
101 const double k_dist =
MU * (gsum / gcells) /
F;
109 ref.setSolid(gsdf,
true);
110 for (
int it = 0; it <
STEPS; ++it)
114 auto u = ref.getVelocity(0);
118 k_ref =
MU * (rsum / gcells) /
F;
120 MPI_Bcast(&k_ref, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
122 const double reld = std::fabs(k_dist - k_ref) / (std::fabs(k_ref) + 1e-30);
124 (size == 1) ? 1e-12 : 2e-5;
126 std::printf(
" k_dist=%.8e k_ref=%.8e rel=%.2e div=%.2e (np=%d, tol %.0e)\n", k_dist,
127 k_ref, reld, div_dist, size, tol);
128 if (reld > tol || !(div_dist < 1e-5))
132 MPI_Allreduce(&fail, &totalFail, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
135 std::printf(
"OK (np=%d): distributed collocated Stokes permeability == single-rank\n", size);
137 std::fprintf(stderr,
"FAILED (np=%d)\n", size);
141 return totalFail == 0 ? 0 : 1;