@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,2 @@
1
+ export { DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA } from "./generated.js";
2
+ export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from "./coefficients.js";
@@ -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,122 @@
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
+ export type DeepTimeLodDeps = {
41
+ constants: DeepTimeLodConstants;
42
+ moonDistanceMetresAtAge: (tMa: number) => number;
43
+ /**
44
+ * - GIA α(t)
45
+ */
46
+ moiFactorAtAge: (tMa: number) => number;
47
+ siderealYearDaysFourierAt: (year: number) => number;
48
+ /**
49
+ * - gated δLOD sum (incl. swing)
50
+ */
51
+ cycleLodSumAt: (year: number) => number;
52
+ /**
53
+ * - gated swing δLOD alone
54
+ */
55
+ swingLodAt: (year: number) => number;
56
+ /**
57
+ * - gated analytic swing rate
58
+ */
59
+ swingLodRateAt: (year: number) => number;
60
+ /**
61
+ * - OPTIONAL time-dependent
62
+ * Earth-Moon angular momentum (the Driver-1½ solar channels,
63
+ * recession-history.cjs). Absent → the J2000 constant, which the budget
64
+ * module equals exactly for t ≤ jointMa — the pure-twin convention.
65
+ */
66
+ lEmAtAgeKgm2S?: ((tMa: number) => number) | undefined;
67
+ };
68
+ /**
69
+ * @typedef {Object} DeepTimeLodConstants
70
+ * @property {number} lTotalEmKgm2S - Earth–Moon total angular momentum
71
+ * @property {number} mMoonAloneKg
72
+ * @property {number} mEarthAloneKg
73
+ * @property {number} rEarthMetres
74
+ * @property {number} gmEmM3PerS2 - GM of the Earth–Moon system
75
+ * @property {number} eFactorMoon - √(1−e²) factor of the lunar orbit
76
+ * @property {number} aLockMetres - tidal-lock distance (LOD denominator → 0)
77
+ * @property {number} aMoonNowMetres - Farhat polynomial anchor
78
+ * @property {number} alpha1PerMa @property {number} alpha3PerMa3
79
+ * @property {number} alpha4PerMa4
80
+ * @property {number} holisticYearJ2000
81
+ * @property {number} lodNowH13Seconds - the H/13-identity mean LOD at J2000
82
+ * @property {number} meanSiderealYearJ2000Seconds
83
+ * @property {number} solarMassLossFracPerYear
84
+ * @property {number} siderealYearDaysKinematicJ2000 - Actual-LOD numerator
85
+ */
86
+ /**
87
+ * @typedef {Object} DeepTimeLodDeps
88
+ * @property {DeepTimeLodConstants} constants
89
+ * @property {(tMa: number) => number} moonDistanceMetresAtAge
90
+ * @property {(tMa: number) => number} moiFactorAtAge - GIA α(t)
91
+ * @property {(year: number) => number} siderealYearDaysFourierAt
92
+ * @property {(year: number) => number} cycleLodSumAt - gated δLOD sum (incl. swing)
93
+ * @property {(year: number) => number} swingLodAt - gated swing δLOD alone
94
+ * @property {(year: number) => number} swingLodRateAt - gated analytic swing rate
95
+ * @property {(tMa: number) => number} [lEmAtAgeKgm2S] - OPTIONAL time-dependent
96
+ * Earth-Moon angular momentum (the Driver-1½ solar channels,
97
+ * recession-history.cjs). Absent → the J2000 constant, which the budget
98
+ * module equals exactly for t ≤ jointMa — the pure-twin convention.
99
+ */
100
+ /** @param {DeepTimeLodDeps} deps */
101
+ export function createDeepTimeLod(deps: DeepTimeLodDeps): {
102
+ lodSecondsAtAge: (t_Ma: number) => number | null;
103
+ lodSecondsAtAgeWithAlpha: (t_Ma: number, alpha: number) => number | null;
104
+ lodHoursAtAge: (t_Ma: number) => number | null;
105
+ hAtAge: (t_Ma: number) => number | null;
106
+ siderealYearSecondsAtAge: (t_Ma: number) => number;
107
+ tropicalYearSecondsAtAge: (t_Ma: number) => number;
108
+ tropicalYearDaysAtAge: (t_Ma: number) => number | null;
109
+ yearInDaysAtAge: (t_Ma: number) => number | null;
110
+ deltaTRawSecondsAtAge: (t_Ma: number) => number;
111
+ lodSecondsWithCorrectionsAtAge: (t_Ma: number) => number | null;
112
+ lodSecondsActualAtAge: (t_Ma: number) => number | null;
113
+ dLodDtDecompositionAtAge: (t_Ma: number) => {
114
+ tidal: number | null;
115
+ gia: number | null;
116
+ stack: number | null;
117
+ resonator: number | null;
118
+ net_L2: number | null;
119
+ net_L3: number | null;
120
+ net_L4: number | null;
121
+ };
122
+ };
@@ -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,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,57 @@
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
+ }>;
@@ -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
+ };