PulseCore

Chapter 4 · Section 3

The Universe's Gravity

The BPT law

BPT Part 3.11 states the Gravity of a Universe (G):

G = 1 / (6 · π · ρ̄ · T²)

"A matter universe's gravity is fixed by its density and its age": ρ̄ is its mean matter density at the final well and T its age there, the time from the Physical Nova. The law comes from setting H = 2/(3T) in the Friedmann equation and solving for G. In the book the age is not free: the Rupture Rule (BPT Chapter 1, Part D; this book's Chapter 1, Part 1.7) gives each universe its life, 2^L of its own Tempos, "so a universe's gravity, its density and its level are bound together. Of two universes with the same density, the deeper one, living longer, has the weaker gravity." Part 3.11's Game's Reading adds that the game's G is this law "from the mean density of both together and T": matter and Data Matter. BPT Part 6.10 (Free-Fall Time) gives the same G a second reading: it is "the clock the game's G is set by, the collapse time of the universe's own matter (Part 3.10, the Rupture Rule)". The code holds both readings, in two places, and uses them for different things.

The established physics

  • Friedmann equation for a flat matter universe, H² = 8πGρ/3, and its Einstein–de Sitter solution H = 2/(3t) (Friedmann 1922; Einstein & de Sitter 1932).
  • Linear growth of a pressureless overdensity in a static medium, δ ∝ cosh(t/τ), 1/τ = √(4πGρ̄) (Jeans 1902).
  • Spherical collapse: a region has collapsed when its linear contrast reaches 1.686 (Gunn & Gott 1972, cited at app.js:600).
  • Poisson noise: M discrete quanta give a contrast of 1/√M on the scale holding them all.

The game's math

G of the Rupture Rule, universeG() app.js:604, computed once a universe and kept in uniG:

M   = number of pulsing cells on the field
ρ̄   = M / (rows · cols)                                 cells per cell
T   = max(8, 2·(lifeEndTempo − max(universePulses, harmonicTempo(3))))   flips
τ   = T / arccosh(max(1.0001, 1.686 · √max(2, M)))
G_R = 1 / (4π · ρ̄ · τ²)

The idea: the whole field starts least uneven, δ₀ = 1/√M, and grows as cosh(t/τ); choose G so that it reaches 1.686 exactly at the rupture. The factor 2 turns Tempos into flips. Since 2026-10-28 harmonicTempo(3) app.js:4284 is the Physical Nova, the start of the universe's clock, so T is the whole life, 2·2^Lm flips.

G of the Friedmann law, set in sendOutMatter() app.js:1244, once at the burst:

ρ̄   = Q · (1 + darkRatio()) / (rows · cols)     Q = all matter sent out, cells
G_F = 1 / (6π · ρ̄ · physLife²)                 physLife = flips from the Physical Nova to the final well

matter.fixedG = G_F and Matter.setG() matter.js:109 makes matter.G = G_F for every matter step. ρ̄ includes the Data Matter (Part 4.10), as Part 3.11's Game's Reading asks.

Which is used where. G_F drives all matter physics: the mesh, the direct pulls, friction, cooling, falls, mergers, births, stars. G_R drives the data drains (wellDyn.G = universeG() app.js:821), the horizons drawn in wellList() app.js:1317, the torus's frame drag frameDrag() app.js:627 (Chapter 2), and it seeds the Matter constructor (G: universeG() app.js:650 and app.js:1194) before the burst replaces it.

Worked case, desktop, level 6 or deeper (Lm = 6, field 256 × 256, 2^Lm = 64 Tempos, physLife = 128 flips): the Pulsecore holds about (n + 1)² = 278² ≈ 77,300 cells at the burst (Part 4.5); darkRatio() = 5.4; ρ̄ = 77,300 × 6.4 / 65,536 ≈ 7.55; G_F = 1/(6π × 7.55 × 128²) ≈ 4.3 × 10⁻⁷ in cells³ per cell of mass per flip².

The expansion dilutes G for the matter: Matter.step() multiplies every pull by gk = (a₀/a)³ (Part 4.4).

In the game

Gravity is what the player watches work from the Physical Nova to the final well: the smooth sky gathering along the lattice's lines, clumps falling together and merging, wells sinking to their hearts. Its constant is not a control. The Universe panel's note (index.php:191) says so: "No couplings to set: the rest follows the book" and "G is fixed by the Rupture: by the universe's end everything has clumped."

  • The readout's "G here" row (app.js:2082) shows the universe's true gravitational constant at its level, with the note "Length³ / (m × Tempo²)": the law's value in SI units, not the cell-and-flip G above.
  • The wells' horizons in 3D are drawn from G_R: each well is a dark point sized by its mass, and drawn at its true horizon, r_s = 2G_R·M/c² cells times a cell's width, once that is larger than the mark (setWells() scene3d.js:1484–1489). Where the true horizon is smaller than the mark, as Part 4.8's worked case finds for the matter's own G, the mark is what shows.
  • The stars of a clump orbit it in 3D at ω = √(G·gk·m/r³) radians a flip, with the matter's own G diluted by the expansion (setMatter() scene3d.js:795–797): a heavier clump swirls faster, and every clump slows as the universe grows.

The scale model

G is set on the drawn field, from the drawn field's own density and the scale model's life of 2^Lm Tempos, not the true level's 2^L. It is a scale-model constant: it makes the drawn matter collapse on the drawn clock. At the model level itself it is exact to the law. The true G of the level is the readout's, computed separately (universe.js) and never used by the matter.

Where the game and the theory differ

  • One universe, two G's. BPT gives a universe one gravitational constant. The game computes two: G_F by the Gravity of a Universe for the matter, and G_R by the collapse-at-rupture reading for the data drains, the drawn horizons and the frame drag. So the horizon a well is drawn with and the horizon its matter falls into (Matter.horizon() matter.js:318, from G_F) are not the same number. The panel's note, "G is fixed by the Rupture", describes G_R; the matter runs on G_F.
  • A rebuilt Matter keeps the wrong one. If stepMatterPre() ever rebuilds Matter because the field changed size, the new object keeps G_R, since fixedG is set only by sendOutMatter().
  • A stale comment. The comment at app.js:601 still says Harmonic 3 is "two thirds through the life"; since 2026-10-28 it is the start of the universe's clock.
  • A control with nothing behind it. app.js:5534 still wires a "Jeans" slider (uJeans) to matter.gravity. The game page has no such slider, and nothing in matter.js reads matter.gravity.

Fixed numbers

Number Where What it is Kind
1.686 universeG() app.js:609 Linear contrast at collapse PHYSICS (Gunn & Gott 1972)
4π universeG() app.js:610 Jeans growth rate 1/τ² = 4πGρ̄ PHYSICS (Jeans 1902)
8 universeG() app.js:608 Floor on T, flips METHOD (keeps τ finite in a tiny life)
2 (×) universeG() app.js:608 Flips per Tempo BPT (Part 1.10: a Pulse is two flips)
1.0001 universeG() app.js:609 Floor on the arccosh argument METHOD (arccosh needs > 1)
2 (max) universeG() app.js:609 Floor on M METHOD (avoids √1)
6π sendOutMatter() app.js:1244 Friedmann gravity G = 1/(6πρ̄T²) BPT (Part 3.11, Gravity of a Universe) and PHYSICS (Friedmann 1922)
4 sendOutMatter() app.js:1225 Floor on physLife, flips METHOD
2 (×) sendOutMatter() app.js:1225 Flips per Tempo in physLife BPT (Part 1.10)