32def hybrid(G, k, mass, full_faces=False):
35 X, Y = np.meshgrid(G.xc, G.yc, indexing=
"ij")
37 nrm = (X / rr, Y / rr)
39 ax = np.zeros_like(G.ax); ay = np.zeros_like(G.ay)
40 ax[1:-1, :] = np.where(sc[1:, :] & sc[:-1, :], 1.0
if full_faces
else G.ax[1:-1, :], 0)
41 ay[:, 1:-1] = np.where(sc[:, 1:] & sc[:, :-1], 1.0
if full_faces
else G.ay[:, 1:-1], 0)
42 wallc = np.zeros((n, n))
43 M = np.where(sc, G.kap, 0.0)
44 for i, j
in zip(*np.nonzero(sc)):
45 for (di, dj, a_face, na)
in ((1, 0, G.ax[i + 1, j], nrm[0]), (-1, 0, G.ax[i, j], nrm[0]),
46 (0, 1, G.ay[i, j + 1], nrm[1]), (0, -1, G.ay[i, j], nrm[1])):
47 if sc[i + di, j + dj]:
49 th = max(G.sdf[i, j] / (G.sdf[i, j] - G.sdf[i + di, j + dj]), 1e-3)
51 film = 0.0
if np.isinf(k)
else 1.0 / (k * h * max(abs(na[i, j]), 1e-12))
52 wallc[i, j] += 1.0 / (th + film) / h**2
54 sl = (G.kap > 1e-12) & ~sc
55 for i, j
in zip(*np.nonzero(sl)):
56 nb = [(i + 1, j, G.ax[i + 1, j]), (i - 1, j, G.ax[i, j]),
57 (i, j + 1, G.ay[i, j + 1]), (i, j - 1, G.ay[i, j])]
58 w = np.array([a
if sc[p, q]
else 0.0
for p, q, a
in nb])
60 w = np.array([1.0
if sc[p, q]
else 0.0
for p, q, a
in nb])
64 for (p, q, _), ww
in zip(nb, w):
65 M[p, q] += ww * G.kap[i, j]
66 K, _ = assemble_fv(G, ax, ay, sc, wall_coef=wallc)
67 Md = M[sc]
if mass ==
"kappa" else np.ones(sc.sum())
72 G =
Geo(ND, off); h = G.h
74 which = 1
if Bi == 0
else 0
77 K, _ = assemble_fv(G, G.ax, G.ay, cells, wall_coef=np.where(cells, Bi * G.Aw / h**2, 0))
78 out[
"P"] = smallest_eig(K, G.kap[cells], k=2)[which]
80 wc = np.where(cells, G.Aw / (h * h * (np.maximum(G.dwall, 1e-3 * h) + 1 / Bi)), 0)
81 K, _ = assemble_fv(G, G.ax, G.ay, cells, wall_coef=wc)
82 out[
"RF"] = smallest_eig(K, G.kap[cells], k=2)[which]
83 for tag, mass, full
in ((
"H-k",
"kappa",
False), (
"H-1",
"one",
False), (
"Hf-1",
"one",
True)):
84 K, M =
hybrid(G, Bi, mass, full)
85 out[tag] = smallest_eig(K, M, k=2)[which]
92 for Bi
in (0.0, 0.1, 1.0, 10.0, 100.0, np.inf):