18 R = (3 * phi / (4 * np.pi)) ** (1 / 3) * N
19 g = np.arange(N) + 0.5
20 X, Y, Z = np.meshgrid(g, g, g, indexing=
"ij")
22 dx -= N * np.round(dx / N)
24 dy -= N * np.round(dy / N)
26 dz -= N * np.round(dz / N)
27 return np.sqrt(dx * dx + dy * dy + dz * dz) - R, R
30def drag(N, mode, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000):
32 s = flow.SolverColocated(N, N, N)
36 s.set_body_force(F, 0, 0)
37 s.set_advection(
False)
38 s.set_velocity_solver_params(200)
39 s.set_pressure_multigrid(
True, levels=max(2, int(np.log2(N)) - 1))
40 s.set_pressure_pcg(
True, 400, 1e-10)
42 s.set_face_interp(mode)
43 s.set_solid(sdf, cutcell_pressure=
True, pressure_coarse=
"rediscretized")
44 prev, warm, um = 0.0,
None, []
45 for it
in range(max_steps):
47 m = float(s.get_u().mean())
51 if it > 10
and abs(m - prev) < warm_tol * (abs(m) + 1e-30):
54 elif it - warm >= tail:
56 K = F * N**3 / (6 * np.pi * mu * R * np.mean(um[-tail:]))
57 return K, s.last_pressure_iterations()
62 M0 = {32: +1.004, 48: +0.685, 64: +0.598, 96: +0.397, 128: +0.299}
63 MG = {32: -0.175, 48: -0.084, 64: -0.056, 96: -0.029, 128: -0.018}