@essrt/physics 9.2.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,10 +18,20 @@
18
18
  // J2000 node lamDotRel ≡ 1 by construction, so the caller's anchor is
19
19
  // preserved exactly.
20
20
  //
21
- // Scope: this channel feeds the model/chart surface for the sidereal year
22
- // OF DATE. The scene's sidereal frame stays on the certified H/13
23
- // identity — a 3e-8 relative frame change is invisible in the render and
24
- // would disturb the certified frozen-clock pair.
21
+ // Scope: this channel is the sidereal year OF DATE everywhere — the
22
+ // model/chart surfaces AND the scene: since plan 06 R1 the Sun's mean
23
+ // longitude of date integrates the one-family tropical year (this channel
24
+ // minus the movement's own general precession), so the scene's measured
25
+ // sidereal angle reproduces this law (the scene-sampled gate,
26
+ // tools/verify/scene-year-lengths.js). The frozen era clock's sidereal
27
+ // year (mass-loss only, no planetary drift) is the certified era device,
28
+ // not a member of this family.
29
+ //
30
+ // ESTIMATOR (2026-09): each banked node is the least-squares slope of a
31
+ // quadratic fitted to the dump's unwrapped L over ±5 kyr — the former
32
+ // 2-kyr boxcar of per-step rates telescoped to the difference of the
33
+ // OSCULATING longitude at the window's two ends and left 0.1–0.3 s of
34
+ // node noise (−266 ms at +4000 against DE441; +18…28″ of Sun by 6500).
25
35
 
26
36
  const { SIDEREAL_CHANNEL_ARTIFACT } = require('./sidereal-channel-artifact.cjs');
27
37
 
@@ -10,81 +10,112 @@
10
10
  // pair's members is amplified ~20×/s by P = T_s/(T_s − T_t).
11
11
  //
12
12
  // The rules this factory owns:
13
- // • ONE FAMILY: tropical = massLoss·(1 − p_geom/360) with p_geom the
14
- // movement's own equinox rate (wobble included); sidereal = the D6
15
- // λ̇ channel; anomalistic = the SECULAR mean-element construction on
16
- // the chain's apsidal tangent (the injected fn — the same rate family
17
- // the panel's Prec. cell shows; structure fallback when absent); every
18
- // value λ̇-corrected coherently (rate form — beats invariant to
19
- // second order).
20
- // • ONE BASIS: SI seconds (days = seconds/86400 at the caller).
13
+ // • ONE FAMILY: sidereal = the D6 λ̇ channel; tropical = the sidereal
14
+ // year minus the movement's own GENERAL-PRECESSION rate of date (the
15
+ // broken-angle equinox longitude, wobble included), in RATE form with
16
+ // the sampler's Julian-year unit named; anomalistic = the tropical
17
+ // year minus the movement's own equinox-referenced apsidal rate of
18
+ // date (the same year-over-year reading — the scene's perihelion
19
+ // passages ARE this movement); every value λ̇-corrected coherently
20
+ // (rate form — beats invariant to second order).
21
+ // • ONE BASIS: SI seconds (days = seconds/86400 at the caller); periods
22
+ // in JULIAN years (the beat's duration ÷ 365.25 d — the unit the
23
+ // frame's precession rate is quoted in, so 360°/rate and the pair's
24
+ // beat are the SAME number; measured 2026-09: the dimensionless
25
+ // T_sid/(T_sid − T_trop) counts TROPICAL years, 2.1e-5 off — 0.55 yr
26
+ // on the axial period, 26 ms on the tropical year against the frame).
21
27
  // • BEATS FROM THE PAIR: each precession period is computed from the
22
28
  // two years THIS factory returns — recomputing a beat from the
23
29
  // displayed/served values reproduces it exactly.
24
- // • Scene MEASUREMENTS validate this family (sub-0.5 s, the report's
25
- // measured columns); they are instruments, never mixed into beats.
30
+ // • THE SCENE IS THE REFERENCE (owner, 2026-09-30: "all calculations
31
+ // should match what we measure in the scene"): the scene's Sun
32
+ // integrates the tropical year below and turns with this movement's
33
+ // frame and apsidal line, so its measured sidereal, tropical and
34
+ // anomalistic years reproduce this family to the millisecond once the
35
+ // planetary completion terms are removed per event (the scene-sampled
36
+ // gate, tools/verify/scene-year-lengths.js). Before this restatement
37
+ // the scene read the law's sidereal year 26 ms short at J2000 and up
38
+ // to 1 s off at depth (the projected equinox rate), and the published
39
+ // anomalistic year rode the planet chain's secular tangent — seconds
40
+ // from the scene's own perihelion passages within a few millennia,
41
+ // 395 s at +25 kyr where e passes 0.0034.
26
42
  // • The frozen era clock stays the certified era device (opt-out /
27
43
  // era-certification record), not a member of this family.
28
44
 
29
45
  const { createCardinalStructure } = require('../cardinal/one-source-structure.cjs');
30
46
  const { createSiderealYearChannel } = require('./sidereal-year-channel.cjs');
31
47
 
48
+ /** SI seconds in one Julian year — the sampler's time unit (t = years from J2000 TT, 365.25 d). */
49
+ const JULIAN_YEAR_SECONDS = 365.25 * 86400;
50
+
32
51
  /**
33
52
  * @param {{
34
- * sampleAt: (year: number) => {e: number, periOfDateDeg: number, equinoxLonJ2000Deg: number},
53
+ * sampleAt: (year: number) => {e: number, periOfDateDeg: number, equinoxLonJ2000Deg: number, generalPrecessionLonDeg: number},
35
54
  * massLossSiderealSecondsAtYearFn: (year: number) => number,
36
- * apsidalSecularDegPerYrFn?: (year: number) => number,
37
55
  * }} opts
38
- * sampleAt: the one-source movement sampler, calendar-year keyed
39
- * (createDeepOrbitalHistory build().at wrapped by the caller — series
40
- * tier where the artifact is available, mode tail beyond).
56
+ * sampleAt: the one-source movement sampler, keyed in the sampler's own
57
+ * year (Julian years from J2000 TT, 2000 = J2000; createDeepOrbitalHistory
58
+ * build().at wrapped by the caller — series tier where the artifact is
59
+ * available, mode tail beyond).
41
60
  * massLossSiderealSecondsAtYearFn: the caller's secular mass-loss
42
61
  * sidereal-year law, SI seconds, IAU-anchored at J2000.
43
- * apsidalSecularDegPerYrFn: the chain's SECULAR apsidal tangent of date
44
- * (keplerian-chain computeApsidalSecularDegPerYr for Earth — deg/yr,
45
- * J2000-ecliptic frame). When given, the anomalistic year is the
46
- * mean-element construction on this smooth rate; when absent, it falls
47
- * back to the cardinal structure's measured year-over-year interval
48
- * (which carries the banked series' century-scale ϖ̇ wobble).
49
62
  */
