25def drag(N, kind, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000):
26 R = (3 * PHI0 / (4 * np.pi)) ** (1 / 3) * N
27 g = np.arange(N) + 0.5
28 X, Y, Z = np.meshgrid(g, g, g, indexing=
"ij")
29 d =
lambda A: A - 0.5 * N - N * np.round((A - 0.5 * N) / N)
30 sdf = np.asfortranarray(np.sqrt(d(X) ** 2 + d(Y) ** 2 + d(Z) ** 2) - R)
31 s = flow.Solver(N, N, N)
if kind ==
"stag" else flow.SolverColocated(N, N, N)
32 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt)
33 s.set_body_force(F, 0, 0); s.set_advection(
False)
34 s.set_velocity_solver_params(150)
35 s.set_pressure_multigrid(
True, max(2, int(np.log2(N)) - 1))
36 s.set_pressure_pcg(
True, 200, 1e-8)
40 if hasattr(s,
"set_collocated_scheme"):
41 s.set_collocated_scheme(kind)
43 s.set_face_interp({
"gauge-exact": 9,
"plain": 0}[kind])
44 s.set_solid(sdf, cutcell_pressure=
True, pressure_coarse=
"rediscretized")
45 prev, warm, um, t0 = 0.0,
None, [], time.time()
46 for it
in range(max_steps):
48 um.append(float(s.get_u().mean()))
51 if it > 10
and abs(um[-1] - prev) < warm_tol * (abs(um[-1]) + 1e-30):
54 elif it - warm >= tail:
56 u = float(np.mean(um[-tail:]))
57 return F * N ** 3 / (6 * np.pi * mu * R * u), it + 1, time.time() - t0
61 Ns = [int(x)
for x
in (sys.argv[1:]
or [32, 48, 64, 96, 128, 192, 256])]