@essrt/physics 4.7.0 → 4.9.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 +40 -38
- package/src/chain-cycles/index.cjs +24 -1
- package/src/constants/coefficients.d.ts +772 -0
- package/src/constants/generated.d.ts +38 -38
- package/src/earth/year-lengths.cjs +1 -1
- package/src/model.js +28 -3
- 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 +32 -0
- package/types/constants/coefficients.d.ts +772 -0
- package/types/constants/generated.d.ts +753 -0
- package/types/constants/index.d.ts +2 -0
- package/types/deltat/cycles.d.cts +72 -0
- package/types/deltat/deep-time.d.cts +122 -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/sidereal-channel-artifact.d.cts +12 -0
- package/types/earth/sidereal-year-channel.d.cts +38 -0
- package/types/earth/year-lengths.d.cts +57 -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 +77 -0
- package/types/layer0/derive-params.d.ts +36 -0
- package/types/layer0/index.d.ts +49 -0
- package/types/layer1/index.d.ts +10 -0
- package/types/model.d.ts +156 -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,138 @@
|
|
|
1
|
+
export type MoonArgsDeg = {
|
|
2
|
+
Lp: number;
|
|
3
|
+
D: number;
|
|
4
|
+
M: number;
|
|
5
|
+
Mp: number;
|
|
6
|
+
F: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {{Lp: number, D: number, M: number, Mp: number, F: number}} MoonArgsDeg
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* @param {{
|
|
13
|
+
* constants: {
|
|
14
|
+
* j2000JD: number,
|
|
15
|
+
* julianCenturyDays: number,
|
|
16
|
+
* holisticYearJ2000: number,
|
|
17
|
+
* balancedYearJ2000: number,
|
|
18
|
+
* meanSolarYearDays: number,
|
|
19
|
+
* meanAnomalisticYearDays: number,
|
|
20
|
+
* tropicalYearHarmonics: Array<[number, number, number]>,
|
|
21
|
+
* anomalisticYearHarmonics: Array<[number, number, number]>,
|
|
22
|
+
* eccentricityJ2000: number,
|
|
23
|
+
* eccentricityDotJ2000: number,
|
|
24
|
+
* eccentricityDotDotJ2000: number,
|
|
25
|
+
* elpEarthFigureJ2ArcsecPerCy2: number,
|
|
26
|
+
* elpGeneralPrecessionPA_T2ArcsecPerCy2: number,
|
|
27
|
+
* eccE0: number,
|
|
28
|
+
* },
|
|
29
|
+
* fns: {
|
|
30
|
+
* eccAt: (tYr: number) => number,
|
|
31
|
+
* channelIntegral: (T: number, s: number) => number,
|
|
32
|
+
* computeObliquityEarth: (year: number) => number,
|
|
33
|
+
* jdToSIyear: (jd: number) => number,
|
|
34
|
+
* tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null),
|
|
35
|
+
* apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null),
|
|
36
|
+
* nodalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null),
|
|
37
|
+
* cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null),
|
|
38
|
+
* isDeepTime: () => boolean,
|
|
39
|
+
* isFrameworkNative: () => boolean,
|
|
40
|
+
* pDynDegPerYearAt?: (year: number) => number,
|
|
41
|
+
* pKinDegPerYearAt?: (year: number) => number,
|
|
42
|
+
* },
|
|
43
|
+
* }} deps — fns are the ENGINE'S OWN chain wrappers (each engine's toggle
|
|
44
|
+
* semantics ride along); eccAt/channelIntegral are the shared moon ecc
|
|
45
|
+
* channel; constants are J2000-frozen injections. The OPTIONAL precession
|
|
46
|
+
* pair powers the (d′) of-date rate completion: pDyn = the DYNAMICAL
|
|
47
|
+
* axial precession (day-form beat of the engine's sidereal/solar year
|
|
48
|
+
* evaluators — the tweakpane identity, real at J2000, epoch-valid);
|
|
49
|
+
* pKin = the KINEMATIC pair's beat (the H/13-family mean the chains
|
|
50
|
+
* embed). Absent ⇒ the completion is disabled (pre-(d′) behaviour).
|
|
51
|
+
*/
|
|
52
|
+
export function createMoonArguments({ constants, fns }: {
|
|
53
|
+
constants: {
|
|
54
|
+
j2000JD: number;
|
|
55
|
+
julianCenturyDays: number;
|
|
56
|
+
holisticYearJ2000: number;
|
|
57
|
+
balancedYearJ2000: number;
|
|
58
|
+
meanSolarYearDays: number;
|
|
59
|
+
meanAnomalisticYearDays: number;
|
|
60
|
+
tropicalYearHarmonics: Array<[number, number, number]>;
|
|
61
|
+
anomalisticYearHarmonics: Array<[number, number, number]>;
|
|
62
|
+
eccentricityJ2000: number;
|
|
63
|
+
eccentricityDotJ2000: number;
|
|
64
|
+
eccentricityDotDotJ2000: number;
|
|
65
|
+
elpEarthFigureJ2ArcsecPerCy2: number;
|
|
66
|
+
elpGeneralPrecessionPA_T2ArcsecPerCy2: number;
|
|
67
|
+
eccE0: number;
|
|
68
|
+
};
|
|
69
|
+
fns: {
|
|
70
|
+
eccAt: (tYr: number) => number;
|
|
71
|
+
channelIntegral: (T: number, s: number) => number;
|
|
72
|
+
computeObliquityEarth: (year: number) => number;
|
|
73
|
+
jdToSIyear: (jd: number) => number;
|
|
74
|
+
tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null);
|
|
75
|
+
apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null);
|
|
76
|
+
nodalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null);
|
|
77
|
+
cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null);
|
|
78
|
+
isDeepTime: () => boolean;
|
|
79
|
+
isFrameworkNative: () => boolean;
|
|
80
|
+
pDynDegPerYearAt?: (year: number) => number;
|
|
81
|
+
pKinDegPerYearAt?: (year: number) => number;
|
|
82
|
+
};
|
|
83
|
+
}): {
|
|
84
|
+
argsAt: (jdTT: number) => MoonArgsDeg;
|
|
85
|
+
fwArgs: (jdTT: number) => MoonArgsDeg;
|
|
86
|
+
fwArgsDeep: (jd: number) => MoonArgsDeg | null;
|
|
87
|
+
pureMeeusArgs: (jdTT: number) => MoonArgsDeg;
|
|
88
|
+
sunSecularDeviations: (jdTT: number) => {
|
|
89
|
+
dLs: number;
|
|
90
|
+
dPeri: number;
|
|
91
|
+
};
|
|
92
|
+
planetaryCarrier: (T: number) => number;
|
|
93
|
+
obliquityCarrier: (T: number) => number;
|
|
94
|
+
lpSecularCompletion: (T: number) => number;
|
|
95
|
+
bundle: {
|
|
96
|
+
LP0: number;
|
|
97
|
+
D0: number;
|
|
98
|
+
M0: number;
|
|
99
|
+
MP0: number;
|
|
100
|
+
F0: number;
|
|
101
|
+
LPR: number;
|
|
102
|
+
DR: number;
|
|
103
|
+
MR: number;
|
|
104
|
+
P_DEGCY: number;
|
|
105
|
+
WDOT: number;
|
|
106
|
+
NDOT: number;
|
|
107
|
+
T2_W: number;
|
|
108
|
+
T2_N: number;
|
|
109
|
+
T3_W: number;
|
|
110
|
+
T3_N: number;
|
|
111
|
+
T2_LP: number;
|
|
112
|
+
T2_LP_TIDAL: number;
|
|
113
|
+
S_W: number;
|
|
114
|
+
S_N: number;
|
|
115
|
+
};
|
|
116
|
+
_rateCompletion: () => {
|
|
117
|
+
rc: {
|
|
118
|
+
ok: boolean;
|
|
119
|
+
pFix: (dyYears: number) => number;
|
|
120
|
+
pdSlopeDegPerCy2: number;
|
|
121
|
+
};
|
|
122
|
+
anchors: {
|
|
123
|
+
ok: boolean;
|
|
124
|
+
Lp: number;
|
|
125
|
+
w: number;
|
|
126
|
+
om: number;
|
|
127
|
+
Lsun: number;
|
|
128
|
+
ws: number;
|
|
129
|
+
Tq: number;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Astronomical JD → decimal year: Julian calendar before 1582-10-15,
|
|
135
|
+
* Gregorian after (Meeus Ch. 7 inverse). The S3-aligned coordinate for the
|
|
136
|
+
* Sun secular deviations. @param {number} jd @returns {number}
|
|
137
|
+
*/
|
|
138
|
+
export function jdToDecimalYear(jd: number): number;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* earthZ: ReadonlyArray<{omegaRadPerYr: number, re: number, im: number}>,
|
|
4
|
+
* anchorE: number,
|
|
5
|
+
* anchorPeriEclipticDeg: number,
|
|
6
|
+
* }} artifact — the embedded deep-modes artifact (earth z-modes + the J2000
|
|
7
|
+
* anchor pair joined from the chain artifact's one home).
|
|
8
|
+
*/
|
|
9
|
+
export function createDeepEccChannel({ earthZ, anchorE, anchorPeriEclipticDeg }: {
|
|
10
|
+
earthZ: ReadonlyArray<{
|
|
11
|
+
omegaRadPerYr: number;
|
|
12
|
+
re: number;
|
|
13
|
+
im: number;
|
|
14
|
+
}>;
|
|
15
|
+
anchorE: number;
|
|
16
|
+
anchorPeriEclipticDeg: number;
|
|
17
|
+
}): {
|
|
18
|
+
eccAt: (tYr: number) => number;
|
|
19
|
+
eccRateAt: (tYr: number) => number;
|
|
20
|
+
modulation: (tMa: number, s: number) => number;
|
|
21
|
+
channelIntegral: (T: number, s: number) => number;
|
|
22
|
+
eFactorAt: (tYr: number) => number;
|
|
23
|
+
e0: number;
|
|
24
|
+
g0: number;
|
|
25
|
+
};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
export const DEEP_MODES_ARTIFACT: Readonly<{
|
|
2
|
+
meta: {
|
|
3
|
+
integrator: string;
|
|
4
|
+
order: number;
|
|
5
|
+
dtDays: number;
|
|
6
|
+
spanYears: number;
|
|
7
|
+
sampleDays: number;
|
|
8
|
+
gr: boolean;
|
|
9
|
+
seed: string;
|
|
10
|
+
masses: string;
|
|
11
|
+
runCommand: string;
|
|
12
|
+
dumpFile: string;
|
|
13
|
+
dumpSha256: string;
|
|
14
|
+
conservationMaxDE: number;
|
|
15
|
+
decimation: number;
|
|
16
|
+
naffTerms: number;
|
|
17
|
+
naffZetaTerms: number;
|
|
18
|
+
naffZetaTermsEra: number;
|
|
19
|
+
frame: string;
|
|
20
|
+
laskarRef: string;
|
|
21
|
+
};
|
|
22
|
+
verdict: {
|
|
23
|
+
strongestBeatPeriodKyr: number;
|
|
24
|
+
strongestBeatArcsecPerYr: number;
|
|
25
|
+
la2004BeatPeriodKyr: number;
|
|
26
|
+
rockMetronomeKyr: number;
|
|
27
|
+
companion124Kyr: number;
|
|
28
|
+
companion95Kyr: number;
|
|
29
|
+
earthLeadingModesArcsecPerYr: number[];
|
|
30
|
+
topBeatLines: {
|
|
31
|
+
periodKyr: number;
|
|
32
|
+
productAmp: number;
|
|
33
|
+
}[];
|
|
34
|
+
note: string;
|
|
35
|
+
};
|
|
36
|
+
earthZ: {
|
|
37
|
+
omegaRadPerYr: number;
|
|
38
|
+
re: number;
|
|
39
|
+
im: number;
|
|
40
|
+
}[];
|
|
41
|
+
earthZeta: {
|
|
42
|
+
omegaRadPerYr: number;
|
|
43
|
+
re: number;
|
|
44
|
+
im: number;
|
|
45
|
+
}[];
|
|
46
|
+
earthZetaEra: {
|
|
47
|
+
omegaRadPerYr: number;
|
|
48
|
+
re: number;
|
|
49
|
+
im: number;
|
|
50
|
+
}[];
|
|
51
|
+
planetLeadingZetaArcsecPerYr: {
|
|
52
|
+
mercury: number;
|
|
53
|
+
venus: number;
|
|
54
|
+
earth: number;
|
|
55
|
+
mars: number;
|
|
56
|
+
jupiter: number;
|
|
57
|
+
saturn: number;
|
|
58
|
+
uranus: number;
|
|
59
|
+
neptune: number;
|
|
60
|
+
};
|
|
61
|
+
planetZ: {
|
|
62
|
+
mercury: {
|
|
63
|
+
omegaRadPerYr: number;
|
|
64
|
+
re: number;
|
|
65
|
+
im: number;
|
|
66
|
+
}[];
|
|
67
|
+
venus: {
|
|
68
|
+
omegaRadPerYr: number;
|
|
69
|
+
re: number;
|
|
70
|
+
im: number;
|
|
71
|
+
}[];
|
|
72
|
+
mars: {
|
|
73
|
+
omegaRadPerYr: number;
|
|
74
|
+
re: number;
|
|
75
|
+
im: number;
|
|
76
|
+
}[];
|
|
77
|
+
jupiter: {
|
|
78
|
+
omegaRadPerYr: number;
|
|
79
|
+
re: number;
|
|
80
|
+
im: number;
|
|
81
|
+
}[];
|
|
82
|
+
saturn: {
|
|
83
|
+
omegaRadPerYr: number;
|
|
84
|
+
re: number;
|
|
85
|
+
im: number;
|
|
86
|
+
}[];
|
|
87
|
+
uranus: {
|
|
88
|
+
omegaRadPerYr: number;
|
|
89
|
+
re: number;
|
|
90
|
+
im: number;
|
|
91
|
+
}[];
|
|
92
|
+
neptune: {
|
|
93
|
+
omegaRadPerYr: number;
|
|
94
|
+
re: number;
|
|
95
|
+
im: number;
|
|
96
|
+
}[];
|
|
97
|
+
};
|
|
98
|
+
planetZeta: {
|
|
99
|
+
mercury: {
|
|
100
|
+
omegaRadPerYr: number;
|
|
101
|
+
re: number;
|
|
102
|
+
im: number;
|
|
103
|
+
}[];
|
|
104
|
+
venus: {
|
|
105
|
+
omegaRadPerYr: number;
|
|
106
|
+
re: number;
|
|
107
|
+
im: number;
|
|
108
|
+
}[];
|
|
109
|
+
mars: {
|
|
110
|
+
omegaRadPerYr: number;
|
|
111
|
+
re: number;
|
|
112
|
+
im: number;
|
|
113
|
+
}[];
|
|
114
|
+
jupiter: {
|
|
115
|
+
omegaRadPerYr: number;
|
|
116
|
+
re: number;
|
|
117
|
+
im: number;
|
|
118
|
+
}[];
|
|
119
|
+
saturn: {
|
|
120
|
+
omegaRadPerYr: number;
|
|
121
|
+
re: number;
|
|
122
|
+
im: number;
|
|
123
|
+
}[];
|
|
124
|
+
uranus: {
|
|
125
|
+
omegaRadPerYr: number;
|
|
126
|
+
re: number;
|
|
127
|
+
im: number;
|
|
128
|
+
}[];
|
|
129
|
+
neptune: {
|
|
130
|
+
omegaRadPerYr: number;
|
|
131
|
+
re: number;
|
|
132
|
+
im: number;
|
|
133
|
+
}[];
|
|
134
|
+
};
|
|
135
|
+
anchorE: 0.016702435651957018;
|
|
136
|
+
anchorPeriEclipticDeg: 462.9179213996577;
|
|
137
|
+
anchorInclEclipticDeg: 0.00010345820355474172;
|
|
138
|
+
anchorAscNodeEclipticDeg: 140.29217988414328;
|
|
139
|
+
}>;
|
|
140
|
+
export const DEEP_MODES_ARTIFACT_HASH: "77e0baf779e85de5";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null),
|
|
4
|
+
* eccentricityBase: number,
|
|
5
|
+
* eccentricityJ2000?: number,
|
|
6
|
+
* perihelionLongitudeJ2000Deg: number,
|
|
7
|
+
* inclinationCycleAnchorDeg: number,
|
|
8
|
+
* }} deps — cyclesBetween MUST be the engine's own H-lattice phase counter
|
|
9
|
+
* (integrated under deep time); perihelionLongitudeJ2000Deg is ϖ_ICRF at
|
|
10
|
+
* J2000 (102.94719°, the FULL value — a truncated copy once cost 0.684″);
|
|
11
|
+
* inclinationCycleAnchorDeg is the H/3 inclination anchor (21.77°).
|
|
12
|
+
*/
|
|
13
|
+
export function createMoonEccChannel({ cyclesBetween, eccentricityBase, perihelionLongitudeJ2000Deg, inclinationCycleAnchorDeg, eccentricityJ2000, }: {
|
|
14
|
+
cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null);
|
|
15
|
+
eccentricityBase: number;
|
|
16
|
+
eccentricityJ2000?: number;
|
|
17
|
+
perihelionLongitudeJ2000Deg: number;
|
|
18
|
+
inclinationCycleAnchorDeg: number;
|
|
19
|
+
}): {
|
|
20
|
+
eccAt: (tYr: number) => number;
|
|
21
|
+
eccRateAt: (tYr: number) => number;
|
|
22
|
+
modulation: (tMa: number, s: number) => number;
|
|
23
|
+
channelIntegral: (T: number, s: number) => number;
|
|
24
|
+
eFactorAt: (tYr: number) => number;
|
|
25
|
+
th0: number;
|
|
26
|
+
amplitude: number;
|
|
27
|
+
mean: number;
|
|
28
|
+
e0: number;
|
|
29
|
+
g0: number;
|
|
30
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* constants: {
|
|
4
|
+
* aMoonNowMetres: number,
|
|
5
|
+
* alpha1PerMa: number,
|
|
6
|
+
* alpha3PerMa3: number,
|
|
7
|
+
* alpha4PerMa4: number,
|
|
8
|
+
* gmEarthMoonM3PerS2: number,
|
|
9
|
+
* massRatioEarthMoon: number,
|
|
10
|
+
* moonSiderealMonthInputDays: number,
|
|
11
|
+
* holisticYearJ2000: number,
|
|
12
|
+
* meanSiderealYearJ2000Seconds: number,
|
|
13
|
+
* nApsidalOfDateJ2000: number,
|
|
14
|
+
* nNodalOfDateJ2000: number,
|
|
15
|
+
* moonApsidalJ2000Seconds: number,
|
|
16
|
+
* moonNodalJ2000Seconds: number,
|
|
17
|
+
* moonSiderealMonthJ2000Seconds: number,
|
|
18
|
+
* sPerigee: number,
|
|
19
|
+
* sNode: number,
|
|
20
|
+
* },
|
|
21
|
+
* fns: {
|
|
22
|
+
* meanLodSecondsAtAge: (tMa: number) => (number | null),
|
|
23
|
+
* meanSiderealYearSecondsAtAge: (tMa: number) => number,
|
|
24
|
+
* meanHAtAge: (tMa: number) => (number | null),
|
|
25
|
+
* modulation: (tMa: number, s: number) => number,
|
|
26
|
+
* distanceMetresAtAge?: (tMa: number) => number,
|
|
27
|
+
* },
|
|
28
|
+
* }} deps — fns are the ENGINE'S OWN layer-0/1 evaluators and the shared
|
|
29
|
+
* eccentricity channel's modulation; constants are the engine's derived
|
|
30
|
+
* J2000 anchors (both engines derive them from the same JSON).
|
|
31
|
+
* fns.distanceMetresAtAge, when present, OVERRIDES the internal quartic —
|
|
32
|
+
* the Driver-1½ regime-aware history (recession-history.cjs); absent, the
|
|
33
|
+
* internal quartic is the pure twin (bit-identical for t ≤ jointMa).
|
|
34
|
+
*/
|
|
35
|
+
export function createMoonMonthChain({ constants, fns }: {
|
|
36
|
+
constants: {
|
|
37
|
+
aMoonNowMetres: number;
|
|
38
|
+
alpha1PerMa: number;
|
|
39
|
+
alpha3PerMa3: number;
|
|
40
|
+
alpha4PerMa4: number;
|
|
41
|
+
gmEarthMoonM3PerS2: number;
|
|
42
|
+
massRatioEarthMoon: number;
|
|
43
|
+
moonSiderealMonthInputDays: number;
|
|
44
|
+
holisticYearJ2000: number;
|
|
45
|
+
meanSiderealYearJ2000Seconds: number;
|
|
46
|
+
nApsidalOfDateJ2000: number;
|
|
47
|
+
nNodalOfDateJ2000: number;
|
|
48
|
+
moonApsidalJ2000Seconds: number;
|
|
49
|
+
moonNodalJ2000Seconds: number;
|
|
50
|
+
moonSiderealMonthJ2000Seconds: number;
|
|
51
|
+
sPerigee: number;
|
|
52
|
+
sNode: number;
|
|
53
|
+
};
|
|
54
|
+
fns: {
|
|
55
|
+
meanLodSecondsAtAge: (tMa: number) => (number | null);
|
|
56
|
+
meanSiderealYearSecondsAtAge: (tMa: number) => number;
|
|
57
|
+
meanHAtAge: (tMa: number) => (number | null);
|
|
58
|
+
modulation: (tMa: number, s: number) => number;
|
|
59
|
+
distanceMetresAtAge?: (tMa: number) => number;
|
|
60
|
+
};
|
|
61
|
+
}): {
|
|
62
|
+
distanceMetresAtAge: (tMa: number) => number;
|
|
63
|
+
distanceKmAtAge: (tMa: number) => number;
|
|
64
|
+
solarDeltaAKmAtAge: (tMa: number, aApparentKm: number) => number | null;
|
|
65
|
+
distanceCorrectedKmAtAge: (tMa: number) => number | null;
|
|
66
|
+
siderealMonthSecondsAtAge: (tMa: number) => number | null;
|
|
67
|
+
synodicMonthSecondsAtAge: (tMa: number) => number | null;
|
|
68
|
+
tropicalMonthSecondsAtAge: (tMa: number) => number | null;
|
|
69
|
+
apsidalCyclesOfDateAtAge: (tMa: number) => number | null;
|
|
70
|
+
nodalCyclesOfDateAtAge: (tMa: number) => number | null;
|
|
71
|
+
apsidalPrecessionSecondsOfDateAtAge: (tMa: number) => number | null;
|
|
72
|
+
nodalPrecessionSecondsOfDateAtAge: (tMa: number) => number | null;
|
|
73
|
+
perigeePrecessionSecondsAtAge: (tMa: number) => number | null;
|
|
74
|
+
nodePrecessionSecondsAtAge: (tMa: number) => number | null;
|
|
75
|
+
anomalisticMonthSecondsAtAge: (tMa: number) => number | null;
|
|
76
|
+
nodalMonthSecondsAtAge: (tMa: number) => number | null;
|
|
77
|
+
apsidalMeetsNodalSecondsAtAge: (tMa: number) => number | null;
|
|
78
|
+
lunarLevelingSecondsAtAge: (tMa: number) => number | null;
|
|
79
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Derived series-extension correction to the full-series Moon:
|
|
3
|
+
* the Delaunay tail plus the A2 planetary tail (longitude only).
|
|
4
|
+
* @param {number} T - Julian centuries TT from J2000
|
|
5
|
+
* @returns {{dLonDeg: number, dLatDeg: number}} degrees — ADD to the
|
|
6
|
+
* full-series Moon longitude/latitude
|
|
7
|
+
*/
|
|
8
|
+
export function moonSeriesExtensionDeg(T: number): {
|
|
9
|
+
dLonDeg: number;
|
|
10
|
+
dLatDeg: number;
|
|
11
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export type MeeusTermTable = Array<[number, number, number, number, number]>;
|
|
2
|
+
/**
|
|
3
|
+
* @typedef {Array<[number, number, number, number, number]>} MeeusTermTable
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* @param {{
|
|
7
|
+
* constants: {
|
|
8
|
+
* moonL: MeeusTermTable,
|
|
9
|
+
* moonB: MeeusTermTable,
|
|
10
|
+
* moonR: MeeusTermTable,
|
|
11
|
+
* moonRMeanKm: number,
|
|
12
|
+
* moonDistanceJ2000Km: number,
|
|
13
|
+
* j2000JD: number,
|
|
14
|
+
* julianCenturyDays: number,
|
|
15
|
+
* moonMeeusLpCorrectionDeg: number,
|
|
16
|
+
* fwA2RateDegPerCy: number,
|
|
17
|
+
* fwA3RateDegPerCy: number,
|
|
18
|
+
* },
|
|
19
|
+
* fns: {
|
|
20
|
+
* argsAt: (jdTT: number) => {Lp: number, D: number, M: number, Mp: number, F: number},
|
|
21
|
+
* eFactorForD: (dDaysTT: number, T: number, T2: number) => number,
|
|
22
|
+
* eFactorAtJdTT: (jdTT: number, T: number, T2: number) => number,
|
|
23
|
+
* getMoonDistanceKm: (jdTT?: number) => number,
|
|
24
|
+
* getEccentricityBase: () => number,
|
|
25
|
+
* deltaTSeconds: (jdUT: number) => number,
|
|
26
|
+
* jdToSIyear: (jd: number) => number,
|
|
27
|
+
* tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null),
|
|
28
|
+
* apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null),
|
|
29
|
+
* cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null),
|
|
30
|
+
* jupiterOrbitsBetween: (yearA: number, yearB: number) => (number | null),
|
|
31
|
+
* isDeepTime: () => boolean,
|
|
32
|
+
* isFrameworkNative: () => boolean,
|
|
33
|
+
* },
|
|
34
|
+
* }} deps — argsAt is the engine's dispatcher (probe hook and mode toggle
|
|
35
|
+
* ride along); eFactorForD preserves each engine's exact E-factor call
|
|
36
|
+
* shape (S11: the two convert d→years with differently-associated
|
|
37
|
+
* expressions); distance/eccentricity are GETTERS because the browser's
|
|
38
|
+
* moonDistance is deep-time-mutable.
|
|
39
|
+
*/
|
|
40
|
+
export function createMoonSeries({ constants, fns }: {
|
|
41
|
+
constants: {
|
|
42
|
+
moonL: MeeusTermTable;
|
|
43
|
+
moonB: MeeusTermTable;
|
|
44
|
+
moonR: MeeusTermTable;
|
|
45
|
+
moonRMeanKm: number;
|
|
46
|
+
moonDistanceJ2000Km: number;
|
|
47
|
+
j2000JD: number;
|
|
48
|
+
julianCenturyDays: number;
|
|
49
|
+
moonMeeusLpCorrectionDeg: number;
|
|
50
|
+
fwA2RateDegPerCy: number;
|
|
51
|
+
fwA3RateDegPerCy: number;
|
|
52
|
+
};
|
|
53
|
+
fns: {
|
|
54
|
+
argsAt: (jdTT: number) => {
|
|
55
|
+
Lp: number;
|
|
56
|
+
D: number;
|
|
57
|
+
M: number;
|
|
58
|
+
Mp: number;
|
|
59
|
+
F: number;
|
|
60
|
+
};
|
|
61
|
+
eFactorForD: (dDaysTT: number, T: number, T2: number) => number;
|
|
62
|
+
eFactorAtJdTT: (jdTT: number, T: number, T2: number) => number;
|
|
63
|
+
getMoonDistanceKm: (jdTT?: number) => number;
|
|
64
|
+
getEccentricityBase: () => number;
|
|
65
|
+
deltaTSeconds: (jdUT: number) => number;
|
|
66
|
+
jdToSIyear: (jd: number) => number;
|
|
67
|
+
tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null);
|
|
68
|
+
apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null);
|
|
69
|
+
cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null);
|
|
70
|
+
jupiterOrbitsBetween: (yearA: number, yearB: number) => (number | null);
|
|
71
|
+
isDeepTime: () => boolean;
|
|
72
|
+
isFrameworkNative: () => boolean;
|
|
73
|
+
};
|
|
74
|
+
}): {
|
|
75
|
+
sceneEvalAt: (dDaysTT: number) => {
|
|
76
|
+
thetaAddRad: number;
|
|
77
|
+
lonDeg: number;
|
|
78
|
+
latRad: number;
|
|
79
|
+
latDeg: number;
|
|
80
|
+
distKm: number;
|
|
81
|
+
T: number;
|
|
82
|
+
};
|
|
83
|
+
truncatedLonDeg: (jdUT: number) => number;
|
|
84
|
+
truncatedBetaDeg: (jdUT: number) => number;
|
|
85
|
+
truncatedDistanceKm: (jdUT: number) => number;
|
|
86
|
+
additionalArgs: (T: number, dDaysTT: number) => {
|
|
87
|
+
A1: number;
|
|
88
|
+
A2: number;
|
|
89
|
+
A3: number;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{
|
|
3
|
+
* holisticHAtAgeMa: (tMa: number) => (number | null),
|
|
4
|
+
* tableAnchorYear: number,
|
|
5
|
+
* driftRefYear: number,
|
|
6
|
+
* hJ2000: number,
|
|
7
|
+
* yearMin?: number,
|
|
8
|
+
* yearMax?: number,
|
|
9
|
+
* stepYears?: number,
|
|
10
|
+
* }} cfg — holisticHAtAgeMa MUST be the lattice-α form; tableAnchorYear is
|
|
11
|
+
* startmodelYear (2000.5, table zero + t_Ma convention); driftRefYear is
|
|
12
|
+
* startModelYearWithCorrection (the R3 drift anchor); hJ2000 the snapshot
|
|
13
|
+
* rate the drift compares against; 10-kyr cells match both engines'
|
|
14
|
+
* historic tables.
|
|
15
|
+
*/
|
|
16
|
+
export function createPhaseMachinery({ holisticHAtAgeMa, tableAnchorYear, driftRefYear, hJ2000, yearMin, yearMax, stepYears, }: {
|
|
17
|
+
holisticHAtAgeMa: (tMa: number) => (number | null);
|
|
18
|
+
tableAnchorYear: number;
|
|
19
|
+
driftRefYear: number;
|
|
20
|
+
hJ2000: number;
|
|
21
|
+
yearMin?: number;
|
|
22
|
+
yearMax?: number;
|
|
23
|
+
stepYears?: number;
|
|
24
|
+
}): {
|
|
25
|
+
ensureTable: () => void;
|
|
26
|
+
cumulAtYear: (year: number) => number | null;
|
|
27
|
+
integralBetween: (yearA: number, yearB: number) => number | null;
|
|
28
|
+
j2000Drift: (yearA: number) => number;
|
|
29
|
+
cyclesBetween: (yearA: number, yearB: number, divisorN: number) => number | null;
|
|
30
|
+
yearAtCumul: (targetCumul: number) => number | null;
|
|
31
|
+
grid: () => {
|
|
32
|
+
yearMin: number;
|
|
33
|
+
yearMax: number;
|
|
34
|
+
stepYears: number;
|
|
35
|
+
j2000Idx: number;
|
|
36
|
+
length: number;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{ ascendingNodeDeg: number, inclinationDeg: number }} tilt —
|
|
3
|
+
* static node and inclination (engine-decomposed from its scene scheme)
|
|
4
|
+
* @param {number} currentYear
|
|
5
|
+
* @param {{
|
|
6
|
+
* obliquityAt: (year: number) => number,
|
|
7
|
+
* earthInclinationAt: (year: number) => number,
|
|
8
|
+
* obliquityExtremaInRange: (yearMin: number, yearMax: number) => number[],
|
|
9
|
+
* inclinationCrossingsInRange: (inclinationDeg: number, yearMin: number, yearMax: number) => number[],
|
|
10
|
+
* eclipticInclinationAt: ((year: number) => number) | null,
|
|
11
|
+
* earthInclinationMeanDeg: number,
|
|
12
|
+
* earthInclinationAmplitudeDeg: number,
|
|
13
|
+
* epochYear?: number,
|
|
14
|
+
* }} deps — eclipticInclinationAt non-null enables the dynamic-inclination
|
|
15
|
+
* crossover search and per-segment rates (the planetName path).
|
|
16
|
+
* @returns {number} dynamic ascending node longitude, degrees 0–360
|
|
17
|
+
*/
|
|
18
|
+
export function integrateAscendingNode(tilt: {
|
|
19
|
+
ascendingNodeDeg: number;
|
|
20
|
+
inclinationDeg: number;
|
|
21
|
+
}, currentYear: number, deps: {
|
|
22
|
+
obliquityAt: (year: number) => number;
|
|
23
|
+
earthInclinationAt: (year: number) => number;
|
|
24
|
+
obliquityExtremaInRange: (yearMin: number, yearMax: number) => number[];
|
|
25
|
+
inclinationCrossingsInRange: (inclinationDeg: number, yearMin: number, yearMax: number) => number[];
|
|
26
|
+
eclipticInclinationAt: ((year: number) => number) | null;
|
|
27
|
+
earthInclinationMeanDeg: number;
|
|
28
|
+
earthInclinationAmplitudeDeg: number;
|
|
29
|
+
epochYear?: number;
|
|
30
|
+
}): number;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED — do not edit. Regenerate:
|
|
3
|
+
* node tools/constants/generate.mjs --write
|
|
4
|
+
*
|
|
5
|
+
* Source: data/nbody-secular-frequencies.json (the governed engine-D
|
|
6
|
+
* artifact), emitted VERBATIM. Two gates guard the two legs of the causal
|
|
7
|
+
* chain: check:artifacts pins artifact ↔ engine (input hashes name the
|
|
8
|
+
* regeneration command), this module's staleness check pins embed ↔ artifact.
|
|
9
|
+
* A changed planet mass therefore propagates engine → artifact → here → the
|
|
10
|
+
* browser scene, or a gate goes red.
|
|
11
|
+
*/
|
|
12
|
+
/** @type {string} */
|
|
13
|
+
export const CHAIN_ARTIFACT_HASH: string;
|
|
14
|
+
/** @type {Readonly<Record<string, unknown>>} */
|
|
15
|
+
export const CHAIN_ARTIFACT: Readonly<Record<string, unknown>>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The law of cosines over resolved cycles. null cycles → the MEAN
|
|
3
|
+
* eccentricity √(base² + amp²) (past the tidal-lock asymptote).
|
|
4
|
+
* @param {number | null} cycles @param {number} base @param {number} amplitude
|
|
5
|
+
* @returns {number} */
|
|
6
|
+
export function eccentricityFromCycles(cycles: number | null, base: number, amplitude: number): number;
|
|
7
|
+
/**
|
|
8
|
+
* Browser-convention evaluator: J2000-FIXED anchor + cycle length, divisor
|
|
9
|
+
* N = H_J2000/cycleLength, integrated phase via the injected engine
|
|
10
|
+
* cyclesBetween (toggle semantics ride along), null → mean.
|
|
11
|
+
* @param {number} currentYear @param {number} anchorYearJ2000
|
|
12
|
+
* @param {number} cycleLengthYearsJ2000 @param {number} base
|
|
13
|
+
* @param {number} amplitude
|
|
14
|
+
* @param {{ holisticYearJ2000: number,
|
|
15
|
+
* cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null) }} env
|
|
16
|
+
* @returns {number} */
|
|
17
|
+
export function computeEccentricityIntegrated(currentYear: number, anchorYearJ2000: number, cycleLengthYearsJ2000: number, base: number, amplitude: number, env: {
|
|
18
|
+
holisticYearJ2000: number;
|
|
19
|
+
cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null);
|
|
20
|
+
}): number;
|