@essrt/physics 20.0.1 → 22.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 (63) hide show
  1. package/README.md +4 -4
  2. package/package.json +4 -8
  3. package/src/cardinal/one-source-structure.cjs +3 -2
  4. package/src/chain-cycles/index.cjs +12 -30
  5. package/src/climate/l1-orbital.cjs +3 -1
  6. package/src/constants/coefficients.d.ts +17 -93
  7. package/src/constants/coefficients.js +7 -22
  8. package/src/constants/generated.d.ts +18 -156
  9. package/src/constants/generated.js +33 -168
  10. package/src/deltat/deep-time.cjs +36 -92
  11. package/src/deltat/recession-history.cjs +2 -1
  12. package/src/earth/deep-orbital-history.cjs +4 -4
  13. package/src/earth/frame-of-date.cjs +25 -1
  14. package/src/earth/precession-composed.cjs +3 -3
  15. package/src/earth/year-lengths.cjs +16 -1
  16. package/src/eclipse/sun-planetary-completion.cjs +11 -12
  17. package/src/index.js +28 -48
  18. package/src/layer0/derive-params.js +10 -5
  19. package/src/layer0/index.js +27 -73
  20. package/src/layer1/index.js +6 -37
  21. package/src/model.js +200 -225
  22. package/src/moon/arguments.cjs +57 -83
  23. package/src/moon/deep-modes-artifact.cjs +2 -2
  24. package/src/moon/month-chain.cjs +25 -59
  25. package/src/moon/series.cjs +14 -10
  26. package/src/phase/deep-calendar.cjs +35 -80
  27. package/src/planets/chain-artifact.js +2 -2
  28. package/src/planets/display-names.cjs +30 -0
  29. package/src/planets/geometry.cjs +79 -29
  30. package/src/planets/model.cjs +12 -11
  31. package/src/planets/spin-channel.cjs +46 -2
  32. package/types/chain-cycles/index.d.cts +9 -4
  33. package/types/climate/l1-orbital.d.cts +3 -1
  34. package/types/constants/coefficients.d.ts +17 -93
  35. package/types/constants/generated.d.ts +18 -156
  36. package/types/deltat/deep-time.d.cts +3 -16
  37. package/types/earth/frame-of-date.d.cts +9 -0
  38. package/types/earth/year-lengths.d.cts +12 -0
  39. package/types/eclipse/sun-planetary-completion.d.cts +0 -9
  40. package/types/index.d.ts +4 -13
  41. package/types/layer0/derive-params.d.ts +7 -4
  42. package/types/layer0/index.d.ts +6 -13
  43. package/types/layer1/index.d.ts +0 -2
  44. package/types/model.d.ts +8 -6
  45. package/types/moon/arguments.d.cts +23 -22
  46. package/types/moon/deep-modes-artifact.d.cts +3 -3
  47. package/types/moon/month-chain.d.cts +7 -16
  48. package/types/moon/series.d.cts +2 -4
  49. package/types/phase/deep-calendar.d.cts +14 -50
  50. package/types/planets/display-names.d.cts +2 -0
  51. package/types/planets/geometry.d.cts +36 -13
  52. package/types/planets/model.d.cts +7 -6
  53. package/types/planets/spin-channel.d.cts +4 -0
  54. package/src/cardinal/index.cjs +0 -324
  55. package/src/moon/ecc-channel.cjs +0 -141
  56. package/src/phase/index.cjs +0 -186
  57. package/src/planets/ecc-channel.cjs +0 -59
  58. package/src/sun/longitude-correction.cjs +0 -68
  59. package/types/cardinal/index.d.cts +0 -80
  60. package/types/moon/ecc-channel.d.cts +0 -30
  61. package/types/phase/index.d.cts +0 -38
  62. package/types/planets/ecc-channel.d.cts +0 -20
  63. package/types/sun/longitude-correction.d.cts +0 -41
