Gravitational Echolocation

A sense you weren’t born with

Imagine someone born with a lattice of atomic clocks embedded in their head — twenty-seven of them, arranged in a neat 3×3×3 grid. Every mass in the world dents spacetime, and clocks deeper in the dent tick slower. Could such a person feel the masses around them, the way echolocation feels surfaces?

One constraint makes this premise honest: the head carries no outside reference. There is no distant master clock to compare against — only the twenty-seven clocks against each other. Whatever is sensed must live in the differences between their tick rates, never in their absolute values.

That is a well-posed physics question, and everything on this site so far — the forward model, the particle filter, the degeneracy analysis — is already dimension-agnostic. So: how far can this sense reach?

What an exterior mass shows the head

Every previous page hid the mass inside the sensor array. An exterior mass is a harder target: it shifts all twenty-seven clocks by nearly the same amount (a common-mode offset, ∝ M/R), and that shared offset is exactly what the head cannot perceive. Subtract the mean and what remains is the gradient of the potential across the head — falling off as 1/R² — plus the still-fainter curvature that distinguishes “small mass nearby” from “large mass far away.” Direction is cheap; range is expensive. This is the mass–distance degeneracy in its purest form.

Code
import matplotlib.pyplot as plt
import numpy as np
from clocks import clock_rates
from clocks._scenarios import (
    ECHO_NOISE_STD,
    build_head_lattice,
    echo_mass_config,
)

head = build_head_lattice()
ranges = np.linspace(2.0, 10.0, 60)  # from the validated exterior minimum
signal = []
for r in ranges:
    rates = clock_rates(echo_mass_config(float(r)), head)
    signal.append(np.max(np.abs(rates - rates.mean())))

fig, ax = plt.subplots()
ax.semilogy(ranges, signal, color="steelblue", label="differential signal")
ax.axhline(
    ECHO_NOISE_STD, color="lightcoral", linestyle="--", label="noise floor"
)
ax.set_xlabel("range (circumradii)")
ax.set_ylabel("max centered rate difference")
ax.legend()
plt.close(fig)
fig

The differential signal an exterior mass leaves on the head, vs range. The dashed line is the per-observation noise floor; the sense must work in the shrinking gap above it.

One technical footnote. Subtracting the mean makes the observation noise slightly correlated — every centered rate shares the subtracted average. The filter nonetheless keeps the simpler independent-noise likelihood, which is harmless here: on centered residuals the two likelihoods differ only by a constant that cancels out of the particle weights. (Only the absolute evidence normalization shifts, and nothing on this page uses it.)

Watching the head lock on

The demo places the mass at two circumradii along a fixed off-axis direction and lets the filter work through eighty differential observations. The camera orbits once while the particle cloud — six thousand hypotheses spread through a box far larger than the head — collapses onto the true mass. (This demo run is curated for visual clarity: two circumradii is the closest, most favorable range, and its seed is fixed. The study below takes no such liberties.)

The echolocation demo. Left: the head lattice, the true exterior mass (star), and the particle cloud, camera orbiting. Right, top to bottom: parameter convergence, mass marginal, differential rates by clock.

How far does the sense reach?

The quantitative version: sweep the range from two to eight circumradii, twelve independent runs per range (certification seeds, run exactly once — no cherry-picking), and track both the actual error and the filter’s own claimed uncertainty. The pass criterion is strict, and only the nearest range clears it.

Resolution vs range. Top: position error; bottom: mass error. Dots are individual runs, solid lines are medians, dashed lines are the filter’s claimed uncertainty (posterior std).

At two circumradii the head localizes the mass in eleven of twelve runs, and its confidence is honest: the truth lands inside the filter’s own 3-sigma region in all twelve. This is the near field, and the sense works.

Past that, it fails in two very different ways. From roughly two-and-a-half to four-and-a-half circumradii the filter is confidently wrong. The mass–distance degeneracy drags its estimate outward along the line of sight — pushing the mass too far and inflating its size to compensate — while the reported uncertainty stays deceptively tight. 3-sigma coverage collapses across this band: three of twelve, then one of twelve, then zero of twelve as the range grows. Here the head would swear it senses a mass that simply is not where it thinks.

Farther out, from about six to eight circumradii, the failure turns honest. The signal now sits so far below the level where range can be pinned that the posterior just goes diffuse — position uncertainty at eight circumradii runs roughly fifteen times the near-field value — and with that width the truth falls back inside the credible region nine and then eleven times out of twelve. The head no longer knows where; but it has stopped pretending to.

Verdict

Physically coherent, with a short and treacherous horizon. The differential signal an exterior mass leaves on a head-sized lattice dies as 1/R², and separating mass from range leans on a fainter curvature term dying as 1/R³. So the sense is sharp only within two to three circumradii. Just beyond that lies a band where the degeneracy makes the head misjudge range with confidence — the most dangerous failure a sense can have — before the signal finally sinks far enough that the uncertainty widens honestly and the false certainty dissolves. Our imagined synesthete would feel what is close — furniture, a doorframe, someone leaning in — as a presence with clear direction and rough heft; would feel things in the middle distance too, but misplaced, and held with a conviction they haven’t earned; and would sense the far world only as a vague pressure with no fixed location. Echolocation is the right metaphor, with the right caveat: a near-field sense, written in spacetime instead of sound — reliable at arm’s reach, credulous in the middle distance, and knowingly blind beyond.

Coda: could she feel the Sun?

