10def run(N=128, Re=100.0, U=1.0, nz=4, max_steps=4000, vmg=False, vlevels=3, vcycles=4, vel_iter=60, dt=1.0):
12 s = sdflow.Solver(N, N, nz)
13 s.set_rho(1.0); s.set_mu(nu); s.set_dt(dt); s.set_advection(
True)
14 s.set_domain_bc(0, 1); s.set_domain_bc(1, 1); s.set_domain_bc(2, 1)
15 s.set_domain_bc(3, 2, U, 0.0, 0.0)
16 s.set_velocity_solver_params(vel_iter)
18 s.set_velocity_multigrid(
True, vlevels, vcycles)
19 s.set_pressure_multigrid(
True, levels=8)
20 s.set_pressure_solver_params(80)
21 s.set_pressure_geometry(np.full((N, N, nz), 1e30))
25 for it
in range(max_steps):
28 u = np.asarray(s.get_u()).reshape((N, N, nz), order=
"F")
29 cur = u[:, :, nz // 2].copy()
31 d = np.max(np.abs(cur - prev)) / (np.max(np.abs(cur)) + 1e-30)
35 dt_wall = time.time() - t0
36 u = np.asarray(s.get_u()).reshape((N, N, nz), order=
"F")
37 v = np.asarray(s.get_v()).reshape((N, N, nz), order=
"F")
38 uc = 0.5 * (u[N // 2 - 1, :, nz // 2] + u[N // 2, :, nz // 2])
39 vc = 0.5 * (v[:, N // 2 - 1, nz // 2] + v[:, N // 2, nz // 2])
40 yc = (np.arange(N) + 0.5) / N
41 u_rms = float(np.sqrt(np.mean((np.interp(GHIA_Y, yc, uc) - GHIA_U) ** 2)))
42 v_rms = float(np.sqrt(np.mean((np.interp(GHIA_X, yc, vc) - GHIA_V) ** 2)))
44 div = float(s.max_flux_divergence())
47 return dict(u_rms=u_rms, v_rms=v_rms, umin=float(uc.min()), div=div, steps=steps, wall=dt_wall)
run(N=128, Re=100.0, U=1.0, nz=4, max_steps=4000, vmg=False, vlevels=3, vcycles=4, vel_iter=60, dt=1.0)