19 R = (3 * phi / (4 * np.pi)) ** (1 / 3) * N
20 g = np.arange(N) + 0.5
21 X, Y, Z = np.meshgrid(g, g, g, indexing=
"ij")
23 dx -= N * np.round(dx / N)
25 dy -= N * np.round(dy / N)
27 dz -= N * np.round(dz / N)
28 return np.sqrt(dx * dx + dy * dy + dz * dz) - R, R
33def drag(N, ghost, orders=None, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40,
36 lv = max(2, int(np.log2(N)) - 1)
37 s = flow.SolverColocated(N, N, N)
41 s.set_body_force((F, 0, 0))
42 s.set_advection(
False)
43 s.diagnostics.set_velocity_solver_params(200)
44 s.set_pressure_multigrid(
True, levels=lv)
45 s.set_pressure_pcg(
True, 400, 1e-10)
47 s.diagnostics.set_ghost_projection(
True, *(orders
or GPORD))
48 s.set_solid(sdf, cutcell_pressure=
True)
49 prev, warm, um, t0 = 0.0,
None, [], time.time()
50 for it
in range(max_steps):
52 m = float(s.get_u().
mean())
56 if it > 10
and abs(m - prev) < warm_tol * (abs(m) + 1e-30):
59 elif it - warm >= tail:
61 K = F * N**3 / (6 * np.pi * mu * R * np.mean(um[-tail:]))
62 return K, it + 1, s.diagnostics.last_pressure_iterations(), s.max_open_divergence(), time.time() - t0
drag(N, ghost, orders=None, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000)