This chapter continues conserved flux, physical units and a first growth estimate. It assumes complex numbers, series solutions of differential equations and some Python.
What makes a frequency a bound state
A trapped cloud must satisfy two boundary conditions at once. At the horizon it may only fall in, as for the scattered wave. Far away it must decay instead of radiating, R∝eqr with
Both conditions together are possible only for special complex values of ω. Their real part is the cloud's oscillation frequency; their imaginary part ωI is the growth rate, positive for a growing cloud.
Dolan writes the solution as a product that already has the right behaviour at both ends, times a power series:
with σ=2r+(ω−mΩH)/(r+−r−) and χ=(μ2−2ω2)/q. The series variable runs from 0 at the horizon to 1 at infinity. Dolan, Instability of the massive Klein-Gordon field on the Kerr spacetime, §III, Eqs. (33)-(34)
From a recurrence to a continued fraction
Putting the series into the radial equation gives a three-term recurrence,
where αn, βn and γn are quadratics in n whose coefficients depend on ω, a, μ, m and the angular eigenvalue Λ. The series converges at r→∞ only for the minimal solution of the recurrence, and that solution exists exactly when
Dolan, §III, Eqs. (35)-(36) and (47)-(48) This is Leaver's method, first used for black-hole ringing.
Two details matter in code. First, Λ must be computed for the complex spheroidal parameter c2=a2(ω2−μ2), not for a2ω2; our solver finds it as an eigenvalue of a 24×24 matrix in a Legendre basis. Second, the fraction is evaluated from a finite depth N back to n=0, so N is a numerical parameter that must be tested.
def continued_fraction(omega, a, mu, l=1, m=1, depth=4000):
c0, c1, c2, c3, c4 = _recurrence_coefficients(omega, a, mu, l, m)
n = np.arange(depth + 1, dtype=float)
alpha = n * n + (c0 + 1) * n + c0
beta = -2 * n * n + (c1 + 2) * n + c3
gamma = n * n + (c2 - 3) * n + c4
tail = 0j
for k in range(depth, 0, -1):
tail = alpha[k - 1] * gamma[k] / (beta[k] - tail)
return (beta[0] - tail) / beta[0]
The full file is kerr_bound_states.py.
Finding the zero
Dolan minimised the absolute value of the fraction over the complex plane. We use a complex secant iteration started from the hydrogenic frequency of the previous chapter. Brito, Cardoso and Pani, Superradiance, §5.6.2, Eq. (5.27) Neighbouring levels are separated by about μ3, so each step is clamped to 5 percent of that spacing. Without the clamp, a single large step can jump to another level.
Worked example 1. For a=0.99 and α=0.1 the hydrogenic guess is Mω=0.099875+1.59×10−11i. The iteration converges to MωI=7.389×10−12. The real part barely moves; the imaginary part halves.
Convergence: make the fraction deeper
We use depth 3000 for α≥0.1 and 6000 below. To test it, solve again with four times the depth and compare.
Small couplings converge slowest. The cloud peaks near r=4/α2, which for α=0.05 is 1600M, so the series variable must get very close to 1 before the solution is captured, and the terms decay slowly. A 10−4 error is far below what the Lab displays. It is still the worst case, and the worst case is the number to quote.
A published check: Dolan's Table I
Dolan lists, for six spins, the coupling of the fastest-growing l=m=1 cloud and its growth rate. We find each maximum with a golden-section search on our solver.
Dolan, Table I
Every difference is smaller than the rounding of the printed three figures. This is a reproduction of one table, not of the whole paper. The script is compare_hydrogenic_growth.py, and its saved output is hydrogenic-comparison-outputs.json.
The overtone trap
The secant iteration converges to whichever zero is nearest, and at large coupling the ground state and the first overtone are close. In the hydrogenic picture their real parts are α(1−α2/8) and α(1−α2/18). At α=0.47 these differ by only about 1.5 percent.
Worked example 2. For a=0.55 and α=0.47, starting from the hydrogenic guess converges to MωR=0.4622. That is the overtone with one radial node. Starting instead from the solution at a=0.54 gives the ground state, MωR=0.45190 with MωI=−1.354×10−3: the cloud is absorbed. A guard that rejects a solution whose real part is more than 8 percent from the hydrogenic value cannot catch this, because the two levels are much closer than that.
Our grid avoids the trap by continuation. From α=0.15 on, each new coupling starts from a straight-line extrapolation of the two previous solutions of the same spin, so the solver follows one level as it moves. Every stored entry is also checked against the superradiance condition, ωI>0 exactly when ωR<mΩH. That test catches a wrong root or a wrong angular eigenvalue, but it cannot tell levels apart, because an overtone obeys the same condition. Continuation and a smooth curve are what keep the grid on the ground state.
The grid behind the Lab
The Lab does not solve the continued fraction in the browser. It reads an offline grid made with build_growth_reference_grid.py:
- Spins from 0 to 0.98 in steps of 0.02, plus 0.99.
- Couplings from 0.05 to 0.70 in steps of 0.01.
- For each entry, MωI to four significant figures and MωR to six.
Between grid points the Lab writes the rate as ωI=g(mΩH−ωR) and interpolates lng, which is smooth, against lnα. This keeps the zero of the growth rate exactly at the superradiance threshold. At seven points chosen between grid lines, including the overtone case above, the interpolated rate agrees with a direct solution to within 0.83 percent.
Lab tasks
- Set spin 0.99 and slide the frequency until the growth curve peaks. Compare the peak coupling with Table 3.2.
- Repeat at spin 0.5. Note where the dashed hydrogenic curve and the solid curve agree, and where they separate.
- Pick the preset Right at the threshold and confirm that the cloud's growth rate and the scattered wave's gain change sign at the same frequency.
Exercises with explained answers
- Why must the root satisfy Req<0?
- Why does a deeper fraction matter more at small coupling?
- You find a growing mode with ωR>mΩH. What went wrong?
- Why interpolate lng instead of ωI directly?
AnswersShow the answer
- With Req>0 the factor eqr grows at large radius. That describes a field fed from infinity, not a cloud held by the hole.
- The cloud extends to about 4M/α2. The series must reproduce the solution out to that radius, where the expansion variable is close to 1, so more terms are needed before the tail stops changing.
- The flux identity forbids it, so either the iteration converged to a spurious root or an overtone, the depth is too small, or the angular eigenvalue was computed for the wrong c2. Repeat with a deeper fraction and a guess continued from a neighbouring solution.
- ωI changes by orders of magnitude and changes sign at the threshold. Linear interpolation of it would move the zero away from ωR=mΩH. The factor g is positive and smooth on both sides, so interpolating it keeps the threshold exact.
The scattered wave can be checked the same way against a public table. The method guide does that: recomputing a published superradiance amplification table.