Aetheria/docs/research/gravity-well-law/selfpull.py
Meta Vens b2f6122dd2 Research: the conserving compact well law (band terms on the orbit tree), for ruling tame-tails-parent-only-rails
Each node pulls exactly as its body inside its outermost child, exactly as one body
of its family's mass beyond its own support, and nothing beyond its reach; the root
has no reach, so the zone's far field is exactly c(M_zone) however the generator
splits it. C4 on every band edge, closed-form potential (grid = K phi), Plummer core.
Probe against today, a2, c2, b1 and the tapered draft: ratio, funnel, 12-18 u/s,
far field, split invariance, whole-zone depth, and evaluation cost.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 22:22:10 +02:00

15 lines
1.1 KiB
Python

# Self-pull check: a lone body (mass 100) at 200 u on a bodyless node that orbits a sun at 3000 u. Its rail reads the
# node's own terms; a law that counts the body's own mass in the node's family term pulls it toward the node.
# Reuses probe3.py's term builders (its definitions only; the probe's main loop is not run).
import os, sys
import numpy as np
HERE = os.path.dirname(os.path.abspath(__file__))
src = open(os.path.join(HERE, 'probe3.py'), encoding='utf-8').read()
g = {'__file__': os.path.join(HERE, 'probe3.py')}
exec(src[:src.index('rng = np.random')], g); g['rng'] = np.random.default_rng(7)
exec(src[src.index('def zone_struct'):src.index('pick = [int')], g)
par = np.array([-1, 0, 1]); D = np.array([0., 3000., 200.]); m = np.array([5000., 0., 100.]); body = np.array([True, False, True])
own = g['strength'](100.0) * 200 / (200 ** 2 + g['core_radius'](100.0) ** 2)
for name, build in (('tapered draft', g['build_terms_tapered']), ('band', g['build_terms_band'])):
T = build(par, D, m, body, g['TIDAL'])[0]
print(f'{name}: the node pulls the lone body at {g["own_pull"](T, 1, 200.0) / own:.3f} of its own pull')