53 g = (np.arange(sub) + 0.5) / sub
54 frac = np.zeros((NX, NY, NZ))
58 X, Y, Z = np.meshgrid(np.arange(NX) + gx, np.arange(NY) + gy, np.arange(NZ) + gz,
61 dx -= NX * np.round(dx / NX)
62 frac += (dx * dx + (Y - c[1]) ** 2 + (Z - c[2]) ** 2) < r * r
63 return np.asfortranarray(frac / sub ** 3)
66def build(mode, mirror, variable_mu=True, harmonic=False):
67 cy = 2.0
if mode ==
"scalar" else 3.0
68 c = (0.4, NY - cy
if mirror
else cy, 6.1)
69 s = pf.Solver(NX, NY, NZ)
72 s.set_domain_bc(
"-y",
"wall", (0, 0, 0))
73 s.set_domain_bc(
"+y",
"wall", (0, 0, 0))
74 s.set_pressure_geometry(np.full((NX, NY, NZ), 10.0, order=
"F"))
76 s.add_scalar(
"T", 0.0,
"koren")
77 s.set_field(
"T",
sphere(c, R))
78 s.set_property_model(
"rho",
"linear",
"T", [1.0, -0.5])
80 s.set_property_model(
"mu",
"linear",
"T", [0.05, -0.04])
81 s.set_property_model(
"force_x",
"linear",
"T", [0.0, -0.02])
84 s.set_vof(
sphere(c, R)
if mode ==
"vof" else np.zeros((NX, NY, NZ), order=
"F"))
85 s.set_property_model(
"rho",
"linear",
"C", [1.0, -0.9])
86 s.set_property_model(
"mu",
"linear",
"C", [0.05, -0.04])
87 s.set_surface_tension(0.02)
89 s.enable_vof_blocks([(c[0], c[1], c[2], R)])
90 s.enable_vof_block_csf()
91 s.set_property_model(
"force_x",
"linear",
"C", [0.0, -0.02])
93 s.diagnostics.set_property_mode(
"variable",
True)
94 s.set_pressure_pcg(
True, 800, 1e-12)
95 s.set_superficial_velocity(
True,
"x", 0.0)
96 rng = np.random.default_rng(1)
97 u, v, w = (np.asfortranarray(0.05 * rng.standard_normal((NX, NY, NZ)))
for _
in range(3))
101 for k, a
in enumerate((u, v, w)):
123 xc = np.arange(N) + 0.5
124 X, Y = np.meshgrid(xc, xc, indexing=
"ij")
125 mu = 1 + 0.5 * np.sin(k * X + 0.3) * np.cos(k * Y + 0.7)
126 mux = 0.5 * k * np.cos(k * X + 0.3) * np.cos(k * Y + 0.7)
127 muy = -0.5 * k * np.sin(k * X + 0.3) * np.sin(k * Y + 0.7)
128 ux, uy = A * np.sin(k * X) * np.cos(k * Y), -A * np.cos(k * X) * np.sin(k * Y)
129 fx = -(-2 * k * k * mu * ux + A * k * (mux * np.cos(k * X) * np.cos(k * Y)
130 - muy * np.sin(k * X) * np.sin(k * Y)))
131 fy = -(-2 * k * k * mu * uy + A * k * (mux * np.sin(k * X) * np.sin(k * Y)
132 - muy * np.cos(k * X) * np.cos(k * Y)))
133 rep =
lambda a: np.asfortranarray(np.repeat(a[:, :,
None], nz, axis=2))
134 s = pf.Solver(N, N, nz)
138 s.set_advection(
False)
139 s.set_pressure_pcg(
True, 400, 1e-13)
140 s.diagnostics.set_velocity_solver_params(400, 1e-12, 2)
141 s.set_pressure_geometry(np.asfortranarray(np.full((N, N, nz), 10.0)))
142 s.enable_cell_force()
143 s.diagnostics.set_property_mode(
"variable",
False)
146 s.diagnostics.set_variable_rotational(
"off", 1.0)
147 s.set_field(
"mu", rep(mu))
148 for nm, a
in ((
"force_x", rep(fx)), (
"force_y", rep(fy)), (
"force_z", rep(0 * fx))):
150 s.diagnostics.exchange_field(nm)
152 for _
in range(20000):
154 u = np.array(s.get_u())
155 if prev
is not None and np.max(np.abs(u - prev)) <= 1e-13 * np.max(np.abs(u)):
158 u, v = np.array(s.get_u())[:, :, 0], np.array(s.get_v())[:, :, 0]
159 i = np.arange(N, dtype=np.float64)
160 xu, yc = np.meshgrid(i, i + 0.5, indexing=
"ij")
161 xc2, yv = np.meshgrid(i + 0.5, i, indexing=
"ij")
162 ue = A * np.sin(k * xu) * np.cos(k * yc)
163 ve = -A * np.cos(k * xc2) * np.sin(k * yv)
164 return max(np.abs(u - ue).max(), np.abs(v - ve).max()) / A