The plate work every band shares, done once per sample.
elevationAt builds one of these and hands it to the three bands that read
plates, because all three want the same answer and none of them can cache it:
the bands are pure functions of a direction and the direction changes every
sample. What it saves is stated in the module header.
across is folded in for the same reason and computed only where it is read:
it is the belts' convergence, weighted at BELT_MARGIN, and beltBand is
the only band that reads it.
The arc computes its own, and sharing this one was wrong. ARC_MARGIN is
inside BELT_MARGIN, which reads as the arc asking for strictly less — but
convergence returns total/weight, a normalized mean, and re-weighting a
mean moves it in either direction rather than shrinking it. Measured on Earth
over the 11,833 of 40,000 directions the arc actually reads: the two disagree
in 3,510 of them, worst case a belt reading of 0.0005 — pure transform, no arc
at all — against an arc reading of 1.0000, fully convergent with cones at full
height, at a boundary of 0.0583 with three plates in range. Through
edge · continental · across · cones³ · 1.6 that is 436 m of a 802 m
volcanism budget. A second convergence pass costs a loop over two to four
plates on the thin band where boundary < ARC_MARGIN, which is what the arc's
own gate was already paying for.
across is defined only where edge > 0, and it is zero rather than
continuous outside that. It steps at boundary === BELT_MARGIN, where the
pair weights go to zero but their normalized ratio does not. Nothing sees it:
beltBand multiplies by an edge that is exactly zero there and returns
before that anyway, and the arc gates at 0.06. A third consumer, or an
ARC_MARGIN raised past BELT_MARGIN, would see it — which is the kind of
precondition this whole branch exists because nobody wrote down.
Members
acrossreadonly
Relative motion across the nearby boundary: positive convergent, negative divergent, near zero transform. Zero away from every boundary, where no band reads it.