@essrt/physics 4.8.0 → 5.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 +4 -0
- package/package.json +42 -39
- package/src/climate/l1-orbital.cjs +76 -5
- package/src/constants/coefficients.d.ts +678 -0
- package/src/constants/coefficients.js +4 -4
- package/src/constants/generated.d.ts +42 -41
- package/src/constants/generated.js +6 -5
- package/src/deltat/deep-time.cjs +69 -2
- package/src/earth/deep-orbital-history.cjs +6 -5
- package/src/earth/precession-composed.cjs +120 -0
- package/src/earth/year-lengths.cjs +12 -1
- package/src/index.js +6 -2
- package/src/layer0/derive-params.js +21 -4
- package/src/layer0/index.js +35 -4
- package/src/model.js +176 -33
- package/src/planets/chain-artifact.js +2 -2
- package/types/cardinal/index.d.cts +80 -0
- package/types/cardinal/one-source-structure.d.cts +35 -0
- package/types/chain-cycles/index.d.cts +33 -0
- package/types/climate/l1-orbital.d.cts +103 -0
- package/types/constants/coefficients.d.ts +678 -0
- package/types/constants/generated.d.ts +754 -0
- package/types/constants/index.d.ts +2 -0
- package/types/deltat/cycles.d.cts +72 -0
- package/types/deltat/deep-time.d.cts +135 -0
- package/types/deltat/historical.d.cts +8 -0
- package/types/deltat/recession-history.d.cts +80 -0
- package/types/earth/deep-orbital-history.d.cts +77 -0
- package/types/earth/precession-composed.d.cts +59 -0
- package/types/earth/sidereal-channel-artifact.d.cts +12 -0
- package/types/earth/sidereal-year-channel.d.cts +38 -0
- package/types/earth/year-lengths.d.cts +67 -0
- package/types/eclipse/besselian.d.cts +101 -0
- package/types/eclipse/finders.d.cts +116 -0
- package/types/eclipse/sun-planetary-completion.d.cts +39 -0
- package/types/index.d.ts +78 -0
- package/types/layer0/derive-params.d.ts +46 -0
- package/types/layer0/index.d.ts +64 -0
- package/types/layer1/index.d.ts +10 -0
- package/types/model.d.ts +184 -0
- package/types/moon/apparent.d.cts +78 -0
- package/types/moon/arguments.d.cts +138 -0
- package/types/moon/deep-ecc-channel.d.cts +25 -0
- package/types/moon/deep-modes-artifact.d.cts +140 -0
- package/types/moon/ecc-channel.d.cts +30 -0
- package/types/moon/month-chain.d.cts +79 -0
- package/types/moon/series-extension.d.cts +11 -0
- package/types/moon/series.d.cts +91 -0
- package/types/phase/index.d.cts +38 -0
- package/types/planets/asc-node-integrator.d.cts +30 -0
- package/types/planets/chain-artifact.d.ts +15 -0
- package/types/planets/ecc-channel.d.cts +20 -0
- package/types/planets/fibonacci-laws.d.cts +90 -0
- package/types/planets/geometry.d.cts +60 -0
- package/types/planets/inv-plane-frame.d.cts +36 -0
- package/types/planets/keplerian-chain.d.cts +173 -0
- package/types/planets/model.d.cts +116 -0
- package/types/planets/orbit-chain.d.cts +12 -0
- package/types/planets/orientation.d.cts +67 -0
- package/types/planets/predict.d.cts +88 -0
- package/types/planets/secular-series.d.cts +73 -0
- package/types/sun/longitude-correction.d.cts +41 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export type CycleSpec = {
|
|
2
|
+
latticeN: number;
|
|
3
|
+
cosCoeffSeconds: number;
|
|
4
|
+
sinCoeffSeconds: number;
|
|
5
|
+
};
|
|
6
|
+
export type ResonatorKick = {
|
|
7
|
+
tYear: number;
|
|
8
|
+
cosSeconds: number;
|
|
9
|
+
sinSeconds: number;
|
|
10
|
+
};
|
|
11
|
+
export type ResonatorTone = {
|
|
12
|
+
dn: number;
|
|
13
|
+
phiLockedRad: number;
|
|
14
|
+
ampSeconds: number;
|
|
15
|
+
};
|
|
16
|
+
export type DeltaTCyclesDeps = {
|
|
17
|
+
/**
|
|
18
|
+
* - 8 × the holistic year (J2000)
|
|
19
|
+
*/
|
|
20
|
+
eightHYears: number;
|
|
21
|
+
/**
|
|
22
|
+
* - full strength within |y−2000| ≤ this
|
|
23
|
+
*/
|
|
24
|
+
taperFullHalfwidthYears: number;
|
|
25
|
+
/**
|
|
26
|
+
* - zero beyond
|
|
27
|
+
*/
|
|
28
|
+
taperTotalHalfwidthYears: number;
|
|
29
|
+
/**
|
|
30
|
+
* - δLOD denominator (variation ≤1e-8 in-window)
|
|
31
|
+
*/
|
|
32
|
+
tropicalYearSecondsJ2000: number;
|
|
33
|
+
/**
|
|
34
|
+
* - keyed bond/hallstatt/jose5/jose4
|
|
35
|
+
*/
|
|
36
|
+
cycles: Record<string, CycleSpec>;
|
|
37
|
+
resonator: {
|
|
38
|
+
t0LatticeN: number;
|
|
39
|
+
q: number;
|
|
40
|
+
kicks: ResonatorKick[];
|
|
41
|
+
tones: ResonatorTone[];
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* @typedef {{ latticeN: number, cosCoeffSeconds: number, sinCoeffSeconds: number }} CycleSpec
|
|
46
|
+
* @typedef {{ tYear: number, cosSeconds: number, sinSeconds: number }} ResonatorKick
|
|
47
|
+
* @typedef {{ dn: number, phiLockedRad: number, ampSeconds: number }} ResonatorTone
|
|
48
|
+
*/
|
|
49
|
+
/**
|
|
50
|
+
* @typedef {Object} DeltaTCyclesDeps
|
|
51
|
+
* @property {number} eightHYears - 8 × the holistic year (J2000)
|
|
52
|
+
* @property {number} taperFullHalfwidthYears - full strength within |y−2000| ≤ this
|
|
53
|
+
* @property {number} taperTotalHalfwidthYears - zero beyond
|
|
54
|
+
* @property {number} tropicalYearSecondsJ2000 - δLOD denominator (variation ≤1e-8 in-window)
|
|
55
|
+
* @property {Record<string, CycleSpec>} cycles - keyed bond/hallstatt/jose5/jose4
|
|
56
|
+
* @property {{ t0LatticeN: number, q: number, kicks: ResonatorKick[],
|
|
57
|
+
* tones: ResonatorTone[] }} resonator
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* Build the cycle-correction evaluators over one engine's constant set.
|
|
61
|
+
* All evaluators are UNGATED — the engines own their enable flags.
|
|
62
|
+
* @param {DeltaTCyclesDeps} deps
|
|
63
|
+
*/
|
|
64
|
+
export function createDeltaTCycles(deps: DeltaTCyclesDeps): {
|
|
65
|
+
taperAt: (year: number) => number;
|
|
66
|
+
taperDerivativeAt: (year: number) => number;
|
|
67
|
+
cycleDeltaTSecondsAt: (cycleKey: string, year: number) => number;
|
|
68
|
+
cycleLodSecondsAt: (cycleKey: string, year: number) => number;
|
|
69
|
+
swingDeltaTSecondsAt: (year: number) => number;
|
|
70
|
+
swingLodSecondsAt: (year: number) => number;
|
|
71
|
+
swingLodRateAt: (year: number) => number;
|
|
72
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
export type DeepTimeLodConstants = {
|
|
2
|
+
/**
|
|
3
|
+
* - Earth–Moon total angular momentum
|
|
4
|
+
*/
|
|
5
|
+
lTotalEmKgm2S: number;
|
|
6
|
+
mMoonAloneKg: number;
|
|
7
|
+
mEarthAloneKg: number;
|
|
8
|
+
rEarthMetres: number;
|
|
9
|
+
/**
|
|
10
|
+
* - GM of the Earth–Moon system
|
|
11
|
+
*/
|
|
12
|
+
gmEmM3PerS2: number;
|
|
13
|
+
/**
|
|
14
|
+
* - √(1−e²) factor of the lunar orbit
|
|
15
|
+
*/
|
|
16
|
+
eFactorMoon: number;
|
|
17
|
+
/**
|
|
18
|
+
* - tidal-lock distance (LOD denominator → 0)
|
|
19
|
+
*/
|
|
20
|
+
aLockMetres: number;
|
|
21
|
+
/**
|
|
22
|
+
* - Farhat polynomial anchor
|
|
23
|
+
*/
|
|
24
|
+
aMoonNowMetres: number;
|
|
25
|
+
alpha1PerMa: number;
|
|
26
|
+
alpha3PerMa3: number;
|
|
27
|
+
alpha4PerMa4: number;
|
|
28
|
+
holisticYearJ2000: number;
|
|
29
|
+
/**
|
|
30
|
+
* - the H/13-identity mean LOD at J2000
|
|
31
|
+
*/
|
|
32
|
+
lodNowH13Seconds: number;
|
|
33
|
+
meanSiderealYearJ2000Seconds: number;
|
|
34
|
+
solarMassLossFracPerYear: number;
|
|
35
|
+
/**
|
|
36
|
+
* - Actual-LOD numerator
|
|
37
|
+
*/
|
|
38
|
+
siderealYearDaysKinematicJ2000: number;
|
|
39
|
+
/**
|
|
40
|
+
* - f_S, the solar fraction of the J2000
|
|
41
|
+
* precession torque (derive-params) — the unit H(t) = 13·T_p,composed needs it
|
|
42
|
+
*/
|
|
43
|
+
precessionSolarShareJ2000: number;
|
|
44
|
+
};
|
|
45
|
+
export type DeepTimeLodDeps = {
|
|
46
|
+
constants: DeepTimeLodConstants;
|
|
47
|
+
moonDistanceMetresAtAge: (tMa: number) => number;
|
|
48
|
+
/**
|
|
49
|
+
* - GIA α(t)
|
|
50
|
+
*/
|
|
51
|
+
moiFactorAtAge: (tMa: number) => number;
|
|
52
|
+
siderealYearDaysFourierAt: (year: number) => number;
|
|
53
|
+
/**
|
|
54
|
+
* - gated δLOD sum (incl. swing)
|
|
55
|
+
*/
|
|
56
|
+
cycleLodSumAt: (year: number) => number;
|
|
57
|
+
/**
|
|
58
|
+
* - gated swing δLOD alone
|
|
59
|
+
*/
|
|
60
|
+
swingLodAt: (year: number) => number;
|
|
61
|
+
/**
|
|
62
|
+
* - gated analytic swing rate
|
|
63
|
+
*/
|
|
64
|
+
swingLodRateAt: (year: number) => number;
|
|
65
|
+
/**
|
|
66
|
+
* - OPTIONAL time-dependent
|
|
67
|
+
* Earth-Moon angular momentum (the Driver-1½ solar channels,
|
|
68
|
+
* recession-history.cjs). Absent → the J2000 constant, which the budget
|
|
69
|
+
* module equals exactly for t ≤ jointMa — the pure-twin convention.
|
|
70
|
+
*/
|
|
71
|
+
lEmAtAgeKgm2S?: ((tMa: number) => number) | undefined;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* @typedef {Object} DeepTimeLodConstants
|
|
75
|
+
* @property {number} lTotalEmKgm2S - Earth–Moon total angular momentum
|
|
76
|
+
* @property {number} mMoonAloneKg
|
|
77
|
+
* @property {number} mEarthAloneKg
|
|
78
|
+
* @property {number} rEarthMetres
|
|
79
|
+
* @property {number} gmEmM3PerS2 - GM of the Earth–Moon system
|
|
80
|
+
* @property {number} eFactorMoon - √(1−e²) factor of the lunar orbit
|
|
81
|
+
* @property {number} aLockMetres - tidal-lock distance (LOD denominator → 0)
|
|
82
|
+
* @property {number} aMoonNowMetres - Farhat polynomial anchor
|
|
83
|
+
* @property {number} alpha1PerMa @property {number} alpha3PerMa3
|
|
84
|
+
* @property {number} alpha4PerMa4
|
|
85
|
+
* @property {number} holisticYearJ2000
|
|
86
|
+
* @property {number} lodNowH13Seconds - the H/13-identity mean LOD at J2000
|
|
87
|
+
* @property {number} meanSiderealYearJ2000Seconds
|
|
88
|
+
* @property {number} solarMassLossFracPerYear
|
|
89
|
+
* @property {number} siderealYearDaysKinematicJ2000 - Actual-LOD numerator
|
|
90
|
+
* @property {number} precessionSolarShareJ2000 - f_S, the solar fraction of the J2000
|
|
91
|
+
* precession torque (derive-params) — the unit H(t) = 13·T_p,composed needs it
|
|
92
|
+
*/
|
|
93
|
+
/**
|
|
94
|
+
* @typedef {Object} DeepTimeLodDeps
|
|
95
|
+
* @property {DeepTimeLodConstants} constants
|
|
96
|
+
* @property {(tMa: number) => number} moonDistanceMetresAtAge
|
|
97
|
+
* @property {(tMa: number) => number} moiFactorAtAge - GIA α(t)
|
|
98
|
+
* @property {(year: number) => number} siderealYearDaysFourierAt
|
|
99
|
+
* @property {(year: number) => number} cycleLodSumAt - gated δLOD sum (incl. swing)
|
|
100
|
+
* @property {(year: number) => number} swingLodAt - gated swing δLOD alone
|
|
101
|
+
* @property {(year: number) => number} swingLodRateAt - gated analytic swing rate
|
|
102
|
+
* @property {(tMa: number) => number} [lEmAtAgeKgm2S] - OPTIONAL time-dependent
|
|
103
|
+
* Earth-Moon angular momentum (the Driver-1½ solar channels,
|
|
104
|
+
* recession-history.cjs). Absent → the J2000 constant, which the budget
|
|
105
|
+
* module equals exactly for t ≤ jointMa — the pure-twin convention.
|
|
106
|
+
*/
|
|
107
|
+
/** @param {DeepTimeLodDeps} deps */
|
|
108
|
+
export function createDeepTimeLod(deps: DeepTimeLodDeps): {
|
|
109
|
+
lodSecondsAtAge: (t_Ma: number) => number | null;
|
|
110
|
+
lodSecondsAtAgeWithAlpha: (t_Ma: number, alpha: number) => number | null;
|
|
111
|
+
lodHoursAtAge: (t_Ma: number) => number | null;
|
|
112
|
+
hAtAge: (t_Ma: number) => number | null;
|
|
113
|
+
lunisolarPrecessionRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
|
|
114
|
+
lunarTorqueFactorAtAge: (tMa: number) => (number | null);
|
|
115
|
+
precessionTorqueTermAtAge: (tMa: number) => (number | null);
|
|
116
|
+
siderealYearSecondsAtAge: (t_Ma: number) => number;
|
|
117
|
+
tropicalYearSecondsAtAge: (t_Ma: number) => number;
|
|
118
|
+
tropicalYearDaysAtAge: (t_Ma: number) => number | null;
|
|
119
|
+
yearInDaysAtAge: (t_Ma: number) => number | null;
|
|
120
|
+
deltaTRawSecondsAtAge: (t_Ma: number) => number;
|
|
121
|
+
lodSecondsWithCorrectionsAtAge: (t_Ma: number) => number | null;
|
|
122
|
+
lodSecondsActualAtAge: (t_Ma: number) => number | null;
|
|
123
|
+
dLodDtDecompositionAtAge: (t_Ma: number) => {
|
|
124
|
+
tidal: number | null;
|
|
125
|
+
gia: number | null;
|
|
126
|
+
stack: number | null;
|
|
127
|
+
resonator: number | null;
|
|
128
|
+
net_L2: number | null;
|
|
129
|
+
net_L3: number | null;
|
|
130
|
+
net_L4: number | null;
|
|
131
|
+
};
|
|
132
|
+
eraClockHAtAge: (t_Ma: number) => number | null;
|
|
133
|
+
eraClockTropicalYearSecondsAtAge: (t_Ma: number) => number;
|
|
134
|
+
eraClockYearInDaysAtAge: (t_Ma: number) => number | null;
|
|
135
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Espenak/Meeus ΔT in seconds — the FULL published canon: separate
|
|
3
|
+
* 1986–2005 segment, and the −20 + 32u² parabola (with the −0.5628
|
|
4
|
+
* correction above 2050) outside the tabulated range instead of NaN.
|
|
5
|
+
* @param {number} year - calendar year
|
|
6
|
+
* @returns {number}
|
|
7
|
+
*/
|
|
8
|
+
export function deltaTEspenakMeeusCanonSeconds(year: number): number;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export type RecessionRegime = {
|
|
2
|
+
/**
|
|
3
|
+
* - regime boundary; quartic below, spline above
|
|
4
|
+
*/
|
|
5
|
+
jointMa: number;
|
|
6
|
+
/**
|
|
7
|
+
* - interior knot ages (ascending)
|
|
8
|
+
*/
|
|
9
|
+
knotAgesMa: number[];
|
|
10
|
+
/**
|
|
11
|
+
* - fitted knot distances
|
|
12
|
+
*/
|
|
13
|
+
knotDistancesKm: number[];
|
|
14
|
+
/**
|
|
15
|
+
* - the Roche-crossing epoch
|
|
16
|
+
*/
|
|
17
|
+
genesisMa: number;
|
|
18
|
+
/**
|
|
19
|
+
* - the rigid Roche endpoint
|
|
20
|
+
*/
|
|
21
|
+
rocheLimitKm: number;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* @typedef {Object} RecessionRegime
|
|
25
|
+
* @property {number} jointMa - regime boundary; quartic below, spline above
|
|
26
|
+
* @property {number[]} knotAgesMa - interior knot ages (ascending)
|
|
27
|
+
* @property {number[]} knotDistancesKm - fitted knot distances
|
|
28
|
+
* @property {number} genesisMa - the Roche-crossing epoch
|
|
29
|
+
* @property {number} rocheLimitKm - the rigid Roche endpoint
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* @param {{
|
|
33
|
+
* aMoonNowMetres: number,
|
|
34
|
+
* alpha1PerMa: number, alpha3PerMa3: number, alpha4PerMa4: number,
|
|
35
|
+
* regime: RecessionRegime,
|
|
36
|
+
* }} deps
|
|
37
|
+
* @returns {{ distanceMetresAtAge: (tMa: number) => number }}
|
|
38
|
+
*/
|
|
39
|
+
export function createMoonRecessionHistory(deps: {
|
|
40
|
+
aMoonNowMetres: number;
|
|
41
|
+
alpha1PerMa: number;
|
|
42
|
+
alpha3PerMa3: number;
|
|
43
|
+
alpha4PerMa4: number;
|
|
44
|
+
regime: RecessionRegime;
|
|
45
|
+
}): {
|
|
46
|
+
distanceMetresAtAge: (tMa: number) => number;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* The solar angular-momentum channels: L_EM(t) integrated backward from
|
|
50
|
+
* J2000 with the ocean leak and the thermal-tide pump, explicit only
|
|
51
|
+
* beyond jointMa. Absent this module, every consumer's L_EM is the J2000
|
|
52
|
+
* constant — which remains the exact behaviour for t ≤ jointMa.
|
|
53
|
+
*
|
|
54
|
+
* @param {{
|
|
55
|
+
* lTotalJ2000KgM2S: number,
|
|
56
|
+
* mMoonAloneKg: number, gmEmM3PerS2: number, eFactorMoon: number,
|
|
57
|
+
* beta0: number,
|
|
58
|
+
* pumpStartMa: number, pumpEndMa: number, pumpFactor: number,
|
|
59
|
+
* jointMa: number, genesisMa: number,
|
|
60
|
+
* distanceMetresAtAge: (tMa: number) => number,
|
|
61
|
+
* stepMa?: number,
|
|
62
|
+
* }} deps
|
|
63
|
+
* @returns {{ lEmAtAgeKgm2S: (tMa: number) => number }}
|
|
64
|
+
*/
|
|
65
|
+
export function createSolarChannelBudget(deps: {
|
|
66
|
+
lTotalJ2000KgM2S: number;
|
|
67
|
+
mMoonAloneKg: number;
|
|
68
|
+
gmEmM3PerS2: number;
|
|
69
|
+
eFactorMoon: number;
|
|
70
|
+
beta0: number;
|
|
71
|
+
pumpStartMa: number;
|
|
72
|
+
pumpEndMa: number;
|
|
73
|
+
pumpFactor: number;
|
|
74
|
+
jointMa: number;
|
|
75
|
+
genesisMa: number;
|
|
76
|
+
distanceMetresAtAge: (tMa: number) => number;
|
|
77
|
+
stepMa?: number;
|
|
78
|
+
}): {
|
|
79
|
+
lEmAtAgeKgm2S: (tMa: number) => number;
|
|
80
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* zModes: ReadonlyArray<{omegaRadPerYr: number, re: number, im: number}>,
|
|
4
|
+
* zetaModes: ReadonlyArray<{omegaRadPerYr: number, re: number, im: number}>,
|
|
5
|
+
* zetaSeries?: {t0Yr: number, stepYr: number,
|
|
6
|
+
* q: ReadonlyArray<number>, p: ReadonlyArray<number>},
|
|
7
|
+
* zSeries?: {t0Yr: number, stepYr: number,
|
|
8
|
+
* q: ReadonlyArray<number>, p: ReadonlyArray<number>},
|
|
9
|
+
* anchorE: number,
|
|
10
|
+
* anchorPeriEclipticDeg: number,
|
|
11
|
+
* anchorInclEclipticDeg: number,
|
|
12
|
+
* anchorAscNodeEclipticDeg: number,
|
|
13
|
+
* axialPrecessionYearsJ2000: number,
|
|
14
|
+
* obliquityJ2000Deg: number,
|
|
15
|
+
* axialPrecessionYearsAtYearFn?: (year: number) => number,
|
|
16
|
+
* }} deps — mode tables from the governed deep artifact (choose the ζ tier
|
|
17
|
+
* per consumer: era = its own 8-term extraction, deep = the 16-term
|
|
18
|
+
* table; NEVER a slice); anchors from the chain artifact's one home; the
|
|
19
|
+
* axial-precession years and ε₀ from the injecting engine's certified
|
|
20
|
+
* surfaces. zetaSeries (C-2, the ONE-SOURCE evaluator): the BANKED engine
|
|
21
|
+
* ζ series (data/nbody-earth-zeta-series.json) — when supplied, n̂(t)
|
|
22
|
+
* reads the series itself inside its span (no mode extraction, no tiers;
|
|
23
|
+
* measured at the 500-yr artifact cadence: 0.16″/0.18″ rms vs IAU-2006
|
|
24
|
+
* over 1900–2100/1600–2400 vs the era tier's 0.31″/0.63″, and 0.0396°
|
|
25
|
+
* vs La2004 over −200 kyr vs the deep tier's 0.069° — the C-1 verdict,
|
|
26
|
+
* plan 02) and zetaModes serves only as the TAIL beyond the span (the
|
|
27
|
+
* seam at the span edge is the extraction residual, far outside every
|
|
28
|
+
* certified window).
|
|
29
|
+
*/
|
|
30
|
+
export function createDeepOrbitalHistory({ zModes, zetaModes, zetaSeries, zSeries, anchorE, anchorPeriEclipticDeg, anchorInclEclipticDeg, anchorAscNodeEclipticDeg, axialPrecessionYearsJ2000, obliquityJ2000Deg, axialPrecessionYearsAtYearFn, }: {
|
|
31
|
+
zModes: ReadonlyArray<{
|
|
32
|
+
omegaRadPerYr: number;
|
|
33
|
+
re: number;
|
|
34
|
+
im: number;
|
|
35
|
+
}>;
|
|
36
|
+
zetaModes: ReadonlyArray<{
|
|
37
|
+
omegaRadPerYr: number;
|
|
38
|
+
re: number;
|
|
39
|
+
im: number;
|
|
40
|
+
}>;
|
|
41
|
+
zetaSeries?: {
|
|
42
|
+
t0Yr: number;
|
|
43
|
+
stepYr: number;
|
|
44
|
+
q: ReadonlyArray<number>;
|
|
45
|
+
p: ReadonlyArray<number>;
|
|
46
|
+
};
|
|
47
|
+
zSeries?: {
|
|
48
|
+
t0Yr: number;
|
|
49
|
+
stepYr: number;
|
|
50
|
+
q: ReadonlyArray<number>;
|
|
51
|
+
p: ReadonlyArray<number>;
|
|
52
|
+
};
|
|
53
|
+
anchorE: number;
|
|
54
|
+
anchorPeriEclipticDeg: number;
|
|
55
|
+
anchorInclEclipticDeg: number;
|
|
56
|
+
anchorAscNodeEclipticDeg: number;
|
|
57
|
+
axialPrecessionYearsJ2000: number;
|
|
58
|
+
obliquityJ2000Deg: number;
|
|
59
|
+
axialPrecessionYearsAtYearFn?: (year: number) => number;
|
|
60
|
+
}): {
|
|
61
|
+
build: (t0Yr: number, t1Yr: number, stepYr: number) => {
|
|
62
|
+
/** @param {number} tYr */
|
|
63
|
+
at(tYr: number): {
|
|
64
|
+
epsDeg: number;
|
|
65
|
+
e: number;
|
|
66
|
+
periOfDateDeg: number;
|
|
67
|
+
eSinPeri: number;
|
|
68
|
+
eCosPeri: number;
|
|
69
|
+
inclEclDeg: number;
|
|
70
|
+
equinoxLonJ2000Deg: number;
|
|
71
|
+
equinoxLonRateDegPerYr: number;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
alphaArcsecPerYr: number;
|
|
75
|
+
alphaLunisolarArcsecPerYr: number;
|
|
76
|
+
axialPrecessionYearsLunisolarJ2000: number;
|
|
77
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solar fraction of the J2000 precession torque from the shared constants.
|
|
3
|
+
* @param {{
|
|
4
|
+
* gmSunKm3S2: number, auKm: number, earthEccentricity: number,
|
|
5
|
+
* gmMoonKm3S2: number, moonDistanceKm: number, moonEccentricity: number, moonInclinationDeg: number,
|
|
6
|
+
* }} c
|
|
7
|
+
* @returns {number} f_S in [0, 1]
|
|
8
|
+
*/
|
|
9
|
+
export function computeSolarTorqueShare(c: {
|
|
10
|
+
gmSunKm3S2: number;
|
|
11
|
+
auKm: number;
|
|
12
|
+
earthEccentricity: number;
|
|
13
|
+
gmMoonKm3S2: number;
|
|
14
|
+
moonDistanceKm: number;
|
|
15
|
+
moonEccentricity: number;
|
|
16
|
+
moonInclinationDeg: number;
|
|
17
|
+
}): number;
|
|
18
|
+
/**
|
|
19
|
+
* @param {{
|
|
20
|
+
* p0ArcsecPerYr: number,
|
|
21
|
+
* solarShare: number,
|
|
22
|
+
* lodSecondsAtAge: (tMa: number) => (number | null),
|
|
23
|
+
* lodJ2000Seconds: number,
|
|
24
|
+
* moonDistanceMetresAtAge: (tMa: number) => (number | null),
|
|
25
|
+
* moonDistanceJ2000Metres: number,
|
|
26
|
+
* yearToTMa: (year: number) => number,
|
|
27
|
+
* }} deps - p0 = 1,296,000/(H/13) (the model's J2000 rate); lodJ2000Seconds
|
|
28
|
+
* the SAME day basis lodSecondsAtAge(0) returns.
|
|
29
|
+
* @returns {{
|
|
30
|
+
* composedRateArcsecPerYrAtAge: (tMa: number) => (number | null),
|
|
31
|
+
* composedPeriodYearsAtAge: (tMa: number) => (number | null),
|
|
32
|
+
* composedRateArcsecPerYrAtYear: (year: number) => (number | null),
|
|
33
|
+
* composedPeriodYearsAtYear: (year: number) => (number | null),
|
|
34
|
+
* composedRateRatioAtAge: (tMa: number) => (number | null),
|
|
35
|
+
* torqueTermAtAge: (tMa: number) => (number | null),
|
|
36
|
+
* lunarTorqueFactorAtAge: (tMa: number) => (number | null),
|
|
37
|
+
* solarShare: number,
|
|
38
|
+
* p0ArcsecPerYr: number,
|
|
39
|
+
* }}
|
|
40
|
+
*/
|
|
41
|
+
export function createComposedPrecession(deps: {
|
|
42
|
+
p0ArcsecPerYr: number;
|
|
43
|
+
solarShare: number;
|
|
44
|
+
lodSecondsAtAge: (tMa: number) => (number | null);
|
|
45
|
+
lodJ2000Seconds: number;
|
|
46
|
+
moonDistanceMetresAtAge: (tMa: number) => (number | null);
|
|
47
|
+
moonDistanceJ2000Metres: number;
|
|
48
|
+
yearToTMa: (year: number) => number;
|
|
49
|
+
}): {
|
|
50
|
+
composedRateArcsecPerYrAtAge: (tMa: number) => (number | null);
|
|
51
|
+
composedPeriodYearsAtAge: (tMa: number) => (number | null);
|
|
52
|
+
composedRateArcsecPerYrAtYear: (year: number) => (number | null);
|
|
53
|
+
composedPeriodYearsAtYear: (year: number) => (number | null);
|
|
54
|
+
composedRateRatioAtAge: (tMa: number) => (number | null);
|
|
55
|
+
torqueTermAtAge: (tMa: number) => (number | null);
|
|
56
|
+
lunarTorqueFactorAtAge: (tMa: number) => (number | null);
|
|
57
|
+
solarShare: number;
|
|
58
|
+
p0ArcsecPerYr: number;
|
|
59
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export const SIDEREAL_CHANNEL_ARTIFACT: Readonly<{
|
|
2
|
+
t0Yr: -10000000;
|
|
3
|
+
stepYr: 2000;
|
|
4
|
+
windowYr: 2000;
|
|
5
|
+
lamDotRel: number[];
|
|
6
|
+
meta: {
|
|
7
|
+
dumpSha256: string;
|
|
8
|
+
source: string;
|
|
9
|
+
chaprontGate: number;
|
|
10
|
+
};
|
|
11
|
+
}>;
|
|
12
|
+
export const SIDEREAL_CHANNEL_ARTIFACT_HASH: "528101ca3410dc9b";
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* t0Yr?: number,
|
|
4
|
+
* stepYr?: number,
|
|
5
|
+
* lamDotRel?: number[],
|
|
6
|
+
* massLossSiderealSecondsAtYearFn: (year: number) => number,
|
|
7
|
+
* }} opts
|
|
8
|
+
* t0Yr/stepYr/lamDotRel: the banked channel geometry (t in years from
|
|
9
|
+
* J2000: t_i = t0Yr + i·stepYr) — default: the embedded
|
|
10
|
+
* SIDEREAL_CHANNEL_ARTIFACT (generate.mjs-owned, pinned to the governed
|
|
11
|
+
* series artifact), so callers normally pass only the mass-loss law.
|
|
12
|
+
* massLossSiderealSecondsAtYearFn: the caller's secular mass-loss
|
|
13
|
+
* sidereal-year law, SI seconds (year = calendar year).
|
|
14
|
+
*/
|
|
15
|
+
export function createSiderealYearChannel(opts: {
|
|
16
|
+
t0Yr?: number;
|
|
17
|
+
stepYr?: number;
|
|
18
|
+
lamDotRel?: number[];
|
|
19
|
+
massLossSiderealSecondsAtYearFn: (year: number) => number;
|
|
20
|
+
}): {
|
|
21
|
+
/** The planetary λ̇ ratio to J2000 (1 outside the banked span). @param {number} year */
|
|
22
|
+
planetaryRelAtYear: (year: number) => number;
|
|
23
|
+
/** The sidereal year of date, SI seconds. @param {number} year */
|
|
24
|
+
siderealYearSecondsAtYear: (year: number) => number;
|
|
25
|
+
/**
|
|
26
|
+
* Apply the λ̇ drift COHERENTLY to any year length (tropical,
|
|
27
|
+
* anomalistic, …): every year is 360/(λ̇ + X) for some geometric rate
|
|
28
|
+
* X (equinox p, apsidal −ϖ̇, 0 for sidereal), and the channel scales
|
|
29
|
+
* λ̇ only — so the correction is on the RATE, not the period:
|
|
30
|
+
* 1/T' = 1/T + (rel − 1)/T_sid_raw
|
|
31
|
+
* (for the sidereal year itself this reduces exactly to T/rel).
|
|
32
|
+
* Correcting periods by division instead would corrupt beat-derived
|
|
33
|
+
* quantities (P = sid/(sid − trop) amplifies ~20×/s); this form
|
|
34
|
+
* leaves every beat invariant to second order.
|
|
35
|
+
* @param {number} year @param {number} yearSeconds
|
|
36
|
+
*/
|
|
37
|
+
correctedYearSeconds: (year: number, yearSeconds: number) => number;
|
|
38
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* sampleAt: (year: number) => {e: number, periOfDateDeg: number, equinoxLonJ2000Deg: number},
|
|
4
|
+
* massLossSiderealSecondsAtYearFn: (year: number) => number,
|
|
5
|
+
* apsidalSecularDegPerYrFn?: (year: number) => number,
|
|
6
|
+
* }} opts
|
|
7
|
+
* sampleAt: the one-source movement sampler, calendar-year keyed
|
|
8
|
+
* (createDeepOrbitalHistory build().at wrapped by the caller — series
|
|
9
|
+
* tier where the artifact is available, mode tail beyond).
|
|
10
|
+
* massLossSiderealSecondsAtYearFn: the caller's secular mass-loss
|
|
11
|
+
* sidereal-year law, SI seconds, IAU-anchored at J2000.
|
|
12
|
+
* apsidalSecularDegPerYrFn: the chain's SECULAR apsidal tangent of date
|
|
13
|
+
* (keplerian-chain computeApsidalSecularDegPerYr for Earth — deg/yr,
|
|
14
|
+
* J2000-ecliptic frame). When given, the anomalistic year is the
|
|
15
|
+
* mean-element construction on this smooth rate; when absent, it falls
|
|
16
|
+
* back to the cardinal structure's measured year-over-year interval
|
|
17
|
+
* (which carries the banked series' century-scale ϖ̇ wobble).
|
|
18
|
+
*/
|
|
19
|
+
export function createYearLengths({ sampleAt, massLossSiderealSecondsAtYearFn, apsidalSecularDegPerYrFn }: {
|
|
20
|
+
sampleAt: (year: number) => {
|
|
21
|
+
e: number;
|
|
22
|
+
periOfDateDeg: number;
|
|
23
|
+
equinoxLonJ2000Deg: number;
|
|
24
|
+
};
|
|
25
|
+
massLossSiderealSecondsAtYearFn: (year: number) => number;
|
|
26
|
+
apsidalSecularDegPerYrFn?: (year: number) => number;
|
|
27
|
+
}): Readonly<{
|
|
28
|
+
/** Mean tropical year of date, SI seconds. @param {number} year */
|
|
29
|
+
tropicalYearSecondsAtYear: (year: number) => number;
|
|
30
|
+
/** Sidereal year of date, SI seconds. @param {number} year */
|
|
31
|
+
siderealYearSecondsAtYear: (year: number) => number;
|
|
32
|
+
/** Anomalistic year of date, SI seconds. @param {number} year */
|
|
33
|
+
anomalisticYearSecondsAtYear: (year: number) => number;
|
|
34
|
+
/** Axial precession period of date (equinox regression beat), years. @param {number} y */
|
|
35
|
+
axialPrecessionYearsAtYear: (y: number) => number;
|
|
36
|
+
/** Perihelion (apsidal-vs-equinox) precession period of date, years. @param {number} y */
|
|
37
|
+
perihelionPrecessionYearsAtYear: (y: number) => number;
|
|
38
|
+
/** Apsidal precession period of date vs the fixed stars, years (hypersensitive: ±1 s ↔ ≈400 yr; the identifier keeps the historical "inclination" name). @param {number} y */
|
|
39
|
+
inclinationPrecessionYearsAtYear: (y: number) => number;
|
|
40
|
+
/** The per-cardinal layer (D6 rules: year lengths λ̇-corrected; offsets/spreads raw — μs-class/second-order there). */
|
|
41
|
+
cardinal: Readonly<{
|
|
42
|
+
/** @param {number} y @param {'VE'|'SS'|'AE'|'WS'} type */
|
|
43
|
+
yearLengthSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
44
|
+
/** @param {number} y @param {'VE'|'SS'|'AE'|'WS'} type */
|
|
45
|
+
eocOffsetSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
46
|
+
/** @param {number} y */
|
|
47
|
+
spreadSeconds: (y: number) => {
|
|
48
|
+
VE: number;
|
|
49
|
+
SS: number;
|
|
50
|
+
AE: number;
|
|
51
|
+
WS: number;
|
|
52
|
+
meanSeconds: number;
|
|
53
|
+
};
|
|
54
|
+
}>;
|
|
55
|
+
/** The planetary λ̇ ratio (diagnostic; ≡1 at J2000). */
|
|
56
|
+
planetaryRelAtYear: (year: number) => number;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* The published of-date window (plan 06 Phase 3 S2): inside |year − 2000| ≤
|
|
60
|
+
* this span the one-family route is THE published year-length / precession
|
|
61
|
+
* family (the banked tiers — 100-yr and 1000-yr grids, no unbounded sampler
|
|
62
|
+
* growth); beyond it the published surfaces return the unit's SECULAR mean
|
|
63
|
+
* (H(t)/13 for the precession period, the tidal-chain mean year), because the
|
|
64
|
+
* of-date wobble is unresolved there and the deep sampler grows ~0.1 s per Myr
|
|
65
|
+
* of span. A displayed rate must name its window — this is the window.
|
|
66
|
+
*/
|
|
67
|
+
export const ONE_FAMILY_WINDOW_YEARS: 2000000;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export type BesselianDeps = {
|
|
2
|
+
/**
|
|
3
|
+
* full-series Moon: ecliptic-of-date longitude/latitude (deg) + distance (km), TT axis (days since J2000)
|
|
4
|
+
*/
|
|
5
|
+
moonFullAtDaysTT: (dDaysTT: number) => {
|
|
6
|
+
lonDeg: number;
|
|
7
|
+
latDeg: number;
|
|
8
|
+
distKm: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* - geometric mean sun longitude (deg), JD(UT) axis with the finder's internal ΔT
|
|
12
|
+
*/
|
|
13
|
+
sunLonDegAt: (jdUT: number) => number;
|
|
14
|
+
/**
|
|
15
|
+
* - 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)
|
|
16
|
+
*/
|
|
17
|
+
sunCompletionDeg: (T: number) => number;
|
|
18
|
+
/**
|
|
19
|
+
* - derived series-extension tail (deg) at T centuries TT, ADDED to the full-series Moon longitude/latitude (see moon/series-extension.cjs; same finder-scoping rationale as sunCompletionDeg — the finders stay on the bare series)
|
|
20
|
+
*/
|
|
21
|
+
moonExtensionAt: (T: number) => {
|
|
22
|
+
dLonDeg: number;
|
|
23
|
+
dLatDeg: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* - framework ΔT (J2000-zeroed convention)
|
|
27
|
+
*/
|
|
28
|
+
deltaTSecondsAt: (jd: number) => number;
|
|
29
|
+
/**
|
|
30
|
+
* - framework obliquity (deg) at calendar year
|
|
31
|
+
*/
|
|
32
|
+
obliquityDegAt: (year: number) => number;
|
|
33
|
+
/**
|
|
34
|
+
* - framework Earth-orbit eccentricity at calendar year
|
|
35
|
+
*/
|
|
36
|
+
eccentricityAt: (year: number) => number;
|
|
37
|
+
/**
|
|
38
|
+
* - framework perihelion longitude (deg) at calendar year
|
|
39
|
+
*/
|
|
40
|
+
perihelionLongitudeDegAt: (year: number) => number;
|
|
41
|
+
/**
|
|
42
|
+
* - the model's own JD → calendar-year conversion
|
|
43
|
+
*/
|
|
44
|
+
yearFromJD: (jd: number) => number;
|
|
45
|
+
constants: {
|
|
46
|
+
j2000JD: number;
|
|
47
|
+
julianCenturyDays: number;
|
|
48
|
+
earthDiameterKm: number;
|
|
49
|
+
moonDiameterKm: number;
|
|
50
|
+
sunDiameterKm: number;
|
|
51
|
+
sunDistanceKm: number;
|
|
52
|
+
earthFlatteningInverse: number;
|
|
53
|
+
ttBridgeSeconds: number;
|
|
54
|
+
gmstMeanSiderealT0Deg: number;
|
|
55
|
+
gmstMeanSiderealRateDegPerDay: number;
|
|
56
|
+
gmstMeanSiderealT2Deg: number;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* @typedef {Object} BesselianDeps
|
|
61
|
+
* @property {(dDaysTT: number) => {lonDeg: number, latDeg: number, distKm: number}} moonFullAtDaysTT
|
|
62
|
+
* full-series Moon: ecliptic-of-date longitude/latitude (deg) + distance (km), TT axis (days since J2000)
|
|
63
|
+
* @property {(jdUT: number) => number} sunLonDegAt - geometric mean sun longitude (deg), JD(UT) axis with the finder's internal ΔT
|
|
64
|
+
* @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)
|
|
65
|
+
* @property {(T: number) => {dLonDeg: number, dLatDeg: number}} moonExtensionAt - derived series-extension tail (deg) at T centuries TT, ADDED to the full-series Moon longitude/latitude (see moon/series-extension.cjs; same finder-scoping rationale as sunCompletionDeg — the finders stay on the bare series)
|
|
66
|
+
* @property {(jd: number) => number} deltaTSecondsAt - framework ΔT (J2000-zeroed convention)
|
|
67
|
+
* @property {(year: number) => number} obliquityDegAt - framework obliquity (deg) at calendar year
|
|
68
|
+
* @property {(year: number) => number} eccentricityAt - framework Earth-orbit eccentricity at calendar year
|
|
69
|
+
* @property {(year: number) => number} perihelionLongitudeDegAt - framework perihelion longitude (deg) at calendar year
|
|
70
|
+
* @property {(jd: number) => number} yearFromJD - the model's own JD → calendar-year conversion
|
|
71
|
+
* @property {{ j2000JD: number, julianCenturyDays: number, earthDiameterKm: number,
|
|
72
|
+
* moonDiameterKm: number, sunDiameterKm: number, sunDistanceKm: number,
|
|
73
|
+
* earthFlatteningInverse: number, ttBridgeSeconds: number,
|
|
74
|
+
* gmstMeanSiderealT0Deg: number, gmstMeanSiderealRateDegPerDay: number,
|
|
75
|
+
* gmstMeanSiderealT2Deg: number }} constants
|
|
76
|
+
*/
|
|
77
|
+
/** @param {BesselianDeps} deps */
|
|
78
|
+
export function createBesselian(deps: BesselianDeps): {
|
|
79
|
+
umbraGroundAt: (jdUT: number) => {
|
|
80
|
+
latDeg: number;
|
|
81
|
+
lonDeg: number;
|
|
82
|
+
} | null;
|
|
83
|
+
shadowStateAt: (jdUT: number, latDeg: number, lonDeg: number) => {
|
|
84
|
+
offsetKm: number;
|
|
85
|
+
penumbraKm: number;
|
|
86
|
+
umbraKm: number;
|
|
87
|
+
magnitude: number;
|
|
88
|
+
};
|
|
89
|
+
localCircumstances: (jdGreatest: number, latDeg: number, lonDeg: number) => {
|
|
90
|
+
kind: "none" | "partial" | "annular" | "total";
|
|
91
|
+
magnitude: number;
|
|
92
|
+
maxJd: number;
|
|
93
|
+
contacts: {
|
|
94
|
+
c1: number | null;
|
|
95
|
+
c2: number | null;
|
|
96
|
+
c3: number | null;
|
|
97
|
+
c4: number | null;
|
|
98
|
+
};
|
|
99
|
+
centralDurationSeconds: number | null;
|
|
100
|
+
};
|
|
101
|
+
};
|