Numerical study of energy extraction from rotating (Kerr) black holes via the Penrose process using rocket propulsion. This repository accompanies the paper "On the rarity of rocket-driven Penrose extraction in Kerr spacetime".
Through 252,000 trajectory simulations (112,000 main experimental phases + 140,000 spin-threshold characterization), we establish:
| Finding | Value |
|---|---|
| Broad-scan success rate ( |
~1% |
| Sweet-spot success rate ( |
11--14% |
| Peak success rate ( |
~88.5% |
| Critical spin threshold | |
| Single-impulse efficiency | |
| Continuous thrust efficiency | 2--4% |
Sweet spot parameters: specific energy
A single impulsive burn at periapsis achieves maximum efficiency (~19%) by concentrating all thrust at the point of minimum exhaust energy.
Sustained thrust throughout the ergosphere passage demonstrates path-averaging effects that reduce efficiency to 2--4%.
Within the ergosphere of a Kerr black hole, the stationary Killing vector becomes spacelike, permitting negative-energy states. A spacecraft can exploit this by ejecting exhaust with negative Killing energy
We work in the test-particle limit (
where the exhaust 4-velocity is
Penrose signature: Energy extraction occurs when exhaust Killing energy
penrose_process/
|-- kerr_utils.py # Kerr metric, geodesic equations, impulse mechanics
|-- single_thrust_case.py # Single impulsive burn at periapsis
|-- continuous_thrust_case.py # Sustained ergosphere thrust (RK4 integrator)
|-- pyproject.toml # Package configuration
|-- experiments/
| |-- trajectory_classifier.py # Orbit classification (flyby, plunge, bound)
| |-- parameter_sweep.py # Grid-based parameter exploration
| |-- comprehensive_sweep.py # Full statistical sweeps
| |-- thrust_comparison.py # Strategy comparison (geodesic/impulse/continuous)
| |-- ensemble.py # Monte Carlo analysis with BCa bootstrap CIs
| |-- run_trajectory_study.py # CLI orchestrator
| |-- generate_prd_figures.py # Paper figure generation (6 figures)
| |-- regenerate_sweep_data.py # Sweep data regeneration
| |-- trajectory_visualization.py # Animated GIF generation
| |-- phase_space.py # Phase-space (E, Lz) diagrams
| `-- benchmark.py # Performance and reproducibility tracking
|-- tests/
| |-- test_conservation_laws.py # Conservation laws and analytical solutions
| |-- test_derivatives.py # Kerr metric derivative validation
| |-- test_null_cases.py # Schwarzschild and outside-ergosphere null tests
| |-- test_geodesic.py # Pure geodesic flyby validation
| |-- test_optimal_thrust.py # Optimal thrust direction test
| |-- test_retrograde_thrust.py # Retrograde exhaust Penrose condition test
| |-- test_E_ex_directions.py # Exhaust energy directional dependence
| `-- test_integrator_convergence.py # ODE solver accuracy analysis
|-- results/ # Pre-computed sweep data (JSON)
|-- figures/ # Generated paper figures (PDF/PNG)
`-- visualizations/ # Animated GIFs
pip install -e .This installs the package in editable mode, making all modules importable without path hacks.
Requirements: Python >= 3.8, numpy, scipy, matplotlib, pandas
# Single impulse case
python single_thrust_case.py
# Continuous thrust case
python continuous_thrust_case.py# Quick validation (~2 min)
python experiments/run_trajectory_study.py --mode quick
# Standard study (~10 min)
python experiments/run_trajectory_study.py --mode standard
# Full analysis (~30 min)
python experiments/run_trajectory_study.py --mode fullpython experiments/trajectory_visualization.py --spin 0.95# Run all tests (requires pip install pytest)
pytest tests/
# Or run individual test files directly
python tests/test_conservation_laws.py
python tests/test_null_cases.pyAll six figures from the paper can be reproduced using the provided scripts.
# Generate all 6 figures (PDF + PNG)
python experiments/generate_prd_figures.pyThis creates figures/fig1_orbit_classification.pdf through figures/fig6_ultrarel_saturation.pdf.
To regenerate the underlying sweep data from scratch (~120,000 trajectories, 4-8 hours):
# Regenerate JSON data for Figures 5 and 6
python experiments/regenerate_sweep_data.py
# Then generate figures from new data
python experiments/generate_prd_figures.pyOptions for regenerate_sweep_data.py:
--fig5: Only regenerate Figure 5 data (velocity phase transition)--fig6: Only regenerate Figure 6 data (ultra-relativistic saturation)--quick: Quick test mode (50 samples/point instead of 500)--workers N: Number of parallel workers
| Figure | File | Description |
|---|---|---|
| 1 | fig1_orbit_classification.pdf |
Orbit classification in |
| 2 | fig2_ensemble_statistics.pdf |
Penrose success rate vs spin |
| 3 | fig3_thrust_comparison.pdf |
Single-impulse vs continuous thrust |
| 4 | fig4_spin_dependence.pdf |
Spin dependence of extraction window |
| 5 | fig5_thrust_sensitivity.pdf |
Velocity phase transition at |
| 6 | fig6_ultrarel_saturation.pdf |
Efficiency saturation as |
The continuous thrust integrator uses classical RK4 with mass-shell projection. For geodesic phases, the recommended solver settings are:
from scipy.integrate import solve_ivp
solution = solve_ivp(
geodesic_rhs,
t_span=(0, tau_max),
y0=initial_state,
method='DOP853', # 8th-order Dormand-Prince
rtol=1e-10,
atol=1e-12,
)Initial conditions:
-
R. Penrose and R. M. Floyd, Nature Phys. Sci. 229, 177 (1971). doi:10.1038/physci229177a0
-
R. M. Wald, Astrophys. J. 191, 231 (1974). doi:10.1086/152959
-
S. Chandrasekhar, The Mathematical Theory of Black Holes (Oxford University Press, 1983).

