22 R = (3 * phi / (4 * np.pi))**(1 / 3) * N
23 g = np.arange(N) + 0.5; X, Y, Z = np.meshgrid(g, g, g, indexing=
"ij")
24 dx = X - 0.5 * N; dx -= N * np.round(dx / N)
25 dy = Y - 0.5 * N; dy -= N * np.round(dy / N)
26 dz = Z - 0.5 * N; dz -= N * np.round(dz / N)
27 return np.sqrt(dx * dx + dy * dy + dz * dz) - R, R
29def drag(N, mode, mu=0.1, F=1e-3, dt=400.0, min_steps=500, max_steps=3500, dtol=5e-5):
30 sdf, R =
lattice_sdf(N); lv = max(2, int(np.log2(N)) - 1)
31 s = flow.SolverColocated(N, N, N)
32 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt); s.set_body_force((F, 0, 0)); s.set_advection(
False)
33 s.diagnostics.set_velocity_solver_params(200); s.set_pressure_multigrid(
True, levels=lv)
34 s.set_pressure_pcg(
True, 500, 1e-12);
_collocated_mode(s, mode); s.diagnostics.set_pressure_warmstart(
True)
35 s.set_solid(sdf, cutcell_pressure=
True)
36 kfac = F * N**3 / (6 * np.pi * mu * R); hist = []; t0 = time.time(); drift = 1.0
37 for it
in range(max_steps):
40 K = kfac / float(s.get_u().
mean()); hist.append(K)
42 drift = abs(hist[-1] - hist[-5]) / abs(hist[-1])
43 if it + 1 >= min_steps
and drift < dtol:
break
44 return hist[-1], it + 1, drift, time.time() - t0