50
- function createYearLengths({ sampleAt, massLossSiderealSecondsAtYearFn, apsidalSecularDegPerYrFn }) {
63
+ function createYearLengths({ sampleAt, massLossSiderealSecondsAtYearFn }) {
51
64
  if (typeof sampleAt !== 'function' || typeof massLossSiderealSecondsAtYearFn !== 'function') {
52
65
  throw new Error('createYearLengths: sampleAt and massLossSiderealSecondsAtYearFn are required');
53
66
  }
54
67
  const w180 = (/** @type {number} */ d) => ((d + 540) % 360) - 180;
55
68
  const chan = createSiderealYearChannel({ massLossSiderealSecondsAtYearFn });
69
+ /** A year length from a longer year and a retrograde angular rate of the
70
+ * reference point, RATE form: 1/T = 1/T_long + p/(360°·JY) — exact (the
71
+ * linear T_long·(1 − p/360) drops (p/360)², 47 ms on the tropical year),
72
+ * with p in degrees per JULIAN year (the sampler's unit; read as "per
73
+ * tropical year" it was 26 ms short). @param {number} tLong @param {number} pDegPerJulianYr */
74
+ const shorterYear = (tLong, pDegPerJulianYr) => 1 / (1 / tLong + pDegPerJulianYr / (360 * JULIAN_YEAR_SECONDS));
75
+ /** The movement's own general precession of date, degrees per Julian
76
+ * year, retrograde positive — the year-over-year advance of the
77
+ * broken-angle equinox longitude (wobble included). @param {number} year */
78
+ const generalPrecessionDegPerJulianYr = (year) =>
79
+ w180(sampleAt(year - 0.5).generalPrecessionLonDeg - sampleAt(year + 0.5).generalPrecessionLonDeg);
80
+ /** The movement's own apsidal rate of date RELATIVE TO THE EQUINOX (the
81
+ * climatic-precession rate, ~0.017°/yr at J2000), degrees per Julian
82
+ * year, prograde positive. @param {number} year */
83
+ const apsidalVsEquinoxDegPerJulianYr = (year) =>
84
+ w180(sampleAt(year + 0.5).periOfDateDeg - sampleAt(year - 0.5).periOfDateDeg);
56
85
  // The mean tropical year OF DATE, raw (pre-λ̇): the movement's own
57
- // equinox-rate form — carries the real precession-rate wobble, unlike
58
- // the smooth secular mean (a wobble-free mean under a wobbling family
59
- // was one of the duplicated implementations this factory retires).
60
- const tropicalRawSeconds = (/** @type {number} */ year) => {
61
- const p = w180(sampleAt(year - 0.5).equinoxLonJ2000Deg
62
- - sampleAt(year + 0.5).equinoxLonJ2000Deg); // retrograde → positive
63
- return massLossSiderealSecondsAtYearFn(year) * (1 - p / 360);
64
- };
86
+ // general-precession rate — carries the real precession-rate wobble,
87
+ // unlike the smooth secular mean (a wobble-free mean under a wobbling
88
+ // family was one of the duplicated implementations this factory retires).
89
+ const tropicalRawSeconds = (/** @type {number} */ year) =>
90
+ shorterYear(massLossSiderealSecondsAtYearFn(year), generalPrecessionDegPerJulianYr(year));
65
91
  const structure = createCardinalStructure({
66
92
  sampleAt,
67
93
  tropicalYearSecondsAtYearFn: tropicalRawSeconds,
68
94
  });
69
95
  const trop = (/** @type {number} */ year) => chan.correctedYearSeconds(year, tropicalRawSeconds(year));
70
96
  const sid = (/** @type {number} */ year) => chan.siderealYearSecondsAtYear(year);
71
- // The anomalistic year OF DATE — the SECULAR (mean-element) construction
72
- // when the chain tangent is injected: T_anom_raw = T_sid_raw·360/(360 − w)
73
- // with w = dϖ/dt (deg/yr, J2000-ecliptic, the SAME rate family the panel's
74
- // Prec. cell shows), then λ̇-corrected coherently. The displayed beat
75
- // anom/(anom − sid) then equals the chain period 360/w EXACTLY at J2000
76
- // (the rate-form correction leaves beats invariant), and the J2000 value
77
- // lands +0.07 s from the published mean-element 365.259636 d. The former
78
- // structure form (the year-over-year interval on the banked series) read
79
- // the series' century-scale ϖ̇ wobble — ±0.015″/yr ≈ ±0.35 s, an alias at
80
- // the series' 250-yr sampling — and sat +0.20 s above the smooth tangent
81
- // at J2000 (owner-found: the panel beat read 111,491 where the Prec. cell
82
- // read 111,570). The measured-interval form stays on the cardinal
83
- // structure for callers that want the wobble.
84
- const anom = apsidalSecularDegPerYrFn
85
- ? (/** @type {number} */ year) => chan.correctedYearSeconds(year,
86
- massLossSiderealSecondsAtYearFn(year) * 360 / (360 - apsidalSecularDegPerYrFn(year)))
87
- : (/** @type {number} */ year) => chan.correctedYearSeconds(year, structure.anomalisticYearSeconds(year));
97
+ // The anomalistic year OF DATE: the tropical year lengthened by the
98
+ // movement's own apsidal advance against the equinox (a perihelion
99
+ // passage is a pure mean-anomaly event — no equation-of-centre term), in
100
+ // rate form, then λ̇-corrected coherently. This IS the scene: its apsidal
101
+ // wheel turns with periOfDateDeg, and the scene's perihelion-to-perihelion
102
+ // intervals read this form to 0.03–0.13 s at every sampled epoch. The
103
+ // former construction on the planet chain's secular apsidal tangent (the
104
+ // same family as the Perihelion Longitudes Prec. cell) agreed at J2000
105
+ // (+0.07 s) and parted from the scene by +3.3 s at 0 AD, −6.6 s at 6000,
106
+ // −14 s at 10,000 and −395 s at +25,000 (e = 0.0034, the apsidal line
107
+ // swings fast) — the chain tangent's dϖ̇/dt runs ~40 % steep against the
108
+ // secular mean elements, the series' reads them to ~1 s over ±4 kyr. The
109
+ // rate the beats and the Prec. cell quote is apsidalRateFixedDegPerJulianYr
110
+ // below — ONE family, so 360°/rate and anom/(anom − sid) are the same
111
+ // number. The year-over-year reading carries the banked series' own
112
+ // century-scale ripple (±0.015″/yr ≈ ±0.35 s; the cadence is named in the
113
+ // artifact) — it is the movement's, not smoothed away.
114
+ const anom = (/** @type {number} */ year) =>
115
+ chan.correctedYearSeconds(year, shorterYear(tropicalRawSeconds(year), -apsidalVsEquinoxDegPerJulianYr(year)));
116
+ /** A beat period in JULIAN years from two year lengths (SI s): the time for
117
+ * the shorter year to gain one turn on the longer, ÷ 365.25 d. @param {number} tLong @param {number} tShort */
118
+ const beatJulianYears = (tLong, tShort) => tLong * tShort / ((tLong - tShort) * JULIAN_YEAR_SECONDS);
88
119
 
89
120
  return Object.freeze({
90
121
  /** Mean tropical year of date, SI seconds. @param {number} year */
@@ -93,12 +124,16 @@ function createYearLengths({ sampleAt, massLossSiderealSecondsAtYearFn, apsidalS
93
124
  siderealYearSecondsAtYear: sid,
94
125
  /** Anomalistic year of date, SI seconds. @param {number} year */
95
126
  anomalisticYearSecondsAtYear: anom,
96
- /** Axial precession period of date (equinox regression beat), years. @param {number} y */
97
- axialPrecessionYearsAtYear: (y) => { const s = sid(y), t = trop(y); return s / (s - t); },
98
- /** Perihelion (apsidal-vs-equinox) precession period of date, years. @param {number} y */
99
- perihelionPrecessionYearsAtYear: (y) => { const a = anom(y), t = trop(y); return a / (a - t); },
100
- /** Apsidal precession period of date vs the fixed stars, years (hypersensitive: ±1 s ↔ ≈400 yr; the identifier keeps the historical "inclination" name). @param {number} y */
101
- inclinationPrecessionYearsAtYear: (y) => { const a = anom(y), s = sid(y); return a / (a - s); },
127
+ /** Axial precession period of date (equinox regression beat), JULIAN years. @param {number} y */
128
+ axialPrecessionYearsAtYear: (y) => beatJulianYears(sid(y), trop(y)),
129
+ /** Perihelion (apsidal-vs-equinox) precession period of date, JULIAN years. @param {number} y */
130
+ perihelionPrecessionYearsAtYear: (y) => beatJulianYears(anom(y), trop(y)),
131
+ /** Apsidal precession period of date vs the fixed stars, JULIAN years (hypersensitive: ±1 s ↔ ≈400 yr; the identifier keeps the historical "inclination" name). @param {number} y */
132
+ inclinationPrecessionYearsAtYear: (y) => beatJulianYears(anom(y), sid(y)),
133
+ /** The movement's own general precession of date, ″ per Julian year (retrograde positive) — 360°/this ≡ axialPrecessionYearsAtYear to second order. @param {number} y */
134
+ generalPrecessionArcsecPerJulianYr: (y) => generalPrecessionDegPerJulianYr(y) * 3600,
135
+ /** The movement's own apsidal rate of date against the FIXED frame, ″ per Julian year (prograde positive) — the rate the Perihelion Longitudes Prec. cell shows for Earth; 360°/this ≡ inclinationPrecessionYearsAtYear exactly. @param {number} y */
136
+ apsidalRateFixedArcsecPerJulianYr: (y) => { const a = anom(y), s = sid(y); return 360 * JULIAN_YEAR_SECONDS * (1 / s - 1 / a) * 3600; },
102
137
  /** The per-cardinal layer (D6 rules: year lengths λ̇-corrected; offsets/spreads raw — μs-class/second-order there). */
103
138
  cardinal: Object.freeze({
104
139
  /** @param {number} y @param {'VE'|'SS'|'AE'|'WS'} type */
package/src/model.js CHANGED
@@ -24,7 +24,6 @@ import { createPhaseMachinery } from './phase/index.cjs';
24
24
  import { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from './earth/year-lengths.cjs';
25
25
  import { createDeepOrbitalHistory } from './earth/deep-orbital-history.cjs';
26
26
  import { CHAIN_ARTIFACT } from './planets/chain-artifact.js';
27
- import { buildPlanetChainsFromArtifactData, computeApsidalSecularDegPerYr } from './planets/keplerian-chain.cjs';
28
27
  import { computeSecularShape } from './planets/secular-shape.cjs';
29
28
  import { createPlanetSpinChannelFromArtifacts, computeObliquityJ2000Deg } from './planets/spin-channel.cjs';
30
29
  import { createDeltaTCycles } from './deltat/cycles.cjs';
@@ -148,6 +147,10 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
148
147
  relaxationKyr: C.deepTime.alphaGiaRelaxationKyr,
149
148
  alphaGiaRateJ2000PerYr: C.deepTime.alphaGiaRateJ2000PerYr,
150
149
  alphaJ2000: earthMoiFactorJ2000,
150
+ // the channel's second observable, J₂(t)/J₂₀ — scaled on the OBSERVED
151
+ // dJ₂/dt; consumed by the spin integration below (the precession of date)
152
+ j2RateJ2000PerYr: C.deepTime.j2RateJ2000PerYr,
153
+ j2J2000: C.physicalConstants.earthJ2,
151
154
  });
152
155
 
153
156
  let latticeAlphaPin = false;
@@ -529,9 +532,6 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
529
532
  // path; the npm package alone has no 8 MB series), the movement runs the
530
533
  // SERIES tier exactly like the browser — killing the mode-vs-series
531
534
  // value split (measured: 6 s on the anomalistic year at J2000).
532
- // The engine-D planet chains (ONE build; the one-family route's apsidal
533
- // tangent and the lunisolar surface's n_aps read the same instance).
534
- const kcChainsM = buildPlanetChainsFromArtifactData(CHAIN_ARTIFACT);
535
535
  // The ONE-SOURCE movement: the hybrid's ε(t) (plan 06 Phase 3 S3b — THE
536
536
  // published obliquity) and the one-family year lengths, on the same
537
537
  // per-tier sampler.
@@ -577,6 +577,14 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
577
577
  const h = deepLod.hAtAge((startmodelYear - yr) / 1e6);
578
578
  return axial0 * (h === null ? 1 : h / H0);
579
579
  },
580
+ // THE PRECESSION OF DATE (plan 06 §9 item 10): on top of the secular
581
+ // law above, the solar torque at the eccentricity of date and the
582
+ // oblateness of date from the GIA channel — both exactly 1 at J2000,
583
+ // so the unit H(t) and the J2000 anchor are untouched. The channel is
584
+ // read PURE (alphaGia, not the lattice-pin-aware earthMoiFactorAtAge):
585
+ // the samplers are cached, their values must be pure in year.
586
+ solarTorqueShareJ2000: EPOCH_PARAMS.precessionSolarShareJ2000,
587
+ dynamicalEllipticityRatioAtYearFn: alphaGia.j2RatioAt,
580
588
  });
581
589
  // PER-TIER ROUTING (the anomalistic-contamination fix): one sampler PER
582
590
  // grid tier, built on first entry and KEPT — a query always reads the
@@ -599,13 +607,12 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
599
607
  }
600
608
  return samplers.get(key).at(t);
601
609
  };
602
- // The anomalistic rides the chain's SECULAR apsidal tangent (the same
603
- // rate family the panel's Prec. cell shows) — ONE helper, keplerian-chain.
604
- const kcChains = kcChainsM;
610
+ // The anomalistic year rides THIS movement's own apsidal line (the
611
+ // scene's perihelion) — the factory owns the construction; the planet
612
+ // chain's secular tangent is no longer a member (year-lengths.cjs).
605
613
  const yearLengths = createYearLengths({
606
614
  sampleAt,
607
615
  massLossSiderealSecondsAtYearFn: (year) => deepLod.siderealYearSecondsAtAge(yearToTMa(year)),
608
- apsidalSecularDegPerYrFn: (year) => computeApsidalSecularDegPerYr(year, kcChains.earth, kcChains),
609
616
  });
610
617
  return {
611
618
  yearLengths,
@@ -615,6 +622,8 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
615
622
  periOfDateDegAt: (year) => sampleAt(year).periOfDateDeg,
616
623
  /** The hybrid's obliquity at a decimal year, degrees — the banked series inside its span, the α(t)-coupled ζ-tail integration beyond (the deep sampler grows ~0.1 s/Myr). @param {number} year @returns {number} */
617
624
  epsAt: (year) => sampleAt(year).epsDeg,
625
+ /** The precession of date's two factors at a decimal year (the factory's own — ONE home). @param {number} year @returns {{solarTorque: number, ellipticity: number}} */
626
+ precessionOfDateFactorsAt: (year) => hist.precessionOfDateFactorsAt(year - 2000),
618
627
  };
619
628
  })();
620
629
  const yearLengthsM = oneSourceM.yearLengths;
@@ -1471,6 +1480,10 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
1471
1480
  ofDatePeriodYearsAtYear: publishedAxialPrecessionYearsAtYear,
1472
1481
  /** f_S, the solar fraction of the J2000 precession torque. */
1473
1482
  solarShareJ2000: EPOCH_PARAMS.precessionSolarShareJ2000,
1483
+ /** THE PRECESSION OF DATE — the solar-torque factor 1 + f_S·([(1 − e²)/(1 − e₀²)]^(−3/2) − 1) at the eccentricity of date (1 at J2000; +3.2·10⁻⁴ on the million-year mean). The spin integration multiplies it into the secular rate. @param {number} year @returns {number} */
1484
+ solarTorqueFactorOfDateAtYear: (year) => oneSourceM.precessionOfDateFactorsAt(year).solarTorque,
1485
+ /** THE PRECESSION OF DATE — J₂(t)/J₂₀, the oblateness of date from the GIA channel (ψ̇ ∝ J₂; 1 at J2000, bounded ±5·10⁻⁴; dJ₂/dt at J2000 = the observed satellite rate). @param {number} year @returns {number} */
1486
+ ellipticityRatioOfDateAtYear: (year) => oneSourceM.precessionOfDateFactorsAt(year).ellipticity,
1474
1487
  /** (a₀/a_M(t))³ — the lunar torque's growth on the recession history. @param {number} year @returns {number} */
1475
1488
  lunarTorqueFactorAtYear: (year) => { const f = deepLod.lunarTorqueFactorAtAge(yearToTMa(year)); return f === null ? 1 : f; },
1476
1489
  /** f_S + (1 − f_S)(a₀/a_M)³ — the torque term the unit divides H_era by. @param {number} year @returns {number} */