@@ -25,17 +25,12 @@ export type DeepTimeLodConstants = {
25
25
  alpha1PerMa: number;
26
26
  alpha3PerMa3: number;
27
27
  alpha4PerMa4: number;
28
- holisticYearJ2000: number;
29
28
  /**
30
- * - the H/13-identity mean LOD at J2000
29
+ * - ω₀, the J2000 day length (the SI day since plan 09; identifier kept)
31
30
  */
32
31
  lodNowH13Seconds: number;
33
32
  meanSiderealYearJ2000Seconds: number;
34
33
  solarMassLossFracPerYear: number;
35
- /**
36
- * - Actual-LOD numerator
37
- */
38
- siderealYearDaysKinematicJ2000: number;
39
34
  /**
40
35
  * - f_S, the solar fraction of the J2000
41
36
  * precession torque (derive-params) — the unit H(t) = 13·T_p,composed needs it
@@ -49,7 +44,6 @@ export type DeepTimeLodDeps = {
49
44
  * - GIA α(t)
50
45
  */
51
46
  moiFactorAtAge: (tMa: number) => number;
52
- siderealYearDaysFourierAt: (year: number) => number;
53
47
  /**
54
48
  * - gated δLOD sum (incl. swing)
55
49
  */
@@ -101,11 +95,9 @@ export type DeepTimeLodDeps = {
101
95
  * @property {number} aMoonNowMetres - Farhat polynomial anchor
102
96
  * @property {number} alpha1PerMa @property {number} alpha3PerMa3
103
97
  * @property {number} alpha4PerMa4
104
- * @property {number} holisticYearJ2000
105
- * @property {number} lodNowH13Seconds - the H/13-identity mean LOD at J2000
98
+ * @property {number} lodNowH13Seconds - ω₀, the J2000 day length (the SI day since plan 09; identifier kept)
106
99
  * @property {number} meanSiderealYearJ2000Seconds
107
100
  * @property {number} solarMassLossFracPerYear
108
- * @property {number} siderealYearDaysKinematicJ2000 - Actual-LOD numerator
109
101
  * @property {number} precessionSolarShareJ2000 - f_S, the solar fraction of the J2000
110
102
  * precession torque (derive-params) — the unit H(t) = 13·T_p,composed needs it
111
103
  */
@@ -114,7 +106,6 @@ export type DeepTimeLodDeps = {
114
106
  * @property {DeepTimeLodConstants} constants
115
107
  * @property {(tMa: number) => number} moonDistanceMetresAtAge
116
108
  * @property {(tMa: number) => number} moiFactorAtAge - GIA α(t)
117
- * @property {(year: number) => number} siderealYearDaysFourierAt
118
109
  * @property {(year: number) => number} cycleLodSumAt - gated δLOD sum (incl. swing)
119
110
  * @property {(year: number) => number} swingLodAt - gated swing δLOD alone
120
111
  * @property {(year: number) => number} swingLodRateAt - gated analytic swing rate
@@ -141,7 +132,6 @@ export function createDeepTimeLod(deps: DeepTimeLodDeps): {
141
132
  lodSecondsAtAge: (t_Ma: number) => number | null;
142
133
  lodSecondsAtAgeWithAlpha: (t_Ma: number, alpha: number) => number | null;
143
134
  lodHoursAtAge: (t_Ma: number) => number | null;
144
- hAtAge: (t_Ma: number) => number | null;
145
135
  lunisolarPrecessionRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
146
136
  lunisolarPrecessionPeriodYearsAtAge: (t_Ma: number) => number | null;
147
137
  lunarTorqueFactorAtAge: (tMa: number) => (number | null);
@@ -149,11 +139,11 @@ export function createDeepTimeLod(deps: DeepTimeLodDeps): {
149
139
  siderealYearSecondsAtAge: (t_Ma: number) => number;
150
140
  tropicalYearSecondsAtAge: (t_Ma: number) => number;
151
141
  tropicalYearDaysAtAge: (t_Ma: number) => number | null;
142
+ tropicalYearSecondsFromLod: (t_Ma: number, LOD_s: number | null) => number;
152
143
  eclipticLodCorrectionSecondsAtAge: (t_Ma: number) => number | null;
153
144
  yearInDaysAtAge: (t_Ma: number) => number | null;
154
145
  deltaTRawSecondsAtAge: (t_Ma: number) => number;
155
146
  lodSecondsWithCorrectionsAtAge: (t_Ma: number) => number | null;
156
- lodSecondsActualAtAge: (t_Ma: number) => number | null;
157
147
  dLodDtDecompositionAtAge: (t_Ma: number) => {
158
148
  tidal: number | null;
159
149
  gia: number | null;
@@ -163,7 +153,4 @@ export function createDeepTimeLod(deps: DeepTimeLodDeps): {
163
153
  net_L3: number | null;
164
154
  net_L4: number | null;
165
155
  };
166
- eraClockHAtAge: (t_Ma: number) => number | null;
167
- eraClockTropicalYearSecondsAtAge: (t_Ma: number) => number;
168
- eraClockYearInDaysAtAge: (t_Ma: number) => number | null;
169
156
  };
@@ -35,3 +35,12 @@ export function computeEarthFrameOfDate(sample: {
35
35
  * @returns {number} θ in radians, in (−π, π]
36
36
  */
37
37
  export function solveWheelAngleForLongitude(lambdaRad: number, e: number, periRad: number): number;
38
+ /**
39
+ * The scene's world frame: R maps a J2000-ecliptic vector to world, columns
40
+ * [ĝ, n̂ × ĝ, n̂] = [the equinox, longitude 90°, the ecliptic pole] with
41
+ * n̂ = world Y exactly and ĝ at the view azimuth.
42
+ * @returns {number[][]} a 3×3 rotation matrix, rows × columns
43
+ */
44
+ export function computeSceneWorldFrameJ2000(): number[][];
45
+ /** The J2000 equinox's azimuth in the scene's world XZ plane, degrees (atan2(x, z)) — the view convention. */
46
+ export const SCENE_EQUINOX_VIEW_AZIMUTH_DEG: 158.2265109779131;
@@ -53,6 +53,18 @@ export function createYearLengths({ sampleAt, massLossSiderealSecondsAtYearFn }:
53
53
  /** The planetary λ̇ ratio (diagnostic; ≡1 at J2000). */
54
54
  planetaryRelAtYear: (year: number) => number;
55
55
  }>;
56
+ /** The J2000 mean tropical year, DAYS — derived in ONE home from two IAU
57
+ * inputs, the sidereal year and the general precession in longitude p_A
58
+ * (″ per JULIAN year), in the exact rate form
59
+ * 1/T_trop = 1/T_sid + p_A / (1,296,000″ · 365.25 d)
60
+ * — the same beat `shorterYear` evaluates of date. 365.242190469 d on the
61
+ * IAU 2006 inputs. Plan 09: replaces the Meeus & Savoie 1992 input
62
+ * 365.2421897 (66 ms shorter, whose beat with the sidereal year read
63
+ * 25,770.7 yr against p_A's 25,771.6 — three inputs over-determining a
64
+ * two-parameter identity). Counting p_A per tropical or sidereal year
65
+ * instead moves this by 26 ms; IAU states p_A per Julian year.
66
+ * @param {number} siderealYearDays @param {number} generalPrecessionArcsecPerJulianYr @returns {number} */
67
+ export function computeMeanTropicalYearJ2000Days(siderealYearDays: number, generalPrecessionArcsecPerJulianYr: number): number;
56
68
  /**
57
69
  * The published of-date window (plan 06 Phase 3 S2): inside |year − 2000| ≤
58
70
  * this span the one-family route is THE published year-length / precession
@@ -63,15 +63,6 @@ export function computeCarrierRatesDegPerCy({ meanSiderealYearDays, moonSidereal
63
63
  * @returns {[number, number]}
64
64
  */
65
65
  export function eccVectorOfDateEmbedded(bodyIndex: number, T: number): [number, number];
66
- /** sha256/16 of JSON.stringify(FITTED_COEFFICIENTS.SUN_LONGITUDE_HARMONICS)
67
- * at derivation time — the matched-pair fingerprint asserted by test:model.
68
- * Unchanged from v1/v2: SUN_HARMONICS did not move in the D2 or N3
69
- * landings. Plan 07 R10 moved the hash WITHOUT a refit: the three (sin, cos)
70
- * pairs were rotated exactly from the t₀ phase origin to J2000
71
- * (tools/fit/reorigin-combs-j2000.mjs), the finder Sun is bit-identical, so
72
- * the residual this table was derived from is unchanged — the table stands
73
- * (fidelity 0.616″, 70 terms), only the fingerprint is re-recorded. */
74
- export const PAIRED_SUN_HARMONICS_SHA256: "53530a28a60b3c4a";
75
66
  /** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
76
67
  * full-precision carrier rates (deg/cy TT) the tables pair with: since plan
77
68
  * 06 I3 the model's own banked J2000 sidereal mean motions for the planets
package/types/index.d.ts CHANGED
@@ -1,17 +1,13 @@
1
1
  export { createEpochPrimitives } from "./layer0/index.js";
2
2
  export { deriveEpochParams } from "./layer0/derive-params.js";
3
3
  export { createDerivedViews } from "./layer1/index.js";
4
- export { createPhaseMachinery } from "./phase/index.cjs";
5
4
  export { createDeepCalendar } from "./phase/deep-calendar.cjs";
6
- export { createCardinalModel } from "./cardinal/index.cjs";
7
5
  export { createCardinalStructure } from "./cardinal/one-source-structure.cjs";
8
- export { createMoonEccChannel } from "./moon/ecc-channel.cjs";
9
6
  export { createMoonMonthChain } from "./moon/month-chain.cjs";
10
7
  export { createChainCycleIntegrator } from "./chain-cycles/index.cjs";
11
8
  export { createMoonArguments } from "./moon/arguments.cjs";
12
9
  export { createMoonSeries } from "./moon/series.cjs";
13
10
  export { createMoonApparent } from "./moon/apparent.cjs";
14
- export { derivePlanetGeometry } from "./planets/geometry.cjs";
15
11
  export * as planetOrbitChain from "./planets/orbit-chain.cjs";
16
12
  export { computeSecularShape } from "./planets/secular-shape.cjs";
17
13
  export { createSecularSeriesOverride } from "./planets/secular-series.cjs";
@@ -19,11 +15,11 @@ export { createDeepEccChannel } from "./moon/deep-ecc-channel.cjs";
19
15
  export { createDeepOrbitalHistory } from "./earth/deep-orbital-history.cjs";
20
16
  export { createSiderealYearChannel } from "./earth/sidereal-year-channel.cjs";
21
17
  export { createPlanetModel } from "./planets/model.cjs";
18
+ export { PLANET_DISPLAY_NAMES } from "./planets/display-names.cjs";
22
19
  export { createDeltaTCycles } from "./deltat/cycles.cjs";
23
20
  export { createDeepTimeLod } from "./deltat/deep-time.cjs";
24
21
  export { deltaTEspenakMeeusCanonSeconds } from "./deltat/historical.cjs";
25
22
  export { createEclipseFinders } from "./eclipse/finders.cjs";
26
- export { createSunLongitudeCorrection } from "./sun/longitude-correction.cjs";
27
23
  export function createModel(constants?: Constants, opts?: {
28
24
  laws?: {
29
25
  eccentricityAt?: (year: number) => number;
@@ -50,11 +46,6 @@ export type ModelIdentity = {
50
46
  export type Model = {
51
47
  constants: Constants;
52
48
  hash: string;
53
- computeLatticePeriodsYears: () => {
54
- axialPrecessionPeriodYears: number;
55
- inclinationPrecessionPeriodYears: number;
56
- perihelionPrecessionPeriodYears: number;
57
- };
58
49
  eccentricity: (year: number) => number;
59
50
  identity: ModelIdentity;
60
51
  } & ModelSurfaces;
@@ -66,14 +57,14 @@ import { REFERENCE_DATA } from './constants/index.js';
66
57
  import { assembleModel } from './model.js';
67
58
  export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA };
68
59
  export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from "./constants/index.js";
69
- export { computeEarthFrameOfDate, solveWheelAngleForLongitude } from "./earth/frame-of-date.cjs";
70
- export { eccentricityFromCycles, computeEccentricityIntegrated } from "./planets/ecc-channel.cjs";
60
+ export { computeEarthFrameOfDate, solveWheelAngleForLongitude, computeSceneWorldFrameJ2000, SCENE_EQUINOX_VIEW_AZIMUTH_DEG } from "./earth/frame-of-date.cjs";
61
+ export { derivePlanetGeometry, scaffoldOrbitInputs } from "./planets/geometry.cjs";
71
62
  export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, computeApsidalSecularDegPerYr, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from "./planets/keplerian-chain.cjs";
72
63
  export { computeEquatorNodeOriginSFrameDeg, convertNodeSFrameToEquatorOriginDeg } from "./planets/inv-plane-frame.cjs";
73
64
  export { computePlanetPrecessionConstant, createPlanetSpinChannel, createPlanetSpinChannelFromArtifacts, computeObliquityJ2000Deg } from "./planets/spin-channel.cjs";
74
65
  export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from "./planets/chain-artifact.js";
75
66
  export { DEEP_MODES_ARTIFACT, DEEP_MODES_ARTIFACT_HASH } from "./moon/deep-modes-artifact.cjs";
76
- export { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from "./earth/year-lengths.cjs";
67
+ export { createYearLengths, computeMeanTropicalYearJ2000Days, ONE_FAMILY_WINDOW_YEARS } from "./earth/year-lengths.cjs";
77
68
  export { computeSolarTorqueShare, createComposedPrecession } from "./earth/precession-composed.cjs";
78
69
  export { createMoonRecessionHistory, createSolarChannelBudget } from "./deltat/recession-history.cjs";
79
70
  export { evalClimateL1OrbitalPermil, laggedL1Terms, createAlphaGiaChannel } from "./climate/l1-orbital.cjs";
@@ -15,12 +15,11 @@ export type RawEpochConstants = {
15
15
  alpha1PerMa: number;
16
16
  alpha3PerMa3: number;
17
17
  alpha4PerMa4: number;
18
+ meanSiderealYearSeconds: number;
18
19
  /**
19
- * H
20
+ * ω₀: the J2000 day length, SI seconds (the SI day since plan 09)
20
21
  */
21
- holisticYearJ2000: number;
22
- meanSiderealYearSeconds: number;
23
- meanSiderealYearDaysKinematic: number;
22
+ lodJ2000Seconds: number;
24
23
  /**
25
24
  * M_SUN
26
25
  */
@@ -43,4 +42,8 @@ export type RawEpochConstants = {
43
42
  astronomicalUnitKm: number;
44
43
  earthOrbitalEccentricityJ2000: number;
45
44
  moonEclipticInclinationJ2000Deg: number;
45
+ /**
46
+ * the model's ONE J2000 precession reading (1,296,000/p_A; plan 09)
47
+ */
48
+ axialPrecessionJ2000Years: number;
46
49
  };
@@ -33,7 +33,6 @@ export type EpochParams = {
33
33
  moonEccentricityFactor: number;
34
34
  earthMassKg: number;
35
35
  earthRadiusM: number;
36
- holisticYearJ2000: number;
37
36
  lodNowH13Seconds: number;
38
37
  siderealYearJ2000Seconds: number;
39
38
  solarMassLossFracPerYear: number;
@@ -41,24 +40,18 @@ export type EpochParams = {
41
40
  * f_S, the solar fraction of the J2000 precession torque
42
41
  */
43
42
  precessionSolarShareJ2000: number;
43
+ /**
44
+ * p₀, the composed precession rate's J2000 anchor (1,296,000/axial0)
45
+ */
46
+ precessionRateJ2000ArcsecPerYr: number;
44
47
  };
45
48
  export type EpochPrimitives = {
46
49
  tMa: (year: number) => number;
47
50
  moonDistanceMetres: (year: number) => number;
48
51
  lodSeconds: (year: number) => number | null;
49
- /**
50
- * the UNIT: 13 × the composed lunisolar precession period
51
- */
52
- holisticH: (year: number) => number | null;
53
52
  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
53
  /**
61
- * T_sid·(1 − 13/H_era) — the frozen comb family's base
54
+ * sidereal less one equinox turn per T_p(t) (the composed precession period)
62
55
  */
63
- eraClockTropicalYearSeconds: (year: number) => number;
56
+ tropicalYearSeconds: (year: number) => number;
64
57
  };
@@ -5,6 +5,4 @@ export type EpochPrimitives = import("../layer0/index.js").EpochPrimitives;
5
5
  export type DerivedViews = {
6
6
  tropicalYearDays: (year: number) => number | null;
7
7
  siderealYearDays: (year: number) => number | null;
8
- anomalisticYearDays: (year: number) => number | null;
9
- siderealYearDaysViaLattice: (year: number) => number | null;
10
8
  };
package/types/model.d.ts CHANGED
@@ -32,16 +32,20 @@ export function assembleModel(C: Readonly<Record<string, any>>, F: Readonly<Reco
32
32
  jdFromYear: (year: number) => number;
33
33
  siTropicalYearDays: number;
34
34
  }>;
35
+ sun: Readonly<{
36
+ /** Mean longitude of date, degrees, unwrapped — L0 + 360·∫dt/T_trop (the one-family tropical year). @param {number} year @returns {number} */
37
+ meanLongitudeDegAt: (year: number) => number;
38
+ /** The Sun's mean perihelion longitude of date (Earth's ϖ, mean elements), degrees, wrapped to [0, 360). @param {number} year @returns {number} */
39
+ perihelionLongitudeDegAt: (year: number) => number;
40
+ }>;
35
41
  epoch: Readonly<{
36
42
  yearToTMa: (year: number) => number;
37
- hAtYear: (year: number) => number | null;
38
43
  lodSecondsAtYear: (year: number) => number | null;
39
44
  lodRealSecondsAtYear: (year: number) => number;
40
45
  alphaAtYear: (year: number) => number;
41
46
  moonDistanceKmAtYear: (year: number) => number;
42
47
  siderealYearSecondsAtYear: (year: number) => number;
43
48
  deltaTSecondsAtYear: (year: number) => number;
44
- cyclesBetween: (yearA: number, yearB: number, divisorN: number) => number;
45
49
  axialPrecessionYearsAtYear: (year: number) => number;
46
50
  tropicalYearSecondsAtYear: (year: number) => number;
47
51
  }>;
@@ -119,22 +123,18 @@ export function assembleModel(C: Readonly<Record<string, any>>, F: Readonly<Reco
119
123
  earth: Readonly<{
120
124
  perihelionLongitudeDeg: (year: number) => number;
121
125
  obliquityDeg: (year: number) => number;
122
- obliquityCombDeg: (year: number) => number;
123
126
  eccentricity: (year: number) => number;
124
127
  inclinationDeg: (year: number) => number;
125
128
  ascendingNodeDeg: (year: number) => number;
126
129
  }>;
127
130
  lengths: Readonly<{
128
131
  tropicalYearDays: (year: number) => number;
129
- tropicalYearDirectDays: (year: number) => number;
130
132
  siderealYearDays: (year: number) => number;
131
133
  anomalisticYearDays: (year: number) => number;
132
134
  dayLengthSeconds: (year: number) => number;
133
135
  lodRealSeconds: (year: number) => number;
134
136
  siderealDaySeconds: (year: number) => number;
135
137
  stellarDaySeconds: (year: number) => number;
136
- measuredSolarDaySeconds: (year: number) => number;
137
- raDayOffsetMs: (year: number) => number;
138
138
  }>;
139
139
  cardinal: Readonly<{
140
140
  jd: (year: number, type: string) => number;
@@ -261,6 +261,8 @@ export function assembleModel(C: Readonly<Record<string, any>>, F: Readonly<Reco
261
261
  meanDeg: number;
262
262
  maxDeg: number;
263
263
  } | null;
264
+ spinAxisEclipticJ2000AtYear: (year: number) => number[] | null;
265
+ orbitNormalEclipticJ2000AtYear: (year: number) => number[];
264
266
  stepYr: number;
265
267
  maxSpanYr: 10000000;
266
268
  }>;
@@ -5,20 +5,11 @@ export type MoonArgsDeg = {
5
5
  Mp: number;
6
6
  F: number;
7
7
  };
8
- /**
9
- * @typedef {{Lp: number, D: number, M: number, Mp: number, F: number}} MoonArgsDeg
10
- */
11
8
  /**
12
9
  * @param {{
13
10
  * constants: {
14
11
  * j2000JD: number,
15
12
  * 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
13
  * eccentricityJ2000: number,
23
14
  * eccentricityDotJ2000: number,
24
15
  * eccentricityDotDotJ2000: number,
@@ -30,11 +21,12 @@ export type MoonArgsDeg = {
30
21
  * eccAt: (tYr: number) => number,
31
22
  * channelIntegral: (T: number, s: number) => number,
32
23
  * computeObliquityEarth: (year: number) => number,
24
+ * sunMeanLonDegAtJdTT: (jdTT: number) => number,
25
+ * sunPerihelionLonDegAtJdTT: (jdTT: number) => number,
33
26
  * jdToSIyear: (jd: number) => number,
34
27
  * tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null),
35
28
  * apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null),
36
29
  * nodalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null),
37
- * cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null),
38
30
  * isDeepTime: () => boolean,
39
31
  * isFrameworkNative: () => boolean,
40
32
  * pDynDegPerYearAt?: (year: number) => number,
@@ -48,17 +40,20 @@ export type MoonArgsDeg = {
48
40
  * evaluators — the tweakpane identity, real at J2000, epoch-valid);
49
41
  * pKin = the KINEMATIC pair's beat (the H/13-family mean the chains
50
42
  * embed). Absent ⇒ the completion is disabled (pre-(d′) behaviour).
43
+ * Plan 09: the Sun of the arguments is the engine's ONE certified Sun —
44
+ * sunMeanLonDegAtJdTT (the mean longitude that integrates the one-family
45
+ * tropical year, unwrapped) and sunPerihelionLonDegAtJdTT (the mean
46
+ * perihelion of date, wrapped — the arguments wrap M, and the rate anchors
47
+ * difference it over ±25 days wrapped to ±180°). The former "model timeline" Sun — 360° per mean solar
48
+ * year plus the closed-form integrals of the retired year-length combs,
49
+ * the perihelion on the H/16 chain count — sat 0.2° behind the IAU mean
50
+ * Sun at −2000 (the combs could not carry the tropical year's secular
51
+ * drift); measured against Meeus L0 before the move.
51
52
  */
52
53
  export function createMoonArguments({ constants, fns }: {
53
54
  constants: {
54
55
  j2000JD: number;
55
56
  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
57
  eccentricityJ2000: number;
63
58
  eccentricityDotJ2000: number;
64
59
  eccentricityDotDotJ2000: number;
@@ -70,11 +65,12 @@ export function createMoonArguments({ constants, fns }: {
70
65
  eccAt: (tYr: number) => number;
71
66
  channelIntegral: (T: number, s: number) => number;
72
67
  computeObliquityEarth: (year: number) => number;
68
+ sunMeanLonDegAtJdTT: (jdTT: number) => number;
69
+ sunPerihelionLonDegAtJdTT: (jdTT: number) => number;
73
70
  jdToSIyear: (jd: number) => number;
74
71
  tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null);
75
72
  apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null);
76
73
  nodalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null);
77
- cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null);
78
74
  isDeepTime: () => boolean;
79
75
  isFrameworkNative: () => boolean;
80
76
  pDynDegPerYearAt?: (year: number) => number;
@@ -85,10 +81,6 @@ export function createMoonArguments({ constants, fns }: {
85
81
  fwArgs: (jdTT: number) => MoonArgsDeg;
86
82
  fwArgsDeep: (jd: number) => MoonArgsDeg | null;
87
83
  pureMeeusArgs: (jdTT: number) => MoonArgsDeg;
88
- sunSecularDeviations: (jdTT: number) => {
89
- dLs: number;
90
- dPeri: number;
91
- };
92
84
  planetaryCarrier: (T: number) => number;
93
85
  obliquityCarrier: (T: number) => number;
94
86
  lpSecularCompletion: (T: number) => number;
@@ -101,7 +93,6 @@ export function createMoonArguments({ constants, fns }: {
101
93
  LPR: number;
102
94
  DR: number;
103
95
  MR: number;
104
- P_DEGCY: number;
105
96
  WDOT: number;
106
97
  NDOT: number;
107
98
  T2_W: number;
@@ -136,3 +127,13 @@ export function createMoonArguments({ constants, fns }: {
136
127
  * Sun secular deviations. @param {number} jd @returns {number}
137
128
  */
138
129
  export function jdToDecimalYear(jd: number): number;
130
+ /**
131
+ * @typedef {{Lp: number, D: number, M: number, Mp: number, F: number}} MoonArgsDeg
132
+ */
133
+ /** The secular-completion taper half-width, Julian years: the cos² envelope
134
+ * inside which the chain's Meeus-measured rate anchors and the Lp secular
135
+ * completion act (full at the anchor, zero beyond). A recorded window of the
136
+ * completion, not a law — the anchors were measured with it (plan 09 step
137
+ * 5c: it was written as the era unit's twelfth, H/12, "lattice-derived";
138
+ * the value is kept bit-identical and named for what it is). */
139
+ export const SECULAR_COMPLETION_TAPER_YEARS: 27943.083333333332;
@@ -151,11 +151,11 @@ export const DEEP_MODES_ARTIFACT: Readonly<{
151
151
  im: number;
152
152
  }[];
153
153
  };
154
- anchorE: 0.016702435651957018;
155
- anchorPeriEclipticDeg: 462.9179213996577;
154
+ anchorE: 0.016702435651957125;
155
+ anchorPeriEclipticDeg: 462.9179213996576;
156
156
  anchorInclEclipticDeg: 0.00010345820355474172;
157
157
  anchorAscNodeEclipticDeg: 140.29217988414328;
158
158
  anchorZDotPerYr: number[];
159
159
  slopeTaperYears: 27943.083333333332;
160
160
  }>;
161
- export const DEEP_MODES_ARTIFACT_HASH: "7633dd8f434fd6fc";
161
+ export const DEEP_MODES_ARTIFACT_HASH: "87c325fac77d94a4";
@@ -8,14 +8,9 @@
8
8
  * gmEarthMoonM3PerS2: number,
9
9
  * massRatioEarthMoon: number,
10
10
  * moonSiderealMonthInputDays: number,
11
- * holisticYearJ2000: number,
12
11
  * meanSiderealYearJ2000Seconds: number,
13
- * nApsidalOfDateJ2000: number,
14
- * nNodalOfDateJ2000: number,
15
12
  * moonApsidalJ2000Seconds: number,
16
13
  * moonNodalJ2000Seconds: number,
17
- * moonApsidalOfDateJ2000Seconds: number,
18
- * moonNodalOfDateJ2000Seconds: number,
19
14
  * moonSiderealMonthJ2000Seconds: number,
20
15
  * sPerigee: number,
21
16
  * sNode: number,
@@ -23,13 +18,18 @@
23
18
  * fns: {
24
19
  * meanLodSecondsAtAge: (tMa: number) => (number | null),
25
20
  * meanSiderealYearSecondsAtAge: (tMa: number) => number,
26
- * meanHAtAge: (tMa: number) => (number | null),
21
+ * precessionPeriodYearsAtAge: (tMa: number) => (number | null),
27
22
  * modulation: (tMa: number, s: number) => number,
28
23
  * distanceMetresAtAge?: (tMa: number) => number,
29
24
  * },
30
25
  * }} deps — fns are the ENGINE'S OWN layer-0/1 evaluators and the shared
31
26
  * eccentricity channel's modulation; constants are the engine's derived
32
27
  * J2000 anchors (both engines derive them from the same JSON).
28
+ * fns.precessionPeriodYearsAtAge is the engine's lunisolar precession period
29
+ * of date T_p(t), Julian years (the composed rate's period; plan 09 step
30
+ * 5c — the tropical month's equinox turn, formerly the counter's 13/H(t),
31
+ * 0.086 % slow: the chain's J2000 tropical month sat 5.85 ms above the IAU
32
+ * input, the 1/T_p form is within 0.1 ms of it).
33
33
  * fns.distanceMetresAtAge, when present, OVERRIDES the internal quartic —
34
34
  * the Driver-1½ regime-aware history (recession-history.cjs); absent, the
35
35
  * internal quartic is the pure twin (bit-identical for t ≤ jointMa).
@@ -43,14 +43,9 @@ export function createMoonMonthChain({ constants, fns }: {
43
43
  gmEarthMoonM3PerS2: number;
44
44
  massRatioEarthMoon: number;
45
45
  moonSiderealMonthInputDays: number;
46
- holisticYearJ2000: number;
47
46
  meanSiderealYearJ2000Seconds: number;
48
- nApsidalOfDateJ2000: number;
49
- nNodalOfDateJ2000: number;
50
47
  moonApsidalJ2000Seconds: number;
51
48
  moonNodalJ2000Seconds: number;
52
- moonApsidalOfDateJ2000Seconds: number;
53
- moonNodalOfDateJ2000Seconds: number;
54
49
  moonSiderealMonthJ2000Seconds: number;
55
50
  sPerigee: number;
56
51
  sNode: number;
@@ -58,7 +53,7 @@ export function createMoonMonthChain({ constants, fns }: {
58
53
  fns: {
59
54
  meanLodSecondsAtAge: (tMa: number) => (number | null);
60
55
  meanSiderealYearSecondsAtAge: (tMa: number) => number;
61
- meanHAtAge: (tMa: number) => (number | null);
56
+ precessionPeriodYearsAtAge: (tMa: number) => (number | null);
62
57
  modulation: (tMa: number, s: number) => number;
63
58
  distanceMetresAtAge?: (tMa: number) => number;
64
59
  };
@@ -70,10 +65,6 @@ export function createMoonMonthChain({ constants, fns }: {
70
65
  siderealMonthSecondsAtAge: (tMa: number) => number | null;
71
66
  synodicMonthSecondsAtAge: (tMa: number) => number | null;
72
67
  tropicalMonthSecondsAtAge: (tMa: number) => number | null;
73
- apsidalCyclesOfDateAtAge: (tMa: number) => number | null;
74
- nodalCyclesOfDateAtAge: (tMa: number) => number | null;
75
- apsidalPrecessionSecondsOfDateAtAge: (tMa: number) => number | null;
76
- nodalPrecessionSecondsOfDateAtAge: (tMa: number) => number | null;
77
68
  perigeePrecessionSecondsAtAge: (tMa: number) => number | null;
78
69
  nodePrecessionSecondsAtAge: (tMa: number) => number | null;
79
70
  anomalisticMonthSecondsAtAge: (tMa: number) => number | null;
@@ -12,7 +12,6 @@ export type MeeusTermTable = Array<[number, number, number, number, number]>;
12
12
  * moonDistanceJ2000Km: number,
13
13
  * j2000JD: number,
14
14
  * julianCenturyDays: number,
15
- * moonMeeusLpCorrectionDeg: number,
16
15
  * fwA2RateDegPerCy: number,
17
16
  * fwA3RateDegPerCy: number,
18
17
  * },
@@ -26,7 +25,7 @@ export type MeeusTermTable = Array<[number, number, number, number, number]>;
26
25
  * jdToSIyear: (jd: number) => number,
27
26
  * tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null),
28
27
  * apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null),
29
- * cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null),
28
+ * siderealOrbitsBetween: (yearA: number, yearB: number) => (number | null),
30
29
  * jupiterOrbitsBetween: (yearA: number, yearB: number) => (number | null),
31
30
  * isDeepTime: () => boolean,
32
31
  * isFrameworkNative: () => boolean,
@@ -46,7 +45,6 @@ export function createMoonSeries({ constants, fns }: {
46
45
  moonDistanceJ2000Km: number;
47
46
  j2000JD: number;
48
47
  julianCenturyDays: number;
49
- moonMeeusLpCorrectionDeg: number;
50
48
  fwA2RateDegPerCy: number;
51
49
  fwA3RateDegPerCy: number;
52
50
  };
@@ -66,7 +64,7 @@ export function createMoonSeries({ constants, fns }: {
66
64
  jdToSIyear: (jd: number) => number;
67
65
  tropicalOrbitsBetween: (yearA: number, yearB: number) => (number | null);
68
66
  apsidalOfDateCyclesBetween: (yearA: number, yearB: number) => (number | null);
69
- cyclesBetween: (yearA: number, yearB: number, divisorN: number) => (number | null);
67
+ siderealOrbitsBetween: (yearA: number, yearB: number) => (number | null);
70
68
  jupiterOrbitsBetween: (yearA: number, yearB: number) => (number | null);
71
69
  isDeepTime: () => boolean;
72
70
  isFrameworkNative: () => boolean;