@essrt/physics 7.0.0 → 8.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.
- package/README.md +2 -2
- package/package.json +2 -2
- package/src/constants/coefficients.d.ts +1 -38
- package/src/constants/coefficients.js +2 -5
- package/src/constants/generated.d.ts +2 -2
- package/src/constants/generated.js +9 -9
- package/src/earth/deep-orbital-history.cjs +10 -0
- package/src/earth/frame-of-date.cjs +105 -0
- package/src/eclipse/besselian.cjs +41 -17
- package/src/eclipse/sun-planetary-completion.cjs +55 -14
- package/src/index.js +5 -1
- package/src/model.js +213 -113
- package/src/moon/apparent.cjs +45 -126
- package/src/moon/series-extension.cjs +2 -1
- package/src/moon/series.cjs +21 -4
- package/src/planets/chain-artifact.js +2 -2
- package/types/constants/coefficients.d.ts +1 -38
- package/types/constants/generated.d.ts +2 -2
- package/types/earth/deep-orbital-history.d.cts +2 -0
- package/types/earth/frame-of-date.d.cts +37 -0
- package/types/eclipse/besselian.d.cts +5 -7
- package/types/eclipse/sun-planetary-completion.d.cts +14 -10
- package/types/index.d.ts +1 -1
- package/types/model.d.ts +3 -0
- package/types/moon/apparent.d.cts +7 -68
- package/src/planets/predict.cjs +0 -324
- package/types/planets/predict.d.cts +0 -88
|
@@ -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: "
|
|
5
|
+
export declare const CONSTANTS_HASH: "2f0bb1d372d35ed9";
|
|
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: "
|
|
12
|
+
readonly hash: "2f0bb1d372d35ed9";
|
|
13
13
|
readonly additionalBodies: {
|
|
14
14
|
"pluto": {
|
|
15
15
|
"name": string;
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
* carry it so a counterfactual is reproducible (§2d).
|
|
34
34
|
* @type {string}
|
|
35
35
|
*/
|
|
36
|
-
export const CONSTANTS_HASH = "
|
|
36
|
+
export const CONSTANTS_HASH = "2f0bb1d372d35ed9";
|
|
37
37
|
|
|
38
38
|
/** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
|
|
39
39
|
export const MODEL_VERSION = "v14.0";
|
|
@@ -43,7 +43,7 @@ export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
|
|
|
43
43
|
|
|
44
44
|
/** @type {Readonly<Record<string, unknown>>} */
|
|
45
45
|
export const DEFAULT_CONSTANTS = Object.freeze({
|
|
46
|
-
hash: "
|
|
46
|
+
hash: "2f0bb1d372d35ed9",
|
|
47
47
|
additionalBodies: {
|
|
48
48
|
"pluto": {
|
|
49
49
|
"name": "Pluto",
|
|
@@ -171,10 +171,10 @@ export const DEFAULT_CONSTANTS = Object.freeze({
|
|
|
171
171
|
"eros": 16.84
|
|
172
172
|
},
|
|
173
173
|
cardinalPointAnchors: {
|
|
174
|
-
"SS": 2451716.
|
|
175
|
-
"WS": 2451900.
|
|
176
|
-
"VE": 2451623.
|
|
177
|
-
"AE": 2451810.
|
|
174
|
+
"SS": 2451716.575,
|
|
175
|
+
"WS": 2451900.0674,
|
|
176
|
+
"VE": 2451623.816,
|
|
177
|
+
"AE": 2451810.2271
|
|
178
178
|
},
|
|
179
179
|
deepTime: {
|
|
180
180
|
"alpha1PerMa": -0.000099375895103,
|
|
@@ -250,7 +250,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
|
|
|
250
250
|
"moonStartposApsidal": 347.5476,
|
|
251
251
|
"moonStartposNodal": 64.0435,
|
|
252
252
|
"moonStartposMoon": 67.8443,
|
|
253
|
-
"moonMeeusLpCorrection": 0
|
|
253
|
+
"moonMeeusLpCorrection": 0
|
|
254
254
|
},
|
|
255
255
|
moonMeeus: {
|
|
256
256
|
"elpW1T2Decomposition_arcsecPerCy2": {
|
|
@@ -766,8 +766,8 @@ export const REFERENCE_DATA = Object.freeze({
|
|
|
766
766
|
"sunModelTrueErrorDeg": 0.003,
|
|
767
767
|
"sunTropicalYearDiffSeconds": 0.1,
|
|
768
768
|
"sunSiderealYearDiffSeconds": 0.02,
|
|
769
|
-
"frameworkSunVsJplRmsArcsec":
|
|
770
|
-
"meeusCh25SunVsJplRmsArcsec": 1.
|
|
769
|
+
"frameworkSunVsJplRmsArcsec": 1.03,
|
|
770
|
+
"meeusCh25SunVsJplRmsArcsec": 1.02,
|
|
771
771
|
"moonSeriesLonVsJplRmsArcsec": 2.84,
|
|
772
772
|
"moonSeriesLatVsJplRmsArcsec": 0.35,
|
|
773
773
|
"mercuryNewtonianArcsecCy": 532,
|
|
@@ -320,6 +320,14 @@ function createDeepOrbitalHistory({
|
|
|
320
320
|
eSinPeri: e * Math.sin(periOfDateDeg * D2R),
|
|
321
321
|
eCosPeri: e * Math.cos(periOfDateDeg * D2R),
|
|
322
322
|
inclEclDeg: i * R2D,
|
|
323
|
+
// The orbit normal's in-plane components in the J2000 ecliptic frame
|
|
324
|
+
// (n̂ = (sin i sin Ω, −sin i cos Ω, cos i); the third component follows).
|
|
325
|
+
// With epsDeg and equinoxLonJ2000Deg these reconstruct the FULL Earth
|
|
326
|
+
// frame of date — n̂, the equinox ĝ and the spin axis ŝ — for the scene
|
|
327
|
+
// (earth/frame-of-date.cjs). Smooth and small (47″/cy): linear
|
|
328
|
+
// interpolation on the grid is exact to the ζ series' own resolution.
|
|
329
|
+
orbitNormalX: n[0],
|
|
330
|
+
orbitNormalY: n[1],
|
|
323
331
|
// The equinox node (ŝ×n̂) longitude in the J2000 ecliptic frame —
|
|
324
332
|
// its year-over-year retrograde advance IS the general precession of
|
|
325
333
|
// date, wobble included (the n̂(t) geometry generates the equinox
|
|
@@ -420,6 +428,8 @@ function createDeepOrbitalHistory({
|
|
|
420
428
|
eSinPeri: lerp(a.eSinPeri, b.eSinPeri),
|
|
421
429
|
eCosPeri: lerp(a.eCosPeri, b.eCosPeri),
|
|
422
430
|
inclEclDeg: lerp(a.inclEclDeg, b.inclEclDeg),
|
|
431
|
+
orbitNormalX: lerp(a.orbitNormalX, b.orbitNormalX),
|
|
432
|
+
orbitNormalY: lerp(a.orbitNormalY, b.orbitNormalY),
|
|
423
433
|
// C1 (cubic Hermite) — linear interpolation here made the
|
|
424
434
|
// realized equinox RATE piecewise-constant per grid cell (the
|
|
425
435
|
// measured per-year precession staircase). Node rates come from
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Earth frame of date — ONE home (holisticuniverse plan 06, R4 "one Earth
|
|
3
|
+
* frame": the scene's axis, equinox and sun plane placed from the engine).
|
|
4
|
+
*
|
|
5
|
+
* The one-source movement's sample carries, at a year, the obliquity ε, the
|
|
6
|
+
* equinox node's longitude in the J2000 ecliptic frame and the orbit normal's
|
|
7
|
+
* in-plane components. From those three the full frame follows, all unit
|
|
8
|
+
* vectors in the J2000 ecliptic frame the chain artifact uses:
|
|
9
|
+
*
|
|
10
|
+
* n̂ — the ecliptic pole of date (the orbit normal; the sun plane's normal)
|
|
11
|
+
* ĝ — the equinox of date: the ascending node of the ecliptic of date on the
|
|
12
|
+
* equator of date, ĝ ∝ ŝ × n̂; it lies in the ecliptic of date at the
|
|
13
|
+
* sample's node longitude
|
|
14
|
+
* ŝ — the spin axis (the celestial pole of date): the ecliptic pole tilted by
|
|
15
|
+
* ε toward longitude ĝ + 90° — ŝ = cos ε·n̂ + sin ε·(n̂ × ĝ)
|
|
16
|
+
*
|
|
17
|
+
* so that ĝ = unit(ŝ × n̂) and ε = ∠(ŝ, n̂) hold by construction. Reconstructing
|
|
18
|
+
* from ANGLES (not from stored vectors) keeps the grid interpolation exact: the
|
|
19
|
+
* node longitude is Hermite-interpolated by the sampler, the normal components
|
|
20
|
+
* and ε are smooth.
|
|
21
|
+
*
|
|
22
|
+
* Both scene twins (src/script.js, tools/lib/scene-graph.js) place the axis,
|
|
23
|
+
* the sun plane and the Sun from this frame every frame — no relative
|
|
24
|
+
* corrections on a device geometry (the retired tilt/azimuth/apsidal/plane
|
|
25
|
+
* corrections and the δ Newton read: docs/41). Measured before the change:
|
|
26
|
+
* the K sun plane and the RA frame's ecliptic parted by 20.5″ at J2000 and 10′
|
|
27
|
+
* at −3000, the rendered Sun −19″ in declination against Horizons at the
|
|
28
|
+
* March 2000 equinox (+19″ in September; 0.1–1″ at the solstice).
|
|
29
|
+
*/
|
|
30
|
+
'use strict';
|
|
31
|
+
|
|
32
|
+
const D2R = Math.PI / 180;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @typedef {{x: number, y: number, z: number}} Vec3
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/** @param {number[]} a @param {number[]} b @returns {number[]} */
|
|
39
|
+
function cross(a, b) {
|
|
40
|
+
return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
41
|
+
}
|
|
42
|
+
/** @param {number[]} v @returns {number[]} */
|
|
43
|
+
function unit(v) {
|
|
44
|
+
const n = Math.hypot(v[0], v[1], v[2]);
|
|
45
|
+
return [v[0] / n, v[1] / n, v[2] / n];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The Earth frame of date from a one-source sample, unit vectors in the J2000
|
|
50
|
+
* ecliptic frame: `n` the ecliptic pole of date, `g` the equinox of date, `s`
|
|
51
|
+
* the spin axis of date. Every vector is `[x, y, z]`.
|
|
52
|
+
* @param {{epsDeg: number, equinoxLonJ2000Deg: number, orbitNormalX: number, orbitNormalY: number}} sample
|
|
53
|
+
* @returns {{n: number[], g: number[], s: number[]}}
|
|
54
|
+
*/
|
|
55
|
+
function computeEarthFrameOfDate(sample) {
|
|
56
|
+
const nx = sample.orbitNormalX, ny = sample.orbitNormalY;
|
|
57
|
+
const nz = Math.sqrt(Math.max(0, 1 - nx * nx - ny * ny));
|
|
58
|
+
const n = [nx, ny, nz];
|
|
59
|
+
// the equinox: in the ecliptic of date (⟂ n̂), at the sampled longitude L
|
|
60
|
+
// measured in the J2000 ecliptic — the unit vector (cos L, sin L, z) with
|
|
61
|
+
// z fixed by ĝ·n̂ = 0
|
|
62
|
+
const L = sample.equinoxLonJ2000Deg * D2R;
|
|
63
|
+
const gx = Math.cos(L), gy = Math.sin(L);
|
|
64
|
+
const gz = -(nx * gx + ny * gy) / nz;
|
|
65
|
+
const g = unit([gx, gy, gz]);
|
|
66
|
+
// the spin axis: the pole tilted by ε from n̂ toward longitude ĝ + 90°
|
|
67
|
+
const eps = sample.epsDeg * D2R;
|
|
68
|
+
const w = cross(n, g); // the in-plane direction at ĝ + 90°
|
|
69
|
+
const s = unit([
|
|
70
|
+
Math.cos(eps) * n[0] + Math.sin(eps) * w[0],
|
|
71
|
+
Math.cos(eps) * n[1] + Math.sin(eps) * w[1],
|
|
72
|
+
Math.cos(eps) * n[2] + Math.sin(eps) * w[2],
|
|
73
|
+
]);
|
|
74
|
+
return { n, g, s };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The wheel angle θ that puts the Sun at ecliptic longitude λ on the scene's
|
|
79
|
+
* offset circle: the Sun sits at radius 1 (100 scene units) about a centre
|
|
80
|
+
* displaced by −e along the perihelion direction ϖ (the one eccentricity law's
|
|
81
|
+
* single arm), P(θ) = −e·û(ϖ) + û(θ), and the geocentric longitude is the
|
|
82
|
+
* direction of P. Two Newton steps from θ₀ = λ (the offset-circle Jacobian
|
|
83
|
+
* dλ/dθ = 1 − e·cos(θ − ϖ) + O(e²)); converged to <1e-12 rad for e < 0.1.
|
|
84
|
+
* Angles in radians; θ increases with λ (the scene's node angles are
|
|
85
|
+
* λ-handed).
|
|
86
|
+
* @param {number} lambdaRad - the target geocentric ecliptic longitude
|
|
87
|
+
* @param {number} e - the eccentricity (the centre offset in units of the radius)
|
|
88
|
+
* @param {number} periRad - the perihelion longitude ϖ of date (the offset direction is −û(ϖ))
|
|
89
|
+
* @returns {number} θ in radians, in (−π, π]
|
|
90
|
+
*/
|
|
91
|
+
function solveWheelAngleForLongitude(lambdaRad, e, periRad) {
|
|
92
|
+
const cx = -e * Math.cos(periRad), cy = -e * Math.sin(periRad);
|
|
93
|
+
let th = lambdaRad;
|
|
94
|
+
for (let k = 0; k < 3; k++) {
|
|
95
|
+
const px = cx + Math.cos(th), py = cy + Math.sin(th);
|
|
96
|
+
const lam = Math.atan2(py, px);
|
|
97
|
+
const r2 = px * px + py * py;
|
|
98
|
+
const dLamDth = (px * Math.cos(th) + py * Math.sin(th)) / r2; // d atan2(py, px)/dθ
|
|
99
|
+
const err = Math.atan2(Math.sin(lambdaRad - lam), Math.cos(lambdaRad - lam));
|
|
100
|
+
th += err / dLamDth;
|
|
101
|
+
}
|
|
102
|
+
return Math.atan2(Math.sin(th), Math.cos(th));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
module.exports = { computeEarthFrameOfDate, solveWheelAngleForLongitude };
|
|
@@ -30,19 +30,36 @@
|
|
|
30
30
|
* the observed 63.8/64.2 s — mean 6.3″ vs 7.3″). ~34″ of the raw
|
|
31
31
|
* offset.
|
|
32
32
|
*
|
|
33
|
-
* 2. Full series, not the truncated finder forms.
|
|
34
|
-
* the
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
33
|
+
* 2. Full series, not the truncated finder forms. truncatedBetaDeg omits
|
|
34
|
+
* the −2235·sin(Lp) latitude family (~8″) and both truncated forms omit
|
|
35
|
+
* the derived series-extension tail — deliberate for the certified
|
|
36
|
+
* finder statistics (knife-edge canon events), required here. The
|
|
37
|
+
* injected moonFullAtDaysTT is the series' sceneEvalAt — the same
|
|
38
|
+
* evaluation the browser scene ships (the extension inside it since
|
|
39
|
+
* plan 06 R3 item 1: one scene Moon).
|
|
40
40
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* the
|
|
41
|
+
* APPARENT PLACES (plan 06 R3 item 1 — measured, the cancellation the I2
|
|
42
|
+
* Sun exposed): both bodies are evaluated mean-of-date (nutation is a common
|
|
43
|
+
* rotation of Sun and Moon and cancels in the elongation) but with their
|
|
44
|
+
* PLANETARY ABERRATION: the Sun's derived κ = 2π a/(c T_sid √(1−e²))
|
|
45
|
+
* (≈20.5″, the light-time of a source at rest in the barycentric frame) and
|
|
46
|
+
* the Moon's RELATIVE light-time (its geocentric motion during dist/c,
|
|
47
|
+
* ≈0.7″). For a body co-moving with the observer the stellar aberration
|
|
48
|
+
* cancels against its barycentric light-time displacement — Horizons'
|
|
49
|
+
* apparent Moon coincides with the geometric Moon to that 0.7″ (the
|
|
50
|
+
* truncated series + extension read −1.0″ ± 1.5″ against it over
|
|
51
|
+
* 1970–2049, flat in elongation) — so "aberrate both bodies, it cancels at
|
|
52
|
+
* syzygy" (the former round-3 reasoning) was the wrong physics: it held the
|
|
53
|
+
* Moon 20.5″ from its apparent place, and the fitted moonMeeusLpCorrection
|
|
54
|
+
* (+32.75″ = κ + the Sun's then-missing long inequality + the trend-ΔT
|
|
55
|
+
* offset) absorbed it. That anchor is retired (0) with the Sun's κ applied
|
|
56
|
+
* here. The mean sidereal time of the Earth-fixed mapping pairs with the
|
|
57
|
+
* mean equinox of the body longitudes as before.
|
|
58
|
+
*
|
|
59
|
+
* The remaining centerline residual on NASA's UT instants (2–5″ in
|
|
60
|
+
* 1999–2026) is the model's TREND ΔT against the observed one (9.5 s below
|
|
61
|
+
* IERS at 2000, 2.9 s at 2024, × the Moon's 0.55″/s) — a ΔT-convention
|
|
62
|
+
* floor, never to be fitted here.
|
|
46
63
|
*
|
|
47
64
|
* The scene-umbra conventions (THREE scaffold navigation) never enter this
|
|
48
65
|
* package (§2h) — this is an independent construction on the shared
|
|
@@ -58,7 +75,7 @@
|
|
|
58
75
|
* full-series Moon: ecliptic-of-date longitude/latitude (deg) + distance (km), TT axis (days since J2000)
|
|
59
76
|
* @property {(jdUT: number) => number} sunLonDegAt - geometric mean sun longitude (deg), JD(UT) axis with the finder's internal ΔT
|
|
60
77
|
* @property {(T: number) => number} sunCompletionDeg - planetary completion (deg) at T centuries TT, SUBTRACTED from the finder sun (see eclipse/sun-planetary-completion.cjs; the finders deliberately stay without it — their fitted anchors and certified canon statistics were produced on the bare form, and elongation-class timing absorbs the omission into the fitted phases)
|
|
61
|
-
* @property {(
|
|
78
|
+
* @property {(year: number) => number} sunAberrationDegAt - the Sun's derived planetary aberration κ (deg) at calendar year, SUBTRACTED from the geometric Sun longitude (the apparent Sun; see the header)
|
|
62
79
|
* @property {(jd: number) => number} deltaTSecondsAt - framework ΔT (J2000-zeroed convention)
|
|
63
80
|
* @property {(year: number) => number} obliquityDegAt - framework obliquity (deg) at calendar year
|
|
64
81
|
* @property {(year: number) => number} eccentricityAt - framework Earth-orbit eccentricity at calendar year
|
|
@@ -68,7 +85,7 @@
|
|
|
68
85
|
* moonDiameterKm: number, sunDiameterKm: number, sunDistanceKm: number,
|
|
69
86
|
* earthFlatteningInverse: number, ttBridgeSeconds: number,
|
|
70
87
|
* gmstMeanSiderealT0Deg: number, gmstMeanSiderealRateDegPerDay: number,
|
|
71
|
-
* gmstMeanSiderealT2Deg: number }} constants
|
|
88
|
+
* gmstMeanSiderealT2Deg: number, speedOfLightKmS: number }} constants
|
|
72
89
|
*/
|
|
73
90
|
|
|
74
91
|
/** @param {BesselianDeps} deps */
|
|
@@ -125,12 +142,19 @@ function createBesselian(deps) {
|
|
|
125
142
|
const year = deps.yearFromJD(jb);
|
|
126
143
|
const eps = deps.obliquityDegAt(year) * D2R;
|
|
127
144
|
const dTT = (jb - K.j2000JD) + deps.deltaTSecondsAt(jb) / 86400;
|
|
128
|
-
|
|
145
|
+
// the APPARENT Sun: geometric completed longitude minus its derived aberration κ
|
|
146
|
+
const sunLon = deps.sunLonDegAt(jb) - deps.sunCompletionDeg(dTT / K.julianCenturyDays) - deps.sunAberrationDegAt(year);
|
|
147
|
+
// the APPARENT Moon: the geometric series displaced by its RELATIVE light-time —
|
|
148
|
+
// the Moon's own geocentric motion (central difference, a point rate at this
|
|
149
|
+
// instant, never a mean rate × span) during τ = dist/c
|
|
129
150
|
const moon = deps.moonFullAtDaysTT(dTT);
|
|
130
|
-
const
|
|
151
|
+
const H_DAYS = 0.02;
|
|
152
|
+
const dLon = deps.moonFullAtDaysTT(dTT + H_DAYS).lonDeg - deps.moonFullAtDaysTT(dTT - H_DAYS).lonDeg;
|
|
153
|
+
const moonRateDegPerDay = (((dLon + 540) % 360) - 180) / (2 * H_DAYS);
|
|
154
|
+
const tauDays = moon.distKm / K.speedOfLightKmS / 86400;
|
|
131
155
|
return {
|
|
132
156
|
S: eclToEq(sunLon, 0, sunDistanceKm(year, sunLon), eps),
|
|
133
|
-
M: eclToEq(moon.lonDeg
|
|
157
|
+
M: eclToEq(moon.lonDeg - moonRateDegPerDay * tauDays, moon.latDeg, moon.distKm, eps),
|
|
134
158
|
};
|
|
135
159
|
}
|
|
136
160
|
|
|
@@ -22,9 +22,23 @@
|
|
|
22
22
|
* THE CARRIERS (FQ-5 N3, the doctrine's final mile for the Sun side):
|
|
23
23
|
* the six planetary mean-longitude RATES are no longer instrument
|
|
24
24
|
* literals — they are INJECTED by the model wiring, computed live from
|
|
25
|
-
* the framework's own planet records
|
|
26
|
-
*
|
|
27
|
-
*
|
|
25
|
+
* the framework's own planet records, as is the Moon-elongation rate for
|
|
26
|
+
* the EMB-wobble carrier. PLAN 06 I2 — the injected rates are SIDEREAL
|
|
27
|
+
* (the record's of-date rate minus the model's own J2000 precession;
|
|
28
|
+
* Earth the framework sidereal year; model.js): a perturbation argument
|
|
29
|
+
* is inertial (D'Alembert — only Σk = 0 arguments are frame-free), and
|
|
30
|
+
* on the N3 of-date carriers every Σk ≠ 0 row (3V−4E, E−2J, 2V−3E,
|
|
31
|
+
* 2E−3J, 2E−3M, 2M−E, 2(2M−E) …) drifted by Σk·ψ(t): 42..52° at −3000,
|
|
32
|
+
* measured against JPL Horizons over ±3000 yr as the dominant ancient
|
|
33
|
+
* scatter of the certified Sun (6.4″ → 4.4″ at −3000, 6.0 → 4.6″ at
|
|
34
|
+
* −2000, 3.6 → 3.0″ at 0 AD on sidereal carriers; 1900–2100 unchanged).
|
|
35
|
+
* The 70 N3 literals are KEPT: the two carrier sets share the J2000
|
|
36
|
+
* anchors and part by ≤ 1.4°·|Σk| at the 200-yr window's edges, and the
|
|
37
|
+
* re-extraction on sidereal carriers (tools/explore/i2-sidereal-carrier-
|
|
38
|
+
* table.mjs) reproduces the composed function (fidelity 0.612 vs 0.614″,
|
|
39
|
+
* JPL 1900–2100 all-phase sd identical to 0.01″) while redistributing
|
|
40
|
+
* the near-degenerate ±M sideband pairs — only the composed function
|
|
41
|
+
* ships, so the literals stay as extracted. The J2000 phase
|
|
28
42
|
* anchors (ARG_L0, PERI, D0) remain declared epoch constants — the
|
|
29
43
|
* "anchored by design" class; any constant phase offset is absorbed into
|
|
30
44
|
* the fitted cos/sin split exactly. N3 gates measured before the swap:
|
|
@@ -80,7 +94,7 @@
|
|
|
80
94
|
* check`) recomputes it from live constants and fails on mismatch. The
|
|
81
95
|
* carrier↔table pairing is enforced by both living in this one module
|
|
82
96
|
* with the rates injected from the same constants the records read. The
|
|
83
|
-
* api centerline gate (≤
|
|
97
|
+
* api centerline gate (≤12″ shadow-plane) backstops gross staleness
|
|
84
98
|
* independently.
|
|
85
99
|
*
|
|
86
100
|
* FQ-5 N2 RECORD (the carrier attribution): 8/10 carriers measured
|
|
@@ -115,6 +129,26 @@ const ARG_D0 = 297.8501921;
|
|
|
115
129
|
* composed difference vs the previous table ≤1.5″ at the ancient presets,
|
|
116
130
|
* detrended 0.033 min). Individual coefficients redistribute between the
|
|
117
131
|
* near-degenerate ±M sideband families; only the composed function ships.
|
|
132
|
+
*
|
|
133
|
+
* PLAN 06 I2 — the LONG-PERIOD rows (the last two): the Earth–Mars–
|
|
134
|
+
* Jupiter long inequality 4λ_E − 8λ_Ma + 3λ_J (carrier period 1801 yr;
|
|
135
|
+
* the classical ~1783-yr term of the solar theory) and the Venus–Earth
|
|
136
|
+
* term 8λ_V − 13λ_E (238 yr), DERIVED on the model's own Wisdom–Holman
|
|
137
|
+
* engine (tools/explore/nbody-wh.mjs, the chain artifact's integrator) on
|
|
138
|
+
* the campaign's ONE Horizons J2000 seed, Sun + eight planets, DE440
|
|
139
|
+
* masses, 1PN, order 2, dt 2 d, −5100..+1100 yr: the EMB's osculating
|
|
140
|
+
* mean longitude Ω+ω+M in yearly means, LSQ on [1, T, T²] + cos/sin of
|
|
141
|
+
* the arguments on THESE carriers (tools/explore/i2-long-inequality.mjs).
|
|
142
|
+
* Measured: 6.27″ / 1.84″; step-converged (dt 1 d: 6.272 / 1.869); the
|
|
143
|
+
* integration reproduces DE441's Earth longitude to 0.68″ sd over 6000
|
|
144
|
+
* yr with 0.03″ left at the 1783-yr argument. Neither could come from the
|
|
145
|
+
* 200-yr D2 window (the term's in-window ramp went to the projected-out
|
|
146
|
+
* secular basis; the 240-yr term folded into it). WHY they were missing:
|
|
147
|
+
* the certified Sun integrates a smooth tropical year for its mean
|
|
148
|
+
* longitude; against Horizons its residual carried exactly this 6″ ripple
|
|
149
|
+
* (plan 06 I1 analysis) — with the same phase in the sidereal residual, a
|
|
150
|
+
* perturbation of Earth's mean motion, not a frame effect. Sub-0.2″
|
|
151
|
+
* candidates left out (2J−5S 0.17″, 5V−8E 0.17″: window-dependent phase).
|
|
118
152
|
* @type {Array<[number[], number[], number, number]>}
|
|
119
153
|
*/
|
|
120
154
|
const TERMS = [
|
|
@@ -188,6 +222,9 @@ const TERMS = [
|
|
|
188
222
|
[[0, 0, 1, -1, 0, 0], [0, 0, 1, 0, 0, 0], 0.0188, 0.0523],
|
|
189
223
|
[[0, 2, -2, 0, 0, 0], [0, 0, 1, 0, 0, 0], -0.0421, -0.0340],
|
|
190
224
|
[[0, 0, 1, -1, 0, 0], [0, 0, -1, 0, 0, 0], -0.0353, -0.0379],
|
|
225
|
+
// plan 06 I2 — the long-period rows (see the doc comment above)
|
|
226
|
+
[[0, 0, 4, -8, 3, 0], [0, 0, 0, 0, 0, 0], 6.2314, -0.7168],
|
|
227
|
+
[[0, 8, -13, 0, 0, 0], [0, 0, 0, 0, 0, 0], 1.8389, 0.1419],
|
|
191
228
|
];
|
|
192
229
|
|
|
193
230
|
const D2R = Math.PI / 180;
|
|
@@ -247,15 +284,19 @@ function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy })
|
|
|
247
284
|
const PAIRED_SUN_HARMONICS_SHA256 = 'cbc189cea1c20292'; // eccentricity unification: Step-0 refit → N2/N3 re-derived (fidelity 0.616″, 70 terms)
|
|
248
285
|
|
|
249
286
|
/** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
|
|
250
|
-
* full-precision carrier rates (deg/cy TT) the TERMS table
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
|
|
287
|
+
* full-precision carrier rates (deg/cy TT) the TERMS table pairs with:
|
|
288
|
+
* the SIDEREAL carriers of plan 06 I2 (record rate − the model's J2000
|
|
289
|
+
* precession; Earth the framework sidereal year; the N3 literals kept,
|
|
290
|
+
* the two long-period rows derived on these rates). The model wiring
|
|
291
|
+
* recomputes the rates live from the planet records, so a planet-period /
|
|
292
|
+
* year / month input change moves the carriers automatically while the
|
|
293
|
+
* table stays frozen — a silent few-arcsec stale below the api gate's
|
|
294
|
+
* ≤12″ backstop. test:model recomputes this fingerprint from live
|
|
295
|
+
* constants (identical arithmetic to model.js) and fails on mismatch:
|
|
296
|
+
* re-run the extraction chain (tools/explore/n2-sun-framework-carriers.mjs
|
|
297
|
+
* → i2-sidereal-carrier-table.mjs for the short-period rows,
|
|
298
|
+
* i2-long-inequality.mjs for the long-period rows), re-embed TERMS, and
|
|
299
|
+
* update this value. */
|
|
300
|
+
const PAIRED_CARRIER_RATES_SHA256 = '2d066e92bae955e4';
|
|
260
301
|
|
|
261
302
|
module.exports = { createSunPlanetaryCompletion, PAIRED_SUN_HARMONICS_SHA256, PAIRED_CARRIER_RATES_SHA256 };
|
package/src/index.js
CHANGED
|
@@ -114,6 +114,9 @@ export { createChainCycleIntegrator } from './chain-cycles/index.cjs';
|
|
|
114
114
|
export { createMoonArguments } from './moon/arguments.cjs';
|
|
115
115
|
export { createMoonSeries } from './moon/series.cjs';
|
|
116
116
|
export { createMoonApparent } from './moon/apparent.cjs';
|
|
117
|
+
// R4 — the Earth frame of date (sun plane, equinox, spin axis from the one-source
|
|
118
|
+
// sample) and the offset-circle wheel-angle solver: the scene twins' one placement.
|
|
119
|
+
export { computeEarthFrameOfDate, solveWheelAngleForLongitude } from './earth/frame-of-date.cjs';
|
|
117
120
|
// Phase 8.3 — the planet machinery, extracted by LAW over body records
|
|
118
121
|
// (survey order: geometry → Fibonacci laws → channels → chains).
|
|
119
122
|
export { derivePlanetGeometry } from './planets/geometry.cjs';
|
|
@@ -143,7 +146,8 @@ export { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from './earth/year-lengths
|
|
|
143
146
|
// (spin ω(t) × [solar torque + lunar torque on the recession history]) —
|
|
144
147
|
// leg-1's physical rate; the structural H(t)/13 clock is its named diagnostic.
|
|
145
148
|
export { computeSolarTorqueShare, createComposedPrecession } from './earth/precession-composed.cjs';
|
|
146
|
-
|
|
149
|
+
// (planets/predict.cjs — the planet predictive-precession feature basis — was
|
|
150
|
+
// retired at plan 06 R8 with PREDICT_COEFFS_PHYSICAL; docs/retired-record.md.)
|
|
147
151
|
// L10 — the composition front door: one law set, N body records. Thin by
|
|
148
152
|
// design; engines keep their direct call sites (see planets/model.cjs).
|
|
149
153
|
export { createPlanetModel } from './planets/model.cjs';
|