20RHO, MU, F, DT = 1.0, 0.1, 1e-3, 60.0
24 """Global 2x2x2 sphere-packing SDF as an (N,N,N) Fortran-order array (negative inside, periodic)."""
26 cs = np.array([0.25 * N, 0.75 * N])
28 X, Y, Z = np.meshgrid(xs, xs, xs, indexing=
"ij")
29 best = np.full((N, N, N), 1e30)
33 dx = X - sx; dx -= N * np.round(dx / N)
34 dy = Y - sy; dy -= N * np.round(dy / N)
35 dz = Z - sz; dz -= N * np.round(dz / N)
36 best = np.minimum(best, np.sqrt(dx * dx + dy * dy + dz * dz) - R)
37 return np.asfortranarray(best)
50 rank, size = comm.Get_rank(), comm.Get_size()
53 gcells = float(N * N * N)
55 origin, bsize = peclet.flow.mpi_block(N, N, N)
60 lsdf = np.asfortranarray(gsdf[ox:ox + lnx, oy:oy + lny, oz:oz + lnz])
65 s.set_solid(lsdf, cutcell_pressure=
True)
66 for _
in range(STEPS):
69 lsum = float(np.sum(s.get_u()))
70 gsum = comm.allreduce(lsum, op=MPI.SUM)
71 k = MU * (gsum / gcells) / F
72 div = s.max_open_divergence()
75 print(f
"np={size}: rank={s.rank()} size={s.size()} k={k:.12e} div={div:.3e} "
76 f
"block(rank0)=origin{origin} size{bsize}")