24 g = (np.arange(Ng) + 0.5) / Ng * side
25 X, Y, Z = np.meshgrid(g, g, g, indexing=
"ij")
26 best = np.full((Ng, Ng, Ng), 1e30)
27 for k
in range(len(pos)):
28 dx = X - (pos[k, 0] + side / 2)
29 dx -= side * np.round(dx / side)
30 dy = Y - (pos[k, 1] + side / 2)
31 dy -= side * np.round(dy / side)
32 dz = Z - (pos[k, 2] + side / 2)
33 dz -= side * np.round(dz / side)
34 best = np.minimum(best, np.sqrt(dx * dx + dy * dy + dz * dz) - r[k])
38def permeability(Ng, sdf, side, colloc, ghost, mode=0, mu=0.1, F=1e-3, dt=80.0, max_steps=3000,
40 lv = max(2, int(np.log2(Ng)) - 1)
41 s = (flow.SolverColocated
if colloc
else flow.Solver)(Ng, Ng, Ng)
45 s.set_body_force(F, 0, 0)
46 s.set_advection(
False)
47 s.set_velocity_solver_params(150)
48 s.set_pressure_multigrid(
True, levels=lv)
49 s.set_pressure_pcg(
True, 400, 1e-9)
51 s.set_ghost_projection(
True, 1, 2)
53 s.set_face_interp(mode)
54 s.set_solid(np.asfortranarray(sdf), cutcell_pressure=
True,
55 pressure_coarse=
"rediscretized")
57 for it
in range(max_steps):
60 m = float(s.get_u().mean())
61 if it > 10
and abs(m - prev) < tol * (abs(m) + 1e-30):
64 umean = float(s.get_u().mean())
65 return dict(k=mu * umean / F * (side / Ng) ** 2, steps=it + 1,
66 pit=s.last_pressure_iterations(), div=s.max_open_divergence())
84 for name, colloc, ghost, mode
in variants:
permeability(Ng, sdf, side, colloc, ghost, mode=0, mu=0.1, F=1e-3, dt=80.0, max_steps=3000, tol=1e-6)