@essrt/physics 4.8.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.
Files changed (50) hide show
  1. package/README.md +4 -0
  2. package/package.json +40 -38
  3. package/src/constants/coefficients.d.ts +772 -0
  4. package/src/constants/generated.d.ts +38 -38
  5. package/src/model.js +14 -3
  6. package/types/cardinal/index.d.cts +80 -0
  7. package/types/cardinal/one-source-structure.d.cts +35 -0
  8. package/types/chain-cycles/index.d.cts +33 -0
  9. package/types/climate/l1-orbital.d.cts +32 -0
  10. package/types/constants/coefficients.d.ts +772 -0
  11. package/types/constants/generated.d.ts +753 -0
  12. package/types/constants/index.d.ts +2 -0
  13. package/types/deltat/cycles.d.cts +72 -0
  14. package/types/deltat/deep-time.d.cts +122 -0
  15. package/types/deltat/historical.d.cts +8 -0
  16. package/types/deltat/recession-history.d.cts +80 -0
  17. package/types/earth/deep-orbital-history.d.cts +77 -0
  18. package/types/earth/sidereal-channel-artifact.d.cts +12 -0
  19. package/types/earth/sidereal-year-channel.d.cts +38 -0
  20. package/types/earth/year-lengths.d.cts +57 -0
  21. package/types/eclipse/besselian.d.cts +101 -0
  22. package/types/eclipse/finders.d.cts +116 -0
  23. package/types/eclipse/sun-planetary-completion.d.cts +39 -0
  24. package/types/index.d.ts +77 -0
  25. package/types/layer0/derive-params.d.ts +36 -0
  26. package/types/layer0/index.d.ts +49 -0
  27. package/types/layer1/index.d.ts +10 -0
  28. package/types/model.d.ts +156 -0
  29. package/types/moon/apparent.d.cts +78 -0
  30. package/types/moon/arguments.d.cts +138 -0
  31. package/types/moon/deep-ecc-channel.d.cts +25 -0
  32. package/types/moon/deep-modes-artifact.d.cts +140 -0
  33. package/types/moon/ecc-channel.d.cts +30 -0
  34. package/types/moon/month-chain.d.cts +79 -0
  35. package/types/moon/series-extension.d.cts +11 -0
  36. package/types/moon/series.d.cts +91 -0
  37. package/types/phase/index.d.cts +38 -0
  38. package/types/planets/asc-node-integrator.d.cts +30 -0
  39. package/types/planets/chain-artifact.d.ts +15 -0
  40. package/types/planets/ecc-channel.d.cts +20 -0
  41. package/types/planets/fibonacci-laws.d.cts +90 -0
  42. package/types/planets/geometry.d.cts +60 -0
  43. package/types/planets/inv-plane-frame.d.cts +36 -0
  44. package/types/planets/keplerian-chain.d.cts +173 -0
  45. package/types/planets/model.d.cts +116 -0
  46. package/types/planets/orbit-chain.d.cts +12 -0
  47. package/types/planets/orientation.d.cts +67 -0
  48. package/types/planets/predict.d.cts +88 -0
  49. package/types/planets/secular-series.d.cts +73 -0
  50. 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;