17mu, f, dt = 0.1, 1e-3, 60.0
24 sys.path.insert(0, os.path.join(HERE,
"..",
"build_omp"))
25 from peclet
import flow
as sdflow
26 g = np.arange(N); X, Y, Z = np.meshgrid(g, g, g, indexing=
"ij")
27 sdf = np.asfortranarray(np.sqrt((X - c) ** 2 + (Y - c) ** 2 + (Z - c) ** 2) - R)
28 s = sdflow.SolverColocated(N, N, N)
29 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt); s.set_body_force(f, 0, 0); s.set_advection(
False)
30 s.set_velocity_solver_params(300); s.set_pressure_multigrid(
True, levels=max(2, int(np.log2(N)) - 1))
31 s.set_pressure_pcg(
True, 300, 1e-10); s.set_solid(sdf, cutcell_pressure=
True)
36 m = float(s.get_u().mean())
37 if it > 10
and abs(m - prev) < 1e-7 * (abs(m) + 1e-30):
40 np.save(OUT.format(
"sdflow"), np.asarray(s.get_u()))
44 sys.path.insert(0, os.path.join(HERE,
"..",
"..",
"transport-core",
"python",
"build"))
47 return ((x - c) ** 2 + (y - c) ** 2 + (z - c) ** 2) ** 0.5 - R
48 oct = tpx_amr.Octree([N, N, N], 0, [-0.5, -0.5, -0.5], 1.0)
49 fl = tpx_amr.Flow(oct, 1.0, mu, dt); fl.set_body_force(f, 0, 0); fl.set_advection(
False); fl.set_solid(sph)
54 ua = np.asarray(fl.velocity(0)); cen = np.rint(np.asarray(oct.centers())).astype(int)
55 u = np.zeros((N, N, N)); u[cen[:, 0], cen[:, 1], cen[:, 2]] = ua
56 np.save(OUT.format(
"amr"), u)
60 env = dict(os.environ, OMP_NUM_THREADS=os.environ.get(
"OMP_NUM_THREADS",
"4"))
61 for mode
in (
"sdflow",
"amr"):
62 subprocess.run([sys.executable, __file__, mode, str(N)], check=
True, env=env,
63 stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
64 u_sd = np.load(OUT.format(
"sdflow")); u_amr = np.load(OUT.format(
"amr"))
65 g = np.arange(N); X, Y, Z = np.meshgrid(g, g, g, indexing=
"ij")
66 dist = np.sqrt((X - c) ** 2 + (Y - c) ** 2 + (Z - c) ** 2) - R
67 ksd = f * N ** 3 / (6 * np.pi * mu * R * u_sd.mean())
68 kam = f * N ** 3 / (6 * np.pi * mu * R * u_amr.mean())
69 print(f
"N={N} phi={phi} K_sdflow={ksd:.4f} ({100*(ksd-4.292)/4.292:+.2f}%) "
70 f
"K_amr={kam:.4f} ({100*(kam-4.292)/4.292:+.2f}%)")
72 print(f
" Umean: sdflow {u_sd.mean():.5e} amr {u_amr.mean():.5e} Δmean {d.mean():+.3e} "
73 f
"max|du| {np.abs(d).max():.3e} (u scale {u_sd.max():.3e})")
74 solid = dist <= 0; cut = (dist > 0) & (dist < 1.5); bulk = dist >= 1.5
76 for name, msk
in [(
"solid", solid), (
"cut-band(<1.5h)", cut), (
"bulk(>1.5h)", bulk)]:
77 contrib = d[msk].sum() / d.size
79 print(f
" {name:16s}: ncells={int(msk.sum()):6d} mean|du|={nz.mean():.3e} max|du|={nz.max():.3e} "
80 f
"Δmean-contrib={contrib:+.3e} ({100*contrib/tot if tot else 0:+6.1f}% of Δmean)")