Chapter 3 · Section 7
Proto Wells Become Sites, and How a Site Fills
The BPT law
BPT Part 3.14 (Proto Wells: Where Wells Will Form) opens from observation: "No black hole has ever been seen to form except by collapse … So a Proto Well is not a well." At the Physical Nova a Proto Well "becomes a site: where the gas will gather, where the first stars will light, and where a well will be born. It is the data's prediction of where the wells of matter will form." A well is born at a site in one of two ways.
- By direct collapse, early. A site makes its well at once when three things hold together: it is deep enough that infalling gas reaches T_vir ≥ 10⁴ K, "a circular speed of about 17 km/s"; its gas is pristine, "its metals below about 10⁻⁵ of the Sun's"; and "a neighbour already shines." The gas then holds near 8,000 K at the Sound Speed of Warm Gas, c_s = √(k_B · T / (μ · m_p)), about 7.4 km/s, and falls in at the Collapse Inflow Rate, Ṁ_in = 0.975 · c_s³ / G, with c_s "in a deeper site the site's v_c / √2". "Above about 0.04 Suns a year the gas arrives faster than a protostar can contract, and it swells into a supermassive star instead." Its well is the Direct Collapse Seed, M_dc = Ṁin · t★, with t_★ "a million years or two", "never more than the site's gas can give."
- By its first dying star. "Everywhere else … its well is born when its first heavy star dies and the remnant sinks to its heart," and "many never fill."
The prediction is scored by the Site Lift, Λ_s = N_in / (N_w · A_s): wells born within a site's core (the radius holding half its matter) against all wells born and the share of the surface within the cores; "1 is chance." BPT's reading of the game (Part 3.14) adds that a site "pulls and gathers its galaxy but is no well: it is not counted, drawn, ranked or shining, and it swallows nothing," that a direct-collapse heart is "M_dc, never more than a tenth of its gas," and that a clump collapsing whole within it makes the heart, "held to the Direct Collapse Seed."
The established physics
As BPT Part 3.14 cites them, and as the code names them:
- Shu 1977 (the inflow of an isothermal sphere, 0.975 c_s³/G).
- Omukai, Schneider & Haiman 2008 (the metal line).
- Shang, Bryan & Haiman 2010, and Visbal, Haiman & Bryan 2014 (a lit neighbor; the code's comment at app.js:1467 names Visbal, Haiman & Bryan 2014).
- Hosokawa et al. 2013 (the 0.04 Suns a year line).
- Woods et al. 2019 (review).
- Madau & Rees 2001 (remnant seeds).
- Bardeen, Bond, Kaiser & Szalay 1986 (peaks predict halos).
The game's math
Making a site. promoteDataWells(frame) app.js:1378 runs failProtoWells, groups the surviving Proto Wells by birth group, passes each group to addPhysicalWells(…, from = group) (which carries each record on under a new W id), then calls makeSite(id) app.js:1417 on each new source. makeSite sets w.site = true, removes one wellWeight() from wellsStand and one from wellsSeen, marks the record's kind as 'site', and opens a siteStats entry.
A site in the physics.
- No horizon.
Matter.horizon(w)matter.js:318 returns 0 for a site, so nothing falls in. - No light.
measureFeedingsetsedd = 0for it. - No capture of data.
stepWellsskips sites for Data Matter capture (app.js:860), and marks themswirlOnlyin the data-layer step (app.js:823), so a site turns the data around it and swallows none. - Grid mass. A site is deposited onto the gravity grid by cloud-in-cell weights (matter.js:246–248) and pulls only through the grid (Part 3.12). The halo's own size is
haloRadius()app.js:1409: the distance holding 0.9 of its galaxy's matter (siteR) and 0.5 (siteCore), at leastSITE_R_MIN= 1 cell. Both are set at each galaxy reading (app.js:3107).
Direct collapse. testDirectCollapse(top, gs) app.js:1465, at each galaxy reading, for each waiting site with a galaxy:
Z = Σ metals / Σ gas (mass fractions)
c_s = max(7.4 km/s, v_c / √2)
Ṁ_in = 0.975 · (c_s·10³)³ / 6.674×10⁻¹¹ / 6.3×10²² Suns a year (kg/s ÷ 6.3×10²²)
x = Ṁ_in / 0.04
fill if T_vir ≥ 10⁴ K and Z < 10⁻⁵ · 0.019 and a lit neighbor within siteR
and no living stars and x ≥ 1 and gas > 0
seed = min(Ṁ_in · 1.5×10⁶ yr, 0.1 · gas · kR) in Suns; kR = realPerCell()
The seed's drawn mass, seed/kR, is taken from the bodies' gas in proportion. Then fillSite(site, 'direct', …). The figure 6.3 × 10²² converts kg/s to Suns a year: 1.989 × 10³⁰ kg ÷ 3.156 × 10⁷ s.
Remnant and clump.
- A Stellar Null Well born within a waiting site's
siteRfills it as a 'remnant' (stepMatterPost, app.js:681–682). - A collapse well (Part 3.8) does the same as a 'clump' (app.js:693). A clump's own mass is held to the Direct Collapse Seed by
siteSeedCap()app.js:1431, the same seed law (2026-10-29: "a level 182 heart was born at 2e16 Suns"). - A well meeting a site in
mergeWellsgoes throughsiteMeets()app.js:1454. Two sites merge as one site. A heart takes in a site's halo. Any other well fills the site.
fillSite() app.js:1437 turns the site into a heart. It records ownSuns, the heart's own mass in Suns, which feeds the galaxies chapter, adds the drawn mass, removes the well that filled it (as a merger), and counts a new well (wellsStand += 1) only for direct collapse. A remnant or a clump was already counted when it was born.
Site Lift. scoreBirth() app.js:1483 marks each well born after the Physical Nova as inside a site's core or not. sampleSites() app.js:1489 measures the share of the surface inside the sites' cores, A_s, on a 96 × 96 grid of points, binned by the widest core. The lift is (inside/born)/mean A_s (siteRecord() app.js:1502). A site that never fills is dropped at the decay: "its site never filled: it returned to the Source" (app.js:2640).
In the game
From Harmonic 3 on, the magenta rings are gone: a site has no mark of its own (wellList() app.js:1315 passes only realWells(), never sites, to the scene). What the player sees instead is what a site does. The stars that condense after the big bang gather round the sites into galaxies, and in 3D each star turns on its own orbit about the galaxy's center, so the disks shear and the spirals wind (scene3d.js:518–523). The HUD well line ends "· N sites waiting" while sites wait for their wells (app.js:2141). When a site fills, a heart appears at the galaxy's center: a solid black sphere, a third of a free well's mark with a faint ring, since a horizon is tiny next to its galaxy (scene3d.js:1472–1476), and a Seyfert's warm glow or a quasar's white glow and twin jets once it feeds past an Eddington ratio of 0.01 or 0.1 (scene3d.js:1540–1550). In a deep universe the hearts born light blaze as quasars while they catch up with their galaxies. The run's record carries the Site Lift and each site's tests and how and when its well was born (siteRecord()); a dive card names a heart's galaxy (Part 3.15).
The scale model
A drawn site stands for wellMult true sites, but the weight is removed from wellsStand because a site is no well. A heart's own mass is counted in true Suns (ownSuns), each drawn cell of matter standing for realPerCell() = starMult / stars.sun Suns. Its drawn mass is in cells.
Fixed numbers
| Number | Where | What it is | Kind |
|---|---|---|---|
| 10⁴ K | SITE_TVIR app.js:1401 |
least virial temperature | PHYSICS (atomic-hydrogen cooling; BPT Part 3.14) |
| 10⁻⁵ | SITE_ZMAX app.js:1401 |
metal line, solar units | PHYSICS (Omukai, Schneider & Haiman 2008, via BPT Part 3.14) |
| 0.019 | SITE_ZMAX app.js:1401, 1471 |
the Sun's metal mass fraction | PHYSICS (a standard solar value; the code names no source) |
| 0.04 | SITE_MCRIT app.js:1401 |
inflow line, Suns a year | PHYSICS (Hosokawa et al. 2013, via BPT Part 3.14) |
| 1.5 × 10⁶ yr | SITE_TSTAR app.js:1401 |
supermassive star's life | PHYSICS (BPT Part 3.14: "a million years or two") |
| 0.1 | SITE_SEED_GAS app.js:1401 |
seed never above a tenth of the gas | CAP (BPT's law says "never more than the site's gas can give"; its reading of the game names a tenth, which no law sets) |
| 7.4 km/s | SITE_CS_WARM app.js:1401 |
sound speed at 8,000 K | PHYSICS (Sound Speed of Warm Gas, BPT Part 3.14, μ ≈ 1.2) |
| 0.975 | app.js:1433, 1471 | Shu's inflow coefficient | PHYSICS (Shu 1977) |
| √2 | app.js:1433, 1471 | c_s from v_c in a deeper site | PHYSICS (isothermal sphere v_c = √2 c_s; BPT Part 3.14) |
| 10³ | app.js:1433, 1471 | km/s to m/s | PHYSICS (units) |
| 6.674 × 10⁻¹¹ | app.js:1433, 1471 | G in SI | PHYSICS (CODATA) |
| 6.3 × 10²² | app.js:1433, 1471 | kg/s per Sun a year | PHYSICS (units: M☉ / yr) |
| 1 | x ≥ 1 app.js:1475 |
at or above the inflow line | PHYSICS (the line itself) |
| 1 cell | SITE_R_MIN app.js:1407 |
least site size | CAP (a floor on a reach; the grid's resolution) |
| 0.9, 0.5 | haloRadius() app.js:1409, 3107 |
halo and core as matter shares | METHOD (definitions of halo and core reach) |
| 96 | sampleSites() app.js:1492 |
surface sample grid, 96 × 96 | METHOD (a Monte Carlo of the area share) |
| 1, 3 × 3 | app.js:1494, 1497 | bin floor and neighbor bins | METHOD (spatial hashing) |
| 200 | app.js:1500 | filled-share curve points kept | RECORD |
| 400 | siteRecord() app.js:1506 |
sites written to the record | RECORD |
| 4 | siteRecord() rounding |
decimals of shares | RECORD |
| 1e-15 | app.js:1477 | gas left to take, zero test | METHOD (round-off) |