Allgemeine Feldtheorie — The Foundations and the Engine of “It Is All One”
PART I — THE FOUNDATIONS
July 2026
This document is the foundation and the keystone of the series in one place: the complete axiomatic content, stated once, so that everything else can be defended as consequence — and
1Why a Foundations Page
The documents of this series now run from the Hubble radius to the attometre — six papers, a dozen companion notes, every one carrying calculations. A structure that size either rests on a small number of stated commitments or it rests on nothing. This document states the commitments — all of them — and sorts every claim of the series into one of six columns: postulate, theorem, measured anchor, audit, curiosity, conjecture. One renunciation and named deferrals complete the accounting. Nothing of the series lives outside these columns.
A Reader’s Guide: How the Mathematics Got Small
This document asks nothing of the reader beyond three ideas, and it is worth stating them before the postulates, because they are the whole toolkit. Idea one: there are numbers for which the order of multiplication matters. Hamilton found them in 1843 — the quaternions, with three different square roots of minus one, i, j, k, obeying i·j = k but j·i = −k. This is not a defect; it is rotation. Hold out your phone: turn it face-down then spin it clockwise, versus spin then turn — it ends up differently. Space itself multiplies in an order-sensitive way, and quaternions are simply the numbers that tell the truth about that. Physics done in order-blind numbers must reintroduce the truth by hand — as matrices, tensors, and indices. Physics done in quaternions gets it free. Idea two: time entered with a factor of i — so time behaves like an angle. One choice, W = iτ, made once in Paper 1. Angles close into circles; so time can close into circles; and the size of a system’s time-circle turns out to be its temperature (Section 4 walks this slowly). Half of thermodynamics falls out of one algebraic choice. Idea three: windings must close. A wave wrapped around a closed loop must rejoin itself or cancel. Every integer in quantum mechanics — every discrete orbit, every quantized spin — is a winding that closed. Nothing else produces the integers, and nothing else is needed. That is the toolkit. And here is the payoff, which the reader can use as a promise to hold this document to: written in these numbers, Maxwell’s four equations of electromagnetism become one line; Einstein’s ten equations of gravity become a first-order pair; Dirac’s four-component equation becomes a coupled pair of quaternions (Lanczos found this in 1929, one year after Dirac). The mathematics of physics did not have to be monstrous. The monstrosity was the price of projecting four-dimensional quaternionic motion onto three-dimensional shadows and then bookkeeping the shadows component by component. This document reads the originals. Where the reading is technical despite that, every symbol is introduced before use, with its units; and the hardest calculation in these pages — Equation (1) and
2The Three Postulates
3The Anatomy of a World
Every world of
PART II — THE FIRST THEOREM
4The Family Law
The family law is not a postulate; it is the first thing the two postulates build together — the place where P1 and P2 shake hands. To watch the handshake we need one idea from each postulate. Both can be said in plain words, and every symbol will be introduced before it is used. From P1: temperature is a size. In this series, time enters the algebra as W = iτ. Read that one symbol at a time. τ (tau) is ordinary elapsed time — the reading of your wristwatch, measured in seconds. i is the imaginary unit from school algebra, the number whose square is −1. W is the time coordinate the algebra actually works with: the wristwatch reading multiplied by i. This looks like a formality, and it has one enormous consequence. Multiplying by i is, geometrically, a quarter-turn; a time that carries a factor of i therefore behaves like an angle — and angles close. After one full turn, an angle returns to where it began. Time in this algebra can run in circles, and we call such a circle the W-circle. Now the connection to heat — one of the deepest results of twentieth-century physics. (In the trade it carries the initials of the three people who formalized it, Kubo, Martin and Schwinger; no jargon beyond the statement itself is needed here.) The statement: a system at temperature T repeats itself exactly when carried once around a W-circle of circumference
(1)T · R = ħ
Figure 1. Equation (1) drawn: every world of
family_law_figure.py — family_law_figure
written fig1_family_law.png Planck R=1.616e-35 m T=2.255e+31 K weak bubble R=2.450e-18 m T=1.488e+14 K colour curvature radius, 0.203 fm R=2.030e-16 m T=1.795e+12 K electron Compton cell R=3.860e-13 m T=9.442e+08 K chemistry R=1.000e-06 m T=3.644e+02 K check: colour rung kT = 154.7 MeV (measured 156.5 +/- 1.5) check: family constant = 0.3644 mm.K
# -*- coding: utf-8 -*-
"""Figure 1 of the Allgemeine Feldtheorie: the family law across 61 decades.
Regenerated July 2026. Two corrections against the previous edition:
(1) THE ANCHOR STAR IS GONE. The old figure plotted the CMB at (c/H, 2.725 K)
and marked it "off the line by 10^30 -- the anchor problem (open)". That
was a mis-assignment, not a miss: the CMB is not a curvature temperature
at all. It is the ELECTROMAGNETIC rung's recombination relic (~3000 K),
redshifted by ~1101 over seven curvature radii, and therefore has no
business on a plot of horizon temperature against curvature radius. The
cosmic rung's own family-law value is the Gibbons-Hawking whisper at
2.7e-30 K, which is on the line, where it always was.
(The Family Law's Cosmic Rung, July 2026.)
(2) THE COLOUR POINT IS RELABELLED. 0.203 fm is the colour world's CURVATURE
RADIUS, not the cage. The cage is the proton, r_p = (4 pi/3) R = 0.84 fm,
and the family law there returns 37 MeV -- the cage's temperature, not the
world's. The old label "colour cage" at 0.2 fm conflated the two.
"""
import numpy as np, matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
hbar=1.054571817e-34; c=2.99792458e8; kB=1.380649e-23; G=6.67430e-11
H=2.1843e-18
FAM=hbar*c/(2*np.pi*kB) # 3.6440e-4 m.K
lP=np.sqrt(hbar*G/c**3)
def T(R): return FAM/R
rungs=[ # (R metres, label, colour, dx, dy, ha)
(lP, "Planck", "black", 2.2, 0.35,"left"),
(2.45e-18, "weak bubble\n(electroweak transition)", "#a02020",-1.0, 0.45,"right"),
(2.03e-16, "colour curvature radius, 0.203 fm\n(155 MeV = the measured\nmelting point of nuclear matter)","#7b1fa2", 1.0, 1.4,"left"),
(3.86e-13, "electron Compton cell\n(pair-plasma)", "#1f3b73", 1.0, 0.9,"left"),
(1.0e-6, "chemistry\n(a warm afternoon, 364 K at 1 μm)", "#1b6b1b", 1.0, 0.35,"left"),
]
fig,ax=plt.subplots(figsize=(14.25,10.20), dpi=100)
R=np.logspace(-37,27,400)
ax.loglog(R,T(R),lw=3.2,color="#1414d2",zorder=2,
label=r"the family law: T$\cdot$R = $\hbar$c/2$\pi$k$_B$ = 0.3644 mm$\cdot$K")
for Rr,lab,col,dx,dy,ha in rungs:
ax.plot(Rr,T(Rr),'o',ms=13,color=col,zorder=4)
ax.annotate(lab,(Rr,T(Rr)),xytext=(10**(np.log10(Rr)+dx*2.2),10**(np.log10(T(Rr))+dy*2.2)),
color=col,fontsize=13,ha=ha,va="center",zorder=5)
# --- the cosmic rung, with a leader so the line never crosses its label ---
ax.plot(c/H, T(c/H), 'o', ms=13, color="black", zorder=4)
ax.annotate("cosmic horizon\n(Gibbons–Hawking whisper)\n2.7×10⁻³⁰ K",
xy=(c/H, T(c/H)), xytext=(1e14, 4e-28),
fontsize=13, color="black", ha="left", va="center", zorder=5,
arrowprops=dict(arrowstyle="-", color="black", lw=1.0,
connectionstyle="arc3,rad=0.12"))
# --- the resolved anchor: a note where the star used to be ----------------
ax.annotate(
"the CMB, 2.725 K, is not on this line —\n"
"it is the electromagnetic rung's relic:\n"
"recombination at 3000 K, redshifted\n"
"1101× over seven curvature radii,\n"
"not a curvature temperature at all.\n"
"The cosmic rung's own value is the\n"
"whisper at the line's far end.",
xy=(1e-36,3e-14), xytext=(1e-36,3e-14),
fontsize=12.5, color="#1b6b1b", ha="left", va="center",
bbox=dict(boxstyle="round,pad=0.6", fc="#f3f8f3", ec="#1b6b1b", lw=1.3), zorder=6)
ax.set_xlim(1e-38,1e28); ax.set_ylim(1e-32,1e34)
ax.set_xlabel("curvature radius R [metres]",fontsize=16,labelpad=10)
ax.set_ylabel("curvature temperature T [kelvin]",fontsize=16,labelpad=10)
ax.set_title("Every world on one line — the family law across 61 decades",fontsize=18,pad=14)
ax.grid(True,which="major",ls="-",lw=0.6,alpha=0.35)
ax.tick_params(labelsize=13)
ax.legend(loc="lower left",fontsize=14,framealpha=0.95)
fig.tight_layout()
fig.savefig("fig1_family_law.png",dpi=100,facecolor="white")
print("written fig1_family_law.png")
for Rr,lab,_,_,_,_ in rungs:
print(f" {lab.splitlines()[0]:<34} R={Rr:.3e} m T={T(Rr):.3e} K")
print(f"\n check: colour rung kT = {T(2.03e-16)*8.617e-5/1e6:.1f} MeV (measured 156.5 +/- 1.5)")
print(f" check: family constant = {FAM*1e3:.4f} mm.K")
Read Equation (1) slowly, because the rest of the series stands on it. T is the temperature of a world, in kelvin. R is that world’s curvature radius, in metres. The right-hand side contains only constants of nature —
4aThe Same Theorem, Read Across a Field: Tolman
Equation (1) was read at a horizon. Read the same step across a static field instead and it delivers the temperature history — which is why this series does not need, and does not have, two thermal mechanisms. Take the W-circle again. A system at temperature T closes its circle, in its own proper time, at circumference
(1a)T · V =
That is the Tolman–Ehrenfest relation, derived here from the same two ingredients as
(1b)T(z) =
Nothing was fitted; the redshift and the temperature ratio are the same function V, met twice. Three things follow, and the first two must be said in the same breath as the result. Equation (1b) holds in every static spacetime whatever — a second derivation, from the hydrostatic equilibrium of a photon gas, shows
tolman_check.py — tolman_check
======================================================================
ROUTE 2 (hydrostatic): photon gas at T(r) in a GENERAL static metric
======================================================================
conservation r-component = 4*a*(T(r)*Derivative(Phi(r), r) + Derivative(T(r), r))*T(r)**3/3
solving for T(r): Eq(T(r), C1*exp(-Phi(r)))
=> T * exp(Phi) = const <-- Tolman-Ehrenfest, ANY static metric, any R(r)
(note: R(r) never enters -- the areal radius is irrelevant to Tolman)
======================================================================
METRIC D: the specific case, exp(Phi) = exp(-k r)
======================================================================
with T(r) = T_0 e^{kr}:
(div T)_t = 0
(div T)_r = 0
(div T)_theta = 0
(div T)_phi = 0
lapse V = sqrt(-g_tt)/c = exp(-k*r)
T * V = T_0 <-- constant, independent of r
redshift: 1+z = V(0)/V(r) = exp(k*r)
therefore T(z)/T_0 = exp(k*r) == 1+z IDENTICALLY
The SAME lapse V carries both the redshift and the temperature.
T(z) = T_0 (1+z) is therefore a tautology of staticity, not a fit.
# -*- coding: utf-8 -*-
"""Independent check of the two routes to Tolman equilibrium, T*V = const."""
import sympy as sp
t,r,th,ph = sp.symbols('t r theta phi', positive=True)
c,k,a,T0 = sp.symbols('c k a T_0', positive=True)
X=(t,r,th,ph); n=4
def christoffel(g):
gi=g.inv()
return [[[sp.cancel(sum(gi[A,d]*(sp.diff(g[d,B],X[C])+sp.diff(g[d,C],X[B])-sp.diff(g[B,C],X[d]))/2
for d in range(n))) for C in range(n)] for B in range(n)] for A in range(n)]
def div_mixed(Tmix, Gam, g):
"""(nabla_mu T^mu_nu) for a mixed tensor."""
out=[]
for nu in range(n):
e=sum(sp.diff(Tmix[mu,nu],X[mu]) for mu in range(n))
e+=sum(Gam[mu][mu][lam]*Tmix[lam,nu] for mu in range(n) for lam in range(n))
e-=sum(Gam[lam][mu][nu]*Tmix[mu,lam] for mu in range(n) for lam in range(n))
out.append(sp.simplify(e))
return out
print("="*70)
print("ROUTE 2 (hydrostatic): photon gas at T(r) in a GENERAL static metric")
print("="*70)
Phi=sp.Function('Phi')(r); R=sp.Function('R')(r); T=sp.Function('T')(r)
g=sp.diag(-c**2*sp.exp(2*Phi), 1, R**2, R**2*sp.sin(th)**2)
Gam=christoffel(g)
rho=a*T**4; p=a*T**4/3 # radiation: rho c^2 = aT^4, p = aT^4/3
Tmix=sp.diag(-rho, p, p, p)
d=div_mixed(Tmix,Gam,g)
eq=sp.simplify(d[1])
print(" conservation r-component =", eq)
sol=sp.dsolve(sp.Eq(eq,0), T)
print(" solving for T(r):", sol)
print(" => T * exp(Phi) = const <-- Tolman-Ehrenfest, ANY static metric, any R(r)")
print(" (note: R(r) never enters -- the areal radius is irrelevant to Tolman)")
print()
print("="*70)
print("METRIC D: the specific case, exp(Phi) = exp(-k r)")
print("="*70)
gD=sp.diag(-c**2*sp.exp(-2*k*r), 1, sp.exp(-2*k*r)*r**2, sp.exp(-2*k*r)*r**2*sp.sin(th)**2)
GamD=christoffel(gD)
TD=T0*sp.exp(k*r) # the claimed history
rhoD=a*TD**4; pD=a*TD**4/3
TmixD=sp.diag(-rhoD,pD,pD,pD)
dD=div_mixed(TmixD,GamD,gD)
print(" with T(r) = T_0 e^{kr}:")
for i,nm in enumerate(['t','r','theta','phi']):
print(f" (div T)_{nm} = {sp.simplify(dD[i])}")
V=sp.sqrt(-gD[0,0])/c
print(f"\n lapse V = sqrt(-g_tt)/c = {sp.simplify(V)}")
print(f" T * V = {sp.simplify(TD*V)} <-- constant, independent of r")
print(f"\n redshift: 1+z = V(0)/V(r) = {sp.simplify(V.subs(r,0)/V)}")
print(f" therefore T(z)/T_0 = {sp.simplify(TD/T0)} == 1+z IDENTICALLY")
print("\n The SAME lapse V carries both the redshift and the temperature.")
print(" T(z) = T_0 (1+z) is therefore a tautology of staticity, not a fit.")
PART III — THE HARVEST
5The Theorem Tree
Figure 2. The theorem tree: three postulates, their consequences, the audits — and, once dashed,
6The Six Columns
The renunciation, priced: the Copernican principle is surrendered — once, explicitly — and what it buys is the isotropy of the redshift–distance law. In a static geometry, a redshift that grows exponentially with distance and does so equally in every direction places whoever measures it at the centre of the arrangement. That isotropy is observed, it is not optional, and in a static universe it is bought with the Copernican principle. Note what it does not buy: T(z) =
PART IV — THE ENGINE
7From Program to Theory
Is this a general field theory? A field theory has three layers: kinematics (what exists), taxonomy (why these particles), and dynamics — an engine from which the field equations follow. The series has the first two in unusual completeness. Until this document’s present edition, the third existed only as a named debt. It is now built, and runs, at the gravity rung. This part assembles it in plain language; its one load-bearing lemma is verified symbolically in the companion script (Cosmology/metricD_focusing_check.py).
metricD_focusing_check.py — metricD_focusing_check
metricD: affine+null OK; theta=2*E*(-k*r + 1)*exp(k*r)/(c*r); residual=0 Schwarz: affine+null OK; theta=2*E/(c*r); residual=0 VERDICT: focusing lemma exact in both kappa = 2*pi/(hbar*c*eta), eta=c^3/(4G hbar) -> 8*pi*G/c**4 (= 8 pi G/c^4)
import sympy as sp
def check(name, gdiag, coords, k_up):
t,r,th,ph = coords
g = sp.diag(*gdiag); ginv = g.inv(); n=4
Gam=[[[sp.simplify(sum(ginv[a,d]*(sp.diff(g[d,b],coords[c])+sp.diff(g[d,c],coords[b])-sp.diff(g[b,c],coords[d]))/2 for d in range(n)))
for c in range(n)] for b in range(n)] for a in range(n)]
def Riem(a,b,c,d):
ex=sp.diff(Gam[a][b][d],coords[c])-sp.diff(Gam[a][b][c],coords[d])
ex+=sum(Gam[a][c][e]*Gam[e][b][d]-Gam[a][d][e]*Gam[e][b][c] for e in range(n))
return ex
Ric=[[sp.simplify(sum(Riem(a,i,a,j) for a in range(n))) for j in range(n)] for i in range(n)]
geo=[sp.simplify(sum(k_up[a]*sp.diff(k_up[b],coords[a]) for a in range(n))
+ sum(Gam[b][a][c]*k_up[a]*k_up[c] for a in range(n) for c in range(n))) for b in range(n)]
assert all(sp.simplify(x)==0 for x in geo), ("not affine",geo)
nullc=sp.simplify(sum(g[a,b]*k_up[a]*k_up[b] for a in range(n) for b in range(n)))
assert nullc==0
sg=sp.sqrt(-g.det())
theta=sp.simplify(sum(sp.diff(sg*k_up[a],coords[a]) for a in range(n))/sg)
dtheta=sp.simplify(sum(k_up[a]*sp.diff(theta,coords[a]) for a in range(n)))
Rkk=sp.simplify(sum(Ric[a][b]*k_up[a]*k_up[b] for a in range(n) for b in range(n)))
resid=sp.simplify(dtheta + theta**2/2 + Rkk)
print(f"{name}: affine+null OK; theta={sp.simplify(theta)}; residual={resid}")
return resid
t,r,th,ph = sp.symbols('t r theta phi', positive=True)
c,k,E,rs = sp.symbols('c k E r_s', positive=True)
coords=(t,r,th,ph)
gD=[-c**2*sp.exp(-2*k*r), 1, sp.exp(-2*k*r)*r**2, sp.exp(-2*k*r)*r**2*sp.sin(th)**2]
kD=[E*sp.exp(2*k*r)/c**2, E*sp.exp(k*r)/c, 0, 0]
r1=check("metricD", gD, coords, kD)
f=1-rs/r
gS=[-c**2*f, 1/f, r**2, r**2*sp.sin(th)**2]
kS=[E/(c**2*f), E/c, 0, 0]
r2=check("Schwarz", gS, coords, kS)
print("VERDICT:", "focusing lemma exact in both" if (r1==0 and r2==0) else "FAIL")
hbar,G=sp.symbols('hbar G',positive=True)
print("kappa = 2*pi/(hbar*c*eta), eta=c^3/(4G hbar) ->", sp.simplify(2*sp.pi/(hbar*c*(c**3/(4*G*hbar)))),"(= 8 pi G/c^4)")
8The Ledger Line, the Seals, the Fuel, the Pixels
The ledger line. The fuel is the oldest equation of thermodynamics. When heat δQ flows into anything at temperature T, its entropy — its count of hidden arrangements — rises by exactly δQ = T·dS. Clausius, 1865. Every steam engine obeys it. It is bookkeeping; the astonishment is only where the line will be made to hold. The seal at every point. Hold station under acceleration — fire your rocket, refuse to fall — and a wall forms behind you: a surface from beyond which no signal can reach you while you keep accelerating. Not a wall of matter; a wall of causality, the same species as the black hole’s horizon, the Hubble sphere, and every seal of this series’ ladder. The crucial point is availability: pick any point, any direction, any moment — there is an accelerated observer whose seal passes exactly there. Seals tile existence. Whatever law we impose at all seals, we impose everywhere. The fuel gauge. A seal has a temperature — and in this series that is not an import but Section 4’s theorem: T = ħa/(2πc·
9The Lever, Executed
The engine needs one piece of genuine differential geometry: a lever connecting “energy crossed the seal” to “the seal’s area changed.” A seal is generated by a sheaf of light rays skimming along it. When energy-momentum crosses, gravity focuses the sheaf, and the area begins to shrink — at a rate that is not vague but exactly proportional to the energy flux (the Raychaudhuri equation, the lever of every singularity theorem). This lemma has been verified in this series’ own benchmarks — symbolically, exactly: for radial light-sheaves in Schwarzschild and in metric D, the focusing identity holds with residual zero (companion script). And the verification paid a bonus it was not asked for: in metric D the computed expansion of an outgoing sheaf is proportional to (1 − kr) — it vanishes at kr = 1, which is precisely the angular-size turnaround at z = e − 1 that the cosmology predicts and the sky shows. The lever, tested on this series’ geometry, independently rediscovered one of the series’ passed tests. Machinery that surprises you with consistency is machinery you may begin to trust.
10The Engine Assembled
At an arbitrary point, choose a seal. Demand the ledger line: the energy flux crossing it must equal the seal’s temperature times its entropy change — which, by the lever, is proportional to the focusing that this same energy causes. Then the decisive move: demand this for every seal at that point — every orientation, every accelerated observer. A single balance is one equation; balance in all directions at all points forces a relation between two entire fields — the curvature of geometry and the energy-momentum of matter. Working through the algebra (Jacobson 1995; inherited, not modified), the unique relation is Einstein’s equation, with the coupling no longer chosen but computed from the pixel size:
(2)κ = 2π/(
(verified algebraically in the companion script). Gravity’s strength is the exchange rate between heat and pixels. The field equation is an equation of state: spacetime bends in response to energy because that is what balancing the entropy books at every seal requires. One refinement matters here: the balance delivers the equation up to a constant that local energy conservation then fixes — admitting a constant background term. The engine does not forbid the background curvature k =
11The Other Gears
The engine’s parts list: seals, a temperature law, an entropy-as-area law, a focusing lever. Audit the other rungs against it. Seals: every rung has them — documented across this series. Temperature:
PART V — THE STANDING OF THE THEORY
12What This Document Claims
Three postulates. One derived law binding every scale, walked in plain words. A page of theorems, ten audits, four quarantined numbers, one priced renunciation. And now an engine — built, credited, and executed at the gravity rung, where it turns the postulates into Einstein’s equation with the coupling computed rather than chosen; verified where it could be verified; and pointed, with a named conjecture, at the remaining rungs where the couplings wait. A framework that names its own missing pieces, and the tools on the shelf beside them, claims less than a finished theory and more than a picture. That is the accurate size of this work today.
13Caveats — What Future Versions Must Address
Stated together, so no reader need hunt for them. (i) The near field — split in two, because the one sentence this caveat used to be was hiding two different debts (The Core of Metric D, Cosmology folder). The diagnosis common to both is one identity: for any static spherically symmetric metric in proper radial distance,
References
W. K. Clifford (1870/1876); H. Weyl, Z. Phys. 56, 330 (1929); T. Kaluza (1921); O. Klein (1926); E. Noether (1918); R. C. Tolman and P. Ehrenfest, Phys. Rev. 36, 1791 (1930); R. Clausius (1865); J. D. Bekenstein, Phys. Rev. D 7, 2333 (1973); S. W. Hawking (1975); W. G. Unruh, Phys. Rev. D 14, 870 (1976); G. W. Gibbons and S. W. Hawking, Phys. Rev. D 15, 2738 (1977); T. Jacobson, Phys. Rev. Lett. 75, 1260 (1995); A. Raychaudhuri (1955); É. Cartan (1922–25); N. J. Popławski, Phys. Lett. B 687, 110 (2010); C. Lanczos, Z. Phys. 57, 447 (1929); A. W. Conway, Proc. Roy. Soc. A 162, 145 (1937); H. Rauch et al. (1975); S. A. Werner et al. (1975); and the documents of this series: Papers 1–6, the Bookkeeping of the Theater, Matter Meets Space, and the companion notes (readable editions, July 2026). Verification scripts: ladder_structure_check.py (the coupling-independence of the equation of state;
14Verification
The companion scripts, with their recorded output. Each script's docstring states what it establishes and what it does not; the Source tab shows the file itself, unedited.
string_cloud_test.py — string_cloud_test
GENERAL static spherically symmetric, proper-radial gauge:
G^t_t = (2*R(r)*Derivative(R(r), (r, 2)) + Derivative(R(r), r)**2 - 1)/R(r)**2
G^r_r = (2*R(r)*Derivative(Phi(r), r)*Derivative(R(r), r) + Derivative(R(r), r)**2 - 1)/R(r)**2
G^th_th = Derivative(Phi(r), r)**2 + Derivative(Phi(r), (r, 2)) + Derivative(Phi(r), r)*Derivative(R(r), r)/R(r) + Derivative(R(r), (r, 2))/R(r)
======================================================================
METRIC D's IMPLIED MEDIUM: w_r = p_r/(rho c^2), w_perp = p_perp/(rho c^2)
======================================================================
G^t_t = (3*k**2*r**2 - 6*k*r - exp(2*k*r) + 1)/r**2
G^r_r = (3*k**2*r**2 - 4*k*r - exp(2*k*r) + 1)/r**2
G^th_th = 3*k*(k*r - 1)/r
w_r = (-3*k**2*r**2 + 4*k*r + exp(2*k*r) - 1)/(3*k**2*r**2 - 6*k*r - exp(2*k*r) + 1)
w_perp = 3*k*r*(-k*r + 1)/(3*k**2*r**2 - 6*k*r - exp(2*k*r) + 1)
limits:
at the observer r->0 : w_r = -3/4 w_perp = -3/8
deep r->oo: w_r = -1 w_perp = 0
a radial STRING CLOUD requires (w_r, w_perp) = (-1, 0) everywhere.
========================================================================
A radial STRING CLOUD imposes TWO conditions:
(A) G^t_t = G^r_r (p_r = -rho c^2)
(B) G^th_th = 0 (p_perp = 0)
With the exponential redshift Phi = -k r, each is an ODE for R(r).
========================================================================
(A) -> (k*Derivative(R(r), r) + Derivative(R(r), (r, 2)))*R(r) = 0
(B) -> k**2*R(r) - k*Derivative(R(r), r) + Derivative(R(r), (r, 2)) = 0
--- (A) alone, with a regular start R(0)=0, R'(0)=1 ---
R = 1/k - exp(-k*r)/k
dR/dr = exp(-k*r) -> never zero: NO angular turnaround at all
--- (B) alone ---
R = 2*sqrt(3)*exp(k*r/2)*sin(sqrt(3)*k*r/2)/(3*k)
dR/dr = 0 at kr = 2.4184 -> 1+z = e^kr = 11.23, z = 10.23
(metric D and the corpus's audited value: z = e - 1 = 1.718)
--- BOTH conditions together ---
(A): R'' = -k R' (B): R'' = k R' - k^2 R
subtract: -2k R' + k^2 R = 0 -> R' = kR/2 -> R = R0 e^{kr/2}
but R(0) = 0 forces R0 = 0, hence R = 0 identically.
=> NO non-trivial radial string cloud is compatible with Phi = -k r.
========================================================================
So the constitutive law does not deliver the 1/r profile -- it FORBIDS it,
and forbids the exponential redshift with it, except as an r -> oo limit.
========================================================================
metric D's medium, rung by rung (w_r, w_perp); string cloud = (-1, 0):
z kr w_r w_perp
0.00 0.00 -0.7500 -0.3750
0.11 0.10 -0.7473 -0.3412
0.65 0.50 -0.7480 -0.1890
1.72 1.00 -0.7870 0.0000
6.39 2.00 -0.9254 0.1119
19.09 3.00 -0.9847 0.0458
147.41 5.00 -0.9995 0.0027
1095.63 7.00 -1.0000 0.0001
22025.47 10.00 -1.0000 0.0000
# -*- coding: utf-8 -*-
"""Does the tension medium's constitutive law deliver metric D's source, or forbid it?
Caveat (i-b) -- metric D's source is a rho ~ 1/r halo centred on the observer --
was handed to the tension medium, on the ground that Part I of the Tension Medium
series identifies the deep medium as Letelier's radial string cloud,
(rho, p_r, p_perp) -> (1, -1, 0) rho. This script asks whether that identification,
promoted from an asymptotic statement to a constitutive law, produces metric D.
It does not. It forbids it.
A radial string cloud imposes TWO conditions on the stress tensor:
(A) G^t_t = G^r_r (p_r = -rho c^2)
(B) G^th_th = 0 (p_perp = 0)
With the lapse fixed by the exponential redshift law, Phi = -k r, each becomes an
ordinary differential equation for the areal radius R(r):
(A) R'' + k R' = 0
(B) R'' - k R' + k^2 R = 0
Each alone has a unique regular solution, and NEITHER is metric D's R = r e^{-kr}:
(A) gives R = (1 - e^{-kr})/k, whose derivative never vanishes -- no angular
turnaround exists at all;
(B) gives R = (2/sqrt3 k) e^{kr/2} sin(sqrt3 k r/2), which turns over at
kr = 2.4184, i.e. z = 10.2 -- not the audited z = e - 1 = 1.718.
Imposed together they give R' = kR/2, hence R = R0 e^{kr/2}, and regularity at the
centre (R(0)=0) forces R0 = 0. There is NO non-trivial radial string cloud
compatible with an exponential redshift law.
WHAT METRIC D'S MEDIUM ACTUALLY IS. Its equation of state runs with radius:
at the observer (w_r, w_perp) = (-3/4, -3/8)
at the turnaround (w_r, w_perp) = (-e^2/(2+e^2), 0) = (-0.787, 0)
deep (w_r, w_perp) -> (-1, 0) the string cloud
So the string-cloud identification is an r -> oo limit, exact nowhere in the
observable range, and the substance filling the near universe -- the substance
that owes the 1/r profile -- is (1, -3/4, -3/8), which this corpus has never
named or characterised.
ONE EXACT STRUCTURE, discovered here and not previously recorded: G^th_th is
proportional to (kr - 1) and dR/dr is proportional to (1 - kr), so the transverse
pressure vanishes EXACTLY on the turnaround sphere. The angular turnaround at
z = e - 1 is the surface on which the medium's transverse stress changes sign --
tension inside, pressure outside -- and it is the one sphere where metric D's
medium is a radial string cloud exactly.
Consequence for the ledger: (i-b) cannot be discharged by appeal to the medium as
currently identified, and the master calculation inherits a harder question than
it was given -- not "does the string cloud support this profile" but "what is the
(1, -3/4, -3/8) substance, and does anything physical have that equation of state".
"""
import sympy as sp
# ===== PART 1: the general tensor and metric D's equation of state =====
t,r,th,ph=sp.symbols('t r theta phi',positive=True)
c,k=sp.symbols('c k',positive=True)
X=(t,r,th,ph); n=4
Phi=sp.Function('Phi')(r); R=sp.Function('R')(r)
g=sp.diag(-c**2*sp.exp(2*Phi),1,R**2,R**2*sp.sin(th)**2); gi=g.inv()
Gam=[[[sp.cancel(sum(gi[A,d]*(sp.diff(g[d,B],X[C])+sp.diff(g[d,C],X[B])-sp.diff(g[B,C],X[d]))/2
for d in range(n))) for C in range(n)] for B in range(n)] for A in range(n)]
def Riem(A,B,C,D):
e=sp.diff(Gam[A][B][D],X[C])-sp.diff(Gam[A][B][C],X[D])
return e+sum(Gam[A][C][E]*Gam[E][B][D]-Gam[A][D][E]*Gam[E][B][C] for E in range(n))
Ric=sp.Matrix(4,4,lambda i,j: sp.cancel(sum(Riem(A,i,A,j) for A in range(n))))
Rs=sp.cancel(sum(gi[i,j]*Ric[i,j] for i in range(n) for j in range(n)))
G=sp.Matrix(4,4,lambda i,j: sp.cancel(Ric[i,j]-g[i,j]*Rs/2))
mix=lambda i: sp.simplify(sum(gi[i,a]*G[a,i] for a in range(n)))
Gtt,Grr,Gthth = mix(0),mix(1),mix(2)
print("GENERAL static spherically symmetric, proper-radial gauge:")
print(" G^t_t =",Gtt)
print(" G^r_r =",Grr)
print(" G^th_th =",Gthth)
import pickle; pickle.dump((sp.srepr(Gtt),sp.srepr(Grr),sp.srepr(Gthth)),open('gen.pkl','wb'))
print("\n" + "="*70)
print("METRIC D's IMPLIED MEDIUM: w_r = p_r/(rho c^2), w_perp = p_perp/(rho c^2)")
print("="*70)
sub={R:r*sp.exp(-k*r), Phi:-k*r}
def ev(E):
e=E
for f,v in [(R,r*sp.exp(-k*r)),(Phi,-k*r)]:
e=e.subs({sp.Derivative(f,(r,2)):sp.diff(v,r,2), sp.Derivative(f,r):sp.diff(v,r), f:v})
return sp.simplify(e.doit())
A,B,C=ev(Gtt),ev(Grr),ev(Gthth)
print(" G^t_t =",A); print(" G^r_r =",B); print(" G^th_th =",C)
wr = sp.simplify(B/(-A)); wp = sp.simplify(C/(-A))
print("\n w_r =",sp.simplify(wr))
print(" w_perp =",sp.simplify(wp))
print("\n limits:")
print(" at the observer r->0 : w_r =",sp.limit(wr,r,0)," w_perp =",sp.limit(wp,r,0))
print(" deep r->oo: w_r =",sp.limit(wr,r,sp.oo)," w_perp =",sp.limit(wp,r,sp.oo))
print("\n a radial STRING CLOUD requires (w_r, w_perp) = (-1, 0) everywhere.")
# ===== PART 2: imposing the string-cloud law =====
r,k=sp.symbols('r k',positive=True); R=sp.Function('R')
Rf=R(r); Rp=sp.diff(Rf,r); Rpp=sp.diff(Rf,r,2)
Phip,Phipp=-k,0 # the exponential redshift: Phi = -k r
# from the general tensor (verified in metricD_core_check.py):
Gtt =(2*Rf*Rpp+Rp**2-1)/Rf**2
Grr =(2*Rf*Phip*Rp+Rp**2-1)/Rf**2
Gthth=Phip**2+Phipp+Phip*Rp/Rf+Rpp/Rf
print("="*72)
print("A radial STRING CLOUD imposes TWO conditions:")
print(" (A) G^t_t = G^r_r (p_r = -rho c^2)")
print(" (B) G^th_th = 0 (p_perp = 0)")
print("With the exponential redshift Phi = -k r, each is an ODE for R(r).")
print("="*72)
eqA=sp.simplify(sp.numer(sp.together(Gtt-Grr))); print("\n(A) ->", sp.factor(sp.expand(eqA/2)), "= 0")
eqB=sp.simplify(sp.numer(sp.together(Gthth))); print("(B) ->", sp.factor(sp.expand(eqB)), "= 0")
C1,C2=sp.symbols('C1 C2')
solA=sp.dsolve(sp.Eq(Rpp+k*Rp,0),Rf,ics={R(0):0,sp.diff(R(r),r).subs(r,0):1})
solB=sp.dsolve(sp.Eq(Rpp-k*Rp+k**2*Rf,0),Rf,ics={R(0):0,sp.diff(R(r),r).subs(r,0):1})
RA=sp.simplify(solA.rhs); RB=sp.simplify(sp.expand(sp.simplify(solB.rhs)))
print("\n--- (A) alone, with a regular start R(0)=0, R'(0)=1 ---")
print(" R =",RA)
print(" dR/dr =",sp.simplify(sp.diff(RA,r))," -> never zero: NO angular turnaround at all")
print("\n--- (B) alone ---")
print(" R =",sp.simplify(RB))
tb=sp.nsolve(sp.diff(RB.subs(k,1),r),2.0)
print(f" dR/dr = 0 at kr = {float(tb):.4f} -> 1+z = e^kr = {float(sp.exp(tb)):.2f}, z = {float(sp.exp(tb))-1:.2f}")
print(" (metric D and the corpus's audited value: z = e - 1 = 1.718)")
print("\n--- BOTH conditions together ---")
print(" (A): R'' = -k R' (B): R'' = k R' - k^2 R")
print(" subtract: -2k R' + k^2 R = 0 -> R' = kR/2 -> R = R0 e^{kr/2}")
print(" but R(0) = 0 forces R0 = 0, hence R = 0 identically.")
print(" => NO non-trivial radial string cloud is compatible with Phi = -k r.")
print("\n" + "="*72)
print("So the constitutive law does not deliver the 1/r profile -- it FORBIDS it,")
print("and forbids the exponential redshift with it, except as an r -> oo limit.")
print("="*72)
# how fast does metric D approach the string cloud?
sub=lambda E: sp.simplify(E.subs({sp.Derivative(R(r),(r,2)):sp.diff(r*sp.exp(-k*r),r,2),
sp.Derivative(R(r),r):sp.diff(r*sp.exp(-k*r),r),
R(r):r*sp.exp(-k*r)}).doit())
A_,B_,C_=sub(Gtt),sub(Grr),sub(Gthth)
wr=sp.simplify(B_/(-A_)); wp=sp.simplify(C_/(-A_))
print("\nmetric D's medium, rung by rung (w_r, w_perp); string cloud = (-1, 0):")
print(f" {'z':>10} {'kr':>7} {'w_r':>9} {'w_perp':>9}")
for kr in (0.0,0.1,0.5,1.0,2.0,3.0,5.0,7.0,10.0):
z=float(sp.exp(kr))-1
a=float(wr.subs({k:1,r:kr})) if kr>0 else -0.75
b=float(wp.subs({k:1,r:kr})) if kr>0 else -0.375
print(f" {z:>10.2f} {kr:>7.2f} {a:>9.4f} {b:>9.4f}")