@essrt/physics 20.0.1 → 21.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 (55) hide show
  1. package/README.md +4 -4
  2. package/package.json +3 -8
  3. package/src/cardinal/one-source-structure.cjs +3 -2
  4. package/src/chain-cycles/index.cjs +12 -30
  5. package/src/constants/coefficients.d.ts +16 -92
  6. package/src/constants/coefficients.js +5 -21
  7. package/src/constants/generated.d.ts +12 -16
  8. package/src/constants/generated.js +21 -25
  9. package/src/deltat/deep-time.cjs +36 -92
  10. package/src/deltat/recession-history.cjs +2 -1
  11. package/src/earth/deep-orbital-history.cjs +4 -4
  12. package/src/earth/precession-composed.cjs +3 -3
  13. package/src/earth/year-lengths.cjs +16 -1
  14. package/src/eclipse/sun-planetary-completion.cjs +11 -12
  15. package/src/index.js +22 -46
  16. package/src/layer0/derive-params.js +10 -5
  17. package/src/layer0/index.js +27 -73
  18. package/src/layer1/index.js +6 -37
  19. package/src/model.js +182 -210
  20. package/src/moon/arguments.cjs +57 -83
  21. package/src/moon/deep-modes-artifact.cjs +2 -2
  22. package/src/moon/month-chain.cjs +25 -59
  23. package/src/moon/series.cjs +9 -5
  24. package/src/phase/deep-calendar.cjs +35 -80
  25. package/src/planets/chain-artifact.js +2 -2
  26. package/src/planets/geometry.cjs +52 -23
  27. package/src/planets/model.cjs +5 -5
  28. package/types/chain-cycles/index.d.cts +9 -4
  29. package/types/constants/coefficients.d.ts +16 -92
  30. package/types/constants/generated.d.ts +12 -16
  31. package/types/deltat/deep-time.d.cts +3 -16
  32. package/types/earth/year-lengths.d.cts +12 -0
  33. package/types/eclipse/sun-planetary-completion.d.cts +0 -9
  34. package/types/index.d.ts +2 -12
  35. package/types/layer0/derive-params.d.ts +7 -4
  36. package/types/layer0/index.d.ts +6 -13
  37. package/types/layer1/index.d.ts +0 -2
  38. package/types/model.d.ts +6 -6
  39. package/types/moon/arguments.d.cts +23 -22
  40. package/types/moon/deep-modes-artifact.d.cts +3 -3
  41. package/types/moon/month-chain.d.cts +7 -16
  42. package/types/moon/series.d.cts +2 -2
  43. package/types/phase/deep-calendar.d.cts +14 -50
  44. package/types/planets/geometry.d.cts +27 -11
  45. package/types/planets/model.d.cts +9 -3
  46. package/src/cardinal/index.cjs +0 -324
  47. package/src/moon/ecc-channel.cjs +0 -141
  48. package/src/phase/index.cjs +0 -186
  49. package/src/planets/ecc-channel.cjs +0 -59
  50. package/src/sun/longitude-correction.cjs +0 -68
  51. package/types/cardinal/index.d.cts +0 -80
  52. package/types/moon/ecc-channel.d.cts +0 -30
  53. package/types/phase/index.d.cts +0 -38
  54. package/types/planets/ecc-channel.d.cts +0 -20
  55. package/types/sun/longitude-correction.d.cts +0 -41
@@ -8,10 +8,19 @@
8
8
  * type-branched function over a body record — the shape the model's claim
9
9
  * has always had (six laws, per-body parameters).
10
10
  *