@@ -1487,23 +1500,23 @@ export function assembleModel(C, F, laws = {}, secularSeriesArtifact = /** @type
1487
1500
  const psiDot = r === null ? 1296000 / certifiedAxialPrecessionJ2000Years() : r;
1488
1501
  return 1296000 / (psiDot - s3ArcsecPerYr);
1489
1502
  },
1490
- /** The apsidal (perihelion vs the stars) period from the engine-D chain's secular tangent, years — inside the published window only (the tangent is an extrapolation beyond the banked series: it turns negative at −5 Myr); null beyond. @param {number} year @returns {number|null} */
1491
- apsidalPeriodYearsAtYear: (year) => (Math.abs(year - 2000) <= ONE_FAMILY_WINDOW_YEARS ? 360 / computeApsidalSecularDegPerYr(year, kcChainsM.earth, kcChainsM) : null),
1503
+ /** The apsidal (perihelion vs the stars) period of date, JULIAN years — the ONE movement's own apsidal rate (the scene's perihelion; anom/(anom − sid) of the one family, ≡ 360°/apsidalRateFixedArcsecPerJulianYr), inside the published window only; null beyond. Before 2026-09 this rode the planet chain's secular tangent, which parted from the scene's perihelion passages by seconds of anomalistic year within a few millennia (year-lengths.cjs). @param {number} year @returns {number|null} */
1504
+ apsidalPeriodYearsAtYear: (year) => (Math.abs(year - 2000) <= ONE_FAMILY_WINDOW_YEARS ? yearLengthsM.inclinationPrecessionYearsAtYear(year) : null),
1492
1505
  /** T_aps(t) / T_p(t) — the apsidal period in of-date precession periods (4.33 at J2000, a reading; 0.84 … 9.9 across ±26 kyr, measured); null beyond the published window. @param {number} year @returns {number|null} */
1493
1506
  apsidalPerPrecessionAtYear: (year) => {
1494
1507
  if (Math.abs(year - 2000) > ONE_FAMILY_WINDOW_YEARS) return null;
1495
- return (360 / computeApsidalSecularDegPerYr(year, kcChainsM.earth, kcChainsM)) / publishedAxialPrecessionYearsAtYear(year);
1508
+ return yearLengthsM.inclinationPrecessionYearsAtYear(year) / publishedAxialPrecessionYearsAtYear(year);
1496
1509
  },
1497
- /** T_peri(t) = 1/(1/T_p + 1/T_aps) — the perihelion-of-date period (equinox precession + inertial perihelion motion, frame arithmetic at every epoch), years, on the of-date T_p; null beyond the published window. @param {number} year @returns {number|null} */
1510
+ /** T_peri(t) = 1/(1/T_p + 1/T_aps) — the perihelion-of-date period (equinox precession + inertial perihelion motion, frame arithmetic at every epoch), JULIAN years, on the of-date T_p — ≡ the one family's anom/(anom − trop); null beyond the published window. @param {number} year @returns {number|null} */
1498
1511
  periOfDatePeriodYearsAtYear: (year) => {
1499
1512
  if (Math.abs(year - 2000) > ONE_FAMILY_WINDOW_YEARS) return null;
1500
- const tp = publishedAxialPrecessionYearsAtYear(year), taps = 360 / computeApsidalSecularDegPerYr(year, kcChainsM.earth, kcChainsM);
1513
+ const tp = publishedAxialPrecessionYearsAtYear(year), taps = yearLengthsM.inclinationPrecessionYearsAtYear(year);
1501
1514
  return 1 / (1 / tp + 1 / taps);
1502
1515
  },
1503
1516
  /** T_peri(t) / T_p(t) (0.812 at J2000 — the J2000 reading); null beyond the published window. @param {number} year @returns {number|null} */
1504
1517
  periOfDatePerPrecessionAtYear: (year) => {
1505
1518
  if (Math.abs(year - 2000) > ONE_FAMILY_WINDOW_YEARS) return null;
1506
- const tp = publishedAxialPrecessionYearsAtYear(year), taps = 360 / computeApsidalSecularDegPerYr(year, kcChainsM.earth, kcChainsM);
1519
+ const tp = publishedAxialPrecessionYearsAtYear(year), taps = yearLengthsM.inclinationPrecessionYearsAtYear(year);
1507
1520
  return (1 / (1 / tp + 1 / taps)) / tp;
1508
1521
  },
1509
1522
  /** The published of-date window, years from 2000. */
@@ -16,8 +16,8 @@
16
16
  */
17
17
  'use strict';
18
18
 
19
- const DEEP_MODES_ARTIFACT_HASH = "77e0baf779e85de5";
19
+ const DEEP_MODES_ARTIFACT_HASH = "cbdc477b7442c333";
20
20
 
21
- const DEEP_MODES_ARTIFACT = Object.freeze({"meta":{"integrator":"wh","order":2,"dtDays":2,"spanYears":20000000,"sampleDays":20000,"gr":true,"seed":"JPL Horizons J2000 heliocentric state vectors (tools/explore/j2000-state.mjs, the one home)","masses":"DE440 mass ratios (astro-reference physicalConstants)","runCommand":"node tools/explore/lattice-long-window-test.mjs years=20000000 integrator=wh dt=2 order=2 gr=1 frame=both sample=20000","dumpFile":"tools/explore/lattice-long-window-ecliptic-20000000-gr.local.json (untracked, 337 MB)","dumpSha256":"686d6af51a689f7bd64ac1e2d8b26c243a4beccdacd3167adfeeae078e8b990f","conservationMaxDE":1.2738960401328902e-8,"decimation":4,"naffTerms":18,"naffZetaTerms":16,"naffZetaTermsEra":8,"frame":"ecliptic-J2000 (z-modes for the lunar-chain e; ζ-modes for the Stage-C obliquity hybrid — the invariable-frame ζ table remains unbanked, no consumer)","laskarRef":"Laskar, J. et al. (2004), A&A 428, 261–285, Table 3 (theory reference labels)"},"verdict":{"strongestBeatPeriodKyr":405.625567477903,"strongestBeatArcsecPerYr":3.195064867479295,"la2004BeatPeriodKyr":405.6972922210049,"rockMetronomeKyr":405.6,"companion124Kyr":123.84617993487997,"companion95Kyr":94.87791796545507,"earthLeadingModesArcsecPerYr":[4.257358971029763,7.452423838509057,17.917017907389138,17.368946405872247],"topBeatLines":[{"periodKyr":405.625567477903,"productAmp":0.0003123310080848341},{"periodKyr":94.87791796545507,"productAmp":0.00024338439758855827},{"periodKyr":123.84617993487997,"productAmp":0.00020980875877847502},{"periodKyr":98.84386665157218,"productAmp":0.00016694824937892253},{"periodKyr":130.6909747037068,"productAmp":0.00014391721626151482},{"periodKyr":2364.6549700414625,"productAmp":0.00011214770251987629},{"periodKyr":972.3103697584877,"productAmp":0.00007218142389142678},{"periodKyr":695.9670418382926,"productAmp":0.00006222377072471454}],"note":"g5 matches La2004 to 0.0002 ″/yr; the beat gap vs 405.6 is g2 (chaotic-diffusion window sensitivity + omitted separate-Moon/asteroid terms) — the anatomy is the plan’s Stage-B record."},"earthZ":[{"omegaRadPerYr":0.000020640258745496456,"re":0.01640837548946667,"im":0.00964771830356857},{"omegaRadPerYr":0.00003613037034336034,"re":-0.015519645105303494,"im":-0.005327718511512781},{"omegaRadPerYr":0.00008686415406186803,"re":-0.011108307303646387,"im":0.0063324002417276355},{"omegaRadPerYr":0.00008420702844025169,"re":0.005504442820656899,"im":-0.006828487155118338},{"omegaRadPerYr":0.000027102377738159537,"re":0.0005990602912422896,"im":0.0037445139104202996},{"omegaRadPerYr":0.00008284690006982035,"re":0.002385900412412394,"im":0.0008687520930649916},{"omegaRadPerYr":0.00008551634076169395,"re":0.0012667960543480752,"im":0.001284547912075711},{"omegaRadPerYr":0.00008156882804453768,"re":-0.0003413759390549155,"im":0.0016823570425905205},{"omegaRadPerYr":0.000033456117700854,"re":-0.0012412588643094782,"im":0.0009318258971565654},{"omegaRadPerYr":0.00013693625799603712,"re":-0.0009261214276803977,"im":0.0011910509606790575},{"omegaRadPerYr":0.00008736463294475958,"re":0.0013199280789047622,"im":0.0009530586967429039},{"omegaRadPerYr":0.00008630679999141721,"re":-0.00038871245410104777,"im":0.0009912036911146165},{"omegaRadPerYr":0.000026453632677170472,"re":-0.00032615534646350156,"im":-0.0018102501817831135},{"omegaRadPerYr":0.000034145978925786535,"re":0.0009480778866315119,"im":-0.0008230502200947101},{"omegaRadPerYr":0.00003548085475024487,"re":-0.0013007947815593653,"im":-0.00042439393044846465},{"omegaRadPerYr":0.00008951127418467436,"re":-0.0010559339979945592,"im":-0.000005975184481501219},{"omegaRadPerYr":0.00008814769888639652,"re":-0.0003392982459796931,"im":-0.00126615007571311},{"omegaRadPerYr":0.000027692559180942054,"re":0.0004455147622140075,"im":0.0013147856084997915}],"earthZeta":[{"omegaRadPerYr":-6.480692835562015e-14,"re":-0.004134427250631887,"im":0.013144207689667023},{"omegaRadPerYr":-0.00009139020514696892,"re":-0.003762846299946732,"im":-0.007417313993526907},{"omegaRadPerYr":-0.00002707802193107254,"re":0.004228758817782956,"im":0.001552899971393225},{"omegaRadPerYr":-0.00008608086641122392,"re":0.0012161313006493822,"im":-0.0038454411181687697},{"omegaRadPerYr":-0.00003414305478233622,"re":-0.0030829972319892183,"im":0.002522672469285971},{"omegaRadPerYr":-0.00008873899569559657,"re":-0.00020769480131372744,"im":-0.0026850953462850356},{"omegaRadPerYr":-0.00003333897395226539,"re":0.0006468387853619108,"im":-0.0008212555187612507},{"omegaRadPerYr":-0.000034707554013716744,"re":0.0012115602030611985,"im":-0.0008603813396121053},{"omegaRadPerYr":-0.00009404694793046069,"re":0.001124843496312146,"im":0.0009724617908785189},{"omegaRadPerYr":-0.00002647193861971907,"re":0.001606075294689031,"im":0.0005931944911952478},{"omegaRadPerYr":-0.00003277702706161178,"re":0.0005051745779261483,"im":-0.0006705412769950699},{"omegaRadPerYr":-0.00012773805775388969,"re":-0.0008122347824469044,"im":0.0010593881606687687},{"omegaRadPerYr":-0.00009269956713813446,"re":-0.0006909282558950976,"im":0.0004135096481099148},{"omegaRadPerYr":-0.000014507597324441827,"re":-0.0006470785128404058,"im":0.00057746649029071},{"omegaRadPerYr":-0.000033761896788929335,"re":0.001157822428032179,"im":-0.000690971407290411},{"omegaRadPerYr":-0.000028297573329000286,"re":-0.0011184968821771682,"im":-0.0003885179122647609}],"earthZetaEra":[{"omegaRadPerYr":-6.480692835562015e-14,"re":-0.004136170228858843,"im":0.013147349898750587},{"omegaRadPerYr":-0.00009139020514696892,"re":-0.0037451120264298888,"im":-0.007367103224447289},{"omegaRadPerYr":-0.00002707802193107254,"re":0.004192460536906565,"im":0.0015465498581850507},{"omegaRadPerYr":-0.00008608086641122392,"re":0.0012039767467140353,"im":-0.0038572667358382287},{"omegaRadPerYr":-0.00003414305478233622,"re":-0.0032014533879969596,"im":0.0025701217059533803},{"omegaRadPerYr":-0.00008873899569559657,"re":-0.00021856508120855303,"im":-0.002669820778092242},{"omegaRadPerYr":-0.00003333897395226539,"re":0.0003478573166468341,"im":-0.0006130210720886913},{"omegaRadPerYr":-0.000034707554013716744,"re":0.0012188003710118757,"im":-0.000879354385952938}],"planetLeadingZetaArcsecPerYr":{"mercury":-5.583654095308831,"venus":-18.85062201283722,"earth":-18.850582957521933,"mars":-17.75551746317749,"jupiter":-26.34785064223289,"saturn":-26.34785063789155,"uranus":-2.992403454072025,"neptune":-0.6916261380439003},"planetZ":{"mercury":[{"omegaRadPerYr":0.000027101464787379005,"re":0.036443059874745144,"im":0.15312012416846857},{"omegaRadPerYr":0.00002645682320158395,"re":-0.014115236278813163,"im":-0.07933183704397909},{"omegaRadPerYr":0.000027695768774324655,"re":0.014883065162550294,"im":0.04770421699238349},{"omegaRadPerYr":0.000020608825679123343,"re":0.0339424735092415,"im":0.0205886131133393},{"omegaRadPerYr":0.00003613198806683821,"re":0.026373724217244415,"im":0.007998632845938181},{"omegaRadPerYr":0.000025943085765069145,"re":-0.00008287402030671245,"im":0.01382534867142278},{"omegaRadPerYr":0.000021259366308985905,"re":-0.010921101889740678,"im":-0.005391042758241112},{"omegaRadPerYr":0.000033442897144222473,"re":-0.006298873452719107,"im":0.004846731368887027},{"omegaRadPerYr":0.000027342847424225136,"re":-0.031441801079617394,"im":-0.0012828182325896284},{"omegaRadPerYr":0.000026863603353307064,"re":-0.0023658597755055214,"im":0.03845436133115692},{"omegaRadPerYr":0.000029077390952304336,"re":-0.0056672065762804385,"im":0.008668504999729803},{"omegaRadPerYr":0.000025324686199132127,"re":-0.005942232736715857,"im":-0.012274661661212959},{"omegaRadPerYr":0.00002979754974875923,"re":0.0008097924308674098,"im":-0.0064472013829302505},{"omegaRadPerYr":0.000019992412184743173,"re":0.012472217201012077,"im":0.00359833652112381},{"omegaRadPerYr":0.00002454697962536287,"re":0.0020556509667169235,"im":0.0009916346793612978},{"omegaRadPerYr":0.00002812715748715012,"re":-0.002051758629227311,"im":-0.0033287955771129805},{"omegaRadPerYr":0.000019449369227596397,"re":-0.0038021090567115627,"im":-0.0028426209995905025}],"venus":[{"omegaRadPerYr":0.00003613032718771122,"re":-0.020105324941805183,"im":-0.006917696377202324},{"omegaRadPerYr":0.000020639950705137238,"re":0.017068955357371025,"im":0.010006500628836495},{"omegaRadPerYr":0.00008686450325171618,"re":0.011426811376444728,"im":-0.006520605414974846},{"omegaRadPerYr":0.00008420762005329659,"re":-0.006892443369184228,"im":0.008472548929406779},{"omegaRadPerYr":0.000027101843398089462,"re":0.0009492363872320767,"im":0.005898626241129876},{"omegaRadPerYr":0.00008284929259321451,"re":-0.0030327325912061806,"im":-0.0010976776908548803},{"omegaRadPerYr":0.00008156590133143486,"re":0.0004654494107565469,"im":-0.002280587631810283},{"omegaRadPerYr":0.00003345630943302872,"re":-0.0017828402597892042,"im":0.0012954758789217673},{"omegaRadPerYr":0.00008551538095828359,"re":-0.0011609215700463195,"im":-0.0012677518151850962},{"omegaRadPerYr":0.00002645314323665865,"re":-0.0005187468879242992,"im":-0.0028561425016264542},{"omegaRadPerYr":0.000034145633629733906,"re":0.0012933573208605794,"im":-0.001139818586425855},{"omegaRadPerYr":0.00002769519215699273,"re":0.000692247567326856,"im":0.0020562801187020375},{"omegaRadPerYr":0.00003548134649993586,"re":-0.0017504367473210652,"im":-0.0005759353131695786},{"omegaRadPerYr":0.00008736396981192052,"re":-0.0013474628838071549,"im":-0.000992885318268049},{"omegaRadPerYr":0.00008630854715331631,"re":0.0003763610849158857,"im":-0.0010611470059873186},{"omegaRadPerYr":0.00003678579378710168,"re":0.0015965344500683718,"im":0.0003260227593096117},{"omegaRadPerYr":0.00008814539612129297,"re":0.00043027029421162,"im":0.0012698103607611786},{"omegaRadPerYr":0.00009215946508724939,"re":-0.0008157163462856423,"im":-0.0001752965015353975}],"mars":[{"omegaRadPerYr":0.00008686194427246272,"re":0.04150468181977603,"im":-0.02235805720891878},{"omegaRadPerYr":0.00008420997062723613,"re":0.024191159406394575,"im":-0.02897798440552211},{"omegaRadPerYr":0.000020640675066908026,"re":0.01752920390659033,"im":0.010379054381833624},{"omegaRadPerYr":0.00008155902048560256,"re":-0.005126487019269018,"im":0.017498780322239615},{"omegaRadPerYr":0.00008951470797098792,"re":0.012453460704855819,"im":-0.0011162639997386022},{"omegaRadPerYr":0.00008286071984936754,"re":0.012151786749976757,"im":0.005285572685028835},{"omegaRadPerYr":0.00008552376356754678,"re":-0.008207026797923043,"im":-0.006506174683766466},{"omegaRadPerYr":0.00013693612216296713,"re":-0.004303426290032767,"im":0.005495751915005897},{"omegaRadPerYr":0.0000863140674359666,"re":0.003378196925346155,"im":-0.0035707297870487854},{"omegaRadPerYr":0.00009216418711866517,"re":0.004180141329638833,"im":0.001239878529646219},{"omegaRadPerYr":0.00008815294634884687,"re":0.0015478422945863473,"im":0.005394318221250823},{"omegaRadPerYr":0.00008737006869414014,"re":-0.004859264335556832,"im":-0.002468706141182086},{"omegaRadPerYr":0.00008474936320624016,"re":-0.0037175110079883836,"im":0.0005712305102614905},{"omegaRadPerYr":0.00003613060911836741,"re":-0.002878165082426005,"im":-0.0009813871463689},{"omegaRadPerYr":0.00008323445042360793,"re":-0.0021030674464516,"im":0.002382835034113347},{"omegaRadPerYr":0.00008591714206468895,"re":0.00033705398396163035,"im":-0.0031641077910174956},{"omegaRadPerYr":0.00008022543440532314,"re":0.0014077256319658448,"im":0.00023992196561432362},{"omegaRadPerYr":0.0000900335871717643,"re":-0.0007652388036231974,"im":-0.0015581764537776826}],"jupiter":[{"omegaRadPerYr":0.00002064075395335189,"re":0.038028034576741906,"im":0.022474419029067216},{"omegaRadPerYr":0.00013693627466777967,"re":0.009616177715621049,"im":-0.012410735192913122},{"omegaRadPerYr":0.000014970699552264387,"re":-0.0009276176888746422,"im":0.0015645820896462246},{"omegaRadPerYr":0.00025323179539978545,"re":0.0004059157737100984,"im":0.00040456376985595945},{"omegaRadPerYr":0.0001312662749926737,"re":-0.00015614354905163857,"im":-0.00012183629827031596},{"omegaRadPerYr":0.0001426061431474546,"re":-0.00015326196073912603,"im":-0.00011811188348776635},{"omegaRadPerYr":0.00014000309579914057,"re":0.00010317940519689781,"im":0.00006505029768233116},{"omegaRadPerYr":0.00013386863466366606,"re":0.00007960628300069755,"im":0.0000757581826985722},{"omegaRadPerYr":0.0012496810113814863,"re":3.5498901583457483e-9,"im":7.528217439557287e-9}],"saturn":[{"omegaRadPerYr":0.00013693627469533272,"re":-0.02951381641782599,"im":0.038116342187048506},{"omegaRadPerYr":0.000020640753964721574,"re":0.028361784183640975,"im":0.016761738089661193},{"omegaRadPerYr":0.0002532317954411971,"re":-0.0013588658390314074,"im":-0.0013542513704600167},{"omegaRadPerYr":0.000014970698207898392,"re":-0.0007732461228524056,"im":0.0013033726384504506},{"omegaRadPerYr":0.00013126626734545323,"re":0.000471597345592877,"im":0.0003662972802790016},{"omegaRadPerYr":0.00014260613959102947,"re":0.00046558535071819594,"im":0.0003604428232502375},{"omegaRadPerYr":0.0012496810120112478,"re":-2.2413816213183782e-8,"im":-4.3761227707856587e-8}],"uranus":[{"omegaRadPerYr":0.000020640753931894893,"re":-0.03238248798724911,"im":-0.019137541918709554},{"omegaRadPerYr":0.00001497070511159062,"re":-0.014798949407797135,"im":0.024975442503237483},{"omegaRadPerYr":0.000003264464996922227,"re":0.00045075801975650074,"im":0.0016050091168723338},{"omegaRadPerYr":0.00013693627457864556,"re":0.0009471352229324553,"im":-0.0012234989208774374},{"omegaRadPerYr":0.00000929092310040761,"re":-0.0004015633445553787,"im":-0.0002340983045129561},{"omegaRadPerYr":0.00002631265778975313,"re":0.00022664443272842668,"im":-0.0003767093309339966},{"omegaRadPerYr":0.000014377069742263513,"re":0.00005819778777828242,"im":-0.00005910629719132463},{"omegaRadPerYr":0.000630109378889249,"re":-1.1513321171782036e-7,"im":2.121111820496366e-7}],"neptune":[{"omegaRadPerYr":0.000003264141494649585,"re":0.0024665853980857314,"im":0.008775596228059238},{"omegaRadPerYr":0.000014970655663003607,"re":0.0018888606403837439,"im":-0.0031894015693886913},{"omegaRadPerYr":0.00002064075339053921,"re":0.001629524897365034,"im":0.0009616466536353474},{"omegaRadPerYr":-0.00011593914172939557,"re":7.926785905418971e-8,"im":-4.6685992002385664e-8}]},"planetZeta":{"mercury":[{"omegaRadPerYr":-0.000027070318959890106,"re":0.03509799360084889,"im":0.012514361334229175},{"omegaRadPerYr":-0.000034136904111019706,"re":0.02695969560580955,"im":-0.02182848736661456},{"omegaRadPerYr":-0.000034710315380555884,"re":-0.012559168496773116,"im":0.008299078079729882},{"omegaRadPerYr":-0.00002646765287895232,"re":0.015448524016084493,"im":0.005987672372630069},{"omegaRadPerYr":-0.00003340798156431758,"re":-0.006455019023356067,"im":0.006226120154816196},{"omegaRadPerYr":5.384799590336571e-11,"re":-0.0039804878272654606,"im":0.013070100663895403},{"omegaRadPerYr":-0.000032847026422583094,"re":-0.0057003023891457685,"im":0.005259105004808747},{"omegaRadPerYr":-0.00003594792939956603,"re":-0.0012961241060881503,"im":0.0016159947697806383},{"omegaRadPerYr":-0.000025076126902622893,"re":0.0009463621131951934,"im":0.004877886245061111},{"omegaRadPerYr":-0.00003524962055187364,"re":0.0036108114629212922,"im":-0.004623693257308201},{"omegaRadPerYr":-0.000024475658963257535,"re":0.000022935888716433717,"im":-0.004353014017229704},{"omegaRadPerYr":-0.00003379278995294136,"re":-0.007806785352862373,"im":0.004006431979329447},{"omegaRadPerYr":-0.00003218755893963215,"re":-0.003704818024406685,"im":0.0011960062285103251},{"omegaRadPerYr":-0.000028313967733473683,"re":-0.007360063597313632,"im":-0.002796682485956438},{"omegaRadPerYr":-0.000027441506455909732,"re":0.005714284626147598,"im":-0.00031320953109534994},{"omegaRadPerYr":-0.000025718824169110346,"re":-0.00022772395090882533,"im":-0.00196911848110608}],"venus":[{"omegaRadPerYr":-1.6493179814802074e-12,"re":-0.0041316378307605294,"im":0.013147230899595441},{"omegaRadPerYr":-0.00009139039449248062,"re":0.004107318311959544,"im":0.008097727638340723},{"omegaRadPerYr":-0.000027077829093903624,"re":0.005723184464233101,"im":0.002103989760517981},{"omegaRadPerYr":-0.0000860809730098796,"re":-0.0017575781212555862,"im":0.005497182235759365},{"omegaRadPerYr":-0.00003414333446857137,"re":-0.0036683665695228925,"im":0.0029729549111848722},{"omegaRadPerYr":-0.0000887389845132903,"re":0.00017437292720263114,"im":0.002839346558623874},{"omegaRadPerYr":-0.00003332402755350087,"re":0.0008226456090349229,"im":-0.000990196523458664},{"omegaRadPerYr":-0.00003470699633273722,"re":0.0013981977987789472,"im":-0.0010036696718058783},{"omegaRadPerYr":-0.00002647213755615405,"re":0.002192723581813546,"im":0.0008156688371823413},{"omegaRadPerYr":-0.00009404722529229626,"re":-0.001310202146639285,"im":-0.0011534120915617934},{"omegaRadPerYr":-0.00003276165702381588,"re":0.0005497404769706646,"im":-0.0007663000693998108},{"omegaRadPerYr":-0.00009269906010008638,"re":0.000774314512799505,"im":-0.0004388675219967948},{"omegaRadPerYr":-0.00003375443573456643,"re":0.0014500491408612449,"im":-0.0008824349886108636},{"omegaRadPerYr":-0.000014507610514643914,"re":-0.0007092452594379532,"im":0.000644027430133631},{"omegaRadPerYr":-0.00002829966619518156,"re":-0.0015021530175610535,"im":-0.0005258063199032051},{"omegaRadPerYr":-0.00003214220556483202,"re":0.0006661181436053425,"im":-0.0002653316593905635}],"mars":[{"omegaRadPerYr":-0.00008608117781327729,"re":0.01021076871109231,"im":-0.03356452939087538},{"omegaRadPerYr":-0.00009138911102981668,"re":0.006448673929855857,"im":0.013039152420792278},{"omegaRadPerYr":4.816071417209985e-13,"re":-0.004136702437859971,"im":0.013131620521733377},{"omegaRadPerYr":-0.00008873924259238756,"re":0.000719141598532243,"im":0.006332417454417071},{"omegaRadPerYr":-0.00008342553512204505,"re":-0.003385387773112122,"im":0.004320169865314299},{"omegaRadPerYr":-0.00012773796958870522,"re":-0.002768952254262225,"im":0.0036533714419055593},{"omegaRadPerYr":-0.00008732462124121245,"re":0.002315330060230354,"im":0.00021373005960354581},{"omegaRadPerYr":-0.00008533729428600537,"re":0.0000662084835502976,"im":0.0014041635383156973},{"omegaRadPerYr":-0.0000927013779034122,"re":0.0012004630656653568,"im":-0.0007842461095443991},{"omegaRadPerYr":-0.00008675666306804544,"re":0.0007084511153542455,"im":-0.0008188292363296188},{"omegaRadPerYr":-0.00008568093272163965,"re":-0.0022269947606386804,"im":-0.0002915189256492408},{"omegaRadPerYr":-0.0000920127905544982,"re":-0.00012713738691022227,"im":0.0011838067237884178},{"omegaRadPerYr":-0.00008937418687447559,"re":-0.0002755627620382867,"im":0.0007026683188238479},{"omegaRadPerYr":-0.00002707848026399503,"re":0.0008884002528900317,"im":0.00034005750138313076},{"omegaRadPerYr":-0.00009092889696047022,"re":-0.00043281332848104276,"im":0.0003922132913606256},{"omegaRadPerYr":-0.00009004802546465118,"re":0.0008966966123701487,"im":-0.0005174229841345629}],"jupiter":[{"omegaRadPerYr":3.8532251623886294e-13,"re":-0.0041611376264940984,"im":0.013131043712311021},{"omegaRadPerYr":-0.0001277379845918518,"re":0.0019098261437600508,"im":-0.002505661007425496},{"omegaRadPerYr":-0.000003353110004279269,"re":0.0005277820779376669,"im":0.000232885172945674},{"omegaRadPerYr":-0.000014507601866590341,"re":-0.0003702089817814631,"im":0.00030787406163905093},{"omegaRadPerYr":-0.00013080293768331143,"re":-0.000017471248168841094,"im":-0.00001634692544524867},{"omegaRadPerYr":-0.000011442276716160314,"re":0.000012459821928796665,"im":0.00001269474660145274},{"omegaRadPerYr":0.0004016105340997148,"re":0.000008813036156379482,"im":-0.00001120905836048329},{"omegaRadPerYr":-0.00000882703119796523,"re":0.000007828457504338726,"im":0.000007811495266844502},{"omegaRadPerYr":-0.00002707681546885972,"re":-0.000009044718068424064,"im":-0.0000033400395822585094},{"omegaRadPerYr":-0.0000201768700641032,"re":0.000006156498033523465,"im":0.00000751705596830829},{"omegaRadPerYr":0.0002853150225305461,"re":0.000007292599938644516,"im":0.0000043773896212603925},{"omegaRadPerYr":-0.0002440335075107546,"re":0.000006274454282046377,"im":0.0000036485466831589452},{"omegaRadPerYr":0.00016901949668819092,"re":-0.000002519428503521004,"im":0.000005678550409035692},{"omegaRadPerYr":-0.0000027587103410433805,"re":0.000005899853582363865,"im":8.409148783838858e-7},{"omegaRadPerYr":-0.000034144381407487655,"re":0.000004719652715449978,"im":-0.0000037247689900126893},{"omegaRadPerYr":-0.00013340793710151563,"re":0.0000036153371332643194,"im":0.0000026473096931137383}],"saturn":[{"omegaRadPerYr":3.404546335777438e-13,"re":-0.004160815341357166,"im":0.01313037085706424},{"omegaRadPerYr":-0.0001277379845708044,"re":-0.004757531229884148,"im":0.0062418570697877025},{"omegaRadPerYr":-0.000003353103939425025,"re":0.0005082525979425591,"im":0.0002243582817470411},{"omegaRadPerYr":-0.000014507604683407504,"re":-0.0003003418401293427,"im":0.0002498658928695802},{"omegaRadPerYr":-0.00013080297316369022,"re":0.00004462521372870775,"im":0.00004172396328086738},{"omegaRadPerYr":0.0004016105342059343,"re":-0.000021890424766638027,"im":0.00002784479607678065},{"omegaRadPerYr":0.00028531501227593826,"re":-0.000016971705234483944,"im":-0.000010207779625167536},{"omegaRadPerYr":0.00016901949653661777,"re":0.000006353117499272568,"im":-0.000014464465864357296},{"omegaRadPerYr":-0.00002707712299185719,"re":-0.000011819853659803773,"im":-0.000004343694032290057},{"omegaRadPerYr":-0.00008608110335393078,"re":-0.0000038556316501964585,"im":0.000012260170759195859},{"omegaRadPerYr":-0.00013340770427701983,"re":-0.000008291647540272973,"im":-0.0000060449324319747485},{"omegaRadPerYr":-0.00012206708504485138,"re":-0.000007846468613598666,"im":-0.000006177485716796176},{"omegaRadPerYr":-0.000008827506775295263,"re":0.000006912239479621683,"im":0.0000070997530164759055},{"omegaRadPerYr":-0.00024403351156152198,"re":-0.000006770600853713768,"im":-0.000003936350447344142},{"omegaRadPerYr":-0.0009675113430843807,"re":-0.000004521653063656594,"im":-0.000006119593231226156},{"omegaRadPerYr":-0.000034143979713964837,"re":0.000006837682774689789,"im":-0.000005331591672335383}],"uranus":[{"omegaRadPerYr":1.609741252182826e-12,"re":-0.004160857683169045,"im":0.01312987468744944},{"omegaRadPerYr":-0.000014507581339335488,"re":0.006819771098312077,"im":-0.005674555448618447},{"omegaRadPerYr":-0.0000033533175354118582,"re":-0.0005101607663847248,"im":-0.00022431030942694354},{"omegaRadPerYr":-0.00012773798595007094,"re":0.00021390993605577627,"im":-0.00028068024741796866},{"omegaRadPerYr":-0.000011442390269999423,"re":-0.00021565535141600253,"im":-0.0002150430588126844},{"omegaRadPerYr":-0.000020175380767861024,"re":-0.00012178417740316124,"im":-0.0001456136848907788},{"omegaRadPerYr":-0.00000883157541584528,"re":-0.00012271282922940013,"im":-0.0001340577820362881},{"omegaRadPerYr":-0.000015103884918843288,"re":-0.00005803301762598432,"im":0.000026178909117342292},{"omegaRadPerYr":-0.000005772310491116802,"re":0.000018629424113074064,"im":-0.000018786863001070623},{"omegaRadPerYr":0.000055789019292025894,"re":-0.000003583719865681113,"im":0.00001877185158848246},{"omegaRadPerYr":0.00005011887511064967,"re":0.000011951449395631811,"im":0.000002279724016800827},{"omegaRadPerYr":-0.000027076655469348425,"re":0.000008609833687019483,"im":0.0000039638140159356984},{"omegaRadPerYr":-0.00013080298640432038,"re":-0.000007760607234183951,"im":-0.000007178734351197981},{"omegaRadPerYr":-0.000009192811893081681,"re":-0.000006996875336880973,"im":0.000009870536991923898},{"omegaRadPerYr":-0.000014175491386338482,"re":-0.00001270447511881092,"im":0.000007778091287202746},{"omegaRadPerYr":0.00010178796581047778,"re":-0.000004042702368549757,"im":-0.000006403994609904075}],"neptune":[{"omegaRadPerYr":-5.309966632404278e-12,"re":-0.004159721990836072,"im":0.013130987686676325},{"omegaRadPerYr":-0.000003353098139366354,"re":-0.005314734202759442,"im":-0.0023457634229809878},{"omegaRadPerYr":-0.000014507473764320118,"re":-0.0008167253455895104,"im":0.000679803323619701},{"omegaRadPerYr":-0.00001144267951307936,"re":0.00004103714819598339,"im":0.00004000434297961395},{"omegaRadPerYr":-0.0000027576446795887367,"re":-0.00006149846188777267,"im":-0.000008691440917605258},{"omegaRadPerYr":-0.000127737982036136,"re":0.000022941259364012485,"im":-0.000030013884419629694},{"omegaRadPerYr":-0.00002017340325592398,"re":0.00001785684479351327,"im":0.000021295006716797693},{"omegaRadPerYr":-0.000008980453563447026,"re":-0.0000018701512064522262,"im":0.000017342410863083055},{"omegaRadPerYr":0.0000022940676061081706,"re":-0.000008135256823034523,"im":0.0000159660700897465},{"omegaRadPerYr":-0.000005773430993827179,"re":-0.000010150670472290044,"im":0.000012347455189860531},{"omegaRadPerYr":-0.0000036886914876550886,"re":-0.000013289694939214323,"im":-0.000004967461981751487},{"omegaRadPerYr":-0.000015103364422159208,"re":0.000008447715112089554,"im":-0.0000038128138702162122},{"omegaRadPerYr":0.0000029055921239641946,"re":1.0991164784154305e-8,"im":-0.00000667040982519229},{"omegaRadPerYr":0.000050117959348442586,"re":-0.000005129825896938048,"im":-0.0000010095666431561402},{"omegaRadPerYr":0.0000389783728602118,"re":-0.000002068034832737985,"im":0.000002775618631657745}]},"anchorE":0.016702435651957018,"anchorPeriEclipticDeg":462.9179213996577,"anchorInclEclipticDeg":0.00010345820355474172,"anchorAscNodeEclipticDeg":140.29217988414328,"anchorZDotPerYr":[-8.21997e-7,-6.231489999999999e-7],"slopeTaperYears":27943.083333333332});
21
+ const DEEP_MODES_ARTIFACT = Object.freeze({"meta":{"integrator":"wh","order":2,"dtDays":2,"spanYears":20000000,"sampleDays":20000,"gr":true,"seed":"JPL Horizons J2000 heliocentric state vectors (tools/explore/j2000-state.mjs, the one home)","masses":"DE440 mass ratios (astro-reference physicalConstants)","runCommand":"node tools/explore/lattice-long-window-test.mjs years=20000000 integrator=wh dt=2 order=2 gr=1 frame=both sample=20000 lunar=1 asteroids=1","physics":{"lunarQuadrupole":{"qTilde":0.012002947703527635,"aEmKm":384399.07,"effectiveFactor":0.8537,"provenance":"calibrated against the real-Moon RK4 triple (apsidal-fidelity-sweep RM/RQ)"},"asteroids":{"ceres":62.6284,"pallas":13.63,"vesta":17.28828}},"dumpFile":"tools/explore/lattice-long-window-ecliptic-20000000-gr.local.json (untracked, 337 MB)","dumpSha256":"686d6af51a689f7bd64ac1e2d8b26c243a4beccdacd3167adfeeae078e8b990f","conservationMaxDE":1.2738960401328902e-8,"decimation":4,"naffTerms":18,"naffZetaTerms":16,"naffZetaTermsEra":8,"frame":"ecliptic-J2000 (z-modes for the lunar-chain e; ζ-modes for the Stage-C obliquity hybrid — the invariable-frame ζ table remains unbanked, no consumer)","laskarRef":"Laskar, J. et al. (2004), A&A 428, 261–285, Table 3, as tabulated beside La2010a in Laskar et al. (2011), A&A 532, A89, Table 6 (theory reference labels)"},"verdict":{"strongestBeatPeriodKyr":405.625567477903,"strongestBeatArcsecPerYr":3.195064867479295,"la2004BeatPeriodKyr":405.6972922210049,"rockMetronomeKyr":405.6,"companion124Kyr":123.84617993487997,"companion95Kyr":94.87791796545507,"earthLeadingModesArcsecPerYr":[4.257358971029763,7.452423838509057,17.917017907389138,17.368946405872247],"topBeatLines":[{"periodKyr":405.625567477903,"productAmp":0.0003123310080848341},{"periodKyr":94.87791796545507,"productAmp":0.00024338439758855827},{"periodKyr":123.84617993487997,"productAmp":0.00020980875877847502},{"periodKyr":98.84386665157218,"productAmp":0.00016694824937892253},{"periodKyr":130.6909747037068,"productAmp":0.00014391721626151482},{"periodKyr":2364.6549700414625,"productAmp":0.00011214770251987629},{"periodKyr":972.3103697584877,"productAmp":0.00007218142389142678},{"periodKyr":695.9670418382926,"productAmp":0.00006222377072471454}],"note":"g5 matches La2004 to 0.0001 ″/yr and g2 (7.4524) to 0.0004 ″/yr (La2004 7.452, La2010a 7.453) — the point-mass run read 7.4230 (EMB merged, no asteroids; the pre-lunar dump), 0.029 ″/yr low; the lunar quadrupole + asteroids this run carries supply 0.0294 ″/yr (the lab’s asteroid effect on Earth is null, so it is the Moon) and close that gap — doc 109 §17."},"earthZ":[{"omegaRadPerYr":0.000020640258745496456,"re":0.01640837548946667,"im":0.00964771830356857},{"omegaRadPerYr":0.00003613037034336034,"re":-0.015519645105303494,"im":-0.005327718511512781},{"omegaRadPerYr":0.00008686415406186803,"re":-0.011108307303646387,"im":0.0063324002417276355},{"omegaRadPerYr":0.00008420702844025169,"re":0.005504442820656899,"im":-0.006828487155118338},{"omegaRadPerYr":0.000027102377738159537,"re":0.0005990602912422896,"im":0.0037445139104202996},{"omegaRadPerYr":0.00008284690006982035,"re":0.002385900412412394,"im":0.0008687520930649916},{"omegaRadPerYr":0.00008551634076169395,"re":0.0012667960543480752,"im":0.001284547912075711},{"omegaRadPerYr":0.00008156882804453768,"re":-0.0003413759390549155,"im":0.0016823570425905205},{"omegaRadPerYr":0.000033456117700854,"re":-0.0012412588643094782,"im":0.0009318258971565654},{"omegaRadPerYr":0.00013693625799603712,"re":-0.0009261214276803977,"im":0.0011910509606790575},{"omegaRadPerYr":0.00008736463294475958,"re":0.0013199280789047622,"im":0.0009530586967429039},{"omegaRadPerYr":0.00008630679999141721,"re":-0.00038871245410104777,"im":0.0009912036911146165},{"omegaRadPerYr":0.000026453632677170472,"re":-0.00032615534646350156,"im":-0.0018102501817831135},{"omegaRadPerYr":0.000034145978925786535,"re":0.0009480778866315119,"im":-0.0008230502200947101},{"omegaRadPerYr":0.00003548085475024487,"re":-0.0013007947815593653,"im":-0.00042439393044846465},{"omegaRadPerYr":0.00008951127418467436,"re":-0.0010559339979945592,"im":-0.000005975184481501219},{"omegaRadPerYr":0.00008814769888639652,"re":-0.0003392982459796931,"im":-0.00126615007571311},{"omegaRadPerYr":0.000027692559180942054,"re":0.0004455147622140075,"im":0.0013147856084997915}],"earthZeta":[{"omegaRadPerYr":-6.480692835562015e-14,"re":-0.004134427250631887,"im":0.013144207689667023},{"omegaRadPerYr":-0.00009139020514696892,"re":-0.003762846299946732,"im":-0.007417313993526907},{"omegaRadPerYr":-0.00002707802193107254,"re":0.004228758817782956,"im":0.001552899971393225},{"omegaRadPerYr":-0.00008608086641122392,"re":0.0012161313006493822,"im":-0.0038454411181687697},{"omegaRadPerYr":-0.00003414305478233622,"re":-0.0030829972319892183,"im":0.002522672469285971},{"omegaRadPerYr":-0.00008873899569559657,"re":-0.00020769480131372744,"im":-0.0026850953462850356},{"omegaRadPerYr":-0.00003333897395226539,"re":0.0006468387853619108,"im":-0.0008212555187612507},{"omegaRadPerYr":-0.000034707554013716744,"re":0.0012115602030611985,"im":-0.0008603813396121053},{"omegaRadPerYr":-0.00009404694793046069,"re":0.001124843496312146,"im":0.0009724617908785189},{"omegaRadPerYr":-0.00002647193861971907,"re":0.001606075294689031,"im":0.0005931944911952478},{"omegaRadPerYr":-0.00003277702706161178,"re":0.0005051745779261483,"im":-0.0006705412769950699},{"omegaRadPerYr":-0.00012773805775388969,"re":-0.0008122347824469044,"im":0.0010593881606687687},{"omegaRadPerYr":-0.00009269956713813446,"re":-0.0006909282558950976,"im":0.0004135096481099148},{"omegaRadPerYr":-0.000014507597324441827,"re":-0.0006470785128404058,"im":0.00057746649029071},{"omegaRadPerYr":-0.000033761896788929335,"re":0.001157822428032179,"im":-0.000690971407290411},{"omegaRadPerYr":-0.000028297573329000286,"re":-0.0011184968821771682,"im":-0.0003885179122647609}],"earthZetaEra":[{"omegaRadPerYr":-6.480692835562015e-14,"re":-0.004136170228858843,"im":0.013147349898750587},{"omegaRadPerYr":-0.00009139020514696892,"re":-0.0037451120264298888,"im":-0.007367103224447289},{"omegaRadPerYr":-0.00002707802193107254,"re":0.004192460536906565,"im":0.0015465498581850507},{"omegaRadPerYr":-0.00008608086641122392,"re":0.0012039767467140353,"im":-0.0038572667358382287},{"omegaRadPerYr":-0.00003414305478233622,"re":-0.0032014533879969596,"im":0.0025701217059533803},{"omegaRadPerYr":-0.00008873899569559657,"re":-0.00021856508120855303,"im":-0.002669820778092242},{"omegaRadPerYr":-0.00003333897395226539,"re":0.0003478573166468341,"im":-0.0006130210720886913},{"omegaRadPerYr":-0.000034707554013716744,"re":0.0012188003710118757,"im":-0.000879354385952938}],"planetLeadingZetaArcsecPerYr":{"mercury":-5.583654095308831,"venus":-18.85062201283722,"earth":-18.850582957521933,"mars":-17.75551746317749,"jupiter":-26.34785064223289,"saturn":-26.34785063789155,"uranus":-2.992403454072025,"neptune":-0.6916261380439003},"planetZ":{"mercury":[{"omegaRadPerYr":0.000027101464787379005,"re":0.036443059874745144,"im":0.15312012416846857},{"omegaRadPerYr":0.00002645682320158395,"re":-0.014115236278813163,"im":-0.07933183704397909},{"omegaRadPerYr":0.000027695768774324655,"re":0.014883065162550294,"im":0.04770421699238349},{"omegaRadPerYr":0.000020608825679123343,"re":0.0339424735092415,"im":0.0205886131133393},{"omegaRadPerYr":0.00003613198806683821,"re":0.026373724217244415,"im":0.007998632845938181},{"omegaRadPerYr":0.000025943085765069145,"re":-0.00008287402030671245,"im":0.01382534867142278},{"omegaRadPerYr":0.000021259366308985905,"re":-0.010921101889740678,"im":-0.005391042758241112},{"omegaRadPerYr":0.000033442897144222473,"re":-0.006298873452719107,"im":0.004846731368887027},{"omegaRadPerYr":0.000027342847424225136,"re":-0.031441801079617394,"im":-0.0012828182325896284},{"omegaRadPerYr":0.000026863603353307064,"re":-0.0023658597755055214,"im":0.03845436133115692},{"omegaRadPerYr":0.000029077390952304336,"re":-0.0056672065762804385,"im":0.008668504999729803},{"omegaRadPerYr":0.000025324686199132127,"re":-0.005942232736715857,"im":-0.012274661661212959},{"omegaRadPerYr":0.00002979754974875923,"re":0.0008097924308674098,"im":-0.0064472013829302505},{"omegaRadPerYr":0.000019992412184743173,"re":0.012472217201012077,"im":0.00359833652112381},{"omegaRadPerYr":0.00002454697962536287,"re":0.0020556509667169235,"im":0.0009916346793612978},{"omegaRadPerYr":0.00002812715748715012,"re":-0.002051758629227311,"im":-0.0033287955771129805},{"omegaRadPerYr":0.000019449369227596397,"re":-0.0038021090567115627,"im":-0.0028426209995905025}],"venus":[{"omegaRadPerYr":0.00003613032718771122,"re":-0.020105324941805183,"im":-0.006917696377202324},{"omegaRadPerYr":0.000020639950705137238,"re":0.017068955357371025,"im":0.010006500628836495},{"omegaRadPerYr":0.00008686450325171618,"re":0.011426811376444728,"im":-0.006520605414974846},{"omegaRadPerYr":0.00008420762005329659,"re":-0.006892443369184228,"im":0.008472548929406779},{"omegaRadPerYr":0.000027101843398089462,"re":0.0009492363872320767,"im":0.005898626241129876},{"omegaRadPerYr":0.00008284929259321451,"re":-0.0030327325912061806,"im":-0.0010976776908548803},{"omegaRadPerYr":0.00008156590133143486,"re":0.0004654494107565469,"im":-0.002280587631810283},{"omegaRadPerYr":0.00003345630943302872,"re":-0.0017828402597892042,"im":0.0012954758789217673},{"omegaRadPerYr":0.00008551538095828359,"re":-0.0011609215700463195,"im":-0.0012677518151850962},{"omegaRadPerYr":0.00002645314323665865,"re":-0.0005187468879242992,"im":-0.0028561425016264542},{"omegaRadPerYr":0.000034145633629733906,"re":0.0012933573208605794,"im":-0.001139818586425855},{"omegaRadPerYr":0.00002769519215699273,"re":0.000692247567326856,"im":0.0020562801187020375},{"omegaRadPerYr":0.00003548134649993586,"re":-0.0017504367473210652,"im":-0.0005759353131695786},{"omegaRadPerYr":0.00008736396981192052,"re":-0.0013474628838071549,"im":-0.000992885318268049},{"omegaRadPerYr":0.00008630854715331631,"re":0.0003763610849158857,"im":-0.0010611470059873186},{"omegaRadPerYr":0.00003678579378710168,"re":0.0015965344500683718,"im":0.0003260227593096117},{"omegaRadPerYr":0.00008814539612129297,"re":0.00043027029421162,"im":0.0012698103607611786},{"omegaRadPerYr":0.00009215946508724939,"re":-0.0008157163462856423,"im":-0.0001752965015353975}],"mars":[{"omegaRadPerYr":0.00008686194427246272,"re":0.04150468181977603,"im":-0.02235805720891878},{"omegaRadPerYr":0.00008420997062723613,"re":0.024191159406394575,"im":-0.02897798440552211},{"omegaRadPerYr":0.000020640675066908026,"re":0.01752920390659033,"im":0.010379054381833624},{"omegaRadPerYr":0.00008155902048560256,"re":-0.005126487019269018,"im":0.017498780322239615},{"omegaRadPerYr":0.00008951470797098792,"re":0.012453460704855819,"im":-0.0011162639997386022},{"omegaRadPerYr":0.00008286071984936754,"re":0.012151786749976757,"im":0.005285572685028835},{"omegaRadPerYr":0.00008552376356754678,"re":-0.008207026797923043,"im":-0.006506174683766466},{"omegaRadPerYr":0.00013693612216296713,"re":-0.004303426290032767,"im":0.005495751915005897},{"omegaRadPerYr":0.0000863140674359666,"re":0.003378196925346155,"im":-0.0035707297870487854},{"omegaRadPerYr":0.00009216418711866517,"re":0.004180141329638833,"im":0.001239878529646219},{"omegaRadPerYr":0.00008815294634884687,"re":0.0015478422945863473,"im":0.005394318221250823},{"omegaRadPerYr":0.00008737006869414014,"re":-0.004859264335556832,"im":-0.002468706141182086},{"omegaRadPerYr":0.00008474936320624016,"re":-0.0037175110079883836,"im":0.0005712305102614905},{"omegaRadPerYr":0.00003613060911836741,"re":-0.002878165082426005,"im":-0.0009813871463689},{"omegaRadPerYr":0.00008323445042360793,"re":-0.0021030674464516,"im":0.002382835034113347},{"omegaRadPerYr":0.00008591714206468895,"re":0.00033705398396163035,"im":-0.0031641077910174956},{"omegaRadPerYr":0.00008022543440532314,"re":0.0014077256319658448,"im":0.00023992196561432362},{"omegaRadPerYr":0.0000900335871717643,"re":-0.0007652388036231974,"im":-0.0015581764537776826}],"jupiter":[{"omegaRadPerYr":0.00002064075395335189,"re":0.038028034576741906,"im":0.022474419029067216},{"omegaRadPerYr":0.00013693627466777967,"re":0.009616177715621049,"im":-0.012410735192913122},{"omegaRadPerYr":0.000014970699552264387,"re":-0.0009276176888746422,"im":0.0015645820896462246},{"omegaRadPerYr":0.00025323179539978545,"re":0.0004059157737100984,"im":0.00040456376985595945},{"omegaRadPerYr":0.0001312662749926737,"re":-0.00015614354905163857,"im":-0.00012183629827031596},{"omegaRadPerYr":0.0001426061431474546,"re":-0.00015326196073912603,"im":-0.00011811188348776635},{"omegaRadPerYr":0.00014000309579914057,"re":0.00010317940519689781,"im":0.00006505029768233116},{"omegaRadPerYr":0.00013386863466366606,"re":0.00007960628300069755,"im":0.0000757581826985722},{"omegaRadPerYr":0.0012496810113814863,"re":3.5498901583457483e-9,"im":7.528217439557287e-9}],"saturn":[{"omegaRadPerYr":0.00013693627469533272,"re":-0.02951381641782599,"im":0.038116342187048506},{"omegaRadPerYr":0.000020640753964721574,"re":0.028361784183640975,"im":0.016761738089661193},{"omegaRadPerYr":0.0002532317954411971,"re":-0.0013588658390314074,"im":-0.0013542513704600167},{"omegaRadPerYr":0.000014970698207898392,"re":-0.0007732461228524056,"im":0.0013033726384504506},{"omegaRadPerYr":0.00013126626734545323,"re":0.000471597345592877,"im":0.0003662972802790016},{"omegaRadPerYr":0.00014260613959102947,"re":0.00046558535071819594,"im":0.0003604428232502375},{"omegaRadPerYr":0.0012496810120112478,"re":-2.2413816213183782e-8,"im":-4.3761227707856587e-8}],"uranus":[{"omegaRadPerYr":0.000020640753931894893,"re":-0.03238248798724911,"im":-0.019137541918709554},{"omegaRadPerYr":0.00001497070511159062,"re":-0.014798949407797135,"im":0.024975442503237483},{"omegaRadPerYr":0.000003264464996922227,"re":0.00045075801975650074,"im":0.0016050091168723338},{"omegaRadPerYr":0.00013693627457864556,"re":0.0009471352229324553,"im":-0.0012234989208774374},{"omegaRadPerYr":0.00000929092310040761,"re":-0.0004015633445553787,"im":-0.0002340983045129561},{"omegaRadPerYr":0.00002631265778975313,"re":0.00022664443272842668,"im":-0.0003767093309339966},{"omegaRadPerYr":0.000014377069742263513,"re":0.00005819778777828242,"im":-0.00005910629719132463},{"omegaRadPerYr":0.000630109378889249,"re":-1.1513321171782036e-7,"im":2.121111820496366e-7}],"neptune":[{"omegaRadPerYr":0.000003264141494649585,"re":0.0024665853980857314,"im":0.008775596228059238},{"omegaRadPerYr":0.000014970655663003607,"re":0.0018888606403837439,"im":-0.0031894015693886913},{"omegaRadPerYr":0.00002064075339053921,"re":0.001629524897365034,"im":0.0009616466536353474},{"omegaRadPerYr":-0.00011593914172939557,"re":7.926785905418971e-8,"im":-4.6685992002385664e-8}]},"planetZeta":{"mercury":[{"omegaRadPerYr":-0.000027070318959890106,"re":0.03509799360084889,"im":0.012514361334229175},{"omegaRadPerYr":-0.000034136904111019706,"re":0.02695969560580955,"im":-0.02182848736661456},{"omegaRadPerYr":-0.000034710315380555884,"re":-0.012559168496773116,"im":0.008299078079729882},{"omegaRadPerYr":-0.00002646765287895232,"re":0.015448524016084493,"im":0.005987672372630069},{"omegaRadPerYr":-0.00003340798156431758,"re":-0.006455019023356067,"im":0.006226120154816196},{"omegaRadPerYr":5.384799590336571e-11,"re":-0.0039804878272654606,"im":0.013070100663895403},{"omegaRadPerYr":-0.000032847026422583094,"re":-0.0057003023891457685,"im":0.005259105004808747},{"omegaRadPerYr":-0.00003594792939956603,"re":-0.0012961241060881503,"im":0.0016159947697806383},{"omegaRadPerYr":-0.000025076126902622893,"re":0.0009463621131951934,"im":0.004877886245061111},{"omegaRadPerYr":-0.00003524962055187364,"re":0.0036108114629212922,"im":-0.004623693257308201},{"omegaRadPerYr":-0.000024475658963257535,"re":0.000022935888716433717,"im":-0.004353014017229704},{"omegaRadPerYr":-0.00003379278995294136,"re":-0.007806785352862373,"im":0.004006431979329447},{"omegaRadPerYr":-0.00003218755893963215,"re":-0.003704818024406685,"im":0.0011960062285103251},{"omegaRadPerYr":-0.000028313967733473683,"re":-0.007360063597313632,"im":-0.002796682485956438},{"omegaRadPerYr":-0.000027441506455909732,"re":0.005714284626147598,"im":-0.00031320953109534994},{"omegaRadPerYr":-0.000025718824169110346,"re":-0.00022772395090882533,"im":-0.00196911848110608}],"venus":[{"omegaRadPerYr":-1.6493179814802074e-12,"re":-0.0041316378307605294,"im":0.013147230899595441},{"omegaRadPerYr":-0.00009139039449248062,"re":0.004107318311959544,"im":0.008097727638340723},{"omegaRadPerYr":-0.000027077829093903624,"re":0.005723184464233101,"im":0.002103989760517981},{"omegaRadPerYr":-0.0000860809730098796,"re":-0.0017575781212555862,"im":0.005497182235759365},{"omegaRadPerYr":-0.00003414333446857137,"re":-0.0036683665695228925,"im":0.0029729549111848722},{"omegaRadPerYr":-0.0000887389845132903,"re":0.00017437292720263114,"im":0.002839346558623874},{"omegaRadPerYr":-0.00003332402755350087,"re":0.0008226456090349229,"im":-0.000990196523458664},{"omegaRadPerYr":-0.00003470699633273722,"re":0.0013981977987789472,"im":-0.0010036696718058783},{"omegaRadPerYr":-0.00002647213755615405,"re":0.002192723581813546,"im":0.0008156688371823413},{"omegaRadPerYr":-0.00009404722529229626,"re":-0.001310202146639285,"im":-0.0011534120915617934},{"omegaRadPerYr":-0.00003276165702381588,"re":0.0005497404769706646,"im":-0.0007663000693998108},{"omegaRadPerYr":-0.00009269906010008638,"re":0.000774314512799505,"im":-0.0004388675219967948},{"omegaRadPerYr":-0.00003375443573456643,"re":0.0014500491408612449,"im":-0.0008824349886108636},{"omegaRadPerYr":-0.000014507610514643914,"re":-0.0007092452594379532,"im":0.000644027430133631},{"omegaRadPerYr":-0.00002829966619518156,"re":-0.0015021530175610535,"im":-0.0005258063199032051},{"omegaRadPerYr":-0.00003214220556483202,"re":0.0006661181436053425,"im":-0.0002653316593905635}],"mars":[{"omegaRadPerYr":-0.00008608117781327729,"re":0.01021076871109231,"im":-0.03356452939087538},{"omegaRadPerYr":-0.00009138911102981668,"re":0.006448673929855857,"im":0.013039152420792278},{"omegaRadPerYr":4.816071417209985e-13,"re":-0.004136702437859971,"im":0.013131620521733377},{"omegaRadPerYr":-0.00008873924259238756,"re":0.000719141598532243,"im":0.006332417454417071},{"omegaRadPerYr":-0.00008342553512204505,"re":-0.003385387773112122,"im":0.004320169865314299},{"omegaRadPerYr":-0.00012773796958870522,"re":-0.002768952254262225,"im":0.0036533714419055593},{"omegaRadPerYr":-0.00008732462124121245,"re":0.002315330060230354,"im":0.00021373005960354581},{"omegaRadPerYr":-0.00008533729428600537,"re":0.0000662084835502976,"im":0.0014041635383156973},{"omegaRadPerYr":-0.0000927013779034122,"re":0.0012004630656653568,"im":-0.0007842461095443991},{"omegaRadPerYr":-0.00008675666306804544,"re":0.0007084511153542455,"im":-0.0008188292363296188},{"omegaRadPerYr":-0.00008568093272163965,"re":-0.0022269947606386804,"im":-0.0002915189256492408},{"omegaRadPerYr":-0.0000920127905544982,"re":-0.00012713738691022227,"im":0.0011838067237884178},{"omegaRadPerYr":-0.00008937418687447559,"re":-0.0002755627620382867,"im":0.0007026683188238479},{"omegaRadPerYr":-0.00002707848026399503,"re":0.0008884002528900317,"im":0.00034005750138313076},{"omegaRadPerYr":-0.00009092889696047022,"re":-0.00043281332848104276,"im":0.0003922132913606256},{"omegaRadPerYr":-0.00009004802546465118,"re":0.0008966966123701487,"im":-0.0005174229841345629}],"jupiter":[{"omegaRadPerYr":3.8532251623886294e-13,"re":-0.0041611376264940984,"im":0.013131043712311021},{"omegaRadPerYr":-0.0001277379845918518,"re":0.0019098261437600508,"im":-0.002505661007425496},{"omegaRadPerYr":-0.000003353110004279269,"re":0.0005277820779376669,"im":0.000232885172945674},{"omegaRadPerYr":-0.000014507601866590341,"re":-0.0003702089817814631,"im":0.00030787406163905093},{"omegaRadPerYr":-0.00013080293768331143,"re":-0.000017471248168841094,"im":-0.00001634692544524867},{"omegaRadPerYr":-0.000011442276716160314,"re":0.000012459821928796665,"im":0.00001269474660145274},{"omegaRadPerYr":0.0004016105340997148,"re":0.000008813036156379482,"im":-0.00001120905836048329},{"omegaRadPerYr":-0.00000882703119796523,"re":0.000007828457504338726,"im":0.000007811495266844502},{"omegaRadPerYr":-0.00002707681546885972,"re":-0.000009044718068424064,"im":-0.0000033400395822585094},{"omegaRadPerYr":-0.0000201768700641032,"re":0.000006156498033523465,"im":0.00000751705596830829},{"omegaRadPerYr":0.0002853150225305461,"re":0.000007292599938644516,"im":0.0000043773896212603925},{"omegaRadPerYr":-0.0002440335075107546,"re":0.000006274454282046377,"im":0.0000036485466831589452},{"omegaRadPerYr":0.00016901949668819092,"re":-0.000002519428503521004,"im":0.000005678550409035692},{"omegaRadPerYr":-0.0000027587103410433805,"re":0.000005899853582363865,"im":8.409148783838858e-7},{"omegaRadPerYr":-0.000034144381407487655,"re":0.000004719652715449978,"im":-0.0000037247689900126893},{"omegaRadPerYr":-0.00013340793710151563,"re":0.0000036153371332643194,"im":0.0000026473096931137383}],"saturn":[{"omegaRadPerYr":3.404546335777438e-13,"re":-0.004160815341357166,"im":0.01313037085706424},{"omegaRadPerYr":-0.0001277379845708044,"re":-0.004757531229884148,"im":0.0062418570697877025},{"omegaRadPerYr":-0.000003353103939425025,"re":0.0005082525979425591,"im":0.0002243582817470411},{"omegaRadPerYr":-0.000014507604683407504,"re":-0.0003003418401293427,"im":0.0002498658928695802},{"omegaRadPerYr":-0.00013080297316369022,"re":0.00004462521372870775,"im":0.00004172396328086738},{"omegaRadPerYr":0.0004016105342059343,"re":-0.000021890424766638027,"im":0.00002784479607678065},{"omegaRadPerYr":0.00028531501227593826,"re":-0.000016971705234483944,"im":-0.000010207779625167536},{"omegaRadPerYr":0.00016901949653661777,"re":0.000006353117499272568,"im":-0.000014464465864357296},{"omegaRadPerYr":-0.00002707712299185719,"re":-0.000011819853659803773,"im":-0.000004343694032290057},{"omegaRadPerYr":-0.00008608110335393078,"re":-0.0000038556316501964585,"im":0.000012260170759195859},{"omegaRadPerYr":-0.00013340770427701983,"re":-0.000008291647540272973,"im":-0.0000060449324319747485},{"omegaRadPerYr":-0.00012206708504485138,"re":-0.000007846468613598666,"im":-0.000006177485716796176},{"omegaRadPerYr":-0.000008827506775295263,"re":0.000006912239479621683,"im":0.0000070997530164759055},{"omegaRadPerYr":-0.00024403351156152198,"re":-0.000006770600853713768,"im":-0.000003936350447344142},{"omegaRadPerYr":-0.0009675113430843807,"re":-0.000004521653063656594,"im":-0.000006119593231226156},{"omegaRadPerYr":-0.000034143979713964837,"re":0.000006837682774689789,"im":-0.000005331591672335383}],"uranus":[{"omegaRadPerYr":1.609741252182826e-12,"re":-0.004160857683169045,"im":0.01312987468744944},{"omegaRadPerYr":-0.000014507581339335488,"re":0.006819771098312077,"im":-0.005674555448618447},{"omegaRadPerYr":-0.0000033533175354118582,"re":-0.0005101607663847248,"im":-0.00022431030942694354},{"omegaRadPerYr":-0.00012773798595007094,"re":0.00021390993605577627,"im":-0.00028068024741796866},{"omegaRadPerYr":-0.000011442390269999423,"re":-0.00021565535141600253,"im":-0.0002150430588126844},{"omegaRadPerYr":-0.000020175380767861024,"re":-0.00012178417740316124,"im":-0.0001456136848907788},{"omegaRadPerYr":-0.00000883157541584528,"re":-0.00012271282922940013,"im":-0.0001340577820362881},{"omegaRadPerYr":-0.000015103884918843288,"re":-0.00005803301762598432,"im":0.000026178909117342292},{"omegaRadPerYr":-0.000005772310491116802,"re":0.000018629424113074064,"im":-0.000018786863001070623},{"omegaRadPerYr":0.000055789019292025894,"re":-0.000003583719865681113,"im":0.00001877185158848246},{"omegaRadPerYr":0.00005011887511064967,"re":0.000011951449395631811,"im":0.000002279724016800827},{"omegaRadPerYr":-0.000027076655469348425,"re":0.000008609833687019483,"im":0.0000039638140159356984},{"omegaRadPerYr":-0.00013080298640432038,"re":-0.000007760607234183951,"im":-0.000007178734351197981},{"omegaRadPerYr":-0.000009192811893081681,"re":-0.000006996875336880973,"im":0.000009870536991923898},{"omegaRadPerYr":-0.000014175491386338482,"re":-0.00001270447511881092,"im":0.000007778091287202746},{"omegaRadPerYr":0.00010178796581047778,"re":-0.000004042702368549757,"im":-0.000006403994609904075}],"neptune":[{"omegaRadPerYr":-5.309966632404278e-12,"re":-0.004159721990836072,"im":0.013130987686676325},{"omegaRadPerYr":-0.000003353098139366354,"re":-0.005314734202759442,"im":-0.0023457634229809878},{"omegaRadPerYr":-0.000014507473764320118,"re":-0.0008167253455895104,"im":0.000679803323619701},{"omegaRadPerYr":-0.00001144267951307936,"re":0.00004103714819598339,"im":0.00004000434297961395},{"omegaRadPerYr":-0.0000027576446795887367,"re":-0.00006149846188777267,"im":-0.000008691440917605258},{"omegaRadPerYr":-0.000127737982036136,"re":0.000022941259364012485,"im":-0.000030013884419629694},{"omegaRadPerYr":-0.00002017340325592398,"re":0.00001785684479351327,"im":0.000021295006716797693},{"omegaRadPerYr":-0.000008980453563447026,"re":-0.0000018701512064522262,"im":0.000017342410863083055},{"omegaRadPerYr":0.0000022940676061081706,"re":-0.000008135256823034523,"im":0.0000159660700897465},{"omegaRadPerYr":-0.000005773430993827179,"re":-0.000010150670472290044,"im":0.000012347455189860531},{"omegaRadPerYr":-0.0000036886914876550886,"re":-0.000013289694939214323,"im":-0.000004967461981751487},{"omegaRadPerYr":-0.000015103364422159208,"re":0.000008447715112089554,"im":-0.0000038128138702162122},{"omegaRadPerYr":0.0000029055921239641946,"re":1.0991164784154305e-8,"im":-0.00000667040982519229},{"omegaRadPerYr":0.000050117959348442586,"re":-0.000005129825896938048,"im":-0.0000010095666431561402},{"omegaRadPerYr":0.0000389783728602118,"re":-0.000002068034832737985,"im":0.000002775618631657745}]},"anchorE":0.016702435651957018,"anchorPeriEclipticDeg":462.9179213996577,"anchorInclEclipticDeg":0.00010345820355474172,"anchorAscNodeEclipticDeg":140.29217988414328,"anchorZDotPerYr":[-8.21997e-7,-6.231489999999999e-7],"slopeTaperYears":27943.083333333332});
22
22
 
23
23
  module.exports = { DEEP_MODES_ARTIFACT, DEEP_MODES_ARTIFACT_HASH };
@@ -52,6 +52,7 @@
52
52
  * scene's precession rotations integrate on this axis; a fit on it agrees
53
53
  * with the runtime by construction; the round-trip bias Y_SI − Y is −11.0 yr
54
54
  * at −302,635 and grows quadratically).
