29DR, NPER, FITP, NH = 1.0, 3, 2, 5
32def run(N, R, SPP, AR, seed, moving=True):
33 delta=DR*R; om=2*NU/delta**2; A=AR*R; U0=A*om
34 T=2*np.pi/om; dt=T/SPP; x0=0.5*N
35 ni=np.array([1,-1,-1],dtype=np.int32); nr=np.zeros(KN_R); nr[0]=R; nr[14]=1.0; nr[15]=1.0
36 ii=np.zeros((1,KI_I),dtype=np.int32); ii[0]=(0,-1)
37 ir=np.zeros((1,KI_R)); ir[0,0:3]=(x0,0.5*N,0.5*N); ir[0,6]=1.0; ir[0,7]=1.0
38 s=sdflow.Solver(N,N,N); s.set_rho(RHO); s.set_mu(MU); s.set_dt(dt); s.set_advection(
False)
39 s.set_velocity_solver_params(100); s.set_pressure_solver_params(25)
40 s.set_pressure_multigrid(
True, levels=4)
41 s.set_scene(ni,nr,ii.ravel(),ir.ravel(),periodic=
True)
42 s.set_fresh_cell_seed(bool(seed))
43 s.set_instance_motion(0, lin_vel=[U0,0.0,0.0]); s.set_solid_from_scene(
True)
44 ts,Fs=[],[]; t0=time.time()
45 for it
in range(SPP*NPER):
46 t=(it+1)*dt; u=U0*np.cos(om*t)
48 s.set_instance_transform(0,[x0+A*np.sin(om*t),0.5*N,0.5*N])
49 s.set_instance_motion(0, lin_vel=[u,0.0,0.0]); s.rebuild_geometry()
51 s.set_instance_motion(0, lin_vel=[u,0.0,0.0]); s.refresh_wall_velocity()
52 s.step(); ts.append(t); Fs.append(float(np.asarray(s.hydro_force_torque_reaction())[0][0][0]))
53 ts=np.array(ts); Fs=np.array(Fs); m=ts>=(NPER-FITP)*T
55 cols=[np.ones_like(t)]
56 for k
in range(1,NH+1): cols += [np.cos(k*om*t), np.sin(k*om*t)]
57 Ab=np.column_stack(cols); c,*_=np.linalg.lstsq(Ab,F,rcond=
None)
58 res=F-Ab
@c; F1=np.hypot(c[1],c[2])
62 d2 = np.abs(F[2:] - 2*F[1:-1] + F[:-2])
63 return dict(F1=F1, p2p=(res.max()-res.min())/F1, rms=res.std()/F1,
64 d2=float(np.sqrt((d2**2).
mean()))/F1, wall=time.time()-t0, A=A, U0=U0)
81 for N, R
in ((64, 6.4), (96, 9.6), (128, 12.8)):