40def wave_mode(k, nu, sigma=1.0, rho=1.0, H=None):
41 """Complex growth rate s (Re s < 0 decay, Im s frequency) of the two-fluid capillary wave."""
42 from scipy.optimize
import fsolve
44 w0sq = sigma * k ** 3 / (2 * rho)
46 w0sq *= math.tanh(k * H)
50 s = complex(v[0], v[1])
51 m = np.sqrt(k * k + s / nu)
54 r = s * s + w0sq * (1.0 - k / m)
55 return [r.real, r.imag]
57 eps = k * math.sqrt(nu / w0)
58 v = fsolve(f, [-w0 * eps / (2 * math.sqrt(2)), w0 * (1 - eps / (2 * math.sqrt(2)))], xtol=1e-12)
59 return complex(v[0], v[1]), w0
63def drop_mode(n, R, nu, sigma=1.0, rho=1.0, dps=50):
64 """Complex growth rate s of mode n of a drop in an identical fluid; returns (s, w0_Lamb)."""
71 return mp.sqrt(mp.pi / (2 * z)) * mp.besselj(n + mp.mpf(1) / 2, z)
74 return mp.sqrt(mp.pi / (2 * z)) * mp.hankel1(n + mp.mpf(1) / 2, z)
81 jR, hR = jn(q * Rm), hn(q * Rm)
82 basis = [(
lambda r: (r / Rm) ** n,
lambda r: mp.mpf(0), 1),
83 (
lambda r: mp.mpf(0),
lambda r: jn(q * r) / jR, 1),
84 (
lambda r: (Rm / r) ** (n + 1),
lambda r: mp.mpf(0), -1),
85 (
lambda r: mp.mpf(0),
lambda r: hn(q * r) / hR, -1)]
87 for j, (phi, f, sg)
in enumerate(basis):
88 U =
lambda x, phi=phi, f=f: mp.diff(phi, x) + n * (n + 1) * f(x) / x
89 V =
lambda x, phi=phi, f=f: (phi(x) + mp.diff(
lambda y: y * f(y), x)) / x
90 T = mu * (Rm * mp.diff(
lambda y: V(y) / y, Rm) +
U(Rm) / Rm)
91 N = rho * s * phi(Rm) + 2 * mu * mp.diff(U, Rm)
95 M[3, j] = -sg * N - (sigma * (n - 1) * (n + 2) / (s * Rm ** 2)) *
U(Rm) * (1
if sg == 1
else 0)
98 w0 = mp.sqrt(n * (n - 1) * (n + 1) * (n + 2) * sigma / (R ** 3 * (2 * n + 1) * rho))
99 eps = mp.sqrt(nu / (w0 * R * R))
100 s0 = w0 * mp.mpc(-0.885 * eps, 1 - 0.885 * eps)
102 s = mp.findroot(
lambda s: det(s) / d0, s0, tol=1e-24, maxsteps=200)
103 return complex(s), float(w0)
109 for nx, nu, mw, mg
in [(32, 0.005, 0.06017, 1.087e-3), (64, 0.005, 0.02130, 4.628e-4), (32, 0.02, 0.05928, 2.746e-3)]:
116 meas = {0.02: (0.09010, 3.983e-3), 0.01: (0.09061, 2.300e-3), 0.005: (0.09072, 1.474e-3),
117 0.0025: (0.09075, 1.011e-3), 0.00125: (0.09066, 7.108e-4)}
119 for nu
in [0.02, 0.01, 0.005, 0.0025, 0.00125]:
120 s, w0 = drop_mode(2, 8.0, nu)