PulseCore

Chapter 3 · Section 9

Well Spin and the Thorne Limit

The BPT law

BPT Part 6.9 (Spin Inheritance and the Progenitor Axis) starts from what a pulse cannot do: "A pulse cannot carry spin," so a universe's angular momentum can only be inherited from "the merger that made the well." The Progenitor Angular Momentum Budget is a vector sum, J⊚ = J⥀ + J₁ + J₂, of the binary's orbital angular momentum at the last stable orbit and each progenitor's spin Jᵢ = aᵢ G Mᵢ² / c. Dividing by G M_f²/c gives the Inherited Spin Parameter, a_f = | ℓ̃·η·n̂_L + a₁(M₁/M_f)²·n̂₁ + a₂(M₂/M_f)²·n̂₂ |, "capped at the Kerr bound", with η = M₁M₂/M_f² and ℓ̃ ≈ 2.744 fixed by general relativity: "two non-spinning black holes still produce a remnant at a_f ≈ 0.69." "Spin is handed down chiefly as the memory of a dance, not of the dancers." The Kerr Floor on Origin Compression names the top of the range: "a⥣ — maximum physical spin, 0.998 at the Thorne limit, 1 at the Kerr bound." The constants table a_max: 0.998 (universe.js:40) cites "Thorne limit, ch 6 Part 6.9". BPT Part 3.10 (First Fork) adds that spin "is born of the orbit of two wells", so no universe below level 3 carries it.

The established physics

  • The Kerr spin parameter a = cJ/(GM²), with |a| ≤ 1 (Kerr 1963).
  • A disk-fed well spins up to about 0.998, where the radiation it swallows holds it back (Thorne 1974).
  • Spin is born of orbit: two bodies merging keep their orbital angular momentum μ(r × v).

The game's math

Three places set a spin.

  1. A collapsing body, Matter.spinParam(b) matter.js:487. Each body carries a spin S, built in merges as S = S₁ + S₂ + μ(dc·vr − dr·vc), with μ = m₁m₂/(m₁ + m₂) (matter.js:463–464). Then a = clamp(𝒞→·S/(G·m²), −0.998, 0.998). A hoop-test well keeps it (Part 3.8).
  2. A merger, mergeWells() app.js:1690–1694:

    J = (a_a·G·m_a² + a_b·G·m_b²)/𝒞→ + μ·(dc·vr − dr·vc)
    a = clamp(𝒞→·J / (G·M²), −0.998, 0.998)          M = m_a + m_b

    Each well's own angular momentum, a·G·m²/𝒞→, adds to the orbit's. Units are cells and flips, 𝒞→ = lightCells().

  3. A Proto Well spins with its universe's a_f from birth (registerWells, app.js:1515; registerFoldWells, app.js:1655). A site keeps that spin. A heart filled by a stellar well takes spinFrom.

The child a merged well seeds is given its spin by BPT's own formula: mergeWells() calls U.mergerChild() universe.js:360 (app.js:1702), which takes inheritedSpin() universe.js:106 with ℓ̃ = 2.744, η, both wells' spins and the angle between them, and holds the result to a_max. Where a well's spin seeds a child that never merged, childOfEntry() app.js:1032 takes a = min(0.998, |spin|). The spin is signed: the sign is the sense of turn about the torus's axis, which mergeWells reads for the angle between two spins (0° or 180°, app.js:1701).

In the game

Spin is set before the run in the drawer: the "Collision channel" menu picks the progenitor spins and alignment (index.php:148, "Null Well Collision Channel Classification, chapter 6 Part 6.8"), and the HUD's Spin line shows a_f · C (app.js:2134). In 3D, before the big bang, an arrow along the axis is drawn as long as the spin, with a ring at the equator whose arrowheads point the way the Pulsecore turns (scene3d.js:92–102), and a second arrow on the equator facing the camera shows the same turn (placeSpinArrow()). Every Proto Well is born with that a_f, and its life record keeps it. A well's own spin is shown where the player picks it: the dive card lists the child's a_f (Part 3.15). The run summary carries "Spin a_f" with "spin was born here" in a universe whose first merger gave the first spin, and the finds row shows "↻ N mergers · spin is born" (app.js:2780, 2800). The Lineage panel lists each child with its "a_f" and "⟪C⟫".

The scale model

Exact: no scale model. Spin is dimensionless, and G, M and 𝒞→ are all in the game's own units. The Thorne value is applied as a clamp.

Where the game and the theory differ

  • BPT's Inherited Spin Parameter takes the orbital term at the last stable orbit, ℓ̃·η with ℓ̃ = 2.744. The merged well's own spin in mergeWells() uses the orbit the two drawn wells actually had at the merge distance, μ(dc·vr − dr·vc), instead. The child it seeds is given BPT's formula through inheritedSpin(). So one merger yields two spins: the well's, from its drawn orbit, and its child's, from ℓ̃·η.
  • BPT adds the spins as vectors with the angle θ between them. The game's spins all lie along the torus's axis, so θ is only 0° or 180°.
  • BPT caps a_f "at the Kerr bound", 1; the code holds every spin to 0.998, the Thorne value BPT names as a⥣.

Fixed numbers

Number Where What it is Kind
0.998 spinParam() matter.js:487 spin clamp PHYSICS (Thorne 1974; BPT Part 6.9)
0.998 mergeWells() app.js:1694 spin clamp PHYSICS (Thorne 1974; BPT Part 6.9)
0.998 childOfEntry() app.js:1032 spin clamp for a child PHYSICS (Thorne 1974; BPT Part 6.9)
0.998 a_max universe.js:40 the constant itself PHYSICS (Thorne 1974; BPT Part 6.9)
2.744 ell_tilde universe.js:39 ℓ̃, the orbital term of a child's spin BPT (Inherited Spin Parameter, Part 6.9: 0.686/0.25 from general relativity)
0°, 180° app.js:1701 angle between two axial spins METHOD (spins lie along the torus axis)