@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.
Files changed (62) hide show
  1. package/README.md +4 -0
  2. package/package.json +42 -39
  3. package/src/climate/l1-orbital.cjs +76 -5
  4. package/src/constants/coefficients.d.ts +678 -0
  5. package/src/constants/coefficients.js +4 -4
  6. package/src/constants/generated.d.ts +42 -41
  7. package/src/constants/generated.js +6 -5
  8. package/src/deltat/deep-time.cjs +69 -2
  9. package/src/earth/deep-orbital-history.cjs +6 -5
  10. package/src/earth/precession-composed.cjs +120 -0
  11. package/src/earth/year-lengths.cjs +12 -1
  12. package/src/index.js +6 -2
  13. package/src/layer0/derive-params.js +21 -4
  14. package/src/layer0/index.js +35 -4
  15. package/src/model.js +176 -33
  16. package/src/planets/chain-artifact.js +2 -2
  17. package/types/cardinal/index.d.cts +80 -0
  18. package/types/cardinal/one-source-structure.d.cts +35 -0
  19. package/types/chain-cycles/index.d.cts +33 -0
  20. package/types/climate/l1-orbital.d.cts +103 -0
  21. package/types/constants/coefficients.d.ts +678 -0
  22. package/types/constants/generated.d.ts +754 -0
  23. package/types/constants/index.d.ts +2 -0
  24. package/types/deltat/cycles.d.cts +72 -0
  25. package/types/deltat/deep-time.d.cts +135 -0
  26. package/types/deltat/historical.d.cts +8 -0
  27. package/types/deltat/recession-history.d.cts +80 -0
  28. package/types/earth/deep-orbital-history.d.cts +77 -0
  29. package/types/earth/precession-composed.d.cts +59 -0
  30. package/types/earth/sidereal-channel-artifact.d.cts +12 -0
  31. package/types/earth/sidereal-year-channel.d.cts +38 -0
  32. package/types/earth/year-lengths.d.cts +67 -0
  33. package/types/eclipse/besselian.d.cts +101 -0
  34. package/types/eclipse/finders.d.cts +116 -0
  35. package/types/eclipse/sun-planetary-completion.d.cts +39 -0
  36. package/types/index.d.ts +78 -0
  37. package/types/layer0/derive-params.d.ts +46 -0
  38. package/types/layer0/index.d.ts +64 -0
  39. package/types/layer1/index.d.ts +10 -0
  40. package/types/model.d.ts +184 -0
  41. package/types/moon/apparent.d.cts +78 -0
  42. package/types/moon/arguments.d.cts +138 -0
  43. package/types/moon/deep-ecc-channel.d.cts +25 -0
  44. package/types/moon/deep-modes-artifact.d.cts +140 -0
  45. package/types/moon/ecc-channel.d.cts +30 -0
  46. package/types/moon/month-chain.d.cts +79 -0
  47. package/types/moon/series-extension.d.cts +11 -0
  48. package/types/moon/series.d.cts +91 -0
  49. package/types/phase/index.d.cts +38 -0
  50. package/types/planets/asc-node-integrator.d.cts +30 -0
  51. package/types/planets/chain-artifact.d.ts +15 -0
  52. package/types/planets/ecc-channel.d.cts +20 -0
  53. package/types/planets/fibonacci-laws.d.cts +90 -0
  54. package/types/planets/geometry.d.cts +60 -0
  55. package/types/planets/inv-plane-frame.d.cts +36 -0
  56. package/types/planets/keplerian-chain.d.cts +173 -0
  57. package/types/planets/model.d.cts +116 -0
  58. package/types/planets/orbit-chain.d.cts +12 -0
  59. package/types/planets/orientation.d.cts +67 -0
  60. package/types/planets/predict.d.cts +88 -0
  61. package/types/planets/secular-series.d.cts +73 -0
  62. package/types/sun/longitude-correction.d.cts +41 -0
