26N, R, SIGMA, MU, RATIO, U0 = 32, 8.0, 1.0, 0.1, 1000.0, 0.02
27STEPS, WARM, REPEATS = 30, 5, 3
31 off = (np.arange(sub) + 0.5) / sub
32 c = np.array([N / 2 + 0.13, N / 2 + 0.27, N / 2 + 0.11])
33 out = np.zeros((N, N, N))
37 X, Y, Z = np.meshgrid(np.arange(N) + a, np.arange(N) + b, np.arange(N) + d,
39 out += ((X - c[0]) ** 2 + (Y - c[1]) ** 2 + (Z - c[2]) ** 2 < R * R)
40 return np.asfortranarray(out / sub ** 3)
43def build(cls, on, u0, kappa=None):
48 s.set_pressure_geometry(np.asfortranarray(np.full((N, N, N), 10.0)))
51 s.set_property_model(
"rho",
"linear",
"C", [1.0, RATIO - 1.0])
52 s.set_surface_tension(SIGMA)
54 s.diagnostics.set_vof_kappa_constant(kappa)
56 s.enable_vof_momentum(1.0, RATIO)
57 s.set_dt(0.5 * s.capillary_dt())
59 s.set_field(
"u", np.asfortranarray(np.full((N, N, N), u0)))
60 s.set_balanced_force_projection(on)
61 s.set_pressure_chebyshev(
True, 500, 1e-9)
65def run(cls, on, u0, steps, kappa=None):
66 s = build(cls, on, u0, kappa)
67 t, pit, bit = [], [], []
68 for k
in range(steps):
69 t0 = time.perf_counter()
71 t1 = time.perf_counter()
74 pit.append(s.diagnostics.last_pressure_iterations())
75 bit.append(s.diagnostics.last_balanced_force_iterations())
76 u = max(np.max(np.abs(s.get_u())), np.max(np.abs(s.get_v())), np.max(np.abs(s.get_w())))
77 if not np.isfinite(u):
78 raise RuntimeError(
"non-finite velocity")
79 return np.median(t), np.mean(pit), np.mean(bit)