38static std::vector<double>
packingSdf(
double rfrac = 0.18) {
39 const double R = rfrac *
N;
40 std::vector<double> sdf((std::size_t)
N *
N *
N);
41 const double cs[2] = {0.25 *
N, 0.75 *
N};
42 for (
int z = 0; z <
N; ++z)
43 for (
int y = 0; y <
N; ++y)
44 for (
int x = 0; x <
N; ++x) {
48 for (
double sz : cs) {
49 auto wrap = [](
double d) {
return d -
N * std::round(d /
N); };
50 const double dx = wrap(x - sx), dy = wrap(y - sy), dz = wrap(z - sz);
51 best = std::min(best, std::sqrt(dx * dx + dy * dy + dz * dz) - R);
53 sdf[(std::size_t)x + (std::size_t)y *
N + (std::size_t)z *
N *
N] = best;
90int main(
int argc,
char** argv) {
91 MPI_Init(&argc, &argv);
92 Kokkos::initialize(argc, argv);
93 int fail = 0, size = 1, rank = 0;
95 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
96 MPI_Comm_size(MPI_COMM_WORLD, &size);
98 const double gcells = (double)
N *
N *
N;
101 peclet::core::decomp::BlockDecomposer<3> dec(
static_cast<std::size_t
>(size), IVec<3>{
N,
N,
N});
102 auto blk = dec.block(rank);
103 const int ox = (int)blk.origin[0], oy = (
int)blk.origin[1], oz = (int)blk.origin[2];
104 const int lnx = (int)blk.size[0], lny = (
int)blk.size[1], lnz = (int)blk.size[2];
105 std::vector<double> lsdf((std::size_t)lnx * lny * lnz);
106 for (
int z = 0; z < lnz; ++z)
107 for (
int y = 0; y < lny; ++y)
108 for (
int x = 0; x < lnx; ++x)
109 lsdf[(std::size_t)x + (std::size_t)y * lnx + (std::size_t)z * lnx * lny] =
110 gsdf[(std::size_t)(x + ox) + (std::size_t)(y + oy) *
N +
111 (std::size_t)(z + oz) *
N *
N];
118 } CONFIGS[] = {{0,
false}, {9,
false}, {9,
true}};
119 for (
const auto& cfg : CONFIGS) {
120 const int mode = cfg.mode;
121 Colo sd(lnx, lny, lnz);
122 sd.initMpi(
N,
N,
N, MPI_COMM_WORLD);
126 for (
int it = 0; it < steps; ++it)
129 MPI_Allreduce(&lsum, &gsum, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD);
130 const double k_dist =
MU * (gsum / gcells) /
F;
138 ref.setSolid(gsdf,
true);
139 for (
int it = 0; it < steps; ++it)
143 auto u = ref.getVelocity(0);
147 k_ref =
MU * (rsum / gcells) /
F;
149 MPI_Bcast(&k_ref, 1, MPI_DOUBLE, 0, MPI_COMM_WORLD);
151 const double reld = std::fabs(k_dist - k_ref) / (std::fabs(k_ref) + 1e-30);
153 (size == 1) ? 1e-12 : 2e-5;
156 " [mode %d%s] k_dist=%.8e k_ref=%.8e rel=%.2e div=%.2e (np=%d, tol %.0e)\n", mode,
157 cfg.advect ?
" advect" :
"", k_dist, k_ref, reld, div_dist, size, tol);
158 if (reld > tol || !(div_dist < 1e-5))
163 MPI_Allreduce(&fail, &totalFail, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
166 std::printf(
"OK (np=%d): distributed collocated <u> == single-rank, every config\n", size);
168 std::fprintf(stderr,
"FAILED (np=%d)\n", size);
172 return totalFail == 0 ? 0 : 1;