Chapter 6 · Section 6
The Reading Cycle and How Fast a Disk Turns
The BPT law
BPT Part 3.14 states the Disk Turn Rate:
Ω_d = √(Δ_v / 2) · H_f / (√2 · λ⟲)
"How fast a galaxy's disk turns, set by when it formed": Ω_d "the disk's angular speed at twice its scale length", Δ_v "the density its clump collapsed to, over the universe's mean, about 200", H_f "the expansion rate when the clump formed", λ⟲ "its spin parameter, about 0.035". The derivation is given in prose: a clump collapsed to about two hundred times the mean density turns at its edge at Ω = √(G·M/R³) = √(Δ/2)·H, and the disk settled inside at R_d = λ⟲·R/√2 on a flat rotation curve turns faster at twice its scale length by R/(2R_d). "Ω_d ≈ 202·H_f ... A disk turns as often as its universe gives it, whatever the universe's size: with H = 2/(3t), Ω_d·t_f ≈ 135, about 21 turns in the first doubling of its age after it forms. Inside a disk each star turns at its own rate on the flat curve, Ω(r) = Ω_d·(2R_d/r), faster within, so the disk shears round its well, while the arms' pattern turns as one (Spiral Arms)." The book then gives the game's reason: "The game cannot read this turning from its field, whose cells are far coarser than any disk: measured there, at level 133, the largest disk turned a thirtieth of a turn in its whole life. So it turns each galaxy by this law, from the moment its stars first gathered: each star on its own orbit, and the young stars of the arms with their pattern."
BPT does not state the reading cadence, the per-frame clamp, or the reduced turning of ellipticals and irregulars; they are game methods.
The established physics
- A collapsed clump's mean density is about 178 times the background in spherical collapse (Gunn & Gott 1972) and 200 as simulations count it (Navarro, Frenk & White 1996, as BPT cites it), so an orbit at its edge turns at √(G·M/R³) = √(Δ/2)·H.
- In a matter-dominated universe H = 2/(3t) (standard Friedmann result).
- Disks settle at R_d = λ·R/√2 (Mo, Mao & White 1998) on flat rotation curves (Rubin & Ford 1970), so at 2·R_d the disk turns faster than the clump's edge by R/(2R_d) = 1/(√2·λ).
- Differential rotation: on a flat curve each star turns at Ω ∝ 1/r and the disk shears (Binney & Tremaine 2008, ch. 6); a long-lived arm pattern turns as one (Lin & Shu 1964, On the spiral structure of disk galaxies).
The game's math
The cadence. updateGalaxies() runs when pulseCounter % 8 === 0 (app.js:816). Each run reads every galaxy once (app.js:3105).
The turn rate (diskTurnRate(w) app.js:2738–2742). t is the flips since the Physical Nova (physStart); the first time a well is put on the drawn list (a galaxy with lit stars), t is kept as t_f = w.galSince. Then:
Ω_d = √(200/2) · (2 / (3 · max(0.5, t_f))) / (√2 · 0.035)
= 10 · H_f / 0.04950 ≈ 134.7 / t_f radians a flip
Example: a galaxy whose stars first gathered 100 flips after the Physical Nova turns at 1.35 radians a flip at twice its scale length, one turn in 4.7 flips. One whose stars gathered at 1000 flips turns at 0.135, one turn in 47 flips.
Each star's rate (setGalaxies() scene3d.js:524–525), ρ its radius in cells:
Ω(ρ) = min(4·Ω_d, Ω_d · (max(ρ, 0.5·R_d) / (2·R_d))^(−γ)) · s₀ γ = 1 (flat)
s₀ = 1 for a disk, 0.5 for an irregular, 0.2 for an elliptical or spheroidal
This is the book's Ω(r) = Ω_d·(2R_d/r). Inside half a scale length the disk turns as a solid body. On a flat curve the solid core turns at (0.5/2)^−1 = 4·Ω_d, so the min(4·Ω_d, …) never binds while γ = 1.
Each frame (placeGalaxies() scene3d.js:628–639):
dt_ms = min(100, ms since the last frame)
running = a physics step within max(1500, 3·stepGap) ms
flips = running ? dt_ms · dtNow / max(16, stepGap) : 0
turn(ω) = clamp(ω · flips, −0.15, 0.15) radians this frame
An arm point turns with the galaxy's pattern angle, advanced by turn(sense·Ω_d) (×0.2 for ellipticals and spheroidals, which have no arm points, so that factor has no effect). Every other point advances its own angle by turn(sense·Ω(ρ)).
The other literals in the reading (updateGalaxies() app.js:3099–3111), whose laws belong to the stars and wells chapters:
field = 0 if the life share ≥ 0.75/11.0 (reionization by 0.75 Gyr of an 11.0 Gyr life), else 1
ESC = √(2·(1 + ln 10)) escape speed over circular speed at a tenth of the halo's reach
β_esc = ESC · v_c / 299,792.458 km/s
hot = min(t_cool, 10⁹ yr × 3.15576 × 10⁷ s/yr) / LIFE_S · physLife flips
a = max(10⁻⁶, expansionA())
In the game
This is the motion the player watches. Every galaxy turns in its own sense, the sense its bodies' angular momentum gave it, and each star on its own orbit: the inner stars lap the outer ones, so the old stars of the disk stream through the arms while the young arm stars ride the arms' pattern and the arms keep their shape (scene3d.js:518–523). Ellipticals and dwarf spheroidals barely turn (a fifth of the rate) and irregulars turn at half, so the eye can tell a swarm from a disk by its motion.
The turning follows when each galaxy's stars first gathered: galaxies that lit early, soon after the big bang, spin fast, and galaxies that light late in the life turn slowly, about 135 radians divided by their age at first light in flips. The galaxies turn at the physics' own pace: the Speed menu ("How fast pulses run": slider pace, paced, or max) and, at slider pace, the Pace slider change how many flips pass each second, and the galaxies turn faster or slower with them; Stop ("Pause the universe") halts them, since no flips pass while the physics is not stepping (scene3d.js:630). When the universe returns to the Source the turning ends with the scene's fade.
The readings that feed the picture come every four Pulses, so a galaxy's type, arms, size and place in the list change in steps at that rhythm, while its turning and its well's motion are smooth from frame to frame.
The scale model
The turning is not simulated. The comment at app.js:2733–2737 (2026-10-29) records that, read from the field, "the largest disk turned a thirtieth of a turn in its whole life". The law gives the real turn count: a disk turns as often as its universe gives it, Ω_d·t_f ≈ 135, about 21 turns in the first doubling of its age. Because Ω_d is proportional to 1/t_f, the turn count depends only on a ratio of times, so it is the same counted in flips as in years: the drawn disk turns as many times in its drawn life as the real one does. The drawn star's orbit stands for the orbits of the stars in its kind; their radii are the enlarged drawn radii of Part 6.5.
Where the game and the theory differ
- The per-frame clamp binds often. At one flip a frame, turn = Ω_d, which reaches the 0.15 radian clamp for any galaxy with t_f below 134.7 / 0.15 ≈ 900 flips, and its inner stars, at up to 4·Ω_d, below 3600 flips. In those galaxies the drawn turning is 0.15 radians a frame, not the law's rate, and the inner and outer stars turn at the same clamped rate, so the shear BPT describes is not shown.
- BPT turns every disk by the Disk Turn Rate. The game turns ellipticals and spheroidals at a fifth of it and irregulars at half, with no source; BPT says an elliptical's stars "orbit every way at once rather than in a disk" and gives no rate.
- The reionization share 0.75/11.0 is the same value heat.js exports as
REION_FRACTION(heat.js:38), written here a second time as a literal.
Fixed numbers
| Number | Where | What it is | Kind |
|---|---|---|---|
| 8 | app.js:816 | galaxies read every 8 steps of pulseCounter | METHOD (reading cadence; cost) |
| 200 | app.js:2741 | Δ_v, collapsed density over the mean | PHYSICS (Navarro, Frenk & White 1996; BPT Part 3.14) |
| 2 | app.js:2741 | √(Δ_v/2) | PHYSICS (Ω at the clump's edge) |
| 2/3 | app.js:2741 | H = 2/(3t), matter era | PHYSICS (Friedmann, matter dominated) |
| 0.5 | app.js:2741 | least t_f, flips | METHOD (avoids dividing by zero at the Physical Nova) |
| √2, 0.035 | app.js:2741 | R/(2R_d) = 1/(√2·λ) | PHYSICS (Mo, Mao & White 1998; Bullock et al. 2001) |
| 1 | app.js:3112 | γ, a flat rotation curve | PHYSICS (Rubin & Ford 1970) |
| 2 | scene3d.js:524 | rates referred to 2·R_d | BPT (Part 3.14, Disk Turn Rate) |
| 0.5 | scene3d.js:525 | solid-body core inside 0.5·R_d | METHOD (keeps Ω finite at the center) |
| 4 | scene3d.js:525 | greatest star rate, 4·Ω_d (never binds at γ = 1) | METHOD (a guard) |
| 0.2 | scene3d.js:524 | an elliptical's stars turn at a fifth | DISPLAY (no source; motion shown only) |
| 0.5 | scene3d.js:524 | an irregular's stars turn at half | DISPLAY (no source; motion shown only) |
| 0.2 | scene3d.js:633 | an elliptical's arm pattern at a fifth (no arm points: no effect) | DISPLAY |
| 100 | scene3d.js:629 | longest frame counted, ms | METHOD (a stalled tab does not jump) |
| 1500, 3 | scene3d.js:630 | physics counted as running within max(1500 ms, 3 steps) | METHOD |
| 16, 50 | scene3d.js:630 | least step gap, ms; step gap before one is measured | METHOD |
| 0.15 | scene3d.js:631 | greatest turn a frame, radians | CAP |
| 0.75/11.0 | app.js:3099 | reionization as a share of the life | PHYSICS (z ≈ 7 by 0.75 Gyr; heat.js:38) |
| 2, 10 | app.js:3104 | ESC = √(2(1 + ln 10)): escape speed at a tenth of the halo's reach | BPT (Part 3.12, Halo Escape Speed) |
| 299792.458 | app.js:3110 | light speed, km/s | PHYSICS (exact, SI) |
| 1e9 | app.js:3110 | a fountain's fall-back time, years | PHYSICS (Oppenheimer et al. 2010, as the comment cites it) |
| 3.15576e7 | app.js:3110 | seconds in a Julian year | PHYSICS (exact) |
| 1e-6 | app.js:3104 | least scale factor | METHOD |
Measured
Comment at app.js:2733–2737 (2026-10-29): "measured at level 133: the largest disk turned a thirtieth of a turn in its whole life", the reason the turning is set by the law.