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;
72int main(
int argc,
char** argv) {
73 MPI_Init(&argc, &argv);
74 Kokkos::initialize(argc, argv);
75 int fail = 0, size = 1, rank = 0;
77 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
78 MPI_Comm_size(MPI_COMM_WORLD, &size);
80 const double gcells = (double)
N *
N *
N;
83 peclet::core::decomp::BlockDecomposer<3> dec(
static_cast<std::size_t
>(size), IVec<3>{
N,
N,
N});
84 auto blk = dec.block(rank);
85 const int ox = (int)blk.origin[0], oy = (
int)blk.origin[1], oz = (int)blk.origin[2];
86 const int lnx = (int)blk.size[0], lny = (
int)blk.size[1], lnz = (int)blk.size[2];
87 std::vector<double> lsdf((std::size_t)lnx * lny * lnz);
88 for (
int z = 0; z < lnz; ++z)
89 for (
int y = 0; y < lny; ++y)
90 for (
int x = 0; x < lnx; ++x)
91 lsdf[(std::size_t)x + (std::size_t)y * lnx + (std::size_t)z * lnx * lny] =
92 gsdf[(std::size_t)(x + ox) + (std::size_t)(y + oy) *
N +
93 (std::size_t)(z + oz) *
N *
N];
95 IbmSolver sd(lnx, lny, lnz);
96 sd.initMpi(
N,
N,
N, MPI_COMM_WORLD);
98 sd.setSolid(lsdf,
true);
99 for (
int it = 0; it <
STEPS; ++it)
102 MPI_Allreduce(&lsum, &gsum, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
103 const double k_dist =
MU * (gsum / gcells) /
F;
104 const double div_dist = sd.maxOpenDivergence();
109 IbmSolver ref(
N,
N,
N);
111 ref.setSolid(gsdf,
true);
112 for (
int it = 0; it <
STEPS; ++it)
116 auto u = ref.getVelocity(0);
120 k_ref =
MU * (rsum / gcells) /
F;
122 MPI_Bcast(&k_ref, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
124 const double reld = std::fabs(k_dist - k_ref) / (std::fabs(k_ref) + 1e-30);
126 (size == 1) ? 1e-12 : 2e-5;
128 std::printf(
" k_dist=%.8e k_ref=%.8e rel=%.2e div=%.2e (np=%d, tol %.0e)\n", k_dist,
129 k_ref, reld, div_dist, size, tol);
130 if (reld > tol || !(div_dist < 1e-5))
134 MPI_Allreduce(&fail, &totalFail, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
137 std::printf(
"OK (np=%d): distributed IbmSolver Stokes permeability == single-rank\n", size);
139 std::fprintf(stderr,
"FAILED (np=%d)\n", size);
143 return totalFail == 0 ? 0 : 1;