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