23 gy = np.arange(ny, dtype=np.float64)
24 sdf = np.empty((nx, ny, nz))
25 sdf[:, :, :] = np.minimum(gy - ylo, yhi - gy)[
None, :,
None]
29def run(N, ghost, rho=1.0, mu=0.1, dt=50.0, F=0.01, max_steps=400):
32 ylo = round(0.30 * ny) + 0.5
33 yhi = round(0.70 * ny) + 0.5
35 s = flow.Solver(nx, ny, nz)
39 s.set_body_force((F, 0.0, 0.0))
40 s.diagnostics.set_velocity_solver_params(200)
41 s.set_pressure_pcg(
True, 200, 1e-8)
43 s.diagnostics.set_ghost_projection(
True)
44 s.set_solid(
channel_sdf(nx, ny, nz, ylo, yhi), cutcell_pressure=
True)
47 for it
in range(max_steps):
49 u_now = float(s.get_u().max())
50 if it > 5
and abs(u_now - prev) < 1e-10 * (abs(u_now) + 1e-12):
55 prof = u[nx // 2, :, nz // 2]
56 gy = np.arange(ny, dtype=np.float64)
57 fluid = (gy > ylo) & (gy < yhi)
58 u_ana = (F / (2.0 * mu)) * (gy - ylo) * (yhi - gy)
59 err = float(np.max(np.abs(prof[fluid] - u_ana[fluid])))
60 return err, s.max_open_divergence()