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