Flamm’s paraboloid: gravity as curved geometry, not a force#

General Relativity’s central insight is that gravity is not a force propagating through space, but the curvature of spacetime itself – massive objects don’t pull on other objects, they bend the geometry that other objects move through in a straight line (a geodesic). Restricting the Schwarzschild metric to a constant-time, equatorial (\(\theta=\pi/2\)) slice leaves a curved 2D spatial geometry with proper length element

\[d\ell^2 = \frac{dr^2}{1 - 2M/r} + r^2 d\phi^2\]

Flamm’s paraboloid makes this curvature literal: embedding this 2-surface as a surface of revolution \(z(r)\) in ordinary flat 3D Euclidean space,

\[z(r) = 2\sqrt{2M(r - 2M)}, \qquad r \ge 2M\]

reproduces exactly the same proper distances as the curved metric above, so that walking along the resulting funnel-shaped surface covers the same proper distance as walking through the real curved space around the black hole – for masses \(M\) of increasing size (and correspondingly larger horizons \(r=2M\)).

import matplotlib.pyplot as plt
import numpy as np

from physicskit.relativity.chapters.schwarzschild import SchwarzschildBlackHole
from physicskit.relativity.visualizers.spacetime_3d import plot_flamm_paraboloid

The embedding surface for black holes of increasing mass#

fig = plt.figure(figsize=(13, 4.5))
for i, M in enumerate([0.5, 1.0, 2.0]):
    ax = fig.add_subplot(1, 3, i + 1, projection="3d")
    plot_flamm_paraboloid(M, ax=ax, r_max=15.0)
    bh = SchwarzschildBlackHole(M=M)
    ax.set_title(f"M={M} (horizon at r={bh.horizon_radius}M)")
plt.tight_layout()
plt.show()
M=0.5 (horizon at r=1.0M), M=1.0 (horizon at r=2.0M), M=2.0 (horizon at r=4.0M)

Check#

Flamm’s paraboloid z = sqrt(8M (r - 2M)) embeds the t = const equatorial slice: its arc length from the throat equals the proper radial distance integral of dr / sqrt(1 - 2M/r) = sqrt(r (r - 2M)) + 2M ln(sqrt(r/2M) + sqrt(r/2M - 1)).

z_flamm = np.linspace(0, np.sqrt(8 * (15.0 - 2)), 20001)
r_flamm = 2 + z_flamm**2 / 8
arc = np.sum(np.hypot(np.diff(r_flamm), np.diff(z_flamm)))
proper = np.sqrt(15.0 * 13.0) + 2 * np.log(np.sqrt(15.0 / 2) + np.sqrt(15.0 / 2 - 1))
assert abs(arc / proper - 1) < 1e-6
assert SchwarzschildBlackHole(M=2.0).horizon_radius == 4.0

Total running time of the script: (0 minutes 0.166 seconds)

Gallery generated by Sphinx-Gallery