79 sdf, ny, w_lo, w_hi =
channel(N, s)
80 sv = flow.Solver
if kind ==
"stag" else flow.SolverColocated
82 sol.set_rho(1.0); sol.set_mu(MU); sol.set_dt(DT)
83 sol.set_advection(
False)
84 sol.set_velocity_solver_params(200)
85 sol.set_pressure_multigrid(
True, 3)
86 sol.set_pressure_pcg(
True, 200, 1e-10)
88 if hasattr(sol,
"set_collocated_scheme"):
89 sol.set_collocated_scheme(kind)
91 sol.set_face_interp({
"gauge-exact": 9,
"plain": 0}[kind])
92 sol.set_solid(sdf, cutcell_pressure=
True, pressure_coarse=
"rediscretized")
93 return sol, sdf, ny, w_lo, w_hi
97 y = np.arange(ny) + 0.5
99 yc = 0.5 * (w_lo + w_hi)
100 fluid = (y > w_lo) & (y < w_hi)
102 sol.set_body_force(F0, 0.0, 0.0)
104 sol.enable_cell_force()
107 fx = np.where(fluid, F0 * np.cos(k * (y - yc)), 0.0)
110 fx = np.where(fluid, F0, 0.0)
111 fy = np.where(fluid, 10 * F0 * np.sin(2 * np.pi * (y - w_lo) / W), 0.0)
112 zero = np.zeros((NX, ny, NZ), order=
"F")
113 sol.set_field(
"force_x", np.asfortranarray(np.broadcast_to(fx[
None, :,
None],
114 (NX, ny, NZ)).copy()))
115 sol.set_field(
"force_y", np.asfortranarray(np.broadcast_to(fy[
None, :,
None],
116 (NX, ny, NZ)).copy()))
117 sol.set_field(
"force_z", zero)
136 U = np.asarray(sol.get_u())
137 V = np.asarray(sol.get_v())
139 UF, ax = U, np.asarray(sol.get_ox())
141 UF, ax = np.asarray(sol.get_uf()), np.asarray(sol.get_ox())
143 q_flux = float((ax * UF).mean()) * ny
144 q_cell = float(U.mean()) * ny
145 y = np.arange(ny) + 0.5
147 prof = U.mean(axis=(0, 2))
148 inner = (y > w_lo + 1.5) & (y < w_hi - 1.5)
149 l2 = float(np.sqrt(np.mean((prof[inner] - uex[inner]) ** 2)) / np.sqrt(np.mean(uex[inner]**2)))
150 return dict(steps=steps, e_flux=q_flux / Qex - 1, e_cell=q_cell / Qex - 1, l2=l2,
151 U=U, V=V, uscale=float(np.abs(uex).max()))