18 R=(3*phi/(4*np.pi))**(1/3)*N
19 g=np.arange(N)+0.5; X,Y,Z=np.meshgrid(g,g,g,indexing=
"ij")
20 dx=X-0.5*N; dx-=N*np.round(dx/N)
21 dy=Y-0.5*N; dy-=N*np.round(dy/N)
22 dz=Z-0.5*N; dz-=N*np.round(dz/N)
23 return np.sqrt(dx*dx+dy*dy+dz*dz)-R, R
25def drag(N, mode, mu=0.1, F=1e-3, dt=80.0, warm_tol=1e-7, tail=40, max_steps=4000):
27 s=flow.SolverColocated(N,N,N)
28 s.set_rho(1.0); s.set_mu(mu); s.set_dt(dt); s.set_body_force((F, 0, 0)); s.set_advection(
False)
29 s.diagnostics.set_velocity_solver_params(200); s.set_pressure_multigrid(
True,levels=lv)
31 s.set_solid(sdf,cutcell_pressure=
True)
32 prev,warm,um,t0=0.0,
None,[],time.time()
33 for it
in range(max_steps):
34 s.step(); m=float(s.get_u().
mean()); um.append(m)
37 if it>10
and abs(m-prev)<warm_tol*(abs(m)+1e-30): warm=it
39 elif it-warm>=tail:
break
40 return F*N**3/(6*np.pi*mu*R*np.mean(um[-tail:])), it+1, time.time()-t0
43M0={32:+0.99,48:+0.68,64:+0.598,96:+0.397,128:+0.299}