PulseCore

Chapter 2 · Section 10

Data Flow and the Drag Profile

The BPT law

BPT Part 4.2 gives the torus its modes, Space Layers Dynamics:

Layer S1 (Length/Extension): pure poloidal modes (m ≠ 0, n = 0), Δω ≈ v_s / r
Layer S2 (Width/Orthogonality): pure toroidal modes (m = 0, n ≠ 0), Δω ≈ v_s / R
Layer S3 (Depth/Volume): mixed modes (m, n) and radial excitations ℓ ≥ 1

with v_s "substrate phase velocity ≤ 𝒞→" and r the minor radius, κ_r × 𝒞→ × ①⥂⧖. The same Part reads the forces as "binary resonance weaving: gravity is the deep bass, electromagnetism the bright treble." Part 4.1's Harmonic Duality of Radii sets which loop is which: r "regulates local Pulse cycling along the tube," R "governs global circulation around the torus" (Part 2.9). flow.js:4–18 reads the poloidal loop as the fast treble, magnetism, and the toroidal loop as the bass, carried by spin. At one v_s the data winds H = R/r times round the tube for each circuit of the ring.

BPT Part 2.8 names what spin adds, under Merger-Origin Compression Dynamics: "Spin Injection: Counter-rotating or co-rotating spins impart additional frame-dragging, tightening harmonic closure interval." BPT Part 3.5 says where the circulating data goes at the throat: "data crossing it passes through the Source and out again," and Part 3.6 names the circuit the Data Loop, the data that "circulates up through its throat ... and back round the outside."

How many cells the flow moves in a flip, and the shape of the shear, are game methods.

The established physics

  • Frame dragging by a spinning mass falls off as ω ∝ 1/r³ (Lense & Thirring 1918; Misner, Thorne & Wheeler 1973).
  • Light speed: massless data moves at 𝒞→ (Part 2.5).

The game's math

  • flowSlice(dt) app.js:4379 sets flow.rate = lightCells()·dt, where lightCells() = cols/(2·max(1, scale)) app.js:619 is light's reach in a flip, half the field. Over a full step the slices sum to dt = 1, so the data moves cols/(2·scale) rows round the tube a flip: 128 rows on a 256-row field at scale 1, half the tube. The Flow constructor's rate of 0.25 (flow.js:89) and the panel's flow: 1 (app.js:2021) are overwritten by this.
  • Flow.step() flow.js:94: accR −= rate, dr = trunc(accR), and the remainder carries over. The data runs backward in row index, up through the hole and over the outside. rollGrids() flow.js:135 rolls the lit, color, pulser, exposure and fold arrays by dr rows. The pulsers in the dr rows crossing the throat row are counted as passing through the Source (ledger.through, app.js:4386–4388).
  • The twist round the ring: base = SPIN_SHARE·rate·(cols/rows)·a_f/H/max(1, scale²) cells a step (flow.js:114), with SPIN_SHARE = 1 (flow.js:86), the book's a_f/H with no extra factor (Josh's ruling, 2026-10-26). The 1/scale² is angular momentum kept as the torus grows.
  • dragProfile(rows, scale) flow.js:79: for each row i, v = vOfRowFrac((i + 0.5)/rows), ρ = max(10⁻³, R + r·cos v), and prof[i] = min(64, ((R + r)/ρ)³), the rate relative to the outer edge.
  • The shear (flow.js:119–121): pmax = max(1, max prof), and each row turns rowSpeed[i] = base·(1 + 0.5·(prof[i] − 1)/max(10⁻⁹, pmax − 1)) cells a step, so the inside winds up to 1.5 times the outside. Whole cells are shifted by shearGrids() flow.js:127 as they accumulate. ringOmega = 2π·base/max(1, cols) flow.js:115 is the outer edge's turn in radians a step.
  • frameDrag() app.js:627, the torus frame's own slow turn, Ω = 2GJ/(c²R_c³), sums J over rows with v = (i/rows)·2π (app.js:633).

At the throat, v = π, ρ = R − r = HOLE, so

(R + r)/ρ = (HOLE + 2·TUBE·s)/HOLE = 1 + 2s/k = 1 + 2·s·rows/π

It is finite for every field: HOLE = TUBE·π/rows > 0. At scale 1 it is (1 + 2·64/π)³ = 41.74³ ≈ 7.27×10⁴ on 64 rows and (1 + 2·256/π)³ = 163.97³ ≈ 4.41×10⁶ on 256 rows, and it grows with the scale.

In the game

From the Data Nova to the end of the run the field circulates, and this is the motion the player watches most. In 3D the skin scrolls round the tube at light speed, half the tube a flip, up through the hole and back over the outside; the skin is painted in the data's own moving frame and the scene scrolls it by the flow's continuous place, so it glides between steps instead of jumping (drawFieldTexture() app.js:310, setFlowRows() app.js:4398). The lattice turns with the data and its rings radiate out of the hole (setLattice() app.js:1298). The spin's twist shows as color: with "Flow colours" on (Part 2.2) the painted color wheel is carried round the ring as well as round the tube, a little faster near the throat. In 2D the field rolls by half its height each flip and shears row by row.