The simulation runs in units where G = c = 1, but nothing stops us from asking the question in SI. Give the head a 10 cm clock baseline and the best clocks the present day offers — fractional-frequency instability near \(10^{-16}/\sqrt{\tau}\), systematic floors around \(10^{-18}\) — and ask: sitting long and still enough, could she feel the Sun? Jupiter?

Code
import math

from IPython.display import Markdown

C2 = 8.987551787e16  # c^2, (m/s)^2
BASELINE = 0.1  # clock baseline inside the head, m
SIGMA0 = 1e-16  # clock instability: sigma_y(tau) = SIGMA0 / sqrt(tau)
FLOOR = 1e-18  # systematic floor
GM_SUN, GM_JUP = 1.327124e20, 1.266865e17  # m^3/s^2
AU, R_EARTH, G_SURFACE = 1.495979e11, 6.371e6, 9.80665


def gradient(gm, r):
    """Differential rate across the baseline, held static at range r."""
    return gm * BASELINE / (r**2 * C2)


def tide(gm, r):
    """Surviving differential for a head riding the freely falling Earth.

    Best case: a vertical baseline at the sub-source point, where the
    tidal factor (3 cos^2 theta - 1) reaches its maximum of 2.
    """
    return 2 * gm * R_EARTH * BASELINE / (r**3 * C2)


def sitting_time(signal):
    tau = (SIGMA0 / signal) ** 2
    for label, unit in [("seconds", 1.0), ("hours", 3600.0), ("days", 86400.0)]:
        if tau < 1000 * unit:
            return f"{tau / unit:.0f} {label}"
    years = tau / 3.156e7
    if years < 1e4:
        return f"{years:.0f} years"
    return f"$10^{{{round(math.log10(years))}}}$ years"


def vs_floor(signal):
    ratio = signal / FLOOR
    if ratio >= 1:
        return f"{ratio:.0f}× above"
    ratio = 1.0 / ratio
    if ratio < 1000:
        return f"{ratio:.0f}× below"
    return f"$10^{{{round(math.log10(ratio))}}}$× below"


ROWS = [
    ("Earth, from a chair", G_SURFACE * BASELINE / C2),
    ("Sun, hovering static at 1 AU", gradient(GM_SUN, AU)),
    ("Sun, from a chair on Earth", tide(GM_SUN, AU)),
    ("Jupiter, from a chair on Earth", tide(GM_JUP, 4.2 * AU)),
    ("Jupiter, hovering 100,000 km from center", gradient(GM_JUP, 1.0e8)),
]
lines = [
    "| Source | Differential signal | Sitting time (statistical)"
    " | vs systematic floor |",
    "|---|---|---|---|",
]
for name, s in ROWS:
    lines.append(f"| {name} | {s:.1e} | {sitting_time(s)} | {vs_floor(s)} |")
Markdown("\n".join(lines))
Source Differential signal Sitting time (statistical) vs systematic floor
Earth, from a chair 1.1e-17 84 seconds 11× above
Sun, hovering static at 1 AU 6.6e-21 7 years 152× below
Sun, from a chair on Earth 5.6e-25 \(10^{9}\) years \(10^{6}\)× below
Jupiter, from a chair on Earth 7.2e-30 \(10^{19}\) years \(10^{11}\)× below
Jupiter, hovering 100,000 km from center 1.4e-17 50 seconds 14× above

Earth passes immediately. The vertical gradient across her own head is \(1.1\times10^{-17}\) — laboratory clocks have already resolved this across a single millimeter — so a minute or two of stillness gives her down, permanently and unambiguously.

The Sun is stranger. Hovering motionless at 1 AU the signal exists, and seven patient years would statistically resolve it — but it sits two orders of magnitude beneath today’s systematic floor, so that sense waits on the next generation of clocks. And from a chair on Earth the problem changes in kind, not just degree: the Earth free-falls around the Sun, and free fall cancels that leading \(1/R^2\) gradient exactly — the equivalence principle, enforcing itself. What survives inside the head is the tidal residue: real physics, measurable in principle, but four further orders down even with the most favorable alignment, and a million times beneath the floor. No amount of focus recovers the term geometry has removed, and no clock on any horizon reaches the one it leaves behind. (Earthbound clock networks genuinely do see lunar and solar signatures near the \(10^{-17}\) level — tidal-potential and solid-Earth responses spread across continental baselines. Across a single head, though, that ride is common mode: centering erases it, leaving only the local residue already in the table.)

Jupiter, from Earth, is beyond hopeless. To feel Jupiter she must go there — and hold station, engines burning, because an orbit is free fall and free fall forfeits the signal. Hovering 100,000 km from Jupiter’s center — barely 30,000 km above the cloud tops — Jupiter presses on her clocks as strongly as Earth does from a chair: one meditative minute.

There is a familiar shape in all this. Setting the signal against the \(10^{-18}\) floor gives the head a detection horizon of about 0.08 AU for a Sun-sized mass — and the Sun sits twelve times beyond its own horizon, just as the study above found a reach of only a few circumradii. And even inside the horizon, the verdict’s caveat becomes absolute at astronomical range: the curvature term that separates mass from distance is suppressed by a further factor of baseline over range, about \(10^{-12}\) at 1 AU. She could feel direction and pull, never distance — a presence, not a place. Which may be the most meditative conclusion physics has on offer.

NoteReproduce

uv run demo-echolocation-3d regenerates the demo; uv run scripts/scan_echolocation_range.py reruns the sweep (tuning seeds; the published figure used --seed-block 300). See Getting Started.