11
- * EXPRESSION FORMS ARE THE BROWSER'S (the certified engine) — e.g.
12
- * `Math.round((H·mSY)/input)`, `((H/N)**2)**(1/3)` — so browser bit-identity
13
- * holds by construction; Node's last-ulp variants dissolve here (the
14
- * cardinal-extraction pattern).
11
+ * EXPRESSION FORMS ARE THE BROWSER'S (the certified engine) — so browser
12
+ * bit-identity holds by construction; Node's last-ulp variants dissolve here
13
+ * (the cardinal-extraction pattern).
14
+ *
15
+ * PLAN 09 STEP 7b: the device count is gone. The geometry used to quantize
16
+ * every body's period onto the unit — N = round(H·mSY/input) orbits per
17
+ * anchor interval, period H/N, a = (H/N)^(2/3) — a rounding of up to half a
18
+ * count (2.5e-4 of Neptune's period). The caller now hands in the period in
19
+ * SI days directly (the chain's J2000 window mean motion for the seven chain
20
+ * planets, the observed input for the no-chain bodies) and, where a chain
21
+ * exists, the chain's J2000 semi-major axis; Kepler's a from the period is the
22
+ * fallback for the no-chain bodies. Rotation periods are the inputs (they were
23
+ * rounded onto the count too), Mercury's the 3:2 lock on its orbital period.
15
24
  *
16
25
  * Type classification (the survey's measured taxonomy):
17
26
  * - Type I (mercury, venus): peri = a·e_real·100, elip = peri/2
@@ -40,7 +49,8 @@
40
49
  * @typedef {{
41
50
  * key: string,
42
51
  * type?: string,
43
- * solarYearInput: number,
52
+ * periodDays: number,
53
+ * semiMajorAxisAu?: number,
44
54
  * orbitalEccentricityBase?: number,
45
55
  * longitudePerihelion?: number,
46
56
  * ascendingNode?: number,
@@ -50,19 +60,19 @@
50
60
  */
51
61
 
52
62
  /**
53
- * @param {PlanetGeometryBody} body
63
+ * @param {PlanetGeometryBody} body — `periodDays` the body's sidereal orbital
64
+ * period in SI days; `semiMajorAxisAu` the chain's J2000 a where a chain
65
+ * exists (else Kepler's a from the period, in the scene's solar-year units)
54
66
  * @param {{
55
- * holisticYears: number,
56
67
  * meanSolarYearDays: number,
57
68
  * currentAUDistanceKm: number,
58
69
  * earthEccentricityJ2000: number,
59
70
  * earthPerihelionLongitudeJ2000Deg: number,
60
- * }} env — the engine's J2000 values (browser passes its live globals at
61
- * load time, preserving its original initial-derivation semantics; the
62
- * epoch machinery that later mutates the browser's `let` aliases is
63
- * untouched by this layer).
71
+ * }} env — the engine's J2000 values; `meanSolarYearDays` is the scene's
72
+ * year unit (`pos` counts mean solar years), so `periodYears` is the period
73
+ * in that unit, the scaffold's `speed` = 2π/periodYears.
64
74
  * @returns {{
65
- * solarYearCount: number, orbitDistance: number, periodYears: number,
75
+ * orbitDistance: number, periodYears: number, periodDays: number,
66
76
  * realOrbitalEccentricity: (number | undefined),
67
77
  * elipticOrbit: (number | undefined), perihelionDistance: (number | undefined),
68
78
  * speedKmh: number, rotationPeriodHours: (number | undefined),
@@ -70,17 +80,18 @@
70
80
  * }}
71
81
  */
72
82
  function derivePlanetGeometry(body, env) {
73
- const { key, type, solarYearInput, orbitalEccentricityBase: base,
83
+ const { key, type, periodDays, semiMajorAxisAu, orbitalEccentricityBase: base,
74
84
  longitudePerihelion, ascendingNode, rotationPeriodDays, orbitDistanceOverride } = body;
75
- const { holisticYears: H, meanSolarYearDays: mSY, currentAUDistanceKm: AU,
85
+ const { meanSolarYearDays: mSY, currentAUDistanceKm: AU,
76
86
  earthEccentricityJ2000, earthPerihelionLongitudeJ2000Deg } = env;
77
87
 
78
- const solarYearCount = Math.round((H * mSY) / solarYearInput);
88
+ const periodYears = periodDays / mSY; // in the scene's year unit (mean solar years)
79
89
  const orbitDistance = orbitDistanceOverride !== undefined
80
90
  ? orbitDistanceOverride
81
- : ((H / solarYearCount) ** 2) ** (1 / 3);
82
- const periodYears = H / solarYearCount;
83
- const speedKmh = (orbitDistance * AU * Math.PI * 2) / (mSY * (H / solarYearCount)) / 24;
91
+ : semiMajorAxisAu !== undefined
92
+ ? semiMajorAxisAu
93
+ : (periodYears ** 2) ** (1 / 3);
94
+ const speedKmh = (orbitDistance * AU * Math.PI * 2) / periodDays / 24;
84
95
 
85
96
  /** @type {number | undefined} */
86
97
  let realOrbitalEccentricity;
@@ -127,19 +138,37 @@ function derivePlanetGeometry(body, env) {
127
138
  /** @type {number | undefined} */
128
139
  let rotationPeriodHours;
129
140
  if (key === 'mercury') {
130
- // 3:2 spin-orbit lock — period from the orbit count itself.
131
- rotationPeriodHours = 24 * (mSY * H) / (solarYearCount * 3 / 2);
141
+ // 3:2 spin-orbit lock — three sidereal rotations per two orbits.
142
+ rotationPeriodHours = 24 * periodDays / (3 / 2);
132
143
  } else if (rotationPeriodDays !== undefined) {
133
- rotationPeriodHours = 24 * (mSY * H) / Math.round((mSY * H) / rotationPeriodDays);
144
+ rotationPeriodHours = 24 * rotationPeriodDays;
134
145
  }
135
146
 
136
147
  const lowestPoint = ascendingNode !== undefined ? 180 - ascendingNode : undefined;
137
148
 
138
149
  return {
139
- solarYearCount, orbitDistance, periodYears, realOrbitalEccentricity,
150
+ orbitDistance, periodYears, periodDays, realOrbitalEccentricity,
140
151
  elipticOrbit, perihelionDistance, speedKmh, rotationPeriodHours,
141
152
  eccentricityPerihelion, lowestPoint,
142
153
  };
143
154
  }
144
155
 
145
- module.exports = { derivePlanetGeometry };
156
+ /**
157
+ * The scaffold's orbit inputs for one body — ONE home for the rule (plan 09
158
+ * step 7b): where the governed engine-D chain artifact has the body, the
159
+ * chain's J2000 semi-major axis and its fitted era-window mean motion (deg
160
+ * per Julian year → the period in SI days); otherwise the body's observed
161
+ * period input (the no-chain bodies Pluto, Halley, Eros, Ceres).
162
+ * @param {string} key
163
+ * @param {any} chainArtifact the CHAIN_ARTIFACT (or the governed JSON it embeds)
164
+ * @param {number} fallbackPeriodDays the observed period input, SI days
165
+ * @returns {{ periodDays: number, semiMajorAxisAu: (number | undefined) }}
166
+ */
167
+ function scaffoldOrbitInputs(key, chainArtifact, fallbackPeriodDays) {
168
+ const w = chainArtifact && chainArtifact.windowElementRates && chainArtifact.windowElementRates[key];
169
+ const a = chainArtifact && chainArtifact.j2000AnchorElements && chainArtifact.j2000AnchorElements[key];
170
+ if (w && a) return { periodDays: 360 / w.meanMotionDegPerYr * 365.25, semiMajorAxisAu: a.aAU };
171
+ return { periodDays: fallbackPeriodDays, semiMajorAxisAu: undefined };
172
+ }
173
+
174
+ module.exports = { derivePlanetGeometry, scaffoldOrbitInputs };
@@ -31,12 +31,12 @@
31
31
 
32
32
  'use strict';
33
33
 
34
- const { derivePlanetGeometry } = require('./geometry.cjs');
34
+ const { derivePlanetGeometry, scaffoldOrbitInputs } = require('./geometry.cjs');
35
35
 
36
36
  /**
37
37
  * @typedef {Object} PlanetModelBody
38
38
  * @property {string} [type] - geometry type branch ('I' | 'II' | 'III')
39
- * @property {number} solarYearInput
39
+ * @property {number} solarYearInput - the observed sidereal period input, SI days (the scaffold period of the no-chain bodies; the chain planets ride the artifact's elements)
40
40
  * @property {number} [invPlaneInclinationJ2000]
41
41
  * @property {number} [longitudePerihelion]
42
42
  * @property {number} [wobblePeriodYears] - carriers: the chain's g-mode beat (input since Phase 7 commit 2)
@@ -52,7 +52,7 @@ const { derivePlanetGeometry } = require('./geometry.cjs');
52
52
 
53
53
  /**
54
54
  * @typedef {Object} PlanetModelEnv
55
- * @property {number} holisticYears
55
+ * @property {any} [chainArtifact] - the governed engine-D chain artifact (CHAIN_ARTIFACT): the seven chain planets' scaffold a and period ride its J2000 elements (plan 09 step 7b)
56
56
  * @property {number} meanSolarYearDays
57
57
  * @property {number} balancedYear
58
58
  * @property {number} systemResetN
@@ -84,7 +84,6 @@ function createPlanetModel(env, bodies) {
84
84
  // from env.calibration) went with the inclination law.
85
85
 
86
86
  const geomEnv = {
87
- holisticYears: env.holisticYears,
88
87
  meanSolarYearDays: env.meanSolarYearDays,
89
88
  currentAUDistanceKm: env.currentAUDistanceKm,
90
89
  earthEccentricityJ2000: env.earthEccentricityJ2000,
@@ -114,7 +113,8 @@ function createPlanetModel(env, bodies) {
114
113
 
115
114
  rec.geometry = derivePlanetGeometry({
116
115
  key, type: b.type,
117
- solarYearInput: b.solarYearInput,
116
+ // plan 09 step 7b: the chain's J2000 elements where the artifact has the body, else the observed period input
117
+ ...scaffoldOrbitInputs(key, env.chainArtifact, b.solarYearInput),
118
118
  orbitalEccentricityBase: b.orbitalEccentricityBase !== undefined
119
119
  ? b.orbitalEccentricityBase : b.orbitalEccentricityJ2000,
120
120
  longitudePerihelion: b.longitudePerihelion,
@@ -5,7 +5,6 @@ export type PeriodSecondsAtAge = (tMa: number) => (number | null);
5
5
  /**
6
6
  * @param {{
7
7
  * ageAnchorYear: number,
8
- * tropicalYearSecondsAtAge: (tMa: number) => (number | null),
9
8
  * tropicalYearJ2000Seconds: number,
10
9
  * isDeepTime: () => boolean,
11
10
  * gridMinYear?: number,
@@ -15,12 +14,18 @@ export type PeriodSecondsAtAge = (tMa: number) => (number | null);
15
14
  * maxCacheEntries?: number,
16
15
  * }} deps — ageAnchorYear is the year whose age is 0 in the period
17
16
  * functions' t_Ma coordinate (startmodelYear = 2000.5, the certified
18
- * convention); tropicalYearJ2000Seconds feeds the snapshot branch;
17
+ * convention); tropicalYearJ2000Seconds is the length of ONE tick of the
18
+ * year axis the integrator is fed — the linear SI-year label, each tick
19
+ * exactly one J2000 tropical year of seconds — so it is the integrand's
20
+ * weight in BOTH branches (plan 09 step 7c′: the deep branch had weighted
21
+ * each tick by the tropical year OF DATE, adding that year's deep-time
22
+ * drift to every lunar count — ~5° of Moon at ±100 kyr, ~1.3 orbits at
23
+ * 1 Ma — although the tick itself never changes length; the owner's call:
24
+ * a plain correctness fix, the tick already is an SI tick);
19
25
  * isDeepTime is read PER CALL so the engine's runtime toggle works.
20
26
  */
21
- export function createChainCycleIntegrator({ ageAnchorYear, tropicalYearSecondsAtAge, tropicalYearJ2000Seconds, isDeepTime, gridMinYear, gridMaxYear, gridStepYears, gridAnchorYear, maxCacheEntries, }: {
27
+ export function createChainCycleIntegrator({ ageAnchorYear, tropicalYearJ2000Seconds, isDeepTime, gridMinYear, gridMaxYear, gridStepYears, gridAnchorYear, maxCacheEntries, }: {
22
28
  ageAnchorYear: number;
23
- tropicalYearSecondsAtAge: (tMa: number) => (number | null);
24
29
  tropicalYearJ2000Seconds: number;
25
30
  isDeepTime: () => boolean;
26
31
  gridMinYear?: number;
@@ -2,73 +2,10 @@
2
2
  // The fitted coefficients' shapes for TypeScript consumers (§2g); values live
3
3
  // in coefficients.js, emitted VERBATIM from fitted-coefficients.json.
4
4
 
5
- export declare const COEFFICIENTS_HASH: "82c86b078b32fff8";
5
+ export declare const COEFFICIENTS_HASH: "91e2d041c7b6e038";
6
6
 
7
7
  export declare const FITTED_COEFFICIENTS: {
8
- readonly ANOMALISTIC_YEAR_HARMONICS: Array<[number, number, number]>;
9
8
  readonly BALANCE_PRESETS: Array<Array<number | string>>;
10
- readonly CARDINAL_POINT_ANCHORS: {
11
- "SS": number;
12
- "WS": number;
13
- "VE": number;
14
- "AE": number;
15
- };
16
- readonly CARDINAL_POINT_ANCHORS_ADJUSTED: {
17
- "SS": number;
18
- "WS": number;
19
- "VE": number;
20
- "AE": number;
21
- };
22
- readonly CARDINAL_POINT_DERIVED: {
23
- "lincoef": number;
24
- "h0": number;
25
- "h1": number;
26
- "eccOrderDivisors": [number, number];
27
- "note": string;
28
- };
29
- readonly CARDINAL_POINT_ECC_TERMS: {
30
- "SS": Array<{
31
- "order": number;
32
- "sin": number;
33
- "cos": number;
34
- }>;
35
- "WS": Array<{
36
- "order": number;
37
- "sin": number;
38
- "cos": number;
39
- }>;
40
- "VE": Array<{
41
- "order": number;
42
- "sin": number;
43
- "cos": number;
44
- }>;
45
- "AE": Array<{
46
- "order": number;
47
- "sin": number;
48
- "cos": number;
49
- }>;
50
- };
51
- readonly CARDINAL_POINT_HARMONICS: {
52
- "SS": Array<[number, number, number]>;
53
- "WS": Array<[number, number, number]>;
54
- "VE": Array<[number, number, number]>;
55
- "AE": Array<[number, number, number]>;
56
- };
57
- readonly CARDINAL_POINT_JOINT_TERMS: {
58
- "quadratureDeg": {
59
- "SS": number;
60
- "AE": number;
61
- "WS": number;
62
- "VE": number;
63
- };
64
- "terms": Array<{
65
- "order": number;
66
- "div": number;
67
- "sin": number;
68
- "cos": number;
69
- }>;
70
- "note": string;
71
- };
72
9
  readonly CLIMATE_FORMULA_COEFFS: {
73
10
  "config": {
74
11
  "L1_lines": Array<{
@@ -303,105 +240,105 @@ export declare const FITTED_COEFFICIENTS: {
303
240
  "delta_l3": number;
304
241
  };
305
242
  "carbon_amplification_ratios": {
306
- "19.0014": {
243
+ "19.0015": {
307
244
  "period_kyr": number;
308
245
  "lr04_post_mpt_amp": number;
309
246
  "epica_amp": number;
310
247
  "ratio": number;
311
248
  "label": string;
312
249
  };
313
- "19.1554": {
250
+ "19.1555": {
314
251
  "period_kyr": number;
315
252
  "lr04_post_mpt_amp": number;
316
253
  "epica_amp": number;
317
254
  "ratio": number;
318
255
  "label": string;
319
256
  };
320
- "22.4452": {
257
+ "22.4453": {
321
258
  "period_kyr": number;
322
259
  "lr04_post_mpt_amp": number;
323
260
  "epica_amp": number;
324
261
  "ratio": number;
325
262
  "label": string;
326
263
  };
327
- "23.1931": {
264
+ "23.1933": {
328
265
  "period_kyr": number;
329
266
  "lr04_post_mpt_amp": number;
330
267
  "epica_amp": number;
331
268
  "ratio": number;
332
269
  "label": string;
333
270
  };
334
- "23.7599": {
271
+ "23.7601": {
335
272
  "period_kyr": number;
336
273
  "lr04_post_mpt_amp": number;
337
274
  "epica_amp": number;
338
275
  "ratio": number;
339
276
  "label": string;
340
277
  };
341
- "27.2689": {
278
+ "27.2691": {
342
279
  "period_kyr": number;
343
280
  "lr04_post_mpt_amp": number;
344
281
  "epica_amp": number;
345
282
  "ratio": number;
346
283
  "label": string;
347
284
  };
348
- "28.8424": {
285
+ "28.8426": {
349
286
  "period_kyr": number;
350
287
  "lr04_post_mpt_amp": number;
351
288
  "epica_amp": number;
352
289
  "ratio": number;
353
290
  "label": string;
354
291
  };
355
- "29.0047": {
292
+ "29.0050": {
356
293
  "period_kyr": number;
357
294
  "lr04_post_mpt_amp": number;
358
295
  "epica_amp": number;
359
296
  "ratio": number;
360
297
  "label": string;
361
298
  };
362
- "29.6172": {
299
+ "29.6174": {
363
300
  "period_kyr": number;
364
301
  "lr04_post_mpt_amp": number;
365
302
  "epica_amp": number;
366
303
  "ratio": number;
367
304
  "label": string;
368
305
  };
369
- "29.8091": {
306
+ "29.8094": {
370
307
  "period_kyr": number;
371
308
  "lr04_post_mpt_amp": number;
372
309
  "epica_amp": number;
373
310
  "ratio": number;
374
311
  "label": string;
375
312
  };
376
- "39.5560": {
313
+ "39.5564": {
377
314
  "period_kyr": number;
378
315
  "lr04_post_mpt_amp": number;
379
316
  "epica_amp": number;
380
317
  "ratio": number;
381
318
  "label": string;
382
319
  };
383
- "40.2292": {
320
+ "40.2297": {
384
321
  "period_kyr": number;
385
322
  "lr04_post_mpt_amp": number;
386
323
  "epica_amp": number;
387
324
  "ratio": number;
388
325
  "label": string;
389
326
  };
390
- "40.9239": {
327
+ "40.9244": {
391
328
  "period_kyr": number;
392
329
  "lr04_post_mpt_amp": number;
393
330
  "epica_amp": number;
394
331
  "ratio": number;
395
332
  "label": string;
396
333
  };
397
- "41.6445": {
334
+ "41.6450": {
398
335
  "period_kyr": number;
399
336
  "lr04_post_mpt_amp": number;
400
337
  "epica_amp": number;
401
338
  "ratio": number;
402
339
  "label": string;
403
340
  };
404
- "53.6174": {
341
+ "53.6182": {
405
342
  "period_kyr": number;
406
343
  "lr04_post_mpt_amp": number;
407
344
  "epica_amp": number;
@@ -634,17 +571,4 @@ export declare const FITTED_COEFFICIENTS: {
634
571
  };
635
572
  readonly MEEUS_LATITUDE_TERMS: Array<number[]>;
636
573
  readonly MEEUS_LONGITUDE_TERMS: Array<number[]>;
637
- readonly PERI_HARMONICS_RAW: Array<[number, number, number]>;
638
- readonly PERI_OFFSET: number;
639
- readonly RA_DAY_OFFSET_MS: {
640
- "mean": number;
641
- "terms": Array<[number, number, number]>;
642
- "note": string;
643
- };
644
- readonly SIDEREAL_YEAR_HARMONICS: Array<[number, number, number]>;
645
- readonly SOLSTICE_OBLIQUITY_HARMONICS: Array<[number, number, number]>;
646
- readonly SOLSTICE_OBLIQUITY_MEAN_FITTED: number;
647
- readonly SUN_LONGITUDE_HARMONICS: Array<[number, number, number]>;
648
- readonly SUN_LONGITUDE_MEAN: number;
649
- readonly TROPICAL_YEAR_HARMONICS: Array<[number, number, number]>;
650
574
  };
@@ -2,14 +2,14 @@
2
2
  // Gives the TypeScript website full type safety at the boundary (§2g) while
3
3
  // packages/physics stays JavaScript.
4
4
 
5
- export declare const CONSTANTS_HASH: "6c2beb70bb3d5000";
5
+ export declare const CONSTANTS_HASH: "c161ec19e5984b9e";
6
6
 
7
7
  export declare const MODEL_VERSION: string;
8
8
 
9
9
  export declare const PREPRINT_DOI: string;
10
10
 
11
11
  export declare const DEFAULT_CONSTANTS: {
12
- readonly hash: "6c2beb70bb3d5000";
12
+ readonly hash: "c161ec19e5984b9e";
13
13
  readonly additionalBodies: {
14
14
  "pluto": {
15
15
  "name": string;
@@ -148,6 +148,14 @@ export declare const DEFAULT_CONSTANTS: {
148
148
  "earthInvPlaneInclinationAmplitude": number;
149
149
  "eccentricityBase": number;
150
150
  "eccentricityAmplitude": number;
151
+ "kDeviceInclinationPhaseJ2000Deg": number;
152
+ "kDeviceWheelPeriodYears": {
153
+ "3": number;
154
+ "5": number;
155
+ "8": number;
156
+ "13": number;
157
+ "16": number;
158
+ };
151
159
  "kDeviceWheelPhaseAtJ2000Cycles": number;
152
160
  };
153
161
  readonly earthOrbital: {
@@ -156,13 +164,13 @@ export declare const DEFAULT_CONSTANTS: {
156
164
  "juneSolstice2000_JD": number;
157
165
  "obliquityJ2000_deg": number;
158
166
  "obliquityRate_arcsecPerCentury": number;
167
+ "generalPrecessionJ2000_arcsecPerYr": number;
159
168
  "earthEccentricityJ2000": number;
160
169
  "earthEccentricityDotJ2000": number;
161
170
  "earthEccentricityDotDotJ2000": number;
162
171
  "earthPerihelionLongitudeJ2000": number;
163
172
  "sunMeanLongitudeJ2000_deg": number;
164
173
  "earthAscendingNodeInvPlane": number;
165
- "earthInclinationCycleAnchor": number;
166
174
  "perihelionPassageJ2000_JD": number;
167
175
  "earthInclinationJ2000_deg": number;
168
176
  "earthInclinationRate_arcsecPerCentury": number;
@@ -170,9 +178,6 @@ export declare const DEFAULT_CONSTANTS: {
170
178
  "sunTilt": number;
171
179
  };
172
180
  readonly foundational: {
173
- "holisticyearLength": number;
174
- "stepYears": number;
175
- "inputmeanlengthsolaryearindays": number;
176
181
  "startmodelJD": number;
177
182
  "startmodelYear": number;
178
183
  "correctionDays": number;
@@ -480,7 +485,6 @@ export declare const DEFAULT_CONSTANTS: {
480
485
  "type": string;
481
486
  "mirrorPair": string;
482
487
  "ascendingNodeInvPlane": number;
483
- "ascendingNodeCyclesIn8H": number;
484
488
  };
485
489
  "venus": {
486
490
  "name": string;
@@ -490,7 +494,6 @@ export declare const DEFAULT_CONSTANTS: {
490
494
  "type": string;
491
495
  "mirrorPair": string;
492
496
  "ascendingNodeInvPlane": number;
493
- "ascendingNodeCyclesIn8H": number;
494
497
  };
495
498
  "mars": {
496
499
  "name": string;
@@ -500,7 +503,6 @@ export declare const DEFAULT_CONSTANTS: {
500
503
  "type": string;
501
504
  "mirrorPair": string;
502
505
  "ascendingNodeInvPlane": number;
503
- "ascendingNodeCyclesIn8H": number;
504
506
  };
505
507
  "jupiter": {
506
508
  "name": string;
@@ -510,7 +512,6 @@ export declare const DEFAULT_CONSTANTS: {
510
512
  "type": string;
511
513
  "mirrorPair": string;
512
514
  "ascendingNodeInvPlane": number;
513
- "ascendingNodeCyclesIn8H": number;
514
515
  };
515
516
  "saturn": {
516
517
  "name": string;
@@ -520,7 +521,6 @@ export declare const DEFAULT_CONSTANTS: {
520
521
  "type": string;
521
522
  "mirrorPair": string;
522
523
  "ascendingNodeInvPlane": number;
523
- "ascendingNodeCyclesIn8H": number;
524
524
  };
525
525
  "uranus": {
526
526
  "name": string;
@@ -530,7 +530,6 @@ export declare const DEFAULT_CONSTANTS: {
530
530
  "type": string;
531
531
  "mirrorPair": string;
532
532
  "ascendingNodeInvPlane": number;
533
- "ascendingNodeCyclesIn8H": number;
534
533
  };
535
534
  "neptune": {
536
535
  "name": string;
@@ -540,7 +539,6 @@ export declare const DEFAULT_CONSTANTS: {
540
539
  "type": string;
541
540
  "mirrorPair": string;
542
541
  "ascendingNodeInvPlane": number;
543
- "ascendingNodeCyclesIn8H": number;
544
542
  };
545
543
  };
546
544
  readonly timeReference: {
@@ -556,10 +554,7 @@ export declare const DEFAULT_CONSTANTS: {
556
554
  "tropicalYearSS": number;
557
555
  "tropicalYearAE": number;
558
556
  "tropicalYearWS": number;
559
- "tropicalYearMean": number;
560
- "anomalisticYear": number;
561
557
  "siderealYear": number;
562
- "iauPrecessionJ2000": number;
563
558
  "tropicalYearRateSecPerCentury": number;
564
559
  "solarDay": number;
565
560
  "siderealDay": number;
@@ -716,6 +711,7 @@ export declare const REFERENCE_DATA: {
716
711
  "meeusPeriLong2000AD": number;
717
712
  "meeusPeriLong2500AD": number;
718
713
  "meeusPeriLong3000AD": number;
714
+ "simon1994AnomalisticYearDays": number;
719
715
  "mainstreamAxialPrecKyr": number;
720
716
  "mainstreamPeriPrecKyr": number;
721
717
  "mainstreamObliqCycleKyr": number;
@@ -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
  };
@@ -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