25def run(H, L, Re=100.0, U=1.0, nz=4, max_steps=8000, dt=0.5):
27 s = sdflow.SolverColocated(L, H, nz)
28 s.set_rho(1.0); s.set_mu(nu); s.set_dt(dt); s.set_advection(
True)
29 s.set_domain_bc(0, 2, U, 0.0, 0.0)
31 s.set_domain_bc(2, 1); s.set_domain_bc(3, 1)
32 s.set_velocity_solver_params(60)
33 s.set_pressure_pcg(
True, 400, 1e-9)
34 s.set_pressure_geometry(np.asfortranarray(np.full((L, H, nz), 1e30)))
38 for it
in range(max_steps):
41 m = float(s.get_u()[L - 4, H // 2, nz // 2])
42 if it > 1000
and abs(m - prev) < 1e-5 * (abs(m) + 1e-30):
46 u = s.get_u(); div = float(s.max_open_divergence())
47 flux_in = float(u[2, :, nz // 2].sum())
48 flux_out = float(u[L - 3, :, nz // 2].sum())
49 mass_err = abs(flux_out - flux_in) / (abs(flux_in) + 1e-30)
50 prof = u[L - 4, :, nz // 2]
51 U_mean = float(prof.mean())
52 eta = (np.arange(H) + 0.5) / H
53 parab = 6.0 * U_mean * eta * (1.0 - eta)
54 prof_rms = float(np.sqrt(np.mean((prof - parab) ** 2)) / (abs(U_mean) + 1e-30))
55 ratio = float(prof.max() / (U_mean + 1e-30))
56 return dict(steps=steps, mass_err=mass_err, div=div, ratio=ratio, prof_rms=prof_rms, H=H, L=L)