Note
Go to the end to download the full example code.
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
Flamm’s paraboloid makes this curvature literal: embedding this 2-surface as a surface of revolution \(z(r)\) in ordinary flat 3D Euclidean space,
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#

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)