40 b = geom.SceneBuilder()
41 sph = b.add_leaf(
"sphere", [DH / 2])
43 slab = b.add_leaf(
"box", [L / 2 + 1.0, NY * 2.0, L / 2 + 1.0])
44 cav = b.add_leaf(
"box", [(L - 2 * WX) / 2, NY * 2.0, (L - 2 * WX) / 2])
45 duc = b.add_difference(slab, cav)
46 ni, nr, _, _ = b.encode()
48 ii = np.zeros((nI, KI_I), dtype=np.int32); ir = np.zeros((nI, KI_R))
50 ii[0] = (sph, -1); ir[0, 0:3] = (x0, 0.5 * NY + OFF, x0); ir[0, 6] = 1.0; ir[0, 7] = 1.0
52 ii[1] = (duc, -1); ir[1, 0:3] = (x0, 0.5 * NY, x0); ir[1, 6] = 1.0; ir[1, 7] = 1.0
53 s = sdflow.Solver(L, NY, L)
54 s.set_rho(1.0); s.set_mu(NU); s.set_dt(DT); s.set_advection(
True)
55 s.set_velocity_solver_params(60); s.set_pressure_solver_params(20)
56 s.set_pressure_multigrid(
True, levels=4)
57 s.set_scene(np.asarray(ni, np.int32), np.asarray(nr, float), ii.ravel(), ir.ravel(),
60 s.set_instance_motion(1, lin_vel=[0.0, U, 0.0])
61 s.set_solid_from_scene(
True)
62 s.set_velocity(1, np.full((L, NY, L), U, dtype=np.float64, order=
"F"))
64 fest =
abraham_cd(RE) * 0.5 * U ** 2 * np.pi * (DH / 2) ** 2 * (1.4
if duct
else 1.05)
65 vfl = ((L - 2 * WX) ** 2 * NY
if duct
else L * L * NY) - np.pi / 6 * DH ** 3
67 if os.environ.get(
"DUCT_NOBF",
"0") !=
"1":
68 s.set_body_force(0.0, fest / vfl, 0.0)
69 v0 = float(np.asarray(s.get_v()).sum())
70 print(
" [%s] initial sum(v)/vfl = %.5f (fluid v-points with |v|>0: %d, vfl=%d)"
71 % (
"duct" if duct
else "periodic", v0 / vfl, int((np.abs(np.asarray(s.get_v())) > 0).sum()), int(vfl)))
73 for k
in range(STEPS):
75 if k < 100
and k % 10 == 9:
76 print(
" k=%3d momentum fraction %.4f F_y=%.4e" % (k + 1, float(np.asarray(s.get_v()).sum()) / v0,
77 float(np.asarray(s.hydro_force_torque_reaction())[0][0][1])))
78 Fh.append(float(np.asarray(s.hydro_force_torque_reaction())[0][0][1]))
79 if k % 100 == 99
or k == STEPS - 1:
80 vm.append((k + 1, float(np.asarray(s.get_v()).sum()) / vfl))
83 return Fh[n4:].
mean(), Fh, vm, vfl
87 % (DH, RE, L, NY, L, (L - 2 * WX) / DH, L, NY, L))