23 X, Y = np.meshgrid(ix, ix, indexing=
"ij")
24 u2 = U0 * amp * np.sin(k * X) * np.cos(k * Y)
25 v2 = -U0 * amp * np.cos(k * X) * np.sin(k * Y)
26 u = np.repeat(u2[:, :,
None], nz, axis=2)
27 v = np.repeat(v2[:, :,
None], nz, axis=2)
28 w = np.zeros((N, N, nz))
29 return (np.asfortranarray(u), np.asfortranarray(v), np.asfortranarray(w))
32def run(SolverCls, N, nz=4, U0=1.0, rho=1.0, nu=0.05, dt=0.5, steps=100):
34 s = SolverCls(N, N, nz)
39 s.diagnostics.set_velocity_solver_params(80)
40 sdf = np.asfortranarray(np.ones((N, N, nz)) * 1e3)
41 s.set_solid(sdf, cutcell_pressure=
True)
43 s.set_state(u0, v0, w0)
45 for _
in range(steps):
49 amp = np.exp(-2.0 * nu * k * k * T)
51 uu, vv = s.get_u(), s.get_v()
52 num = np.sqrt(np.mean((uu - ue) ** 2 + (vv - ve) ** 2))
53 den = np.sqrt(np.mean(u0 ** 2 + v0 ** 2))
56 e_now = float(np.mean(uu ** 2 + vv ** 2))
57 e_ini = float(np.mean(u0 ** 2 + v0 ** 2))
58 ratio_meas = e_now / e_ini
60 div = float(s.max_open_divergence())
61 return l2, div, ratio_meas, ratio_ana