@@ -0,0 +1,116 @@
1
+ export type FrameworkSunDeps = {
2
+ /**
3
+ * - L0 anchor (input anchor, 280.46646)
4
+ */
5
+ sunMeanLongitudeJ2000Deg: number;
6
+ /**
7
+ * - the framework tropical rate (from the year chain)
8
+ */
9
+ tropicalRateDegPerCy: number;
10
+ /**
11
+ * - the framework e(t) law
12
+ */
13
+ eccentricityAt: (year: number) => number;
14
+ /**
15
+ * - the framework ϖ(t) law (heliocentric)
16
+ */
17
+ perihelionLongitudeDegAt: (year: number) => number;
18
+ /**
19
+ * - optional epoch-dependent
20
+ * mean longitude L(t) (e.g. L0 + ∫rate·dt from the f(Y) tropical-year chain);
21
+ * absent = the linear form L0 + rate·T
22
+ */
23
+ meanLongitudeDegAt?: ((year: number) => number) | undefined;
24
+ };
25
+ export type EclipseFinderDeps = {
26
+ /**
27
+ * - truncated-series ecliptic longitude
28
+ */
29
+ moonLonDegAt: (jd: number) => number;
30
+ /**
31
+ * - truncated-series ecliptic latitude
32
+ */
33
+ moonBetaDegAt: (jd: number) => number;
34
+ /**
35
+ * - truncated-series distance
36
+ */
37
+ moonDistanceKmAt: (jd: number) => number;
38
+ /**
39
+ * - the engine's ΔT convention
40
+ */
41
+ deltaTSecondsAt: (jd: number) => number;
42
+ /**
43
+ * - live (epoch-mutable)
44
+ */
45
+ getSynodicMonthDays: () => number;
46
+ /**
47
+ * - live (epoch-mutable)
48
+ */
49
+ getSunDistanceKm: () => number;
50
+ /**
51
+ * - E4 (the native-Sun landing,
52
+ * plan §12i item 11): when present, sunLonDegAt uses the FRAMEWORK form —
53
+ * linear tropical rate + Kepler EoC (to e³) on the framework e(t)/ϖ(t)
54
+ * laws, TT clock unchanged — instead of the Meeus Ch. 25 polynomials.
55
+ * Absent = the historical Meeus form (every certified number's current
56
+ * basis). The swap is a conscious matched-pair event: the D2 completion's
57
+ * fitted 2lE residue and the certified statistics re-measure with it.
58
+ */
59
+ frameworkSun?: FrameworkSunDeps | undefined;
60
+ constants: {
61
+ rEarthMetres: number;
62
+ moonDiameterKm: number;
63
+ sunDiameterKm: number;
64
+ j2000JD: number;
65
+ julianCenturyDays: number;
66
+ };
67
+ };
68
+ /**
69
+ * @typedef {Object} FrameworkSunDeps
70
+ * @property {number} sunMeanLongitudeJ2000Deg - L0 anchor (input anchor, 280.46646)
71
+ * @property {number} tropicalRateDegPerCy - the framework tropical rate (from the year chain)
72
+ * @property {(year: number) => number} eccentricityAt - the framework e(t) law
73
+ * @property {(year: number) => number} perihelionLongitudeDegAt - the framework ϖ(t) law (heliocentric)
74
+ * @property {(year: number) => number} [meanLongitudeDegAt] - optional epoch-dependent
75
+ * mean longitude L(t) (e.g. L0 + ∫rate·dt from the f(Y) tropical-year chain);
76
+ * absent = the linear form L0 + rate·T
77
+ */
78
+ /**
79
+ * @typedef {Object} EclipseFinderDeps
80
+ * @property {(jd: number) => number} moonLonDegAt - truncated-series ecliptic longitude
81
+ * @property {(jd: number) => number} moonBetaDegAt - truncated-series ecliptic latitude
82
+ * @property {(jd: number) => number} moonDistanceKmAt - truncated-series distance
83
+ * @property {(jd: number) => number} deltaTSecondsAt - the engine's ΔT convention
84
+ * @property {() => number} getSynodicMonthDays - live (epoch-mutable)
85
+ * @property {() => number} getSunDistanceKm - live (epoch-mutable)
86
+ * @property {FrameworkSunDeps} [frameworkSun] - E4 (the native-Sun landing,
87
+ * plan §12i item 11): when present, sunLonDegAt uses the FRAMEWORK form —
88
+ * linear tropical rate + Kepler EoC (to e³) on the framework e(t)/ϖ(t)
89
+ * laws, TT clock unchanged — instead of the Meeus Ch. 25 polynomials.
90
+ * Absent = the historical Meeus form (every certified number's current
91
+ * basis). The swap is a conscious matched-pair event: the D2 completion's
92
+ * fitted 2lE residue and the certified statistics re-measure with it.
93
+ * @property {{ rEarthMetres: number, moonDiameterKm: number,
94
+ * sunDiameterKm: number, j2000JD: number, julianCenturyDays: number }} constants
95
+ */
96
+ /** @param {EclipseFinderDeps} deps */
97
+ export function createEclipseFinders(deps: EclipseFinderDeps): {
98
+ sunLonDegAt: (jd: number) => number;
99
+ findLunarEclipsesInRange: (jdStart: number, jdEnd: number) => Array<{
100
+ jd: number;
101
+ beta: number;
102
+ moonDistance_km: number;
103
+ type: string;
104
+ magnitudeUmbral: number;
105
+ magnitudePenumbral: number;
106
+ }>;
107
+ findSolarEclipsesInRange: (jdStart: number, jdEnd: number) => Array<{
108
+ jd: number;
109
+ beta: number;
110
+ moonDistance_km: number;
111
+ type: string;
112
+ moonAppR_topo: number;
113
+ sunAppR: number;
114
+ moonSunRatio: number;
115
+ }>;
116
+ };
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @param {{ embWobbleArcsec: number,
3
+ * carrierRatesDegPerCy: { planets: number[], moonElongation: number } }} opts
4
+ * - embWobbleArcsec: the DERIVED Earth-around-EMB wobble amplitude
5
+ * a_M·μ/AU in arcsec (μ = 1/(1+M_E/M_M));
6
+ * - carrierRatesDegPerCy.planets: the six FRAMEWORK mean-longitude
7
+ * rates (deg/Julian-century TT), body order Me,V,E,Ma,J,S — one
8
+ * revolution per the model's own tropical period records;
9
+ * - carrierRatesDegPerCy.moonElongation: the framework Moon
10
+ * mean-elongation rate (deg/cy TT) for the EMB-wobble carrier.
11
+ * All computed from live constants by the model wiring so the
12
+ * carrier↔table matched pair tracks the constants.
13
+ * @returns {{ sunPlanetaryCompletionDeg: (T: number) => number }}
14
+ */
15
+ export function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy }: {
16
+ embWobbleArcsec: number;
17
+ carrierRatesDegPerCy: {
18
+ planets: number[];
19
+ moonElongation: number;
20
+ };
21
+ }): {
22
+ sunPlanetaryCompletionDeg: (T: number) => number;
23
+ };
24
+ /** sha256/16 of JSON.stringify(FITTED_COEFFICIENTS.SUN_LONGITUDE_HARMONICS)
25
+ * at derivation time — the matched-pair fingerprint asserted by test:model.
26
+ * Unchanged from v1/v2: SUN_HARMONICS did not move in the D2 or N3
27
+ * landings. */
28
+ export const PAIRED_SUN_HARMONICS_SHA256: "cbc189cea1c20292";
29
+ /** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
30
+ * full-precision carrier rates (deg/cy TT) the TERMS table was extracted
31
+ * under at N3. The model wiring recomputes the rates live from the planet
32
+ * records, so a planet-period / year / month input change moves the
33
+ * carriers automatically while the table stays frozen — a silent few-
34
+ * arcsec stale below the api gate's ≤8″ backstop. test:model recomputes
35
+ * this fingerprint from live constants (identical arithmetic to model.js)
36
+ * and fails on mismatch: re-run the N3 extraction chain
37
+ * (tools/explore/n2-sun-framework-carriers.mjs →
38
+ * n3-carrier-swap-preview.mjs), re-embed TERMS, and update this value. */
39
+ export const PAIRED_CARRIER_RATES_SHA256: "893e055ee12343bd";
@@ -0,0 +1,78 @@
1
+ export { createEpochPrimitives } from "./layer0/index.js";
2
+ export { deriveEpochParams } from "./layer0/derive-params.js";
3
+ export { createDerivedViews } from "./layer1/index.js";
4
+ export { createPhaseMachinery } from "./phase/index.cjs";
5
+ export { createCardinalModel } from "./cardinal/index.cjs";
6
+ export { createCardinalStructure } from "./cardinal/one-source-structure.cjs";
7
+ export { createMoonEccChannel } from "./moon/ecc-channel.cjs";
8
+ export { createMoonMonthChain } from "./moon/month-chain.cjs";
9
+ export { createChainCycleIntegrator } from "./chain-cycles/index.cjs";
10
+ export { createMoonArguments } from "./moon/arguments.cjs";
11
+ export { createMoonSeries } from "./moon/series.cjs";
12
+ export { createMoonApparent } from "./moon/apparent.cjs";
13
+ export { derivePlanetGeometry } from "./planets/geometry.cjs";
14
+ export * as planetFibonacciLaws from "./planets/fibonacci-laws.cjs";
15
+ export * as planetOrientation from "./planets/orientation.cjs";
16
+ export { integrateAscendingNode } from "./planets/asc-node-integrator.cjs";
17
+ export * as planetOrbitChain from "./planets/orbit-chain.cjs";
18
+ export { createSecularSeriesOverride } from "./planets/secular-series.cjs";
19
+ export { createDeepEccChannel } from "./moon/deep-ecc-channel.cjs";
20
+ export { createDeepOrbitalHistory } from "./earth/deep-orbital-history.cjs";
21
+ export { createSiderealYearChannel } from "./earth/sidereal-year-channel.cjs";
22
+ export { createPlanetModel } from "./planets/model.cjs";
23
+ export { createDeltaTCycles } from "./deltat/cycles.cjs";
24
+ export { createDeepTimeLod } from "./deltat/deep-time.cjs";
25
+ export { deltaTEspenakMeeusCanonSeconds } from "./deltat/historical.cjs";
26
+ export { createEclipseFinders } from "./eclipse/finders.cjs";
27
+ export { createSunLongitudeCorrection } from "./sun/longitude-correction.cjs";
28
+ export function createModel(constants?: Constants, opts?: {
29
+ laws?: {
30
+ eccentricityAt?: (year: number) => number;
31
+ eccentricityRateAt?: (year: number) => number;
32
+ perihelionLongitudeDegAt?: (year: number) => number;
33
+ };
34
+ secularSeriesArtifact?: any;
35
+ }): Model;
36
+ export type Constants = Record<string, unknown> & {
37
+ hash?: string;
38
+ };
39
+ export type ModelSurfaces = ReturnType<typeof assembleModel>;
40
+ export type ModelIdentity = {
41
+ modelVersion: string;
42
+ /**
43
+ * THIS context's hash — distinct for a counterfactual
44
+ */
45
+ constantsHash: string;
46
+ coefficientsHash: string;
47
+ counterfactual: boolean;
48
+ preprintDoi: string;
49
+ };
50
+ export type Model = {
51
+ constants: Constants;
52
+ hash: string;
53
+ computeLatticePeriodsYears: () => {
54
+ axialPrecessionPeriodYears: number;
55
+ inclinationPrecessionPeriodYears: number;
56
+ perihelionPrecessionPeriodYears: number;
57
+ };
58
+ eccentricity: (year: number) => number;
59
+ identity: ModelIdentity;
60
+ } & ModelSurfaces;
61
+ import { DEFAULT_CONSTANTS as GENERATED } from './constants/index.js';
62
+ import { CONSTANTS_HASH } from './constants/index.js';
63
+ import { MODEL_VERSION } from './constants/index.js';
64
+ import { PREPRINT_DOI } from './constants/index.js';
65
+ import { REFERENCE_DATA } from './constants/index.js';
66
+ import { assembleModel } from './model.js';
67
+ export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA };
68
+ export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from "./constants/index.js";
69
+ export { eccentricityFromCycles, computeEccentricityIntegrated } from "./planets/ecc-channel.cjs";
70
+ export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, computeApsidalSecularDegPerYr, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from "./planets/keplerian-chain.cjs";
71
+ export { computeEquatorNodeOriginSFrameDeg, convertNodeSFrameToEquatorOriginDeg } from "./planets/inv-plane-frame.cjs";
72
+ export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from "./planets/chain-artifact.js";
73
+ export { DEEP_MODES_ARTIFACT, DEEP_MODES_ARTIFACT_HASH } from "./moon/deep-modes-artifact.cjs";
74
+ export { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from "./earth/year-lengths.cjs";
75
+ export { computeSolarTorqueShare, createComposedPrecession } from "./earth/precession-composed.cjs";
76
+ export { createPredictivePrecession, calcPlanetPerihelionLongDeg } from "./planets/predict.cjs";
77
+ export { createMoonRecessionHistory, createSolarChannelBudget } from "./deltat/recession-history.cjs";
78
+ export { evalClimateL1OrbitalPermil, laggedL1Terms, createAlphaGiaChannel } from "./climate/l1-orbital.cjs";
@@ -0,0 +1,46 @@
1
+ export function deriveEpochParams(raw: RawEpochConstants): import("./index.js").EpochParams;
2
+ export type RawEpochConstants = {
3
+ /**
4
+ * IAU 2015 nominal (W)
5
+ */
6
+ solarLuminosityW: number;
7
+ /**
8
+ * Ulysses/ACE/Wind
9
+ */
10
+ solarWindKgPerS: number;
11
+ /**
12
+ * km/s (fallback 299792458 m/s if falsy)
13
+ */
14
+ speedOfLightKmPerS: number;
15
+ alpha1PerMa: number;
16
+ alpha3PerMa3: number;
17
+ alpha4PerMa4: number;
18
+ /**
19
+ * H
20
+ */
21
+ holisticYearJ2000: number;
22
+ meanSiderealYearSeconds: number;
23
+ meanSiderealYearDaysKinematic: number;
24
+ /**
25
+ * M_SUN
26
+ */
27
+ sunMassKg: number;
28
+ gmEarthAloneKm3S2: number;
29
+ gmMoonAloneKm3S2: number;
30
+ gravitationalConstantKm3KgS2: number;
31
+ earthMoiFactorJ2000: number;
32
+ earthDiameterKm: number;
33
+ moonDistanceKm: number;
34
+ moonOrbitalEccentricity: number;
35
+ gmEarthMoonSystemKm3S2: number;
36
+ /**
37
+ * GM☉ (km³/s²) — the solar precession torque
38
+ */
39
+ gmSunKm3S2: number;
40
+ /**
41
+ * 1 AU (km)
42
+ */
43
+ astronomicalUnitKm: number;
44
+ earthOrbitalEccentricityJ2000: number;
45
+ moonEclipticInclinationJ2000Deg: number;
46
+ };
@@ -0,0 +1,64 @@
1
+ export function createEpochPrimitives({ params: p, alphaAtAgeMa }: {
2
+ params: EpochParams;
3
+ alphaAtAgeMa: (tMa: number) => number;
4
+ }): EpochPrimitives;
5
+ export type EpochParams = {
6
+ /**
7
+ * year at t_Ma = 0 (2000, NOT startmodelYear)
8
+ */
9
+ epochYear: number;
10
+ /**
11
+ * Moon recession, LLR-anchored
12
+ */
13
+ alpha1PerMa: number;
14
+ alpha3PerMa3: number;
15
+ alpha4PerMa4: number;
16
+ /**
17
+ * a_Moon at J2000, metres
18
+ */
19
+ moonDistanceNowM: number;
20
+ /**
21
+ * tidal-lock asymptote, metres
22
+ */
23
+ moonLockDistanceM: number;
24
+ /**
25
+ * L_tot of the Earth-Moon system
26
+ */
27
+ totalAngularMomentumKgM2S: number;
28
+ moonMassKg: number;
29
+ gmEarthMoonM3S2: number;
30
+ /**
31
+ * sqrt(1 - e^2)
32
+ */
33
+ moonEccentricityFactor: number;
34
+ earthMassKg: number;
35
+ earthRadiusM: number;
36
+ holisticYearJ2000: number;
37
+ lodNowH13Seconds: number;
38
+ siderealYearJ2000Seconds: number;
39
+ solarMassLossFracPerYear: number;
40
+ /**
41
+ * f_S, the solar fraction of the J2000 precession torque
42
+ */
43
+ precessionSolarShareJ2000: number;
44
+ };
45
+ export type EpochPrimitives = {
46
+ tMa: (year: number) => number;
47
+ moonDistanceMetres: (year: number) => number;
48
+ lodSeconds: (year: number) => number | null;
49
+ /**
50
+ * the UNIT: 13 × the composed lunisolar precession period
51
+ */
52
+ holisticH: (year: number) => number | null;
53
+ siderealYearSeconds: (year: number) => number;
54
+ tropicalYearSeconds: (year: number) => number;
55
+ anomalisticYearSeconds: (year: number) => number | null;
56
+ /**
57
+ * the frozen era clock's phase convention H₀·LOD/LOD₀ (device tier)
58
+ */
59
+ eraClockH: (year: number) => number | null;
60
+ /**
61
+ * T_sid·(1 − 13/H_era) — the frozen comb family's base
62
+ */
63
+ eraClockTropicalYearSeconds: (year: number) => number;
64
+ };
@@ -0,0 +1,10 @@
1
+ export function createDerivedViews({ primitives: L0 }: {
2
+ primitives: EpochPrimitives;
3
+ }): DerivedViews;
4
+ export type EpochPrimitives = import("../layer0/index.js").EpochPrimitives;
5
+ export type DerivedViews = {
6
+ tropicalYearDays: (year: number) => number | null;
7
+ siderealYearDays: (year: number) => number | null;
8
+ anomalisticYearDays: (year: number) => number | null;
9
+ siderealYearDaysViaLattice: (year: number) => number | null;
10
+ };
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Assemble the model surfaces from a resolved constants context + fitted
3
+ * coefficients. Internal: `createModel` in index.js composes this with the
4
+ * §2d context validation and counterfactual hashing — call that, not this.
5
+ *
6
+ * @param {Readonly<Record<string, any>>} C the frozen constants context
7
+ * @param {Readonly<Record<string, any>>} F the fitted coefficients
8
+ * @param {{ eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number }} [laws]
9
+ * RESEARCH OVERRIDES for Earth's orbit laws (doc 109 §7): an alternative e(t),
10
+ * de/dt(t) and ϖ_of-date(t) flow through every consumer (the eclipse Sun, the
11
+ * Moon's E-factor, the cardinal points) exactly as the shipped laws do. Default
12
+ * {} = the shipped laws, bit-identical to before this parameter existed. Not a
13
+ * counterfactual in the §2d sense (no hash change) — callers must say when
14
+ * they used it; the generators refuse to --write under an override.
15
+ * @returns the assembled surfaces (epoch, earth, lengths, cardinal, moon) — type inferred so ReturnType stays precise
16
+ */
17
+ export function assembleModel(C: Readonly<Record<string, any>>, F: Readonly<Record<string, any>>, laws?: {
18
+ eccentricityAt?: (year: number) => number;
19
+ eccentricityRateAt?: (year: number) => number;
20
+ perihelionLongitudeDegAt?: (year: number) => number;
21
+ }, secularSeriesArtifact?: any): Readonly<{
22
+ time: Readonly<{
23
+ yearFromJD: (jd: number) => number;
24
+ jdFromYear: (year: number) => number;
25
+ siTropicalYearDays: number;
26
+ }>;
27
+ epoch: Readonly<{
28
+ yearToTMa: (year: number) => number;
29
+ hAtYear: (year: number) => number | null;
30
+ lodSecondsAtYear: (year: number) => number | null;
31
+ alphaAtYear: (year: number) => number;
32
+ moonDistanceKmAtYear: (year: number) => number;
33
+ siderealYearSecondsAtYear: (year: number) => number;
34
+ deltaTSecondsAtYear: (year: number) => number;
35
+ cyclesBetween: (yearA: number, yearB: number, divisorN: number) => number;
36
+ axialPrecessionYearsAtYear: (year: number) => number;
37
+ tropicalYearSecondsAtYear: (year: number) => number;
38
+ }>;
39
+ lunisolar: Readonly<{
40
+ /** The mean lunisolar precession period T_p(t), years — the composed torque rate's period. @param {number} year @returns {number} */
41
+ meanPeriodYearsAtYear: (year: number) => number;
42
+ /** The composed rate ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³], ″/yr. @param {number} year @returns {number} */
43
+ meanRateArcsecPerYrAtYear: (year: number) => number;
44
+ /** The of-date period — the one-family beat inside ±2 Myr, the mean beyond. @param {number} year @returns {number} */
45
+ ofDatePeriodYearsAtYear: (year: number) => number;
46
+ /** f_S, the solar fraction of the J2000 precession torque. */
47
+ solarShareJ2000: number;
48
+ /** (a₀/a_M(t))³ — the lunar torque's growth on the recession history. @param {number} year @returns {number} */
49
+ lunarTorqueFactorAtYear: (year: number) => number;
50
+ /** f_S + (1 − f_S)(a₀/a_M)³ — the torque term the unit divides H_era by. @param {number} year @returns {number} */
51
+ torqueTermAtYear: (year: number) => number;
52
+ /** The hybrid's precession constant α = p₀ / cos ε₀, ″/yr (ε₀ the J2000 obliquity input). */
53
+ torqueConstantJ2000ArcsecPerYr: number;
54
+ /** The apsidal (perihelion vs the stars) period from the engine-D chain's secular tangent, years — inside the published window only (the tangent is an extrapolation beyond the banked series: it turns negative at −5 Myr); null beyond. @param {number} year @returns {number|null} */
55
+ apsidalPeriodYearsAtYear: (year: number) => number | null;
56
+ /** T_aps(t) / T_p(t) — the apsidal period in mean precession periods (4.33 at J2000, a fitted reading; 0.84 … 9.5 across ±26 kyr, measured); null beyond the published window. @param {number} year @returns {number|null} */
57
+ apsidalPerPrecessionAtYear: (year: number) => number | null;
58
+ /** T_peri(t) = 1/(1/T_p + 1/T_aps) — the perihelion-of-date period (equinox precession + inertial perihelion motion, frame arithmetic at every epoch), years; null beyond the published window. @param {number} year @returns {number|null} */
59
+ periOfDatePeriodYearsAtYear: (year: number) => number | null;
60
+ /** T_peri(t) / T_p(t) (0.812 at J2000 — the J2000 reading); null beyond the published window. @param {number} year @returns {number|null} */
61
+ periOfDatePerPrecessionAtYear: (year: number) => number | null;
62
+ /** The published of-date window, years from 2000. */
63
+ publishedWindowYears: 2000000;
64
+ }>;
65
+ earth: Readonly<{
66
+ perihelionLongitudeDeg: (year: number) => number;
67
+ obliquityDeg: (year: number) => number;
68
+ obliquityCombDeg: (year: number) => number;
69
+ eccentricity: (year: number) => number;
70
+ inclinationDeg: (year: number) => number;
71
+ ascendingNodeDeg: (year: number) => number;
72
+ }>;
73
+ lengths: Readonly<{
74
+ tropicalYearDays: (year: number) => number;
75
+ tropicalYearDirectDays: (year: number) => number;
76
+ siderealYearDays: (year: number) => number;
77
+ anomalisticYearDays: (year: number) => number;
78
+ dayLengthSeconds: (year: number) => number;
79
+ siderealDaySeconds: (year: number) => number;
80
+ stellarDaySeconds: (year: number) => number;
81
+ measuredSolarDaySeconds: (year: number) => number;
82
+ raDayOffsetMs: (year: number) => number;
83
+ }>;
84
+ cardinal: Readonly<{
85
+ jd: (year: number, type: string) => number;
86
+ raDeg: (year: number, type: string) => number;
87
+ yearLengthDays: (year: number, type: string) => number;
88
+ }>;
89
+ cardinalStructure: Readonly<{
90
+ yearLengthSeconds: (year: number, type: "VE" | "SS" | "AE" | "WS") => number;
91
+ eocOffsetSeconds: (year: number, type: "VE" | "SS" | "AE" | "WS") => number;
92
+ spreadSeconds: (year: number) => {
93
+ VE: number;
94
+ SS: number;
95
+ AE: number;
96
+ WS: number;
97
+ meanSeconds: number;
98
+ };
99
+ anomalisticYearSeconds: (year: number) => number;
100
+ }>;
101
+ yearLengths: Readonly<{
102
+ tropicalYearSecondsAtYear: (year: number) => number;
103
+ siderealYearSecondsAtYear: (year: number) => number;
104
+ anomalisticYearSecondsAtYear: (year: number) => number;
105
+ axialPrecessionYearsAtYear: (y: number) => number;
106
+ perihelionPrecessionYearsAtYear: (y: number) => number;
107
+ inclinationPrecessionYearsAtYear: (y: number) => number;
108
+ cardinal: Readonly<{
109
+ yearLengthSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
110
+ eocOffsetSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
111
+ spreadSeconds: (y: number) => {
112
+ VE: number;
113
+ SS: number;
114
+ AE: number;
115
+ WS: number;
116
+ meanSeconds: number;
117
+ };
118
+ }>;
119
+ planetaryRelAtYear: (year: number) => number;
120
+ }>;
121
+ moon: Readonly<{
122
+ distanceKmAtYear: (year: number) => number;
123
+ siderealMonthDaysAtYear: (year: number) => number;
124
+ synodicMonthDays: number;
125
+ lonDegAtJD: (jd: number) => number;
126
+ betaDegAtJD: (jd: number) => number;
127
+ distanceKmAtJD: (jd: number) => number;
128
+ }>;
129
+ eclipse: Readonly<{
130
+ sunLonDegAtJD: (jd: number) => number;
131
+ sunLonCompletedDegAtJD: (jd: number) => number;
132
+ findLunarInRange: (jdStart: number, jdEnd: number) => {
133
+ jd: number;
134
+ beta: number;
135
+ moonDistance_km: number;
136
+ type: string;
137
+ magnitudeUmbral: number;
138
+ magnitudePenumbral: number;
139
+ }[];
140
+ findSolarInRange: (jdStart: number, jdEnd: number) => {
141
+ jd: number;
142
+ beta: number;
143
+ moonDistance_km: number;
144
+ type: string;
145
+ moonAppR_topo: number;
146
+ sunAppR: number;
147
+ moonSunRatio: number;
148
+ }[];
149
+ deltaTSecondsAtJD: (jd: number) => number;
150
+ frameworkSunDeps: Readonly<{
151
+ sunMeanLongitudeJ2000Deg: any;
152
+ tropicalRateDegPerCy: number;
153
+ eccentricityAt: (year: number) => number;
154
+ perihelionLongitudeDegAt: (year: number) => number;
155
+ meanLongitudeDegAt: (year: number) => number;
156
+ }>;
157
+ umbraGroundAtJD: (jd: number) => {
158
+ latDeg: number;
159
+ lonDeg: number;
160
+ } | null;
161
+ solarLocalCircumstances: (jdGreatest: number, latDeg: number, lonDeg: number) => {
162
+ kind: "none" | "partial" | "annular" | "total";
163
+ magnitude: number;
164
+ maxJd: number;
165
+ contacts: {
166
+ c1: number | null;
167
+ c2: number | null;
168
+ c3: number | null;
169
+ c4: number | null;
170
+ };
171
+ centralDurationSeconds: number | null;
172
+ };
173
+ }>;
174
+ climate: Readonly<{
175
+ l1OrbitalPermil: (year: number) => number;
176
+ }>;
177
+ planets: Readonly<{
178
+ keys: readonly string[];
179
+ record: (k: string) => Record<string, any> | undefined;
180
+ perihelionLongitudeDeg: (k: string, year: number) => number;
181
+ ascendingNodeInvPlaneDeg: (k: string, year: number) => number;
182
+ invPlaneInclinationDeg: (k: string, year: number) => number;
183
+ }>;
184
+ }>;
@@ -0,0 +1,78 @@
1
+ export type MoonCorrectionTable = {
2
+ raSinD: number;
3
+ raCosD: number;
4
+ raSinMp: number;
5
+ raCosMp: number;
6
+ raSinMs: number;
7
+ raCosMs: number;
8
+ decSinD: number;
9
+ decCosD: number;
10
+ decSinMp: number;
11
+ decCosMp: number;
12
+ decSinMs: number;
13
+ decCosMs: number;
14
+ };
15
+ /**
16
+ * @typedef {{raSinD: number, raCosD: number, raSinMp: number, raCosMp: number,
17
+ * raSinMs: number, raCosMs: number, decSinD: number, decCosD: number,
18
+ * decSinMp: number, decCosMp: number, decSinMs: number, decCosMs: number}} MoonCorrectionTable
19
+ */
20
+ /**
21
+ * @param {{
22
+ * constants: {
23
+ * j2000JD: number,
24
+ * julianCenturyDays: number,
25
+ * sunMeanLongitudeJ2000Deg: number,
26
+ * perihelionLongitudeJ2000Deg: number,
27
+ * eccentricityJ2000: number,
28
+ * eccentricityDotJ2000: number,
29
+ * d5RateLDegPerDay: number,
30
+ * d5RatePeriDegPerDay: number,
31
+ * speedOfLight: number,
32
+ * },
33
+ * fns: {
34
+ * computeObliquityEarth: (year: number) => number,
35
+ * getAuDistanceKm: () => number,
36
+ * isFrameworkNative: () => boolean,
37
+ * getCorrectionResidual: () => (MoonCorrectionTable | null),
38
+ * getCorrectionLegacy: () => (MoonCorrectionTable | null),
39
+ * },
40
+ * }} deps — the D5 rates are the engines' J2000-frozen values (the year
41
+ * globals are deep-time-mutable, same pattern as FW_A2_RATE); the AU
42
+ * distance is a GETTER (browser-mutable under deep time).
43
+ */
44
+ export function createMoonApparent({ constants, fns }: {
45
+ constants: {
46
+ j2000JD: number;
47
+ julianCenturyDays: number;
48
+ sunMeanLongitudeJ2000Deg: number;
49
+ perihelionLongitudeJ2000Deg: number;
50
+ eccentricityJ2000: number;
51
+ eccentricityDotJ2000: number;
52
+ d5RateLDegPerDay: number;
53
+ d5RatePeriDegPerDay: number;
54
+ speedOfLight: number;
55
+ };
56
+ fns: {
57
+ computeObliquityEarth: (year: number) => number;
58
+ getAuDistanceKm: () => number;
59
+ isFrameworkNative: () => boolean;
60
+ getCorrectionResidual: () => (MoonCorrectionTable | null);
61
+ getCorrectionLegacy: () => (MoonCorrectionTable | null);
62
+ };
63
+ }): {
64
+ sunGeoVecEqD5: (jd: number) => [number, number, number];
65
+ moonAberrationRaDec: (jd: number, ra: number, dec: number) => {
66
+ dRA: number;
67
+ dDec: number;
68
+ };
69
+ overrideRaDec: ({ lonDeg, betRad, meeusT, obliquityDeg }: {
70
+ lonDeg: number;
71
+ betRad: number;
72
+ meeusT: (number | undefined);
73
+ obliquityDeg: number;
74
+ }) => {
75
+ raRad: number;
76
+ decRad: number;
77
+ };
78
+ };