21N, R, RATIO, SIGMA, MU, U0 = 32, 6.0, 1000.0, 0.01, 0.01, 0.05
25 off = (np.arange(sub) + 0.5) / sub
26 c = np.array([N / 2 + 0.13, N / 2 + 0.27, N / 2 + 0.11])
27 out = np.zeros((N, N, N))
31 X, Y, Z = np.meshgrid(np.arange(N) + a, np.arange(N) + b, np.arange(N) + d,
33 out += ((X - c[0]) ** 2 + (Y - c[1]) ** 2 + (Z - c[2]) ** 2 < R * R)
34 return np.asfortranarray(out / sub ** 3)
43 s.set_pressure_geometry(np.asfortranarray(np.full((N, N, N), 10.0)))
47 s.set_property_model(
"rho",
"linear",
"C", [1.0, RATIO - 1.0])
48 s.set_surface_tension(SIGMA)
50 s.enable_vof_momentum(1.0, RATIO)
52 s.set_balanced_force_projection(bfp)
53 dt = min(0.5 * s.capillary_dt(), 0.2 / U0)
55 s.set_field(
"u", np.asfortranarray(np.full((N, N, N), U0)))
56 steps = int(round(N / (U0 * dt)))
57 v0 = float(np.sum(c0))
59 for _
in range(steps):
61 du = max(np.max(np.abs(np.asarray(s.get_u()) - U0)), np.max(np.abs(s.get_v())),
62 np.max(np.abs(s.get_w())))
63 if not np.isfinite(du):
64 return steps, np.inf, np.inf, np.inf, np.inf
65 worst = max(worst, du)
66 c = np.asarray(s.get_vof())
67 return (steps, du / U0, worst / U0, (np.sum(c) - v0) / v0, np.sum(np.abs(c - c0)) / v0)
76 s.set_domain_bc(
"-z",
"wall", (0, 0, 0))
77 s.set_domain_bc(
"+z",
"wall", (0, 0, 0))
78 s.set_pressure_geometry(np.asfortranarray(np.full((N, 4, NZ), 10.0)))
80 x, z = np.arange(N), np.arange(NZ)
81 zi = NZ / 2 + 1.5 * np.cos(2 * np.pi * x / N)
82 c0 = np.clip((z[
None, :] + 1.0) - zi[:,
None], 0.0, 1.0)
83 s.set_vof(np.asfortranarray(np.repeat(c0[:,
None, :], 4, axis=1)))
84 s.set_property_model(
"rho",
"linear",
"C", [1.0, 2.0])
85 s.set_property_model(
"force_z",
"linear",
"rho", [0.0, -g])
88 h = np.asarray(s.get_vof())[:, 1, :].sum(axis=1)
90 return 0.5 * (zc.max() - zc.min())
92 t, dt, sample, hist = 0.0, dt0, 40.0, [amp()]
93 while t < steps - 1e-9:
94 c = s.vof_max_courant()
96 dt = min(2.0 * dt, dt * cfl / c, dt0)
97 dt = min(dt, sample - t)
101 if t >= sample - 1e-9: