@essrt/physics 25.0.1 → 26.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/package.json +3 -2
- package/src/constants/generated.js +1 -1
- package/src/deltat/deep-time-chain.js +18 -10
- package/src/eclipse/besselian.cjs +5 -6
- package/src/eclipse/sun-planetary-completion.cjs +7 -12
- package/src/index.js +4 -1
- package/src/model/cardinal-instants.js +3 -4
- package/src/model/deep-time-chain.js +3 -3
- package/src/model/lunar-theory.js +6 -5
- package/src/model/one-source-movement.js +8 -8
- package/src/model/planet-records.js +2 -2
- package/src/model/published-periods.js +1 -1
- package/src/model/sun-and-eclipses.js +3 -3
- package/src/model/surface.js +10 -6
- package/src/moon/arguments.cjs +70 -26
- package/src/moon/deep-ecc-channel.cjs +18 -23
- package/src/moon/ecc-sensitivities.cjs +87 -0
- package/src/moon/month-chain.cjs +7 -16
- package/src/moon/series-extension.cjs +3 -3
- package/src/moon/series.cjs +5 -8
- package/types/deltat/deep-time-chain.d.ts +13 -8
- package/types/index.d.ts +2 -1
- package/types/model/deep-time-chain.d.ts +13 -0
- package/types/model/lunar-theory.d.ts +9 -3
- package/types/model/one-source-movement.d.ts +1 -1
- package/types/model/surface.d.ts +17 -4
- package/types/model.d.ts +13 -0
- package/types/moon/arguments.d.cts +11 -3
- package/types/moon/deep-ecc-channel.d.cts +2 -1
- package/types/moon/ecc-sensitivities.d.cts +48 -0
- package/types/moon/month-chain.d.cts +3 -6
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@essrt/physics",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "26.0.0",
|
|
4
4
|
"description": "ESSRT (Expanding Solar System Resonance Theory) physics core — pure, injectable-constants, no I/O, no globals, no DOM. The complete model incl. fitted coefficients; every published version immutably ships one recorded model identity.",
|
|
5
5
|
"essrt": {
|
|
6
|
-
"modelVersion": "v27.
|
|
6
|
+
"modelVersion": "v27.1",
|
|
7
7
|
"_note": "The model identity this package version ships (IP-unified-architecture §10: package semver tracks the API axis; the model version + CONSTANTS_HASH/COEFFICIENTS_HASH in src/constants/ carry the scientific identity). The version-pinning gate enforces this pairing against public/input/model-version.json."
|
|
8
8
|
},
|
|
9
9
|
"type": "module",
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"./math/angles": { "types": "./types/math/angles.d.cts", "default": "./src/math/angles.cjs" },
|
|
40
40
|
"./cardinal/one-source-structure": { "types": "./types/cardinal/one-source-structure.d.cts", "default": "./src/cardinal/one-source-structure.cjs" },
|
|
41
41
|
"./moon/deep-ecc-channel": { "types": "./types/moon/deep-ecc-channel.d.cts", "default": "./src/moon/deep-ecc-channel.cjs" },
|
|
42
|
+
"./moon/ecc-sensitivities": { "types": "./types/moon/ecc-sensitivities.d.cts", "default": "./src/moon/ecc-sensitivities.cjs" },
|
|
42
43
|
"./moon/deep-modes-artifact": { "types": "./types/moon/deep-modes-artifact.d.cts", "default": "./src/moon/deep-modes-artifact.cjs" },
|
|
43
44
|
"./earth/deep-orbital-history": { "types": "./types/earth/deep-orbital-history.d.cts", "default": "./src/earth/deep-orbital-history.cjs" },
|
|
44
45
|
"./earth/sidereal-year-channel": { "types": "./types/earth/sidereal-year-channel.d.cts", "default": "./src/earth/sidereal-year-channel.cjs" },
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
export const CONSTANTS_HASH = "da713fc2d846767d";
|
|
40
40
|
|
|
41
41
|
/** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
|
|
42
|
-
export const MODEL_VERSION = "v27.
|
|
42
|
+
export const MODEL_VERSION = "v27.1";
|
|
43
43
|
|
|
44
44
|
/** Canonical preprint DOI — single source: public/input/model-version.json. */
|
|
45
45
|
export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
|
|
@@ -43,14 +43,9 @@ import { createMoonMonthChain } from '../moon/month-chain.cjs';
|
|
|
43
43
|
import { massLossScaledLinearAtAge, driver2PeriodSecondsAtAge, synodicPeriodSeconds } from '../planets/orbit-chain.cjs';
|
|
44
44
|
import { computeMassChainJ2000, computeMoonPeriodsJ2000 } from '../earth/mass-chain.cjs';
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* 1.0 → 1.018 with the v4 frame-attribution batch). ONE home since B2 (they
|
|
50
|
-
* were literals in model.js, tools/lib/deep-time.js and script.js `_FW_MOON`).
|
|
51
|
-
*/
|
|
52
|
-
export const MOON_ECC_SENSITIVITY_PERIGEE = 2.407;
|
|
53
|
-
export const MOON_ECC_SENSITIVITY_NODE = 1.018;
|
|
46
|
+
// The lunar perigee/node eccentricity sensitivities — ONE home moon/ecc-sensitivities.cjs
|
|
47
|
+
// (plan 23): the Meeus-effective pair and the PHYSICAL pair derived from it there.
|
|
48
|
+
import { deriveMoonEccSensitivities } from '../moon/ecc-sensitivities.cjs';
|
|
54
49
|
|
|
55
50
|
/**
|
|
56
51
|
* The ΔT stack's switches. `resonator` gates the swing's δLOD terms; the
|
|
@@ -127,6 +122,18 @@ export function createDeepTimeChain(deps) {
|
|
|
127
122
|
/** p₀, ″/yr. @returns {number} */
|
|
128
123
|
const precessionRateJ2000ArcsecPerYr = () => 1296000 / certifiedAxialPrecessionJ2000Years();
|
|
129
124
|
|
|
125
|
+
// The lunar perigee/node eccentricity sensitivities (plan 23): the Meeus-effective pair and the
|
|
126
|
+
// PHYSICAL pair derived from it by the T² identity (moon/ecc-sensitivities.cjs, the ONE home).
|
|
127
|
+
// The month chain and the arguments module run the physical pair; the frame share the effective
|
|
128
|
+
// pair carried rides the model's own precession of date instead (the arguments' pFix, on L′, ϖ
|
|
129
|
+
// and Ω alike), so the frame-free arguments M′ and F cancel it at every epoch.
|
|
130
|
+
const moonEccSensitivities = deriveMoonEccSensitivities({
|
|
131
|
+
eccentricityJ2000: C.earthOrbital.earthEccentricityJ2000,
|
|
132
|
+
eccentricityDotJ2000: C.earthOrbital.earthEccentricityDotJ2000,
|
|
133
|
+
frameT2ArcsecPerCy2: C.moonMeeus.elpW1T2Decomposition_arcsecPerCy2.generalPrecessionPA_T2_Lieske1976,
|
|
134
|
+
generalPrecessionArcsecPerYr: C.earthOrbital.generalPrecessionJ2000_arcsecPerYr,
|
|
135
|
+
});
|
|
136
|
+
|
|
130
137
|
// ── α(t): the GIA channel (lagged L1 response), the memo and the lattice pin ──
|
|
131
138
|
const CLIMATE_REGIME = F.CLIMATE_FORMULA_COEFFS.regimes['lr04-post-mpt'];
|
|
132
139
|
const alphaGia = createAlphaGiaChannel({
|
|
@@ -308,7 +315,8 @@ export function createDeepTimeChain(deps) {
|
|
|
308
315
|
moonApsidalJ2000Seconds,
|
|
309
316
|
moonNodalJ2000Seconds,
|
|
310
317
|
moonSiderealMonthJ2000Seconds,
|
|
311
|
-
|
|
318
|
+
// plan 23: the PHYSICAL pair in the channel; the frame share rides the arguments' pFix
|
|
319
|
+
sPerigee: moonEccSensitivities.perigeePhysical, sNode: moonEccSensitivities.nodePhysical,
|
|
312
320
|
},
|
|
313
321
|
fns: {
|
|
314
322
|
meanLodSecondsAtAge,
|
|
@@ -405,7 +413,7 @@ export function createDeepTimeChain(deps) {
|
|
|
405
413
|
EPOCH_PARAMS, ageAnchorYear,
|
|
406
414
|
// the pieces
|
|
407
415
|
alphaGia, earthMoiFactorAtAge, withLatticeAlpha, j2RatioAtYear, iEarthAtAge,
|
|
408
|
-
recession, meanObliquity, dtCycles, s3ArcsecPerYr, deepLod, l0, deepEcc, eCompModulation, moonChain,
|
|
416
|
+
recession, meanObliquity, dtCycles, s3ArcsecPerYr, deepLod, l0, deepEcc, eCompModulation, moonChain, moonEccSensitivities,
|
|
409
417
|
// the family
|
|
410
418
|
meanMoonDistanceMetresAtAge: recession.distanceMetresAtAge,
|
|
411
419
|
meanMoonDistanceAtAge: moonChain.distanceKmAtAge,
|
|
@@ -35,11 +35,10 @@
|
|
|
35
35
|
* the derived series-extension tail — deliberate for the certified
|
|
36
36
|
* finder statistics (knife-edge canon events), required here. The
|
|
37
37
|
* injected moonFullAtDaysTT is the series' sceneEvalAt — the same
|
|
38
|
-
* evaluation the browser scene ships (the extension inside it
|
|
39
|
-
*
|
|
38
|
+
* evaluation the browser scene ships (the extension inside it: one scene
|
|
39
|
+
* Moon).
|
|
40
40
|
*
|
|
41
|
-
* APPARENT PLACES (
|
|
42
|
-
* Sun exposed): both bodies are evaluated mean-of-date (nutation is a common
|
|
41
|
+
* APPARENT PLACES (measured — the cancellation the I2 Sun exposed): both bodies are evaluated mean-of-date (nutation is a common
|
|
43
42
|
* rotation of Sun and Moon and cancels in the elongation) but with their
|
|
44
43
|
* PLANETARY ABERRATION: the Sun's derived κ = 2π a/(c T_sid √(1−e²))
|
|
45
44
|
* (≈20.5″, the light-time of a source at rest in the barycentric frame) and
|
|
@@ -131,8 +130,8 @@ function createBesselian(deps) {
|
|
|
131
130
|
}
|
|
132
131
|
|
|
133
132
|
/** Elliptical Sun distance — FRAMEWORK-NATIVE: the model's own
|
|
134
|
-
* eccentricity
|
|
135
|
-
*
|
|
133
|
+
* eccentricity and perihelion longitude of date close the ellipse, with
|
|
134
|
+
* the true anomaly from the
|
|
136
135
|
* already-computed sun longitude (v = λ − (ϖ + 180°), geocentric-perigee
|
|
137
136
|
* convention). Agrees with the Meeus Ch. 25 polynomial to ±0.001% over a
|
|
138
137
|
* year, with no fitted external coefficients, and stays honest at deep
|
|
@@ -68,8 +68,7 @@
|
|
|
68
68
|
* inconsistency for elongation. Removed: the nutation-free syzygy
|
|
69
69
|
* fleet improves 3.877 → 3.756″ and the fuller-bridged Sun
|
|
70
70
|
* comparison 2.344 → 2.123″ (measured by the fq7s preview and
|
|
71
|
-
* annual-channel instruments
|
|
72
|
-
* §22). This file now carries ZERO fitted
|
|
71
|
+
* annual-channel instruments — docs/109 §22). This file carries ZERO fitted
|
|
73
72
|
* constants. The Earth-around-EMB wobble is DERIVED: amplitude
|
|
74
73
|
* a_M·μ/AU with μ = 1/(1+M_E/M_M), injected by the model wiring
|
|
75
74
|
* from live package constants (6.4399″ at current constants), sign
|
|
@@ -143,8 +142,8 @@ const ARG_D0 = 297.8501921;
|
|
|
143
142
|
* D2 window (the term's in-window ramp went to the projected-out secular
|
|
144
143
|
* basis; the 240-yr term folded into it). WHY they were missing: the
|
|
145
144
|
* certified Sun integrates a smooth tropical year for its mean longitude;
|
|
146
|
-
* against Horizons its residual carried exactly this 6″ ripple
|
|
147
|
-
*
|
|
145
|
+
* against Horizons its residual carried exactly this 6″ ripple — with the
|
|
146
|
+
* same phase in the sidereal residual, a perturbation
|
|
148
147
|
* of Earth's mean motion, not a frame effect. Sub-0.2″ candidates left out
|
|
149
148
|
* (2J−5S 0.17″, 5V−8E 0.17″: window-dependent phase). The CARRIERS moved
|
|
150
149
|
* with I3 from the planet records' rounded of-date periods minus p₀ to the
|
|
@@ -225,7 +224,7 @@ const TERMS = [
|
|
|
225
224
|
[[0, 0, 1, -1, 0, 0], [0, 0, 1, 0, 0, 0], 0.0188, 0.0523],
|
|
226
225
|
[[0, 2, -2, 0, 0, 0], [0, 0, 1, 0, 0, 0], -0.0421, -0.0340],
|
|
227
226
|
[[0, 0, 1, -1, 0, 0], [0, 0, -1, 0, 0, 0], -0.0353, -0.0379],
|
|
228
|
-
//
|
|
227
|
+
// The Venus–Earth term 8λ_V − 13λ_E (≈239 yr on the banked
|
|
229
228
|
// carriers): a CONSTANT row, derived on the model's own run over ±3100 yr
|
|
230
229
|
// (i3-long-period-dalembert.mjs `2 20000 3100 4`; the I2 row read 1.84/0.14″
|
|
231
230
|
// on the record carriers over −5100..+1100). The term is formally FIFTH order
|
|
@@ -394,13 +393,9 @@ function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy, e
|
|
|
394
393
|
return { sunPlanetaryCompletionDeg };
|
|
395
394
|
}
|
|
396
395
|
|
|
397
|
-
/*
|
|
398
|
-
*
|
|
399
|
-
* (
|
|
400
|
-
* — is retired with the comb. The comb left every Sun path at plan 06 R4, so
|
|
401
|
-
* the residual the table was derived from is the certified Sun's; the table
|
|
402
|
-
* stands (fidelity 0.616″, 70 terms) and the carrier-rate pair below remains
|
|
403
|
-
* its enforced matched pair.) */
|
|
396
|
+
/* The table was derived from the certified Sun's residual and stands (fidelity
|
|
397
|
+
* 0.616″, 70 terms); the carrier-rate pair below is its enforced matched pair.
|
|
398
|
+
* (The retired paired-harmonics fingerprint: doc 109 §23.) */
|
|
404
399
|
|
|
405
400
|
/** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
|
|
406
401
|
* full-precision carrier rates (deg/cy TT) the tables pair with: since plan
|
package/src/index.js
CHANGED
|
@@ -108,7 +108,10 @@ export { DEG2RAD, RAD2DEG, ARCSEC_PER_TURN, ARCSEC_PER_RAD, wrap360, wrap180, wr
|
|
|
108
108
|
// cited Moon-distance history, the ΔT cycle stack, |s₃|, the LOD/ΔT core, the
|
|
109
109
|
// lunar month chain and the mean*AtAge family, assembled ONCE from the
|
|
110
110
|
// generated constants; the Node twin and the browser destructure it.
|
|
111
|
-
export { createDeepTimeChain
|
|
111
|
+
export { createDeepTimeChain } from './deltat/deep-time-chain.js';
|
|
112
|
+
// The lunar perigee/node eccentricity sensitivities — the Meeus-effective pair, the physical pair's
|
|
113
|
+
// derivation and the Meeus Ch. 47 argument rates, ONE home (plan 23).
|
|
114
|
+
export { MOON_ECC_SENSITIVITY_PERIGEE, MOON_ECC_SENSITIVITY_NODE, deriveMoonEccSensitivities, MEEUS_ARGUMENT_RATES_DEG_PER_CY } from './moon/ecc-sensitivities.cjs';
|
|
112
115
|
// The J2000 mass chain, the Moon's J2000 periods and the unit constants — ONE home.
|
|
113
116
|
export { computeMassChainJ2000, computeMoonPeriodsJ2000 } from './earth/mass-chain.cjs';
|
|
114
117
|
export { SECONDS_PER_DAY, DAYS_PER_JULIAN_YEAR, JULIAN_CENTURY_DAYS, SECONDS_PER_JULIAN_YEAR } from './constants/units.cjs';
|
|
@@ -57,7 +57,7 @@ export function assembleCardinalInstants(ctx) {
|
|
|
57
57
|
const CARDINAL_SI_YEAR_D = 365.2422;
|
|
58
58
|
/** The crossing NEAREST a seed instant — the unique root within ±½ tropical
|
|
59
59
|
* year of the seed (the wrapped longitude difference is the Newton residual).
|
|
60
|
-
*
|
|
60
|
+
* The seed is a JD because the caller's year may live on a
|
|
61
61
|
* different axis than the model year — the simulator's cardinal panel
|
|
62
62
|
* labels its year with the displayed CALENDAR date (the Julian calendar
|
|
63
63
|
* before 1582, 365.25-d years) while `year` below is the model year (the SI
|
|
@@ -79,13 +79,12 @@ export function assembleCardinalInstants(ctx) {
|
|
|
79
79
|
/** The TRUE-UT JD at which the APPARENT Sun's longitude of date equals
|
|
80
80
|
* the cardinal target in the given year — Newton on the crossing (the
|
|
81
81
|
* Sun's rate 360°/tropical year; a handful of steps from the tropical-year
|
|
82
|
-
* seed).
|
|
83
|
-
* item 2: the Newton root lives on the FINDER axis (the curve-only ΔT the
|
|
82
|
+
* seed). The Newton root lives on the FINDER axis (the curve-only ΔT the
|
|
84
83
|
* eclipse finders certify), and the returned instant is that root minus the
|
|
85
84
|
* deltaTStart bridge — true UT = TT − (deltaTStart + curve), the same
|
|
86
85
|
* bridge the besselian and the registry instruments apply. Before this the
|
|
87
86
|
* published instants were 54.55 s (0.9 min) late. Against Horizons over
|
|
88
|
-
* ±3000 yr the remaining offset is the Sun's (
|
|
87
|
+
* ±3000 yr the remaining offset is the Sun's (measured).
|
|
89
88
|
* `year` is the MODEL year (the SI axis) — see cardinalCrossingNearJdUT.
|
|
90
89
|
* @param {number} year @param {string} type @returns {number} */
|
|
91
90
|
const cardinalCrossingJdUT = (year, type) => {
|
|
@@ -12,8 +12,8 @@ import { DEEP_MODES_ARTIFACT } from '../moon/deep-modes-artifact.cjs';
|
|
|
12
12
|
export function assembleDeepTimeChain(ctx) {
|
|
13
13
|
const { C, F, late, startmodelYear } = ctx;
|
|
14
14
|
// The GIA α channel (the lagged response to the L1 ice history, with the R2
|
|
15
|
-
//
|
|
16
|
-
// Earth–Moon distance history
|
|
15
|
+
// pin and the exact-argument memo), the Layer-0 bundle, the cited
|
|
16
|
+
// Earth–Moon distance history, the ΔT cycle stack (all
|
|
17
17
|
// channels ON here), |s₃|, the LOD/ΔT core and the lunar month chain are
|
|
18
18
|
// assembled once in deltat/deep-time-chain.js from this context's constants
|
|
19
19
|
// and fitted coefficients (so a counterfactual context flows through them);
|
|
@@ -39,7 +39,7 @@ export function assembleDeepTimeChain(ctx) {
|
|
|
39
39
|
* integration actually turns the pole at: the inertial secular rate of date × the solar-torque factor at
|
|
40
40
|
* e(t) × J₂(t)/J₂₀ × cos ε(t)/cos ε₀ (ds/dt = α (ŝ·n̂)(ŝ×n̂): the azimuthal rate about n̂ is α cos ε).
|
|
41
41
|
* The secular rate here is the CONSTANT's scaling (lunisolarTorqueRate…), not the published rate of
|
|
42
|
-
* date: the hybrid's own ε(t) carries the ONE cosine, so the cited mean obliquity's factor
|
|
42
|
+
* date: the hybrid's own ε(t) carries the ONE cosine, so the cited mean obliquity's factor
|
|
43
43
|
* does not enter twice — inside the ζ-series span the hybrid IS the model's obliquity of date.
|
|
44
44
|
* Measured (2026-10): the dominant obliquity line of the model's own ε(t) over the last 5 Myr sits at
|
|
45
45
|
* this mean minus |s₃| (40,938 fitted vs 40,936 predicted), NOT at the J2000 beat (41,098) — the pole
|
|
@@ -23,7 +23,7 @@ export function assembleLunarTheory(ctx) {
|
|
|
23
23
|
// tools/verify/eclipse-audit.js (finders). Deep-time and framework-native
|
|
24
24
|
// are hardwired ON here: they are the shipped defaults; the A/B env
|
|
25
25
|
// toggles (SG_DEEP_TIME/MOON_ARGS_PURE_MEEUS) stay an engine concern.
|
|
26
|
-
const j2000JD = J2000_JD; // ONE home: constants/units
|
|
26
|
+
const j2000JD = J2000_JD; // ONE home: constants/units
|
|
27
27
|
const julianCenturyDays = JULIAN_CENTURY_DAYS;
|
|
28
28
|
|
|
29
29
|
// J2000 Moon precession anchors (the IAU inputs themselves). The
|
|
@@ -50,7 +50,7 @@ export function assembleLunarTheory(ctx) {
|
|
|
50
50
|
// Float64Array tables key correctly and persist.
|
|
51
51
|
const chainCycles = createChainCycleIntegrator({
|
|
52
52
|
ageAnchorYear: startmodelYear,
|
|
53
|
-
tropicalYearJ2000Seconds: meanTropicalYearJ2000Seconds, // the SI tick
|
|
53
|
+
tropicalYearJ2000Seconds: meanTropicalYearJ2000Seconds, // the SI tick
|
|
54
54
|
isDeepTime: () => true,
|
|
55
55
|
});
|
|
56
56
|
/** @param {number} tMa @returns {number|null} */
|
|
@@ -72,7 +72,7 @@ export function assembleLunarTheory(ctx) {
|
|
|
72
72
|
const mcAnomalistic = (a, b) => chainCycles.cyclesBetween(anomalisticMonthPeriodFn, a, b);
|
|
73
73
|
/** @param {number} a @param {number} b @returns {number|null} */
|
|
74
74
|
const mcJupiter = (a, b) => chainCycles.cyclesBetween(jupiterPeriodFn, a, b);
|
|
75
|
-
/** The Moon's sidereal (star-referenced) orbits — the series' A3 argument
|
|
75
|
+
/** The Moon's sidereal (star-referenced) orbits — the series' A3 argument. @param {number} a @param {number} b @returns {number|null} */
|
|
76
76
|
const mcSidereal = (a, b) => chainCycles.cyclesBetween(siderealMonthPeriodFn, a, b);
|
|
77
77
|
/** @param {number} a @param {number} b @returns {number|null} */
|
|
78
78
|
const mcApsidalOfDate = (a, b) => {
|
|
@@ -98,6 +98,8 @@ export function assembleLunarTheory(ctx) {
|
|
|
98
98
|
elpGeneralPrecessionPA_T2ArcsecPerCy2: C.moonMeeus.elpW1T2Decomposition_arcsecPerCy2.generalPrecessionPA_T2_Lieske1976,
|
|
99
99
|
// Decision (ii): the lunar chain reads ONE deep e end to end
|
|
100
100
|
eccE0: deepEcc.e0,
|
|
101
|
+
// plan 23: the perigee/node sensitivities — the chain's derived pair (ONE home)
|
|
102
|
+
moonEccSensitivities: chain.moonEccSensitivities,
|
|
101
103
|
},
|
|
102
104
|
fns: {
|
|
103
105
|
eccAt: /** @param {number} tYr */ (tYr) => deepEcc.eccAt(tYr),
|
|
@@ -191,8 +193,7 @@ export function assembleLunarTheory(ctx) {
|
|
|
191
193
|
// against the MODEL-START anchor (startmodelYear, the browser's
|
|
192
194
|
// J2000_CALENDAR_YEAR — NOT this model's 2000.0 yearToTMa convention:
|
|
193
195
|
// the 0.5-yr difference is 4.95e-11 of distance and failed the
|
|
194
|
-
// bit-exact parity gate
|
|
195
|
-
// from the anchor, both twins alike). Falls back to the J2000 constant
|
|
196
|
+
// bit-exact parity gate). Falls back to the J2000 constant
|
|
196
197
|
// without a jd (legacy call shape) or past the domain.
|
|
197
198
|
getMoonDistanceKm: /** @param {number} [jdTT] */ (jdTT) => {
|
|
198
199
|
if (jdTT === undefined) return moonDistanceKm;
|
|
@@ -32,8 +32,8 @@ export function assembleOneSourceMovement(ctx) {
|
|
|
32
32
|
// path; the npm package alone has no 8 MB series), the movement runs the
|
|
33
33
|
// SERIES tier exactly like the browser — killing the mode-vs-series
|
|
34
34
|
// value split (measured: 6 s on the anomalistic year at J2000).
|
|
35
|
-
// The ONE-SOURCE movement: the hybrid's ε(t) (
|
|
36
|
-
//
|
|
35
|
+
// The ONE-SOURCE movement: the hybrid's ε(t) (THE published obliquity) and
|
|
36
|
+
// the one-family year lengths, on the same
|
|
37
37
|
// per-tier sampler.
|
|
38
38
|
const oneSourceM = (() => {
|
|
39
39
|
const AEarth = /** @type {any} */ (CHAIN_ARTIFACT).j2000AnchorElements.earth;
|
|
@@ -47,7 +47,7 @@ export function assembleOneSourceMovement(ctx) {
|
|
|
47
47
|
// 108.6 ± 8.5).
|
|
48
48
|
const seriesArt = /** @type {any} */ (secularSeriesArtifact);
|
|
49
49
|
const sb = seriesArt && seriesArt.bodies && seriesArt.bodies.earth;
|
|
50
|
-
//
|
|
50
|
+
// The hybrid's own domain is the banked ζ series' span (years; null
|
|
51
51
|
// without a series). Beyond it the ζ-mode tail carries the Quaternary mean with no tidal
|
|
52
52
|
// evolution — the API refuses the obliquity there and serves the cited mean beside it.
|
|
53
53
|
const obliquityHybridDomainYears = sb
|
|
@@ -73,13 +73,13 @@ export function assembleOneSourceMovement(ctx) {
|
|
|
73
73
|
obliquityJ2000Deg: C.earthOrbital.obliquityJ2000_deg,
|
|
74
74
|
// The CONSTANT's scaling (the torque period), not the published rate of date: the
|
|
75
75
|
// integration's own ŝ·n̂ carries the obliquity's cosine, so the cited mean obliquity's
|
|
76
|
-
// factor
|
|
76
|
+
// factor must not enter twice.
|
|
77
77
|
axialPrecessionYearsAtYearFn: (yr) => deepLod.lunisolarTorquePeriodYearsAtAge((startmodelYear - yr) / 1e6) ?? axial0,
|
|
78
78
|
// THE PRECESSION OF DATE: on top of the secular law above, the solar
|
|
79
79
|
// torque at the eccentricity of date and the oblateness of date from
|
|
80
80
|
// the GIA channel — both exactly 1 at J2000, so the J2000 anchor is
|
|
81
81
|
// untouched. The channel is
|
|
82
|
-
// read PURE (alphaGia, not the
|
|
82
|
+
// read PURE (alphaGia, not the pinned earthMoiFactorAtAge):
|
|
83
83
|
// the samplers are cached, their values must be pure in year.
|
|
84
84
|
solarTorqueShareJ2000: EPOCH_PARAMS.precessionSolarShareJ2000,
|
|
85
85
|
// options.giaEllipticityOfDate === false: the orbital forcing alone (the T1 line derivation).
|
|
@@ -100,7 +100,7 @@ export function assembleOneSourceMovement(ctx) {
|
|
|
100
100
|
if (need > 2000000) {
|
|
101
101
|
// The deep tier (5000-yr grid): walked in the queried DIRECTION only,
|
|
102
102
|
// to two nodes past the query, and EXTENDED by the factory's shared
|
|
103
|
-
// walk when a deeper epoch arrives
|
|
103
|
+
// walk when a deeper epoch arrives. It was built to
|
|
104
104
|
// ±1.25·|t| in both directions and rebuilt from J2000 on every deeper
|
|
105
105
|
// probe — bit-identical values, 4× the RK4 steps of one walk.
|
|
106
106
|
const span = Math.ceil((Math.abs(t) + 2 * 5000) / 5000) * 5000;
|
|
@@ -127,7 +127,7 @@ export function assembleOneSourceMovement(ctx) {
|
|
|
127
127
|
periOfDateDegAt: (year) => sampleAt(year).periOfDateDeg,
|
|
128
128
|
/** 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} */
|
|
129
129
|
epsAt: (year) => sampleAt(year).epsDeg,
|
|
130
|
-
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span
|
|
130
|
+
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span; null without a series. */
|
|
131
131
|
obliquityHybridDomainYears,
|
|
132
132
|
/** 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}} */
|
|
133
133
|
precessionOfDateFactorsAt: (year) => hist.precessionOfDateFactorsAt(year - 2000),
|
|
@@ -139,7 +139,7 @@ export function assembleOneSourceMovement(ctx) {
|
|
|
139
139
|
})();
|
|
140
140
|
const yearLengthsM = oneSourceM.yearLengths;
|
|
141
141
|
/** THE one-family tropical year of date in SI seconds: route B inside the
|
|
142
|
-
* one-family window, the tidal-chain year beyond (
|
|
142
|
+
* one-family window, the tidal-chain year beyond (the Sun's
|
|
143
143
|
* mean longitude, the cardinal instants and the published year lengths
|
|
144
144
|
* all ride this one function). @param {number} year @returns {number} */
|
|
145
145
|
const oneFamilyTropicalYearSeconds = (year) => (Math.abs(year - 2000) <= ONE_FAMILY_WINDOW_YEARS
|
|
@@ -45,10 +45,10 @@ export function assemblePlanetRecords(ctx) {
|
|
|
45
45
|
const gArc = chainModes.g[k] && chainModes.g[k].arcsecPerYr;
|
|
46
46
|
const sArc = chainModes.s[k] && chainModes.s[k].arcsecPerYr;
|
|
47
47
|
PUBLISHED_PLANET_RECORDS[k] = Object.freeze({
|
|
48
|
-
name: PLANET_DISPLAY_NAMES[k], // presentation — planets/display-names
|
|
48
|
+
name: PLANET_DISPLAY_NAMES[k], // presentation — planets/display-names
|
|
49
49
|
orbitalPeriodInputDays: ar.orbitalPeriodInputDays,
|
|
50
50
|
longitudePerihelion: ar.longitudePerihelion,
|
|
51
|
-
ascendingNodeInvPlane: ar.ascendingNodeInvPlaneClosedForm, // the closed-form verified J2000 node
|
|
51
|
+
ascendingNodeInvPlane: ar.ascendingNodeInvPlaneClosedForm, // the closed-form verified J2000 node (astro-reference)
|
|
52
52
|
invPlaneInclinationJ2000: ar.invPlaneInclinationJ2000,
|
|
53
53
|
orbitalEccentricityJ2000: ar.orbitalEccentricityJ2000,
|
|
54
54
|
axialTiltJ2000: ar.axialTiltJ2000,
|
|
@@ -8,7 +8,7 @@ import { ONE_FAMILY_WINDOW_YEARS } from '../earth/year-lengths.cjs';
|
|
|
8
8
|
/** @param {import('./sun-and-eclipses.js').Ctx} ctx @returns the bindings the later slices read */
|
|
9
9
|
export function assemblePublishedPeriods(ctx) {
|
|
10
10
|
const { certifiedAxialPrecessionJ2000Years, deepLod, yearLengthsM, yearToTMa } = ctx;
|
|
11
|
-
//
|
|
11
|
+
// THE published of-date precession period and mean
|
|
12
12
|
// tropical year: the one-family route (B) inside the banked tiers
|
|
13
13
|
// (|Δyear| ≤ ONE_FAMILY_WINDOW_YEARS), the composed lunisolar period
|
|
14
14
|
// beyond (S5: on the derived J2000 anchor, so the two faces agree at
|
|
@@ -56,7 +56,7 @@ export function assembleSunAndEclipses(ctx) {
|
|
|
56
56
|
const cyclesTo = (year) => {
|
|
57
57
|
const dy = year - 2000;
|
|
58
58
|
const s = dy >= 0 ? 1 : -1, a = Math.abs(dy);
|
|
59
|
-
// WARM THE SAMPLER TO THE TARGET FIRST (
|
|
59
|
+
// WARM THE SAMPLER TO THE TARGET FIRST (measured): the
|
|
60
60
|
// table below grows outward in 1-yr / 100-yr steps, and every step
|
|
61
61
|
// beyond ~1.6 Myr enlarged the one-family sampler's >2-Myr tier just
|
|
62
62
|
// past its span, rebuilding the whole deep integration about every 32
|
|
@@ -131,7 +131,7 @@ export function assembleSunAndEclipses(ctx) {
|
|
|
131
131
|
* (648000 / Math.PI);
|
|
132
132
|
// FQ-5 N3 — the completion's carriers are FRAMEWORK-derived from the
|
|
133
133
|
// model's own planet period records (the Moon-elongation rate from the
|
|
134
|
-
// sidereal month/year identity).
|
|
134
|
+
// sidereal month/year identity). The carriers are SIDEREAL
|
|
135
135
|
// (measured): the records' orbitalPeriodInputDays are OF-DATE periods (their
|
|
136
136
|
// rates sit +1.39..1.62°/cy above the VSOP sidereal mean motions — the
|
|
137
137
|
// framework precession plus input rounding), and a perturbation argument
|
|
@@ -169,7 +169,7 @@ export function assembleSunAndEclipses(ctx) {
|
|
|
169
169
|
},
|
|
170
170
|
sunLonDegAt: /** @param {number} jdUT */ (jdUT) => eclipseFinders.sunLonDegAt(jdUT),
|
|
171
171
|
sunCompletionDeg: sunPlanetaryCompletionDeg,
|
|
172
|
-
//
|
|
172
|
+
// The location tier on APPARENT places — the Sun's derived κ
|
|
173
173
|
// (the same helper the cardinal instants use), the Moon's relative light-time
|
|
174
174
|
// inside the besselian; the series-extension tail now lives in sceneEvalAt.
|
|
175
175
|
sunAberrationDegAt: /** @param {number} year */ (year) => late.sunAberrationArcsecAt(year) / 3600,
|
package/src/model/surface.js
CHANGED
|
@@ -94,7 +94,7 @@ export function assembleSurface(ctx) {
|
|
|
94
94
|
// one-family inside the window, the tidal-chain mean beyond.
|
|
95
95
|
tropicalYearSecondsAtYear: publishedTropicalYearSecondsAtYear,
|
|
96
96
|
}),
|
|
97
|
-
//
|
|
97
|
+
// The lunisolar precession clock as a
|
|
98
98
|
// first-class surface: Earth's spin clock, ONE home for its published
|
|
99
99
|
// faces, spoken in PERIODS and their RATIOS — no unit, no integer.
|
|
100
100
|
// ONE J2000 reading: every face reads 25,771.6 yr at J2000 — the
|
|
@@ -108,7 +108,7 @@ export function assembleSurface(ctx) {
|
|
|
108
108
|
lunisolar: Object.freeze({
|
|
109
109
|
/** The mean lunisolar precession period T_p(t), years — 1,296,000/the precession RATE of date (25,771.6 at J2000): THE published deep-time clock. @param {number} year @returns {number} */
|
|
110
110
|
meanPeriodYearsAtYear: (year) => { const p = deepLod.lunisolarPrecessionPeriodYearsAtAge(yearToTMa(year)); return p === null ? certifiedAxialPrecessionJ2000Years() : p; },
|
|
111
|
-
/** THE PRECESSION RATE OF DATE ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³] × cos ε̄(t)/cos ε̄(0), ″/yr — the constant's scaling on the spin and the lunar torque times the cited mean obliquity's cosine (
|
|
111
|
+
/** THE PRECESSION RATE OF DATE ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³] × cos ε̄(t)/cos ε̄(0), ″/yr — the constant's scaling on the spin and the lunar torque times the cited mean obliquity's cosine (p₀ = 50.2880, the IAU 2006 input). @param {number} year @returns {number} */
|
|
112
112
|
meanRateArcsecPerYrAtYear: (year) => { const r = deepLod.lunisolarPrecessionRateArcsecPerYrAtAge(yearToTMa(year)); return r === null ? 1296000 / certifiedAxialPrecessionJ2000Years() : r; },
|
|
113
113
|
/** THE PRECESSION CONSTANT OF DATE as a rate on the J2000 obliquity, ″/yr — the spin and torque scaling alone (the hybrid obliquity integration's integrand: its own ŝ·n̂ carries the cosine). @param {number} year @returns {number} */
|
|
114
114
|
torqueRateArcsecPerYrAtYear: (year) => { const r = deepLod.lunisolarTorqueRateArcsecPerYrAtAge(yearToTMa(year)); return r === null ? 1296000 / certifiedAxialPrecessionJ2000Years() : r; },
|
|
@@ -212,9 +212,9 @@ export function assembleSurface(ctx) {
|
|
|
212
212
|
// its deep mean is the Quaternary mean on the tail's mean plane (plan 12
|
|
213
213
|
// §8.3). The cited mean obliquity of date is `meanObliquityCitedDeg`.
|
|
214
214
|
obliquityDeg: /** @param {number} year @returns {number} */ (year) => oneSourceM.epsAt(year),
|
|
215
|
-
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span, ±10 Myr about J2000 (
|
|
215
|
+
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span, ±10 Myr about J2000 (the published surfaces serve `obliquityDeg` inside it only; null without a series, i.e. a bare createModel()). */
|
|
216
216
|
obliquityHybridDomainYears: oneSourceM.obliquityHybridDomainYears,
|
|
217
|
-
/** The cited mean obliquity of date ε̄(t) (Farhat et al. 2022's column
|
|
217
|
+
/** The cited mean obliquity of date ε̄(t) (Farhat et al. 2022's column), degrees — a Myr-scale mean; NaN beyond 4,429 Ma. @param {number} year @returns {number} */
|
|
218
218
|
meanObliquityCitedDeg: /** @param {number} year @returns {number} */ (year) => { const e = chain.meanObliquityCitedDegAtAge(yearToTMa(year)); return e === null ? NaN : e; },
|
|
219
219
|
eccentricity: eccentricityAt,
|
|
220
220
|
inclinationDeg,
|
|
@@ -234,7 +234,7 @@ export function assembleSurface(ctx) {
|
|
|
234
234
|
siderealDaySeconds,
|
|
235
235
|
stellarDaySeconds,
|
|
236
236
|
}),
|
|
237
|
-
//
|
|
237
|
+
// The instants are the crossings of the ONE Sun (the
|
|
238
238
|
// certified completed Sun the scene renders), UT model-JD; the RA at a
|
|
239
239
|
// crossing is the target longitude by construction (λ = 0/90/180/270 ⇒
|
|
240
240
|
// RA = 0/90/180/270, any obliquity); the per-type year length is the
|
|
@@ -266,6 +266,10 @@ export function assembleSurface(ctx) {
|
|
|
266
266
|
distanceKmAtYear: /** @param {number} year @returns {number} */ (year) => moonDistanceKmAtYearOrNaN(year),
|
|
267
267
|
siderealMonthDaysAtYear: moonSiderealMonthDaysAt,
|
|
268
268
|
synodicMonthDays: moonSynodicMonthDays,
|
|
269
|
+
// The perigee/node eccentricity sensitivities (plan 23): the Meeus-effective
|
|
270
|
+
// pair the record fixes and the PHYSICAL pair the runtime derives from it
|
|
271
|
+
// (moon/ecc-sensitivities.cjs, the ONE home) — the registry's source.
|
|
272
|
+
eccSensitivities: chain.moonEccSensitivities,
|
|
269
273
|
// The apparent-position chain (truncated Meeus Ch. 47 series on
|
|
270
274
|
// framework-native arguments). JD(UT) axis — UT→TT applied internally.
|
|
271
275
|
lonDegAtJD: /** @param {number} jd @returns {number} */ (jd) => moonSeries.truncatedLonDeg(jd),
|
|
@@ -288,7 +292,7 @@ export function assembleSurface(ctx) {
|
|
|
288
292
|
sunLonCompletedDegAtJD: /** @param {number} jd @returns {number} */ (jd) =>
|
|
289
293
|
eclipseFinders.sunLonDegAt(jd)
|
|
290
294
|
- sunPlanetaryCompletionDeg((jdTTFromUT(jd) - j2000JD) / julianCenturyDays),
|
|
291
|
-
/** The APPARENT Sun (completed geometric − the derived aberration constant + the leading nutation terms on the model's own arguments) — the quantity Horizons' observer ecliptic longitude is; the cardinal instants are its crossings
|
|
295
|
+
/** The APPARENT Sun (completed geometric − the derived aberration constant + the leading nutation terms on the model's own arguments) — the quantity Horizons' observer ecliptic longitude is; the cardinal instants are its crossings. @param {number} jdUT @returns {number} */
|
|
292
296
|
sunApparentLonDegAtJD: /** @param {number} jdUT @returns {number} */ (jdUT) => sunApparentLonDegAtJdUT(jdUT),
|
|
293
297
|
findLunarInRange: /** @param {number} jdStart @param {number} jdEnd */ (jdStart, jdEnd) => eclipseFinders.findLunarEclipsesInRange(jdStart, jdEnd),
|
|
294
298
|
findSolarInRange: /** @param {number} jdStart @param {number} jdEnd */ (jdStart, jdEnd) => eclipseFinders.findSolarEclipsesInRange(jdStart, jdEnd),
|
package/src/moon/arguments.cjs
CHANGED
|
@@ -20,8 +20,12 @@
|
|
|
20
20
|
* with p the IAU general precession.
|
|
21
21
|
*
|
|
22
22
|
* Construction (docs/66 §1, abridged): linear rates are observational J2000
|
|
23
|
-
* anchors; perigee/node ride the PHASE-AWARE e_E channel integral
|
|
24
|
-
* 2.
|
|
23
|
+
* anchors; perigee/node ride the PHASE-AWARE e_E channel integral on the
|
|
24
|
+
* PHYSICAL sensitivities (s_ϖ 2.479 / s_Ω 0.867 — derived from the
|
|
25
|
+
* Meeus-effective 2.407 / 1.018 by removing the frame's T²;
|
|
26
|
+
* moon/ecc-sensitivities.cjs, the ONE home) plus the model's own precession
|
|
27
|
+
* of date, pFix, the ONE frame term every of-date longitude carries (plan 23
|
|
28
|
+
* — so M′ and F are frame-free at every epoch); Lp's planetary T² remainder rides
|
|
25
29
|
* the bounded e_E² carrier + the obliquity-line carrier (K_PL derived
|
|
26
30
|
* lazily from the closed v4 budget — zero new constants); D and M are
|
|
27
31
|
* identity-composed (D ≡ Lp − L_sun, M ≡ L_sun − ϖ_sun) on the injected
|
|
@@ -37,6 +41,8 @@
|
|
|
37
41
|
// reform). ONE home — time/calendar.cjs; re-exported here for the readers
|
|
38
42
|
// that import it from the arguments module.
|
|
39
43
|
const { jdToDecimalYear } = require('../time/calendar.cjs');
|
|
44
|
+
// The Meeus Ch. 47 argument rates — ONE home (plan 23; the sensitivities' derivation reads the same set).
|
|
45
|
+
const { MEEUS_ARGUMENT_RATES_DEG_PER_CY } = require('./ecc-sensitivities.cjs');
|
|
40
46
|
|
|
41
47
|
/**
|
|
42
48
|
* @typedef {{Lp: number, D: number, M: number, Mp: number, F: number}} MoonArgsDeg
|
|
@@ -59,6 +65,7 @@ const SECULAR_COMPLETION_TAPER_YEARS = 27943.083333333332;
|
|
|
59
65
|
* elpEarthFigureJ2ArcsecPerCy2: number,
|
|
60
66
|
* elpGeneralPrecessionPA_T2ArcsecPerCy2: number,
|
|
61
67
|
* eccE0: number,
|
|
68
|
+
* moonEccSensitivities: ReturnType<typeof import('./ecc-sensitivities.cjs').deriveMoonEccSensitivities>,
|
|
62
69
|
* },
|
|
63
70
|
* fns: {
|
|
64
71
|
* eccAt: (tYr: number) => number,
|
|
@@ -94,8 +101,9 @@ function createMoonArguments({ constants, fns }) {
|
|
|
94
101
|
j2000JD, julianCenturyDays,
|
|
95
102
|
eccentricityJ2000, eccentricityDotJ2000, eccentricityDotDotJ2000,
|
|
96
103
|
elpEarthFigureJ2ArcsecPerCy2, elpGeneralPrecessionPA_T2ArcsecPerCy2,
|
|
97
|
-
eccE0,
|
|
104
|
+
eccE0, moonEccSensitivities,
|
|
98
105
|
} = constants;
|
|
106
|
+
if (!moonEccSensitivities) throw new Error('moon/arguments: constants.moonEccSensitivities is required (the deep-time chain\'s derived pair — plan 23)');
|
|
99
107
|
const {
|
|
100
108
|
eccAt, channelIntegral, computeObliquityEarth, jdToSIyear,
|
|
101
109
|
sunMeanLonDegAtJdTT, sunPerihelionLonDegAtJdTT,
|
|
@@ -108,17 +116,26 @@ function createMoonArguments({ constants, fns }) {
|
|
|
108
116
|
const bundle = (() => {
|
|
109
117
|
const LP0 = 218.3164477, D0 = 297.8501921, M0 = 357.5291092,
|
|
110
118
|
MP0 = 134.9633964, F0 = 93.2720950;
|
|
111
|
-
const
|
|
112
|
-
MPR = 477198.8675055, FR = 483202.0175233;
|
|
119
|
+
const { Lp: LPR, D: DR, M: MR, Mp: MPR, F: FR } = MEEUS_ARGUMENT_RATES_DEG_PER_CY; // ONE home (plan 23)
|
|
113
120
|
const WDOT = LPR - MPR; // perigee ϖ̇ of-date (+4069.0137) = ϖ̇_ICRF + p
|
|
114
121
|
const NDOT = LPR - FR; // node Ω̇ of-date (−1934.1363) = Ω̇_ICRF + p
|
|
115
122
|
// e_E channel Taylor CHECKS (documented J2000 reference values — the live
|
|
116
123
|
// path is the phase-aware channelIntegral; T2_*/T3_* are NOT consumed):
|
|
117
124
|
const E0 = eccentricityJ2000, EDOT0 = eccentricityDotJ2000;
|
|
118
125
|
const KAPPA = 3 * E0 * EDOT0 / (1 - E0 * E0);
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
|
|
126
|
+
// The sensitivities (plan 23; moon/ecc-sensitivities.cjs, the ONE home). The
|
|
127
|
+
// Meeus-EFFECTIVE pair S_W/S_N reproduces Meeus's of-date T² exactly — the
|
|
128
|
+
// documented check below. The live channel runs the PHYSICAL pair
|
|
129
|
+
// S_W_PHYS/S_N_PHYS (the frame's T² removed; the three-body lab's pure-gravity
|
|
130
|
+
// values) on the ICRF rates W_ICRF/N_ICRF, and the frame rides separately:
|
|
131
|
+
// the Meeus polynomial p₀·T + T2F·T² in the snapshot branch (so its T² is
|
|
132
|
+
// Meeus-exact as before), the model's own precession of date (pFix) in the
|
|
133
|
+
// deep branch — ONE frame term on L′, ϖ and Ω alike.
|
|
134
|
+
const SENS = moonEccSensitivities;
|
|
135
|
+
const S_W = SENS.perigeeEffective, S_N = SENS.nodeEffective;
|
|
136
|
+
const S_W_PHYS = SENS.perigeePhysical, S_N_PHYS = SENS.nodePhysical;
|
|
137
|
+
const W_ICRF = SENS.perigeeRateIcrfDegPerCy, N_ICRF = SENS.nodeRateIcrfDegPerCy;
|
|
138
|
+
const P0 = SENS.generalPrecessionDegPerCy, T2F = SENS.frameT2DegPerCy2;
|
|
122
139
|
const T2_W = S_W * WDOT * KAPPA / 2; // −0.010318 °/cy² (Meeus ϖ −0.010320)
|
|
123
140
|
const T2_N = S_N * NDOT * KAPPA / 2; // +0.0020752 °/cy² (Meeus Ω +0.0020753)
|
|
124
141
|
const EDDOT0 = eccentricityDotDotJ2000;
|
|
@@ -130,7 +147,7 @@ function createMoonArguments({ constants, fns }) {
|
|
|
130
147
|
const T2_LP_TIDAL = (-25.86 / 3600) / 2;
|
|
131
148
|
const T2_LP_PLANETARY = -0.0015786 - T2_LP_TIDAL; // +7.247″/cy²
|
|
132
149
|
const T2_LP = T2_LP_TIDAL + T2_LP_PLANETARY;
|
|
133
|
-
return { LP0, D0, M0, MP0, F0, LPR, DR, MR, WDOT, NDOT, T2_W, T2_N, T3_W, T3_N, T2_LP, T2_LP_TIDAL, S_W, S_N };
|
|
150
|
+
return { LP0, D0, M0, MP0, F0, LPR, DR, MR, WDOT, NDOT, T2_W, T2_N, T3_W, T3_N, T2_LP, T2_LP_TIDAL, S_W, S_N, S_W_PHYS, S_N_PHYS, W_ICRF, N_ICRF, P0, T2F };
|
|
134
151
|
})();
|
|
135
152
|
|
|
136
153
|
// ── Bounded Lp carriers (K_PL / C_OBL derived lazily — zero new constants)
|
|
@@ -235,6 +252,23 @@ function createMoonArguments({ constants, fns }) {
|
|
|
235
252
|
}
|
|
236
253
|
const obliquityCarrier = makeDeepCarrier(obliquityIntegrand, obliquityCarrierDense);
|
|
237
254
|
|
|
255
|
+
/** The frame share's REMAINDER for ϖ and Ω (plan 23). The physical exponents gave
|
|
256
|
+
* up the frame's T² the Meeus-effective pair carried (T2F, Lieske's); pFix
|
|
257
|
+
* supplies the model's own in-window acceleration (ṗΔ_eff/2, self-measured);
|
|
258
|
+
* the difference rides the obliquity carrier's integrand, exactly as L′'s
|
|
259
|
+
* figure+frame part does — so every of-date longitude's T² stays Meeus-exact
|
|
260
|
+
* and ONE frame term (pFix + this remainder) rides L′, ϖ and Ω alike. Bounded
|
|
261
|
+
* (the obliquity cycle), ~0.1° at most. Without the (d′) pair (pdSlope 0) the
|
|
262
|
+
* whole Lieske share rides here and pFix is 0 — the same frame, one carrier.
|
|
263
|
+
* @param {number} T @returns {number} */
|
|
264
|
+
function frameRemainder(T) {
|
|
265
|
+
if (T === 0) return 0;
|
|
266
|
+
const pdHalf = rateCompInit().pdSlopeDegPerCy2 / 2;
|
|
267
|
+
const t2Obl = (elpEarthFigureJ2ArcsecPerCy2 + elpGeneralPrecessionPA_T2ArcsecPerCy2) / 3600 - pdHalf; // L′'s carrier normalization (oblInit)
|
|
268
|
+
const t2Rem = bundle.T2F - pdHalf;
|
|
269
|
+
return t2Obl === 0 ? 0 : obliquityCarrier(T) * (t2Rem / t2Obl);
|
|
270
|
+
}
|
|
271
|
+
|
|
238
272
|
// ── Secular-ë completion carrier (ṅ campaign, plan §12i item 0 (c)) ──────
|
|
239
273
|
// The certified snapshot's Lp T³/T⁴ tail is DERIVED physics (v4 D3,
|
|
240
274
|
// tools/explore/v4-d3-tails.js): the Adams–Laplace channel's curvature
|
|
@@ -446,18 +480,22 @@ function createMoonArguments({ constants, fns }) {
|
|
|
446
480
|
if (Ntrop === null || Naps === null || Nnod === null) return null; // tidal-lock guard
|
|
447
481
|
const Tj = (jd - j2000JD) / julianCenturyDays;
|
|
448
482
|
const dy = y - argsY0;
|
|
449
|
-
//
|
|
450
|
-
//
|
|
451
|
-
//
|
|
452
|
-
//
|
|
453
|
-
//
|
|
454
|
-
//
|
|
455
|
-
//
|
|
456
|
-
|
|
483
|
+
// ONE equinox for the three of-date longitudes (plan 23): pFix = ∫(p_dyn − p_kin),
|
|
484
|
+
// the model's own precession of date beyond the chains' kinematic mean, rides
|
|
485
|
+
// L′, ϖ AND Ω alike, so the frame-free arguments M′ = L′ − ϖ and F = L′ − Ω
|
|
486
|
+
// cancel it exactly at every epoch. The apsidal/nodal chains run the PHYSICAL
|
|
487
|
+
// exponents (the frame's T² is no longer frozen inside them); the Lieske share
|
|
488
|
+
// they gave up minus pFix's in-window T² rides the obliquity carrier as
|
|
489
|
+
// frameRemainder, as L′'s figure+frame part does, so ϖ and Ω stay Meeus-exact
|
|
490
|
+
// in T²; the tapered rate anchors self-measure. (Before plan 23 pFix rode L′ only while the chains
|
|
491
|
+
// carried the frame share in the Meeus-effective exponents: in the window the
|
|
492
|
+
// two agreed to 0.006″/cy², beyond it M′ and F inherited the whole wobble —
|
|
493
|
+
// measured 2.5° at ±10 kyr, 39° at −1 Myr.)
|
|
494
|
+
const pF = rateCompInit().pFix(dy), fr = frameRemainder(Tj);
|
|
457
495
|
const Lp = A.LP0 + 360 * Ntrop + planetaryCarrier(Tj) + obliquityCarrier(Tj)
|
|
458
496
|
+ lpSecularCompletion(Tj) + pF;
|
|
459
|
-
const w = (A.LP0 - A.MP0) + 360 * Naps;
|
|
460
|
-
const om = (A.LP0 - A.F0) - 360 * Nnod;
|
|
497
|
+
const w = (A.LP0 - A.MP0) + 360 * Naps + pF + fr; // perigee ϖ (of-date, advance)
|
|
498
|
+
const om = (A.LP0 - A.F0) - 360 * Nnod + pF + fr; // node Ω (of-date, regression)
|
|
461
499
|
const Lsun = sunMeanLonDegAtJdTT(jd); // the certified Sun's mean longitude (unwrapped)
|
|
462
500
|
const ws = sunPerihelionLonDegAtJdTT(jd) + 180; // the Sun's perihelion = Earth's mean ϖ of date + 180° (wrapped; M wraps)
|
|
463
501
|
void A;
|
|
@@ -503,8 +541,13 @@ function createMoonArguments({ constants, fns }) {
|
|
|
503
541
|
const Tc = Math.max(-100, Math.min(100, T));
|
|
504
542
|
const Tc2 = Tc * Tc, Tc3 = Tc2 * Tc, Tc4 = Tc3 * Tc;
|
|
505
543
|
const Lp = A.LP0 + A.LPR * T + A.T2_LP * Tc2 + Tc3 / 538841 - Tc4 / 65194000;
|
|
506
|
-
|
|
507
|
-
|
|
544
|
+
// Perigee and node (of-date), plan 23: the ICRF rate on the PHYSICAL channel
|
|
545
|
+
// exponent plus the Meeus polynomial's frame, p₀·T + T2F·T² (clamped with the
|
|
546
|
+
// other tails) — the T² is Meeus-exact as before, the frame share no longer
|
|
547
|
+
// rides the eccentricity channel's wiggle. The deep branch carries the model's
|
|
548
|
+
// own precession of date (pFix) in its place.
|
|
549
|
+
const w = (A.LP0 - A.MP0) + A.W_ICRF * (T + channelIntegral(T, A.S_W_PHYS)) + A.P0 * T + A.T2F * Tc2; // perigee ϖ (of-date)
|
|
550
|
+
const om = (A.LP0 - A.F0) + A.N_ICRF * (T + channelIntegral(T, A.S_N_PHYS)) + A.P0 * T + A.T2F * Tc2; // node Ω (of-date)
|
|
508
551
|
const Lsun = sunMeanLonDegAtJdTT(jdTT); // the certified Sun's mean longitude of date
|
|
509
552
|
const ws = sunPerihelionLonDegAtJdTT(jdTT) + 180; // the Sun's perihelion of date
|
|
510
553
|
return {
|
|
@@ -520,12 +563,13 @@ function createMoonArguments({ constants, fns }) {
|
|
|
520
563
|
const T2 = T * T, T3 = T2 * T, T4 = T3 * T;
|
|
521
564
|
/** @param {number} x */
|
|
522
565
|
const wrap = (x) => ((x % 360) + 360) % 360;
|
|
566
|
+
const R = MEEUS_ARGUMENT_RATES_DEG_PER_CY; // the rates' ONE home (plan 23)
|
|
523
567
|
return {
|
|
524
|
-
Lp: wrap(218.3164477 +
|
|
525
|
-
D: wrap(297.8501921 +
|
|
526
|
-
M: wrap(357.5291092 +
|
|
527
|
-
Mp: wrap(134.9633964 +
|
|
528
|
-
F: wrap( 93.2720950 +
|
|
568
|
+
Lp: wrap(218.3164477 + R.Lp * T - 0.0015786 * T2 + T3 / 538841 - T4 / 65194000),
|
|
569
|
+
D: wrap(297.8501921 + R.D * T - 0.0018819 * T2 + T3 / 545868 - T4 / 113065000),
|
|
570
|
+
M: wrap(357.5291092 + R.M * T - 0.0001536 * T2 + T3 / 24490000),
|
|
571
|
+
Mp: wrap(134.9633964 + R.Mp * T + 0.0087414 * T2 + T3 / 69699 - T4 / 14712000),
|
|
572
|
+
F: wrap( 93.2720950 + R.F * T - 0.0036539 * T2 - T3 / 3526000 + T4 / 863310000),
|
|
529
573
|
};
|
|
530
574
|
}
|
|
531
575
|
|
|
@@ -12,30 +12,24 @@
|
|
|
12
12
|
* — the constant remainder pins the unresolved short/ultra-long content at
|
|
13
13
|
* the JPL J2000 seed anchor, so e(J2000) is exact by construction.
|
|
14
14
|
*
|
|
15
|
-
* DOMAIN (decision (ii)
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* (moon/ecc-channel.cjs) — a CERTIFICATION split, not a physics one: the
|
|
22
|
-
* two e's agree within 4.2e-5 wherever the domains overlap, and the H/3
|
|
23
|
-
* line keeps its E18 role as the epoch-local tangent inside the fitted
|
|
24
|
-
* clock stack.
|
|
15
|
+
* DOMAIN (decision (ii)): the ENTIRE lunar chain reads THIS channel — eccAt
|
|
16
|
+
* (the Δe² argument terms), channelIntegral (perigee/node of-date rates),
|
|
17
|
+
* modulation (the month/precession chain and its integrated cycle counts),
|
|
18
|
+
* eFactorAt (the Meeus E-factor). Earth's eccentricity of date is the
|
|
19
|
+
* N-body series on every other path as well (plan 21: one e-vector of date
|
|
20
|
+
* on every surface).
|
|
25
21
|
*
|
|
26
|
-
* MEASURED at adoption (banked in the plan record):
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* ephemeris.
|
|
22
|
+
* MEASURED at adoption (banked in the plan record): the attractor-mean
|
|
23
|
+
* modulation shifts were +2,526 ppm (perigee channel) and +1,067 ppm (node)
|
|
24
|
+
* against the single-line law it replaced — month/LOD shifts of ~10–25 ppm
|
|
25
|
+
* class, all 41 paleo anchors in bands; the ancient eclipse stack's cycle
|
|
26
|
+
* counts shift (χ² IMPROVES — recorded with its explanation: this e is
|
|
27
|
+
* La2004-corroborated in-era; theory-corroborated, never tuned). Beyond
|
|
28
|
+
* ~5 Myr the table is spectrum-class (phases decohere) — the quasi-periodic
|
|
29
|
+
* ATTRACTOR (mean e and the 405-kyr-class beat structure) is the claim,
|
|
30
|
+
* never a pointwise ephemeris.
|
|
36
31
|
*
|
|
37
|
-
* LOAD-BEARING conventions (
|
|
38
|
-
* moon/ecc-channel.cjs — so the certified numerics match):
|
|
32
|
+
* LOAD-BEARING conventions (the certified numerics):
|
|
39
33
|
* - channelIntegral uses composite Simpson with step ≤ ~4,000 yr
|
|
40
34
|
* (N ≥ 2, even);
|
|
41
35
|
* - modulation(tMa, s) takes age in Myr, positive = past, ≡ 1 at J2000;
|
|
@@ -63,7 +57,8 @@
|
|
|
63
57
|
*
|
|
64
58
|
* — ż_J2000 is the run's own z-rate at J2000 (script-written into the
|
|
65
59
|
* artifact by generate.mjs from the banked series: "we are the source"),
|
|
66
|
-
* T_q the
|
|
60
|
+
* T_q the arguments' secular-completion taper (SECULAR_COMPLETION_TAPER_YEARS,
|
|
61
|
+
* the one the rate anchors ride). Inside the canon it
|
|
67
62
|
* restores the run's slope exactly; beyond ±T_q it is a constant vector
|
|
68
63
|
* offset of ~3e-3, the size of the table's own spectrum-class scatter
|
|
69
64
|
* there, never a growing polynomial. Absent the two fields (an older
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The lunar perigee/node eccentricity sensitivities — ONE home (plan 23).
|
|
3
|
+
*
|
|
4
|
+
* The Sun's mean perturbation on the lunar perigee and node scales as
|
|
5
|
+
* g(e_E) = (1 − e_E²)^(−3/2); the of-date rates ride the channel
|
|
6
|
+
* rate(t) = rate₀ · [g(e_E(t))/g₀]^s. The pair the record fixes is the
|
|
7
|
+
* MEEUS-EFFECTIVE one: s_ϖ = 2.407 / s_Ω = 1.018 reproduce Meeus Ch. 47's
|
|
8
|
+
* of-date T² coefficients exactly (doc 66 §1, the (ė, s) degeneracy). Each of
|
|
9
|
+
* those T² coefficients contains the equinox's own acceleration — the general
|
|
10
|
+
* precession's T² term, a frame bookkeeping share that has nothing to do with
|
|
11
|
+
* Earth's eccentricity. Removing it gives the PHYSICAL pair the three-body
|
|
12
|
+
* laboratory reproduces from pure gravity (2.479 / 0.867; doc 66 §1):
|
|
13
|
+
*
|
|
14
|
+
* s_phys = (s_eff · Ẋ_of-date · κ/2 − T2_frame) / (Ẋ_ICRF · κ/2),
|
|
15
|
+
* κ = 3 e₀ ė₀ / (1 − e₀²), Ẋ_ICRF = Ẋ_of-date − p₀
|
|
16
|
+
*
|
|
17
|
+
* — derived here from the injected constants, never typed. The runtime (plan
|
|
18
|
+
* 23) carries s_phys in the channel and ONE frame term, the model's own
|
|
19
|
+
* precession of date, on every of-date lunar longitude alike, so the
|
|
20
|
+
* frame-free arguments M′ = L′ − ϖ and F = L′ − Ω cancel it exactly at every
|
|
21
|
+
* epoch. Measured before the change (plan 23 §0): with the frame share frozen
|
|
22
|
+
* inside s_eff on the eccentricity channel, M′ and F inherited L′'s frame term
|
|
23
|
+
* uncancelled — 2.5° at ±10 kyr, 39° at −1 Myr — and the perigee and node
|
|
24
|
+
* carried a 3 % share of the channel's own wiggle that is not theirs; in the
|
|
25
|
+
* historical window the change is ≤ 21″ of ϖ/Ω at ±3000 (seconds of eclipse
|
|
26
|
+
* time).
|
|
27
|
+
*
|
|
28
|
+
* The Meeus Ch. 47 argument RATES live here too (the ONE set the arguments
|
|
29
|
+
* module, its pure-Meeus reference and this derivation share).
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
'use strict';
|
|
33
|
+
|
|
34
|
+
/** Meeus Ch. 47 mean-argument rates, degrees per Julian century (the J2000 polynomials' linear terms). */
|
|
35
|
+
const MEEUS_ARGUMENT_RATES_DEG_PER_CY = Object.freeze({
|
|
36
|
+
Lp: 481267.88123421, // the Moon's mean longitude L′
|
|
37
|
+
D: 445267.1114034, // the mean elongation
|
|
38
|
+
M: 35999.0502909, // the Sun's mean anomaly
|
|
39
|
+
Mp: 477198.8675055, // the Moon's mean anomaly M′
|
|
40
|
+
F: 483202.0175233, // the argument of latitude
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/** The Meeus-effective pair: Meeus-exact of-date T² by construction (the shipped record values). */
|
|
44
|
+
const MOON_ECC_SENSITIVITY_PERIGEE = 2.407;
|
|
45
|
+
const MOON_ECC_SENSITIVITY_NODE = 1.018;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* The physical pair and the rate split, derived from the shipped constants.
|
|
49
|
+
* @param {{
|
|
50
|
+
* eccentricityJ2000: number,
|
|
51
|
+
* eccentricityDotJ2000: number,
|
|
52
|
+
* frameT2ArcsecPerCy2: number,
|
|
53
|
+
* generalPrecessionArcsecPerYr: number,
|
|
54
|
+
* }} inputs — e₀ (the catalog secular value the Taylor checks use); ė₀ per
|
|
55
|
+
* Julian century; the general precession's T² coefficient the of-date Meeus
|
|
56
|
+
* polynomials embed (Lieske 1976, the ELP frame), ″/cy²; p₀, the IAU 2006 p_A
|
|
57
|
+
* linear rate, ″/yr
|
|
58
|
+
* @returns {Readonly<{
|
|
59
|
+
* perigeeEffective: number, nodeEffective: number,
|
|
60
|
+
* perigeePhysical: number, nodePhysical: number,
|
|
61
|
+
* kappaPerCy: number, frameT2DegPerCy2: number, generalPrecessionDegPerCy: number,
|
|
62
|
+
* perigeeRateOfDateDegPerCy: number, nodeRateOfDateDegPerCy: number,
|
|
63
|
+
* perigeeRateIcrfDegPerCy: number, nodeRateIcrfDegPerCy: number,
|
|
64
|
+
* }>}
|
|
65
|
+
*/
|
|
66
|
+
function deriveMoonEccSensitivities({ eccentricityJ2000, eccentricityDotJ2000, frameT2ArcsecPerCy2, generalPrecessionArcsecPerYr }) {
|
|
67
|
+
const R = MEEUS_ARGUMENT_RATES_DEG_PER_CY;
|
|
68
|
+
const e0 = eccentricityJ2000, ed = eccentricityDotJ2000;
|
|
69
|
+
const kappaPerCy = 3 * e0 * ed / (1 - e0 * e0);
|
|
70
|
+
const generalPrecessionDegPerCy = generalPrecessionArcsecPerYr * 100 / 3600;
|
|
71
|
+
const frameT2DegPerCy2 = frameT2ArcsecPerCy2 / 3600;
|
|
72
|
+
const perigeeRateOfDateDegPerCy = R.Lp - R.Mp; // ϖ̇ of date (+4069.0137) = ϖ̇_ICRF + p₀
|
|
73
|
+
const nodeRateOfDateDegPerCy = R.Lp - R.F; // Ω̇ of date (−1934.1363) = Ω̇_ICRF + p₀
|
|
74
|
+
const perigeeRateIcrfDegPerCy = perigeeRateOfDateDegPerCy - generalPrecessionDegPerCy;
|
|
75
|
+
const nodeRateIcrfDegPerCy = nodeRateOfDateDegPerCy - generalPrecessionDegPerCy;
|
|
76
|
+
const half = kappaPerCy / 2;
|
|
77
|
+
const perigeePhysical = (MOON_ECC_SENSITIVITY_PERIGEE * perigeeRateOfDateDegPerCy * half - frameT2DegPerCy2) / (perigeeRateIcrfDegPerCy * half);
|
|
78
|
+
const nodePhysical = (MOON_ECC_SENSITIVITY_NODE * nodeRateOfDateDegPerCy * half - frameT2DegPerCy2) / (nodeRateIcrfDegPerCy * half);
|
|
79
|
+
return Object.freeze({
|
|
80
|
+
perigeeEffective: MOON_ECC_SENSITIVITY_PERIGEE, nodeEffective: MOON_ECC_SENSITIVITY_NODE,
|
|
81
|
+
perigeePhysical, nodePhysical,
|
|
82
|
+
kappaPerCy, frameT2DegPerCy2, generalPrecessionDegPerCy,
|
|
83
|
+
perigeeRateOfDateDegPerCy, nodeRateOfDateDegPerCy, perigeeRateIcrfDegPerCy, nodeRateIcrfDegPerCy,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
module.exports = { MEEUS_ARGUMENT_RATES_DEG_PER_CY, MOON_ECC_SENSITIVITY_PERIGEE, MOON_ECC_SENSITIVITY_NODE, deriveMoonEccSensitivities };
|
package/src/moon/month-chain.cjs
CHANGED
|
@@ -33,10 +33,7 @@
|
|
|
33
33
|
* pair is 2.479/0.867 after removing the IAU frame term — doc 66 §1).
|
|
34
34
|
* - The of-date perigee/node periods are COMPOSITIONS of the inertial chain
|
|
35
35
|
* with the precession of date (the engines' `…OfDateCyclesBetween` count
|
|
36
|
-
* identities N_trop − N_anom and N_drac − N_trop).
|
|
37
|
-
* family here — N·(H(t)/H₀)² counts per anchor unit and period ∝ T_yr/H —
|
|
38
|
-
* was the era device's counter law (doc 99's "Lunar Precession
|
|
39
|
-
* Invariant"); it left at plan 09 step 5c with the per-H counts.
|
|
36
|
+
* identities N_trop − N_anom and N_drac − N_trop).
|
|
40
37
|
* - apsidalMeetsNodal / lunarLeveling existed ONLY in the browser before
|
|
41
38
|
* this move (the Node scene aliased apsidal-of-date on a cancellation
|
|
42
39
|
* argument valid for the paired scene nodes only) — the Node engine gains
|
|
@@ -70,13 +67,10 @@
|
|
|
70
67
|
* eccentricity channel's modulation; constants are the engine's derived
|
|
71
68
|
* J2000 anchors (both engines derive them from the same JSON).
|
|
72
69
|
* fns.precessionPeriodYearsAtAge is the engine's lunisolar precession period
|
|
73
|
-
* of date T_p(t), Julian years (the composed rate's period
|
|
74
|
-
*
|
|
75
|
-
* 0.086 % slow: the chain's J2000 tropical month sat 5.85 ms above the IAU
|
|
76
|
-
* input, the 1/T_p form is within 0.1 ms of it).
|
|
70
|
+
* of date T_p(t), Julian years (the composed rate's period — the tropical
|
|
71
|
+
* month's equinox turn; within 0.1 ms of the IAU input at J2000).
|
|
77
72
|
* fns.distanceMetresAtAge is the engine's CITED distance history
|
|
78
|
-
* (deltat/moon-distance-history;
|
|
79
|
-
* twin this chain carried until then is deleted; null beyond the span).
|
|
73
|
+
* (deltat/moon-distance-history; null beyond the span).
|
|
80
74
|
*/
|
|
81
75
|
function createMoonMonthChain({ constants, fns }) {
|
|
82
76
|
const {
|
|
@@ -136,8 +130,7 @@ function createMoonMonthChain({ constants, fns }) {
|
|
|
136
130
|
|
|
137
131
|
/** Tropical month in seconds (equinox-referenced): the sidereal month less
|
|
138
132
|
* the equinox's own motion over one month — one turn per the precession
|
|
139
|
-
* period of date T_p(t).
|
|
140
|
-
* counter H(t), 0.086 % slow.) @param {number} tMa @returns {number | null} */
|
|
133
|
+
* period of date T_p(t). @param {number} tMa @returns {number | null} */
|
|
141
134
|
function tropicalMonthSecondsAtAge(tMa) {
|
|
142
135
|
const tSm = siderealMonthSecondsAtAge(tMa);
|
|
143
136
|
if (tSm === null) return null;
|
|
@@ -146,10 +139,8 @@ function createMoonMonthChain({ constants, fns }) {
|
|
|
146
139
|
return tSm * (1 - tSm / (/** @type {number} */ (tP) * tYr));
|
|
147
140
|
}
|
|
148
141
|
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
// counts. The of-date perigee and node of date are the engines' count
|
|
152
|
-
// compositions of this chain's inertial periods with the tropical month.)
|
|
142
|
+
// The of-date perigee and node are the engines' count compositions of this
|
|
143
|
+
// chain's inertial periods with the tropical month.
|
|
153
144
|
|
|
154
145
|
/** Perigee precession period in seconds — Brouwer–Clemence m² scaling ×
|
|
155
146
|
* e_E-channel modulation (the factored law: period = invariant mean /
|
|
@@ -52,14 +52,14 @@
|
|
|
52
52
|
* A1-class correlated-subsample effect (the tracked events sit −1.6″
|
|
53
53
|
* below the +1.4″ fleet mean and sample the near-annual arguments at
|
|
54
54
|
* correlated phases; the era-split refutes anchor double-counting and
|
|
55
|
-
* the modern era improves most, 3.57 → 3.34). The api gate (
|
|
56
|
-
*
|
|
55
|
+
* the modern era improves most, 3.57 → 3.34). The api gate (12″ — the
|
|
56
|
+
* physical ΔT-convention floor) holds
|
|
57
57
|
* (max 6.2″). Coefficients are stored with the run→real argument
|
|
58
58
|
* mapping already applied (the extraction's heliocentric-planet vs
|
|
59
59
|
* geocentric-sun π-offset is folded into the signs).
|
|
60
60
|
*
|
|
61
61
|
* THE J2 NODE FAMILY (FQ-7 Round 3, plan §12i) — five derived terms on
|
|
62
|
-
* Ω-family arguments (NOT expressible
|
|
62
|
+
* Ω-family arguments (NOT expressible as integer combinations of the Delaunay arguments,
|
|
63
63
|
* which is why every earlier extraction missed them; the 200-yr band
|
|
64
64
|
* probe named them, the dense 2-day JPL sample confirmed them real, and
|
|
65
65
|
* the channel isolation identified them as EARTH'S J2 acting on the
|
package/src/moon/series.cjs
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
*
|
|
12
12
|
* Full scene form: 60 longitude + 60 latitude terms with E/E² scaling on
|
|
13
13
|
* M-bearing terms, A1 (Venus, Meeus-observed rate — the 18V−16E−M′
|
|
14
|
-
* near-resonance makes it hypersensitive; no
|
|
15
|
-
* (D2-derived
|
|
14
|
+
* near-resonance makes it hypersensitive; no chain identity), A2/A3
|
|
15
|
+
* (D2-derived rates, CHAIN-INTEGRATED under deep time through
|
|
16
16
|
* their identified content), all six latitude corrections, the EoC-half
|
|
17
17
|
* subtraction (the off-centre orbit geometry already provides half the
|
|
18
18
|
* equation of centre), and the two-term ellipse distance.
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
'use strict';
|
|
28
28
|
|
|
29
|
-
//
|
|
29
|
+
// The DERIVED series-extension tail (the D2 planetary and
|
|
30
30
|
// node terms, moon/series-extension.cjs) is part of the ONE scene Moon —
|
|
31
31
|
// formerly added by the besselian tier alone, so the rendered Moon and the
|
|
32
32
|
// eclipse-location Moon were two different Moons. The truncated finder forms
|
|
@@ -98,8 +98,6 @@ function createMoonSeries({ constants, fns }) {
|
|
|
98
98
|
const nAps = apsidalOfDateCyclesBetween(yA0, yA);
|
|
99
99
|
// A3 is the STAR-referenced lunar longitude (Meeus' rate 481,266.484 °/cy
|
|
100
100
|
// ≡ 360°/sidereal month): the chain's sidereal-orbit count directly.
|
|
101
|
-
// Plan 09 step 5c — it was the tropical count minus the counter's 13/H
|
|
102
|
-
// precession turns (0.086 % slow on the precession).
|
|
103
101
|
const nSid = siderealOrbitsBetween(yA0, yA);
|
|
104
102
|
const nJ = jupiterOrbitsBetween(yA0, yA);
|
|
105
103
|
if (nT !== null && nAps !== null && nSid !== null && nJ !== null) {
|
|
@@ -175,9 +173,8 @@ function createMoonSeries({ constants, fns }) {
|
|
|
175
173
|
* Returns everything the scene blocks write:
|
|
176
174
|
* thetaAddRad — the hierarchy θ increment (EoC-half-subtracted Σl);
|
|
177
175
|
* lonDeg — full ecliptic longitude (GEOMETRIC, mean equinox of date)
|
|
178
|
-
* incl. the derived series-extension tail. (
|
|
179
|
-
* anchor
|
|
180
|
-
* its parameter deleted at plan 11 step 2: measured against Horizons' apparent
|
|
176
|
+
* incl. the derived series-extension tail. (No fitted mean-longitude
|
|
177
|
+
* anchor — doc 109 §23: measured against Horizons' apparent
|
|
181
178
|
* Moon over 1970–2049 the series needs no anchor, −1.0″ ± 1.5″ flat in
|
|
182
179
|
* elongation; the former +32.75″ was the eclipse tier's mean Sun
|
|
183
180
|
* compensated — its aberration κ, the I2 long inequality and the trend-ΔT
|
|
@@ -177,6 +177,19 @@ export function createDeepTimeChain(deps: {
|
|
|
177
177
|
apsidalMeetsNodalSecondsAtAge: (tMa: number) => number | null;
|
|
178
178
|
lunarLevelingSecondsAtAge: (tMa: number) => number | null;
|
|
179
179
|
};
|
|
180
|
+
moonEccSensitivities: Readonly<{
|
|
181
|
+
perigeeEffective: number;
|
|
182
|
+
nodeEffective: number;
|
|
183
|
+
perigeePhysical: number;
|
|
184
|
+
nodePhysical: number;
|
|
185
|
+
kappaPerCy: number;
|
|
186
|
+
frameT2DegPerCy2: number;
|
|
187
|
+
generalPrecessionDegPerCy: number;
|
|
188
|
+
perigeeRateOfDateDegPerCy: number;
|
|
189
|
+
nodeRateOfDateDegPerCy: number;
|
|
190
|
+
perigeeRateIcrfDegPerCy: number;
|
|
191
|
+
nodeRateIcrfDegPerCy: number;
|
|
192
|
+
}>;
|
|
180
193
|
meanMoonDistanceMetresAtAge: (tMa: number) => number | null;
|
|
181
194
|
meanMoonDistanceAtAge: (tMa: number) => number | null;
|
|
182
195
|
meanLodSecondsAtAge: (tMa: number) => number | null;
|
|
@@ -238,14 +251,6 @@ export function createDeepTimeChain(deps: {
|
|
|
238
251
|
/** @param {number} tMa @param {number} periodJ2000Seconds @returns {number} */
|
|
239
252
|
meanEarthPlanetSynodicPeriodAtAge: (tMa: number, periodJ2000Seconds: number) => number;
|
|
240
253
|
}>;
|
|
241
|
-
/**
|
|
242
|
-
* Moon-channel eccentricity sensitivities (perigee/node), the [g/g₀]^s
|
|
243
|
-
* exponents of the factored deep-time law — Meeus-effective (S_N moved
|
|
244
|
-
* 1.0 → 1.018 with the v4 frame-attribution batch). ONE home since B2 (they
|
|
245
|
-
* were literals in model.js, tools/lib/deep-time.js and script.js `_FW_MOON`).
|
|
246
|
-
*/
|
|
247
|
-
export const MOON_ECC_SENSITIVITY_PERIGEE: 2.407;
|
|
248
|
-
export const MOON_ECC_SENSITIVITY_NODE: 1.018;
|
|
249
254
|
/**
|
|
250
255
|
* The ΔT stack's switches. `resonator` gates the swing's δLOD terms; the
|
|
251
256
|
* swing's ΔT term is gated by `resonatorDeltaT` when given (the Node twin
|
package/types/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { createEpochPrimitives } from "./layer0/index.js";
|
|
|
2
2
|
export { deriveEpochParams } from "./layer0/derive-params.js";
|
|
3
3
|
export { createDerivedViews } from "./layer1/index.js";
|
|
4
4
|
export { createDeepCalendar } from "./phase/deep-calendar.cjs";
|
|
5
|
+
export { createDeepTimeChain } from "./deltat/deep-time-chain.js";
|
|
5
6
|
export { createCardinalStructure } from "./cardinal/one-source-structure.cjs";
|
|
6
7
|
export { createMoonMonthChain } from "./moon/month-chain.cjs";
|
|
7
8
|
export { createChainCycleIntegrator } from "./chain-cycles/index.cjs";
|
|
@@ -61,7 +62,7 @@ export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT
|
|
|
61
62
|
export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from "./constants/index.js";
|
|
62
63
|
export { GREGORIAN_START, GREGORIAN_START_JD, calendarToJD, jdToCalendar, jdToDecimalYear, dayFractionToHMS, julianCalendarToJD, jdToJulianCalendar } from "./time/calendar.cjs";
|
|
63
64
|
export { DEG2RAD, RAD2DEG, ARCSEC_PER_TURN, ARCSEC_PER_RAD, wrap360, wrap180, wrap180Closed, wrap2pi, wrapPi } from "./math/angles.cjs";
|
|
64
|
-
export {
|
|
65
|
+
export { MOON_ECC_SENSITIVITY_PERIGEE, MOON_ECC_SENSITIVITY_NODE, deriveMoonEccSensitivities, MEEUS_ARGUMENT_RATES_DEG_PER_CY } from "./moon/ecc-sensitivities.cjs";
|
|
65
66
|
export { computeMassChainJ2000, computeMoonPeriodsJ2000 } from "./earth/mass-chain.cjs";
|
|
66
67
|
export { SECONDS_PER_DAY, DAYS_PER_JULIAN_YEAR, JULIAN_CENTURY_DAYS, SECONDS_PER_JULIAN_YEAR } from "./constants/units.cjs";
|
|
67
68
|
export { computeEarthFrameOfDate, solveWheelAngleForLongitude, computeSceneWorldFrameJ2000, SCENE_EQUINOX_VIEW_AZIMUTH_DEG } from "./earth/frame-of-date.cjs";
|
|
@@ -153,6 +153,19 @@ export function assembleDeepTimeChain(ctx: import("./derived-constants.js").Ctx)
|
|
|
153
153
|
apsidalMeetsNodalSecondsAtAge: (tMa: number) => number | null;
|
|
154
154
|
lunarLevelingSecondsAtAge: (tMa: number) => number | null;
|
|
155
155
|
};
|
|
156
|
+
moonEccSensitivities: Readonly<{
|
|
157
|
+
perigeeEffective: number;
|
|
158
|
+
nodeEffective: number;
|
|
159
|
+
perigeePhysical: number;
|
|
160
|
+
nodePhysical: number;
|
|
161
|
+
kappaPerCy: number;
|
|
162
|
+
frameT2DegPerCy2: number;
|
|
163
|
+
generalPrecessionDegPerCy: number;
|
|
164
|
+
perigeeRateOfDateDegPerCy: number;
|
|
165
|
+
nodeRateOfDateDegPerCy: number;
|
|
166
|
+
perigeeRateIcrfDegPerCy: number;
|
|
167
|
+
nodeRateIcrfDegPerCy: number;
|
|
168
|
+
}>;
|
|
156
169
|
meanMoonDistanceMetresAtAge: (tMa: number) => number | null;
|
|
157
170
|
meanMoonDistanceAtAge: (tMa: number) => number | null;
|
|
158
171
|
meanLodSecondsAtAge: (tMa: number) => number | null;
|
|
@@ -18,9 +18,9 @@ export function assembleLunarTheory(ctx: import("./time-axis.js").Ctx): {
|
|
|
18
18
|
M0: number;
|
|
19
19
|
MP0: number;
|
|
20
20
|
F0: number;
|
|
21
|
-
LPR:
|
|
22
|
-
DR:
|
|
23
|
-
MR:
|
|
21
|
+
LPR: 481267.88123421;
|
|
22
|
+
DR: 445267.1114034;
|
|
23
|
+
MR: 35999.0502909;
|
|
24
24
|
WDOT: number;
|
|
25
25
|
NDOT: number;
|
|
26
26
|
T2_W: number;
|
|
@@ -31,6 +31,12 @@ export function assembleLunarTheory(ctx: import("./time-axis.js").Ctx): {
|
|
|
31
31
|
T2_LP_TIDAL: number;
|
|
32
32
|
S_W: number;
|
|
33
33
|
S_N: number;
|
|
34
|
+
S_W_PHYS: number;
|
|
35
|
+
S_N_PHYS: number;
|
|
36
|
+
W_ICRF: number;
|
|
37
|
+
N_ICRF: number;
|
|
38
|
+
P0: number;
|
|
39
|
+
T2F: number;
|
|
34
40
|
};
|
|
35
41
|
_rateCompletion: () => {
|
|
36
42
|
rc: {
|
|
@@ -33,7 +33,7 @@ export function assembleOneSourceMovement(ctx: import("./year-day-lengths.js").C
|
|
|
33
33
|
periOfDateDegAt: (year: number) => number;
|
|
34
34
|
/** 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} */
|
|
35
35
|
epsAt: (year: number) => number;
|
|
36
|
-
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span
|
|
36
|
+
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span; null without a series. */
|
|
37
37
|
obliquityHybridDomainYears: [number, number] | null;
|
|
38
38
|
/** 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}} */
|
|
39
39
|
precessionOfDateFactorsAt: (year: number) => {
|
package/types/model/surface.d.ts
CHANGED
|
@@ -44,7 +44,7 @@ export function assembleSurface(ctx: import("./cardinal-instants.js").Ctx): Read
|
|
|
44
44
|
lunisolar: Readonly<{
|
|
45
45
|
/** The mean lunisolar precession period T_p(t), years — 1,296,000/the precession RATE of date (25,771.6 at J2000): THE published deep-time clock. @param {number} year @returns {number} */
|
|
46
46
|
meanPeriodYearsAtYear: (year: number) => number;
|
|
47
|
-
/** THE PRECESSION RATE OF DATE ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³] × cos ε̄(t)/cos ε̄(0), ″/yr — the constant's scaling on the spin and the lunar torque times the cited mean obliquity's cosine (
|
|
47
|
+
/** THE PRECESSION RATE OF DATE ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³] × cos ε̄(t)/cos ε̄(0), ″/yr — the constant's scaling on the spin and the lunar torque times the cited mean obliquity's cosine (p₀ = 50.2880, the IAU 2006 input). @param {number} year @returns {number} */
|
|
48
48
|
meanRateArcsecPerYrAtYear: (year: number) => number;
|
|
49
49
|
/** THE PRECESSION CONSTANT OF DATE as a rate on the J2000 obliquity, ″/yr — the spin and torque scaling alone (the hybrid obliquity integration's integrand: its own ŝ·n̂ carries the cosine). @param {number} year @returns {number} */
|
|
50
50
|
torqueRateArcsecPerYrAtYear: (year: number) => number;
|
|
@@ -123,9 +123,9 @@ export function assembleSurface(ctx: import("./cardinal-instants.js").Ctx): Read
|
|
|
123
123
|
earth: Readonly<{
|
|
124
124
|
perihelionLongitudeDeg: (year: number) => number;
|
|
125
125
|
obliquityDeg: (year: number) => number;
|
|
126
|
-
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span, ±10 Myr about J2000 (
|
|
126
|
+
/** The hybrid's own domain, [yearFrom, yearTo] — the banked ζ series' span, ±10 Myr about J2000 (the published surfaces serve `obliquityDeg` inside it only; null without a series, i.e. a bare createModel()). */
|
|
127
127
|
obliquityHybridDomainYears: [number, number] | null;
|
|
128
|
-
/** The cited mean obliquity of date ε̄(t) (Farhat et al. 2022's column
|
|
128
|
+
/** The cited mean obliquity of date ε̄(t) (Farhat et al. 2022's column), degrees — a Myr-scale mean; NaN beyond 4,429 Ma. @param {number} year @returns {number} */
|
|
129
129
|
meanObliquityCitedDeg: (year: number) => number;
|
|
130
130
|
eccentricity: (year: number) => number;
|
|
131
131
|
inclinationDeg: (year: number) => number;
|
|
@@ -184,6 +184,19 @@ export function assembleSurface(ctx: import("./cardinal-instants.js").Ctx): Read
|
|
|
184
184
|
distanceKmAtYear: (year: number) => number;
|
|
185
185
|
siderealMonthDaysAtYear: (year: number) => number;
|
|
186
186
|
synodicMonthDays: number;
|
|
187
|
+
eccSensitivities: Readonly<{
|
|
188
|
+
perigeeEffective: number;
|
|
189
|
+
nodeEffective: number;
|
|
190
|
+
perigeePhysical: number;
|
|
191
|
+
nodePhysical: number;
|
|
192
|
+
kappaPerCy: number;
|
|
193
|
+
frameT2DegPerCy2: number;
|
|
194
|
+
generalPrecessionDegPerCy: number;
|
|
195
|
+
perigeeRateOfDateDegPerCy: number;
|
|
196
|
+
nodeRateOfDateDegPerCy: number;
|
|
197
|
+
perigeeRateIcrfDegPerCy: number;
|
|
198
|
+
nodeRateIcrfDegPerCy: number;
|
|
199
|
+
}>;
|
|
187
200
|
lonDegAtJD: (jd: number) => number;
|
|
188
201
|
betaDegAtJD: (jd: number) => number;
|
|
189
202
|
distanceKmAtJD: (jd: number) => number;
|
|
@@ -191,7 +204,7 @@ export function assembleSurface(ctx: import("./cardinal-instants.js").Ctx): Read
|
|
|
191
204
|
eclipse: Readonly<{
|
|
192
205
|
sunLonDegAtJD: (jd: number) => number;
|
|
193
206
|
sunLonCompletedDegAtJD: (jd: number) => number;
|
|
194
|
-
/** The APPARENT Sun (completed geometric − the derived aberration constant + the leading nutation terms on the model's own arguments) — the quantity Horizons' observer ecliptic longitude is; the cardinal instants are its crossings
|
|
207
|
+
/** The APPARENT Sun (completed geometric − the derived aberration constant + the leading nutation terms on the model's own arguments) — the quantity Horizons' observer ecliptic longitude is; the cardinal instants are its crossings. @param {number} jdUT @returns {number} */
|
|
195
208
|
sunApparentLonDegAtJD: (jdUT: number) => number;
|
|
196
209
|
findLunarInRange: (jdStart: number, jdEnd: number) => {
|
|
197
210
|
jd: number;
|
package/types/model.d.ts
CHANGED
|
@@ -145,6 +145,19 @@ export function assembleModel(C: Readonly<Record<string, any>>, F: Readonly<Reco
|
|
|
145
145
|
distanceKmAtYear: (year: number) => number;
|
|
146
146
|
siderealMonthDaysAtYear: (year: number) => number;
|
|
147
147
|
synodicMonthDays: number;
|
|
148
|
+
eccSensitivities: Readonly<{
|
|
149
|
+
perigeeEffective: number;
|
|
150
|
+
nodeEffective: number;
|
|
151
|
+
perigeePhysical: number;
|
|
152
|
+
nodePhysical: number;
|
|
153
|
+
kappaPerCy: number;
|
|
154
|
+
frameT2DegPerCy2: number;
|
|
155
|
+
generalPrecessionDegPerCy: number;
|
|
156
|
+
perigeeRateOfDateDegPerCy: number;
|
|
157
|
+
nodeRateOfDateDegPerCy: number;
|
|
158
|
+
perigeeRateIcrfDegPerCy: number;
|
|
159
|
+
nodeRateIcrfDegPerCy: number;
|
|
160
|
+
}>;
|
|
148
161
|
lonDegAtJD: (jd: number) => number;
|
|
149
162
|
betaDegAtJD: (jd: number) => number;
|
|
150
163
|
distanceKmAtJD: (jd: number) => number;
|
|
@@ -16,6 +16,7 @@ export type MoonArgsDeg = {
|
|
|
16
16
|
* elpEarthFigureJ2ArcsecPerCy2: number,
|
|
17
17
|
* elpGeneralPrecessionPA_T2ArcsecPerCy2: number,
|
|
18
18
|
* eccE0: number,
|
|
19
|
+
* moonEccSensitivities: ReturnType<typeof import('./ecc-sensitivities.cjs').deriveMoonEccSensitivities>,
|
|
19
20
|
* },
|
|
20
21
|
* fns: {
|
|
21
22
|
* eccAt: (tYr: number) => number,
|
|
@@ -56,6 +57,7 @@ export function createMoonArguments({ constants, fns }: {
|
|
|
56
57
|
elpEarthFigureJ2ArcsecPerCy2: number;
|
|
57
58
|
elpGeneralPrecessionPA_T2ArcsecPerCy2: number;
|
|
58
59
|
eccE0: number;
|
|
60
|
+
moonEccSensitivities: ReturnType<typeof import("./ecc-sensitivities.cjs").deriveMoonEccSensitivities>;
|
|
59
61
|
};
|
|
60
62
|
fns: {
|
|
61
63
|
eccAt: (tYr: number) => number;
|
|
@@ -86,9 +88,9 @@ export function createMoonArguments({ constants, fns }: {
|
|
|
86
88
|
M0: number;
|
|
87
89
|
MP0: number;
|
|
88
90
|
F0: number;
|
|
89
|
-
LPR:
|
|
90
|
-
DR:
|
|
91
|
-
MR:
|
|
91
|
+
LPR: 481267.88123421;
|
|
92
|
+
DR: 445267.1114034;
|
|
93
|
+
MR: 35999.0502909;
|
|
92
94
|
WDOT: number;
|
|
93
95
|
NDOT: number;
|
|
94
96
|
T2_W: number;
|
|
@@ -99,6 +101,12 @@ export function createMoonArguments({ constants, fns }: {
|
|
|
99
101
|
T2_LP_TIDAL: number;
|
|
100
102
|
S_W: number;
|
|
101
103
|
S_N: number;
|
|
104
|
+
S_W_PHYS: number;
|
|
105
|
+
S_N_PHYS: number;
|
|
106
|
+
W_ICRF: number;
|
|
107
|
+
N_ICRF: number;
|
|
108
|
+
P0: number;
|
|
109
|
+
T2F: number;
|
|
102
110
|
};
|
|
103
111
|
_rateCompletion: () => {
|
|
104
112
|
rc: {
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
*
|
|
18
18
|
* — ż_J2000 is the run's own z-rate at J2000 (script-written into the
|
|
19
19
|
* artifact by generate.mjs from the banked series: "we are the source"),
|
|
20
|
-
* T_q the
|
|
20
|
+
* T_q the arguments' secular-completion taper (SECULAR_COMPLETION_TAPER_YEARS,
|
|
21
|
+
* the one the rate anchors ride). Inside the canon it
|
|
21
22
|
* restores the run's slope exactly; beyond ±T_q it is a constant vector
|
|
22
23
|
* offset of ~3e-3, the size of the table's own spectrum-class scatter
|
|
23
24
|
* there, never a growing polynomial. Absent the two fields (an older
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Meeus Ch. 47 mean-argument rates, degrees per Julian century (the J2000 polynomials' linear terms). */
|
|
2
|
+
export const MEEUS_ARGUMENT_RATES_DEG_PER_CY: Readonly<{
|
|
3
|
+
Lp: 481267.88123421;
|
|
4
|
+
D: 445267.1114034;
|
|
5
|
+
M: 35999.0502909;
|
|
6
|
+
Mp: 477198.8675055;
|
|
7
|
+
F: 483202.0175233;
|
|
8
|
+
}>;
|
|
9
|
+
/** The Meeus-effective pair: Meeus-exact of-date T² by construction (the shipped record values). */
|
|
10
|
+
export const MOON_ECC_SENSITIVITY_PERIGEE: 2.407;
|
|
11
|
+
export const MOON_ECC_SENSITIVITY_NODE: 1.018;
|
|
12
|
+
/**
|
|
13
|
+
* The physical pair and the rate split, derived from the shipped constants.
|
|
14
|
+
* @param {{
|
|
15
|
+
* eccentricityJ2000: number,
|
|
16
|
+
* eccentricityDotJ2000: number,
|
|
17
|
+
* frameT2ArcsecPerCy2: number,
|
|
18
|
+
* generalPrecessionArcsecPerYr: number,
|
|
19
|
+
* }} inputs — e₀ (the catalog secular value the Taylor checks use); ė₀ per
|
|
20
|
+
* Julian century; the general precession's T² coefficient the of-date Meeus
|
|
21
|
+
* polynomials embed (Lieske 1976, the ELP frame), ″/cy²; p₀, the IAU 2006 p_A
|
|
22
|
+
* linear rate, ″/yr
|
|
23
|
+
* @returns {Readonly<{
|
|
24
|
+
* perigeeEffective: number, nodeEffective: number,
|
|
25
|
+
* perigeePhysical: number, nodePhysical: number,
|
|
26
|
+
* kappaPerCy: number, frameT2DegPerCy2: number, generalPrecessionDegPerCy: number,
|
|
27
|
+
* perigeeRateOfDateDegPerCy: number, nodeRateOfDateDegPerCy: number,
|
|
28
|
+
* perigeeRateIcrfDegPerCy: number, nodeRateIcrfDegPerCy: number,
|
|
29
|
+
* }>}
|
|
30
|
+
*/
|
|
31
|
+
export function deriveMoonEccSensitivities({ eccentricityJ2000, eccentricityDotJ2000, frameT2ArcsecPerCy2, generalPrecessionArcsecPerYr }: {
|
|
32
|
+
eccentricityJ2000: number;
|
|
33
|
+
eccentricityDotJ2000: number;
|
|
34
|
+
frameT2ArcsecPerCy2: number;
|
|
35
|
+
generalPrecessionArcsecPerYr: number;
|
|
36
|
+
}): Readonly<{
|
|
37
|
+
perigeeEffective: number;
|
|
38
|
+
nodeEffective: number;
|
|
39
|
+
perigeePhysical: number;
|
|
40
|
+
nodePhysical: number;
|
|
41
|
+
kappaPerCy: number;
|
|
42
|
+
frameT2DegPerCy2: number;
|
|
43
|
+
generalPrecessionDegPerCy: number;
|
|
44
|
+
perigeeRateOfDateDegPerCy: number;
|
|
45
|
+
nodeRateOfDateDegPerCy: number;
|
|
46
|
+
perigeeRateIcrfDegPerCy: number;
|
|
47
|
+
nodeRateIcrfDegPerCy: number;
|
|
48
|
+
}>;
|
|
@@ -23,13 +23,10 @@
|
|
|
23
23
|
* eccentricity channel's modulation; constants are the engine's derived
|
|
24
24
|
* J2000 anchors (both engines derive them from the same JSON).
|
|
25
25
|
* fns.precessionPeriodYearsAtAge is the engine's lunisolar precession period
|
|
26
|
-
* of date T_p(t), Julian years (the composed rate's period
|
|
27
|
-
*
|
|
28
|
-
* 0.086 % slow: the chain's J2000 tropical month sat 5.85 ms above the IAU
|
|
29
|
-
* input, the 1/T_p form is within 0.1 ms of it).
|
|
26
|
+
* of date T_p(t), Julian years (the composed rate's period — the tropical
|
|
27
|
+
* month's equinox turn; within 0.1 ms of the IAU input at J2000).
|
|
30
28
|
* fns.distanceMetresAtAge is the engine's CITED distance history
|
|
31
|
-
* (deltat/moon-distance-history;
|
|
32
|
-
* twin this chain carried until then is deleted; null beyond the span).
|
|
29
|
+
* (deltat/moon-distance-history; null beyond the span).
|
|
33
30
|
*/
|
|
34
31
|
export function createMoonMonthChain({ constants, fns }: {
|
|
35
32
|
constants: {
|