26U0, RE, CFL, T_TRANSITS, NZ = 1.0, 100.0, 0.2, 1.0, 4
32 steps = int(round(T_TRANSITS * N / (U0 * dt)))
34 s = (flow.Solver
if kind ==
"stag" else flow.SolverColocated)(N, N, NZ)
35 s.set_rho(1.0); s.set_mu(nu); s.set_dt(dt)
37 s.set_velocity_solver_params(200)
38 s.set_pressure_multigrid(
True, max(2, int(np.log2(N)) - 2))
39 s.set_pressure_pcg(
True, 300, 1e-10)
41 if hasattr(s,
"set_collocated_scheme"):
42 s.set_collocated_scheme(
"gauge-exact")
45 s.set_solid(np.full((N, N, NZ), 1e3, order=
"F"), cutcell_pressure=
True,
46 pressure_coarse=
"rediscretized")
48 cc = np.arange(N) + 0.5
49 fc = np.arange(N) * 1.0
50 xu, yu = (fc, cc)
if kind ==
"stag" else (cc, cc)
51 xv, yv = (cc, fc)
if kind ==
"stag" else (cc, cc)
52 u0 = np.asfortranarray(np.broadcast_to(
53 (U0 * np.sin(k * xu)[:,
None] * np.cos(k * yu)[
None, :])[:, :,
None], (N, N, NZ)).copy())
54 v0 = np.asfortranarray(np.broadcast_to(
55 (-U0 * np.cos(k * xv)[:,
None] * np.sin(k * yv)[
None, :])[:, :,
None], (N, N, NZ)).copy())
56 s.set_state(u0, v0, np.zeros((N, N, NZ), order=
"F"))
57 for _
in range(steps):
60 F = np.exp(-2 * nu * k * k * t)
61 uex = (U0 * np.sin(k * xu)[:,
None] * np.cos(k * yu)[
None, :]) * F
62 U = np.asarray(s.get_u())[:, :, NZ // 2]
63 err = float(np.sqrt(np.mean((U - uex) ** 2)) / (U0 * F))
65 Uc = 0.5 * (U + np.roll(U, -1, axis=0))
if kind ==
"stag" else U
82 for a, b
in zip(prev[1:], (es, ec, d))]