55
+ * @property {(ySI: number) => number} siYearToJD the exact inverse of jdToSIyear.
55
56
  * @property {(targetCumul: number) => (number | null)} yearAtCumulIntegral
56
57
  * inverse of the phase machinery's cumulAtYear — null outside the table.
57
58
  * @property {() => void} ensureCumulDaysTable builds the ∫ daysPerYear dt table
@@ -103,6 +104,10 @@ function createDeepCalendar({
103
104
  }) {
104
105
  /** @type {(jd: number) => number} */
105
106
  const jdToSIyear = (jd) => startModelYearWithCorrection + (jd - startModelJD) / siTropicalYearDays;
107
+ /** The exact inverse: SI-year label → JD (the Moon layers' argument clock
108
+ * reads the lunar arguments at the JD of the SI year the dispatch passes).
109
+ * @type {(ySI: number) => number} */
110
+ const siYearToJD = (ySI) => startModelJD + (ySI - startModelYearWithCorrection) * siTropicalYearDays;
106
111
 
107
112
  /** @type {(targetCumul: number) => (number | null)} */
108
113
  const yearAtCumulIntegral = (targetCumul) => phase().yearAtCumul(targetCumul);
@@ -191,6 +196,7 @@ function createDeepCalendar({
191
196
 
192
197
  return Object.freeze({
193
198
  jdToSIyear,
199
+ siYearToJD,
194
200
  yearAtCumulIntegral,
195
201
  ensureCumulDaysTable,
196
202
  yearToJD,
@@ -70,17 +70,35 @@ export function laggedL1Terms(l1Terms: Array<{
70
70
  * relaxationKyr: number,
71
71
  * alphaGiaRateJ2000PerYr: number,
72
72
  * alphaJ2000: number,
73
- * }} cfg - relaxationKyr and alphaGiaRateJ2000PerYr are model-parameters
74
- * deepTime constants; alphaJ2000 the IERS moment-of-inertia factor
73
+ * j2RateJ2000PerYr?: number,
74
+ * j2J2000?: number,
75
+ * }} cfg - relaxationKyr, alphaGiaRateJ2000PerYr and j2RateJ2000PerYr are
76
+ * model-parameters deepTime constants; alphaJ2000 the IERS
77
+ * moment-of-inertia factor; j2J2000 Earth's J₂ (astro-reference)
75
78
  * @returns {{
76
79
  * alphaAt: (year: number) => number,
80
+ * j2RatioAt: (year: number) => number,
77
81
  * laggedL1PermilAt: (year: number) => number,
78
82
  * kPerPermille: number,
79
83
  * relaxationKyr: number,
80
84
  * laggedL1Terms: Array<{period_kyr: number, a: number, b: number}>,
81
85
  * }}
86
+ *
87
+ * THE SAME REDISTRIBUTION, ITS SECOND OBSERVABLE — j2RatioAt(year) = J₂(t)/J₂₀.
88
+ * The mass that changes the polar moment changes the oblateness, and the
89
+ * luni-solar precession rate is proportional to it (ψ̇ ∝ (C − A)/C; the
90
+ * consumer is the spin integration, earth/deep-orbital-history). The J₂ side
91
+ * is scaled on its OWN observation, exactly as the α side is on its rate:
92
+ *
93
+ * J₂(t) = J₂₀ − k_J · [ L1'(t) − L1'(2000) ], k_J = −(dJ₂/dt)_obs / (dL1'/dt)₂₀₀₀
94
+ *
95
+ * so dJ₂/dt(J2000) IS the observed satellite rate (Cox & Chao 2002) by
96
+ * construction, and the J₂→α conversion factor never enters. A constant
97
+ * dJ₂/dt would be a rate valid at a point used across a span; this is the
98
+ * history. Bounded: ±5·10⁻⁴ over the glacial cycles, no secular part.
99
+ * Without the two constants the ratio is 1 at every year.
82
100
  */
83
- export function createAlphaGiaChannel({ l1Terms, yStdDenormalization, relaxationKyr, alphaGiaRateJ2000PerYr, alphaJ2000 }: {
101
+ export function createAlphaGiaChannel({ l1Terms, yStdDenormalization, relaxationKyr, alphaGiaRateJ2000PerYr, alphaJ2000, j2RateJ2000PerYr, j2J2000 }: {
84
102
  l1Terms: Array<{
85
103
  period_kyr: number;
86
104
  a: number;
@@ -90,8 +108,11 @@ export function createAlphaGiaChannel({ l1Terms, yStdDenormalization, relaxation
90
108
  relaxationKyr: number;
91
109
  alphaGiaRateJ2000PerYr: number;
92
110
  alphaJ2000: number;
111
+ j2RateJ2000PerYr?: number;
112
+ j2J2000?: number;
93
113
  }): {
94
114
  alphaAt: (year: number) => number;
115
+ j2RatioAt: (year: number) => number;
95
116
  laggedL1PermilAt: (year: number) => number;
96
117
  kPerPermille: number;
97
118
  relaxationKyr: number;
@@ -2,14 +2,14 @@
2
2
  // Gives the TypeScript website full type safety at the boundary (§2g) while
3
3
  // packages/physics stays JavaScript.
4
4
 
5
- export declare const CONSTANTS_HASH: "b9c4d78647577e67";
5
+ export declare const CONSTANTS_HASH: "726b10e23d8ace09";
6
6
 
7
7
  export declare const MODEL_VERSION: string;
8
8
 
9
9
  export declare const PREPRINT_DOI: string;
10
10
 
11
11
  export declare const DEFAULT_CONSTANTS: {
12
- readonly hash: "b9c4d78647577e67";
12
+ readonly hash: "726b10e23d8ace09";
13
13
  readonly additionalBodies: {
14
14
  "pluto": {
15
15
  "name": string;
@@ -136,6 +136,7 @@ export declare const DEFAULT_CONSTANTS: {
136
136
  "alpha4PerMa4": number;
137
137
  "alphaGiaRateJ2000PerYr": number;
138
138
  "alphaGiaRelaxationKyr": number;
139
+ "j2RateJ2000PerYr": number;
139
140
  "dtStackTaperFullHalfwidthYr": number;
140
141
  "dtStackTaperTotalHalfwidthYr": number;
141
142
  "recessionRegime": {