41 sc = vp.Scale(nx / 1.0)
43 o, n = flow.mpi_block(nx, gny, gnz)
46 s.set_mu(sc.mu(p[
"mu1"]))
47 s.set_domain_bc(
"-z",
"wall", (0, 0, 0))
48 s.set_domain_bc(
"+z",
"wall", (0, 0, 0))
49 s.init_mpi(nx, gny, gnz)
50 s.set_pressure_geometry(np.full(tuple(n), 10.0, order=
"F"))
51 s.set_pressure_chebyshev(
True, 600, 1e-12)
53 C = 1.0 - vp.cylinder_fractions((nx, gny, gnz), R, nx / 2.0, sc.s * 0.5)
55 s.set_property_model(
"rho",
"linear",
"C", [p[
"rho2"], p[
"rho1"] - p[
"rho2"]])
56 s.set_property_model(
"mu",
"linear",
"C", [sc.mu(p[
"mu2"]), sc.mu(p[
"mu1"] - p[
"mu2"])])
57 s.set_surface_tension(sc.sigma(p[
"sigma"]))
58 s.enable_vof_momentum(p[
"rho2"], p[
"rho1"])
59 s.set_property_model(
"force_z",
"linear",
"C",
60 [-sc.bodyforce(p[
"rho2"] * p[
"g"]),
61 -sc.bodyforce((p[
"rho1"] - p[
"rho2"]) * p[
"g"])])
62 s.set_dt(0.5 * s.capillary_dt())
63 return s, 600, f
"hysing1 {nx}x{gny}x{gnz}"
67 NG, RJ, FSDF = 26, 0.171875 * nx, 0.85
69 ZBED, RBUB, ZBUB = 0.5625 * nx, 0.15625 * nx, 0.28125 * nx
70 ctr = vp.cached(f
"bed_e7_{nx}_{gnz}",
lambda: vp.rsa_bed(NG, float(nx), RJ, ZBED, seed=11))
71 SDF = vp.cached(f
"sdf_e7_{nx}_{gnz}",
lambda: vp.bed_sdf(ctr, nx, gnz, RG))
72 C0 = vp.cached(f
"c0_e7_{nx}_{gnz}",
lambda: vp.bubble_colour_sub(nx, gnz, RBUB, ZBUB))
73 ratio, Eo, Mo, g, theta = 100.0, 10.0, 1e-3, 2e-4, 60.0
75 rho_l, rho_g = 1.0, 1.0 / ratio
77 sigma = drho * g * D * D / Eo
78 mu_l = (Mo * rho_l ** 2 * sigma ** 3 / (g * drho)) ** 0.25
80 o, n = flow.mpi_block(nx, nx, gnz)
84 s.set_domain_bc(
"-z",
"wall", (0, 0, 0))
85 s.set_domain_bc(
"+z",
"wall", (0, 0, 0))
86 s.init_mpi(nx, nx, gnz)
87 s.set_solid(
slice_block(SDF, o, n), cutcell_pressure=
True)
90 s.set_property_model(
"rho",
"linear",
"C", [rho_g, rho_l - rho_g])
91 s.set_property_model(
"mu",
"linear",
"C", [mu_g, mu_l - mu_g])
92 s.set_surface_tension(sigma)
93 s.set_contact_angle(theta)
94 s.enable_vof_momentum(rho_g, rho_l)
95 s.set_property_model(
"force_z",
"linear",
"C", [-rho_g * g, -(rho_l - rho_g) * g])
96 s.set_pressure_chebyshev(
True, 600, 1e-12)
97 s.set_dt(0.4 * s.capillary_dt())
98 return s, 600, f
"packed {nx}x{nx}x{gnz}"
105 ap = argparse.ArgumentParser()
106 ap.add_argument(
"--case", default=
"hysing1")
107 ap.add_argument(
"--steps", type=int, default=20)
108 ap.add_argument(
"--warm", type=int, default=5)
110 s, cap, label = BUILD[a.case]()
111 rank, size = s.rank(), s.size()
112 pick = vp.dt_from_limits(0.4)
113 for i
in range(a.warm):
116 tm = vp.profile(s, a.steps, pick, cap, f
"{label} np={size}")
118 d = s.diagnostics.vof_diagnostics()
120 n = max(tm[
"steps"], 1)
122 ex = tm[
"k_exchange"] / n
123 print(f
"\n=== {tm['label']} (rank 0 of {size}) ===")
124 print(f
" {tm['ms_per_step']:8.2f} ms/step wall {1e3*st:8.2f} ms/step timed "
125 f
"pressure {tm['press_max']}/{tm['press_cap']}"
126 + (
" CAPPED" if tm[
"capped"]
else ""))
127 print(f
" g=3 colour exchange {1e3*ex:9.3f} ms/step "
128 f
"{100.0*ex/st if st else 0:6.2f} % of the step")
129 for k
in (
"vof_advect",
"vof_momentum_advect",
"vof_bridge",
"vof_momentum_bridge",
130 "curvature",
"csf",
"k_reconstruct",
"k_fluxes",
"k_sweep",
"k_clip",
131 "predictor",
"momentum_solve",
"projection",
"step"):
132 print(f
" {k:<24s} {1e3*tm[k]/n:9.3f} ms/step "
133 f
"{100.0*(tm[k]/n)/st if st else 0:6.2f} %")
134 print(f
" sum(C) = {d['sum']!r} dt census cfl {tm['binds_cfl']} / capillary "
135 f
"{tm['binds_capillary']}")