12N, MU, DT, F = 32, 0.1, 60.0, 1e-3
18 cs = [(c + 0.5) * N / 2.0
for c
in (0, 1)]
19 X, Y, Z = np.meshgrid(gx, gx, gx, indexing=
"ij")
20 best = np.full((N, N, N), 1e30)
24 dx = X - sx; dx -= N * np.round(dx / N)
25 dy = Y - sy; dy -= N * np.round(dy / N)
26 dz = Z - sz; dz -= N * np.round(dz / N)
27 best = np.minimum(best, np.sqrt(dx * dx + dy * dy + dz * dz) - R)
31def run(chebyshev, max_steps=200):
33 s = sdflow.Solver(N, N, N)
34 s.set_rho(1.0); s.set_mu(MU); s.set_dt(DT)
35 s.set_body_force((F, 0.0, 0.0))
36 s.set_advection(
False)
37 s.diagnostics.set_velocity_solver_params(80)
38 s.set_pressure_multigrid(
True, 4)
40 s.set_pressure_chebyshev(
True, 200, 1e-9)
41 s.set_solid(sdf, cutcell_pressure=
True)
43 for it
in range(max_steps):
45 um = float(s.get_u().
mean())
46 if it > 8
and abs(um - prev) < 3e-4 * (abs(um) + 1e-15):
50 k = MU * float(u.mean()) / F
51 div = s.max_open_divergence()
52 iters = s.diagnostics.last_pressure_iterations()
54 return k, div, float(u.max()), int(iters)
58 print(
"=== Chebyshev pressure driver: converges to the MG-PCG cut-cell Stokes solution ===")
59 k_pcg, d_pcg, umax_pcg, it_pcg =
run(chebyshev=
False)
60 k_cb, d_cb, umax_cb, it_cb =
run(chebyshev=
True)
61 rel = abs(k_cb - k_pcg) / k_pcg
62 print(f
" MG-PCG : k={k_pcg:.6e} div={d_pcg:.2e} last_iters={it_pcg}")
63 print(f
" Chebyshev : k={k_cb:.6e} div={d_cb:.2e} last_iters={it_cb}")
64 print(f
" |k_cheb - k_pcg|/k_pcg = {rel*100:.4f}%")
65 ok = (rel < 5e-3)
and (d_cb < 1e-6 * umax_cb)
and (it_cb > 0)
66 print(f
" result: {'PASS' if ok else 'FAIL'} (Chebyshev == MG-PCG solution; incompressible)")
67 sys.exit(0
if ok
else 1)