29def exact(Ds, K, hc, gs, nmax=1):
31 wf = np.sqrt(mu); ws = np.sqrt(gs * mu / Ds)
34 M[0] = [0, j0(wf * R), y0(wf * R)]
35 M[1] = [-Ds * ws * j1(ws * A), wf * j1(wf * A), wf * y1(wf * A)]
36 qs = [Ds * ws * j1(ws * A), 0, 0]
38 M[2] = [j0(ws * A), -K * j0(wf * A), -K * y0(wf * A)]
40 M[2] = [qs[0] - hc / K * j0(ws * A), hc * j0(wf * A), hc * y0(wf * A)]
41 return np.linalg.det(M)
42 mus = np.linspace(0.05, 60, 6000); d = [det(m)
for m
in mus]
43 for i
in range(len(mus) - 1):
44 if d[i] * d[i + 1] < 0:
45 return brentq(det, mus[i], mus[i + 1], xtol=1e-13)
85 fi = (p[0] - G.xc[0]) / h; fj = (p[1] - G.yc[0]) / h
86 i0, j0_ = int(np.floor(fi)), int(np.floor(fj)); tx, ty = fi - i0, fj - j0_
87 cand = [(i0, j0_), (i0 + 1, j0_), (i0, j0_ + 1), (i0 + 1, j0_ + 1)]
88 ww = [(1 - tx) * (1 - ty), tx * (1 - ty), (1 - tx) * ty, tx * ty]
89 ok = [idx[q] >= 0
for q
in cand]
91 return [(idx[q], wv)
for q, wv
in zip(cand, ww)]
92 wsum = sum(wv
for o, wv
in zip(ok, ww)
if o)
96 return [(idx[q], wv / wsum)
for q, wv, o
in zip(cand, ww, ok)
if o]
99def build(G, Ds, K, hc, gs, c=0.7):
101 vf = G.kf > 1e-12; vs = G.ks > 1e-12
102 idf = -np.ones((n, n), int); idf[vf] = np.arange(vf.sum())
103 ids = -np.ones((n, n), int); ids[vs] = vf.sum() + np.arange(vs.sum())
104 N = vf.sum() + vs.sum()
105 rows, cols, vals = [], [], []
106 def add(r, cc, v): rows.append(r); cols.append(cc); vals.append(v)
108 for (idx, D, ax_, ay_)
in ((idf, 1.0, G.afx, G.afy), (ids, Ds, G.asx, G.asy)):
109 for (a, P, Q)
in ((ax_[1:-1, :], idx[:-1, :], idx[1:, :]), (ay_[:, 1:-1], idx[:, :-1], idx[:, 1:])):
110 m = (a > 0) & (P >= 0) & (Q >= 0)
111 for aa, p, q
in zip(a[m], P[m], Q[m]):
113 add(p, p, cf); add(p, q, -cf); add(q, q, cf); add(q, p, -cf)
116 for i, j
in zip(*np.nonzero(G.Ain > 1e-12 * h)):
117 cx, cy = G.X[i, j], G.Y[i, j]
118 rr = np.hypot(cx, cy); xw = np.array([cx, cy]) * A / rr; nn = xw / A
119 for sf
in (s, 1.0 * h, 1.5 * h):
120 pf =
bilin(G, idf, xw + sf * nn)
121 if pf
is not None:
break
122 for ss
in (s, 1.0 * h, 1.5 * h):
123 ps =
bilin(G, ids, xw - ss * nn)
124 if ps
is not None:
break
125 if pf
is None or ps
is None:
126 raise RuntimeError(
"probe failed")
127 gf, gs_ = 1.0 / sf, Ds / ss
130 Mx = np.array([[gf, gs_], [-K, 1.0]])
if np.isinf(hc)
else np.array([[gf, gs_], [gf + hc, -hc / K]])
132 Bf = np.array([gf, 0.0])
if np.isinf(hc)
else np.array([gf, gf])
133 Bs = np.array([gs_, 0.0])
134 Minv = np.linalg.inv(Mx)
135 cf_ = Minv @ Bf; cs_ = Minv @ Bs
137 qf = gf * (cf_[0] - 1.0); qs = gf * cs_[0]
139 rf = idf[i, j]; rs = ids[i, j]
141 if rf >= 0: add(rf, col, -Aw * qf * wv / h**2)
142 if rs >= 0: add(rs, col, +Aw * qf * wv / h**2)
144 if rf >= 0: add(rf, col, -Aw * qs * wv / h**2)
145 if rs >= 0: add(rs, col, +Aw * qs * wv / h**2)
147 for i, j
in zip(*np.nonzero(G.Aout > 1e-12 * h)):
148 if idf[i, j] < 0:
continue
149 cx, cy = G.X[i, j], G.Y[i, j]; rr = np.hypot(cx, cy)
150 xw = np.array([cx, cy]) * R / rr; nn = -xw / R
151 pf =
bilin(G, idf, xw + s * nn)
152 if pf
is None:
raise RuntimeError(
"outer probe failed")
154 add(idf[i, j], col, G.Aout[i, j] * (1.0 / s) * wv / h**2)
155 Kmat = sp.csr_matrix((vals, (rows, cols)), shape=(N, N))
156 M = np.concatenate([G.kf[vf], gs * G.ks[vs]])
170 cases = [(1.0, 1.0, np.inf, 1.0), (10.0, 1.0, np.inf, 1.0), (0.1, 1.0, np.inf, 1.0),
171 (100.0, 1.0, np.inf, 0.5), (1.0, 3.0, np.inf, 1.0), (1.0, 1.0, 5.0, 1.0),