The readout's Void line adds "· N through the Source" as data crosses the throat (app.js:2149). The Universe & Genesis note says "The data circulates at light speed, half the field a flip" (index.php:191), and the About card "Spin you can see" says "Space is dragged around the void with a_f, the axis runs through the field, and in 3D the torus turns" (index.php:308).

The player sets the twist before Start through the spin: the two spin sliders and the collision channel fix a_f (Part 2.5). At a_f = 0 the data runs straight round the tube with no twist.

The scale model

The flow is exact in cells: every shift is a whole-cell roll or shear, so it conserves the data and is reversible, and a co-moving observer sees the field as if it stood still (flow.js:20–22). The drag profile is scaled: its shape is replaced by a normalized 1-to-1.5 curve. At the true level the throat value is (1 + 2^(L+3)/π)³, about 3.2×10²⁶ at level 28, so the shape the game draws stands for a far steeper true law.

Where the game and the theory differ

  • flow.js applies the Lense–Thirring fall-off with r replaced by ρ, the distance from the axis. These agree on the equatorial plane; off it the true fall-off depends on the distance from the center, √(ρ² + z²).
  • frameDrag() places its rows at equal angles, v = (i/rows)·2π (app.js:633), not on the equal-area map that the drag profile and the drawing use.
  • BPT's Spin Injection (Part 2.8) is a statement about merger-born null wells and their Pulse Diameter; reading it as the twist of the flow round the ring is flow.js's own reading.
  • The drag profile is held at 64 and then normalized to at most 1.5 times the outer rate, so the drawn shear is far gentler than the law. The comment records that the unscaled law "ran 11 times, and the spin swamped the circulation" (2026-10-24). The details follow.

The rows are sampled at their centers on the equal-area map, so the largest value any row actually gets is below the exact throat value. Computed with the code's own radii and table:

Rows (level) Exact throat value Largest row value Rows above 64
4 (0) 44.6 5.85 0
8 (1) 226 22.5 0
16 (2) 1,400 88.6 2
32 (3) 9,760 341 2
64 (4, phone) 7.27×10⁴ 1,274 4
128 (5) 5.61×10⁵ 4,706 8
256 (6, desktop) 4.41×10⁶ 1.74×10⁴ 16

The cap of 64 binds from level 2 up, on every phone and desktop universe of level 2 or more. On a desktop field 16 of 256 rows are held at 64, and the largest true row value is 272 times the cap. The floor ρ ≥ 10⁻³ never binds on a drawn field, since HOLE ≥ 0.0135 at 256 rows; it would bind only on a field above about 3,500 rows, which the v8.3 page cannot make (Part 2.1).

The cap changes the motion even though the shear is normalized afterwards. Because rowSpeed divides by pmax, the cap sets how wide the band of strong shear is. With the cap, on 256 rows 34 rows turn more than 1.1 times the base and the mean factor is 1.057. Without it only 2 rows exceed 1.1 and the mean is 1.0047, and the twist would be all at the throat. On 64 rows: 10 rows with the cap, 2 without. Removing the cap would change the drawn twist more than any other single number here. The 1.5 limit of the normalization is the larger cap: the true Lense–Thirring ratio across a desktop field is 1.74×10⁴.

Fixed numbers

Number Where What it is Kind
2 (cols/2) app.js:619 light covers half the field a flip BPT (Part 1.9 cell size; Part 3.6 a flip is half a Planck time)
1 (SPIN_SHARE) flow.js:86 the twist is a_f/H with no extra factor BPT (Part 4.1, H = R/r; ruling 2026-10-26)
2 (scale²) flow.js:114 angular momentum kept as the torus grows PHYSICS (conservation of angular momentum)
3 ((R + r)/ρ)³ flow.js:81 Lense–Thirring fall-off PHYSICS (Lense & Thirring 1918)
64 flow.js:81 most drag at the throat CAP (binds from level 2; see above)
10⁻³ (ρ floor) flow.js:81 the smallest distance from the axis CAP (does not bind on drawn fields)
0.5 (1 + 0.5·…) flow.js:121 the inside winds at most 1.5 times the outside CAP
1 in max(1, pmax), 10⁻⁹ flow.js:119, 121 guards on the normalization METHOD
0.25 (rate), 0 (a_f) flow.js:89 constructor defaults, overwritten METHOD (placeholder)
1 (flow: 1), 0 (aniso), 0 (drag) app.js:2021 the panel's fixed couplings METHOD (flow overwritten; aniso and drag switch features off, Part 2.12)
1 in max(1, cols) flow.js:115 guard METHOD