This guide lists every input, command, output and failure case so that you can repeat the check. The physics behind it is in conserved flux, physical units and a first growth estimate and solving for the bound cloud's growth rate reproducibly.
What the authors published
The CENTRA gravitation group hosts amplification factors for scalar, electromagnetic and gravitational waves scattered by Kerr black holes. CENTRA/GRIT, amplification factors The page says the routines are freely available and asks users to refer to the original work, the review by Brito, Cardoso and Pani. Brito, Cardoso and Pani, Superradiance, §4.7
Z is the fractional energy gain of the reflected wave, Z=dEout/dEin−1. The archive also contains a Mathematica notebook. We did not open it, so nothing here depends on the authors' code.
We do not redistribute the archive. Its SHA-256 digests are recorded in slice-inputs.json so that you can confirm you have the same bytes.
Step 1: download and verify
Keep the download in its own empty folder, and the scripts in another.
mkdir -p superradiance-check/author-data superradiance-check/scripts
cd superradiance-check/author-data
curl -L -o superradiance_spin_1.zip https://centra.tecnico.ulisboa.pt/media/cms_page_media/147/superradiance_spin_1.zip
shasum -a 256 superradiance_spin_1.zip
unzip superradiance_spin_1.zip
shasum -a 256 sigma_VS_om_a_s0l1m1.dat
The two digests should be:
2c03d43e8d417fad30c2128bb202836411a384dac99d2dcd1a3679f6574aff30 superradiance_spin_1.zip
e03e70b3b2af6c8112487212f8dcb04c9d5bfa46837685580ad65694865333af sigma_VS_om_a_s0l1m1.dat
If either differs, the host has changed the file. Stop and compare before trusting any result below. The run script also checks the table digest and records whether it matched.
Step 2: get the scripts and run them
Save these files into the scripts folder:
- spheroidal_eigenvalue.py, the angular eigenvalue.
- kerr_scalar_scattering.py, the scattering solver.
- low_frequency_amplification.py, the analytic small-frequency formula.
- reproduce_amplification_slice.py, the comparison driver.
- slice-inputs.json, the run settings.
Then run, from the scripts folder:
python3 reproduce_amplification_slice.py ../author-data/sigma_VS_om_a_s0l1m1.dat slice-inputs.json slice-outputs.json
The script exits with status 0 when no row fails and 1 otherwise. Our output is slice-outputs.json. We used Python 3.9.6, NumPy 2.0.2 and SciPy 1.13.1; the versions are written into the output file.
What the solver does
The solver shares no code with the authors. For each frequency it:
- computes the spheroidal eigenvalue for c2=(aω)2 as the eigenvalue of a 24×24 matrix;
- starts at r++10−3(r+−r−) from an eight-term series that falls purely into the horizon;
- integrates the radial equation outward with an eighth-order Runge-Kutta method, relative tolerance 10−11, to r=max(250,80/ω);
- matches the result to twelve-term incoming and outgoing series and reads off Z=∣Rout/I∣2−1.
A row passes when the computed Z is within 10−5 of the published value, relative. Rows whose published value is below 10−12 in magnitude are reported separately as round-off rows, since a relative difference has no meaning there.
Results
The largest gain in the slice is 0.366 percent at Mω=0.382, consistent with the review's statement that scalar waves gain at most about 0.4 percent. Above the threshold the hole absorbs almost the whole wave: Z approaches −1.
Two independent limits back up the solver. With the spin set to zero, Z is negative at every frequency tried: −1.69×10−5 at Mω=0.05, −0.0344 at 0.2 and −0.998 at 0.5. A non-rotating hole only absorbs. At small frequency the analytic formula of the review, its Eqs. (4.103)-(4.104), approaches the table: the ratio of formula to table is 0.990 at Mω=0.0087 and falls to 0.772 by Mω=0.095, as expected for a leading-order expansion.
Step 3: where the hydrogenic growth formula holds
The cloud growth rate has a short formula, Eq. (5.27) of the review, valid for small coupling. To see where it holds, save kerr_bound_states.py and compare_hydrogenic_growth.py next to the other scripts and run
python3 compare_hydrogenic_growth.py hydrogenic-comparison-outputs.json
It solves the continued fraction for spins 0.5, 0.7, 0.9 and 0.99 and couplings from 0.05 in steps of 0.01 until the cloud stops growing, and first checks itself against Dolan's Table I. All six maxima agree to within 0.3 percent. Dolan, Instability of the massive Klein-Gordon field on the Kerr spacetime, Table I Our output is hydrogenic-comparison-outputs.json.
Read this table with care. The agreement bands lie just below each cut-off, where the two curves cross on their way to zero; they are not a regime in which the formula is accurate. At the smallest coupling computed, α=0.05, the formula still overestimates by 15 to 53 percent, more at higher spin. The real part of the frequency is far better: within 0.4 percent everywhere. The formula is a fair guide to which couplings grow and a poor guide to how fast.
Failure cases and guarded traps
The first and the last two items happened in our runs. The second and third are guarded in the code.
- The threshold row. At Mω=mΩH the exact gain is zero. The table's 7.1×10−15 and our 0 are both round-off, so the row is reported but not scored.
- The extremal limit. The solver's horizon series and tortoise coordinate need r+=r−, so it refuses a=1 instead of returning a number.
- The wrong angular parameter. For the bound cloud the spheroidal parameter is a2(ω2−μ2), a complex number. The bound-state solver computes it from the complex frequency at every step, rather than reusing the real scattering value (aω)2.
- The wrong level. At a=0.55 and α=0.47 the hydrogenic starting guess converges to the first overtone, MωR=0.4622, instead of the ground state, MωR=0.45190. Continuing from a neighbouring solution fixes it.
- Slow convergence at small coupling. At a=0.99 and α=0.05 the continued fraction still changes by 1.2×10−4 when made four times deeper.
What this check does not show
It covers one file, the massless scalar with l=m=1, at one spin. It says nothing about the electromagnetic or gravitational tables, nor about other spins in the same file, though the script can be pointed at them by changing the spin in the inputs. Agreement with the authors' table shows that two independent codes solve the same equation the same way; it is not an observation of superradiance. The Lab's gain chart uses the same solver, so this guide is also its test. Try it in the black hole superradiance Lab.