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