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