@essrt/physics 21.0.0 → 22.0.1

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.
@@ -7,8 +7,9 @@
7
7
  * inputs the chain's g-mode beat (wobble) and the spin channel's
8
8
  * derived J2000 obliquity, carried on the record since plan 06
9
9
  * Phase 7 commit 2
10
- * geometry (the type-branched ellipse family on the OBSERVED J2000
11
- * eccentricity; minor bodies use their record's base)
10
+ * geometry (the ellipse family — geometry.cjs's own taxonomy since
11
+ * plan 11 step 3 — on the OBSERVED J2000 eccentricity; minor
12
+ * bodies use their record's base)
12
13
  *
13
14
  * The ψ and K amplitude laws that opened this chain (ψ constant →
14
15
  * inclination amplitude/mean; K constant → eccentricity amplitude/base/
@@ -35,7 +36,6 @@ const { derivePlanetGeometry, scaffoldOrbitInputs } = require('./geometry.cjs');
35
36
 
36
37
  /**
37
38
  * @typedef {Object} PlanetModelBody
38
- * @property {string} [type] - geometry type branch ('I' | 'II' | 'III')
39
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]
@@ -108,11 +108,12 @@ function createPlanetModel(env, bodies) {
108
108
  // eccentricityPhaseJ2000Deg stood here. With the law gone, the ellipse
109
109
  // geometry below reads the OBSERVED J2000 eccentricity where it used to
110
110
  // read the law's System-Reset base — the observation the chain is
111
- // anchored on, not a construction. The stored base survives only for the
112
- // additional bodies, which carry theirs in model-parameters.json.
111
+ // anchored on, not a construction. The additional bodies' base is their
112
+ // observed J2000 eccentricity too (astro-reference additionalBodiesReference;
113
+ // plan 11 step 2 deleted the stored copy).
113
114
 
114
115
  rec.geometry = derivePlanetGeometry({
115
- key, type: b.type,
116
+ key, // the ellipse family is the law's own taxonomy (geometry.cjs SCAFFOLD_ELLIPSE_FAMILY, plan 11 step 3)
116
117
  // plan 09 step 7b: the chain's J2000 elements where the artifact has the body, else the observed period input
117
118
  ...scaffoldOrbitInputs(key, env.chainArtifact, b.solarYearInput),
118
119
  orbitalEccentricityBase: b.orbitalEccentricityBase !== undefined
@@ -46,6 +46,16 @@
46
46
  * `computeObliquityJ2000Deg`), and — through the chain's own g-mode beat
47
47
  * (keplerian-chain `computeSecularShape`) — the "wobble period" the K
48
48
  * device beat from its integer axial and obliquity fractions.
49
+ *
50
+ * Since plan 11 step 3 the channel also serves the POLE of date itself —
51
+ * `spinAxisEclipticJ2000AtYear` (the integrated ŝ(t), angular-momentum
52
+ * sense) beside `orbitNormalEclipticJ2000AtYear` (n̂(t)) — so both scene
53
+ * twins place each planet's rotation axis in world through the frame bridge
54
+ * exactly as Earth's axis is placed (R4): the pole's azimuth used to ride the
55
+ * retired scaffold's start angle (one turn of the pole per orbit), only its
56
+ * tilt magnitude was read from here. Mercury's Cassini-locked pole is the
57
+ * J2000 pole carried with its orbit normal (the minimal rotation n̂₀ → n̂(t)),
58
+ * the lock's constant obliquity.
49
59
  */
50
60
 
51
61
  'use strict';
@@ -124,6 +134,19 @@ const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
124
134
  const unit = (a) => { const r = Math.hypot(a[0], a[1], a[2]); return [a[0] / r, a[1] / r, a[2] / r]; };
125
135
  /** @param {number[]} a @param {number[]} b */
126
136
  const angleDeg = (a, b) => Math.acos(Math.max(-1, Math.min(1, dot(a, b)))) * R2D;
137
+ /**
138
+ * v carried by the minimal rotation that takes unit a onto unit b (Rodrigues
139
+ * about a × b); v itself when a and b coincide.
140
+ * @param {number[]} a @param {number[]} b @param {number[]} v
141
+ */
142
+ const rotateAligned = (a, b, v) => {
143
+ const k = cross(a, b);
144
+ const s = Math.hypot(k[0], k[1], k[2]), c = dot(a, b);
145
+ if (s < 1e-15) return v.slice();
146
+ const kh = [k[0] / s, k[1] / s, k[2] / s];
147
+ const kv = cross(kh, v), kd = dot(kh, v) * (1 - c);
148
+ return [v[0] * c + kv[0] * s + kh[0] * kd, v[1] * c + kv[1] * s + kh[1] * kd, v[2] * c + kv[2] * s + kh[2] * kd];
149
+ };
127
150
 
128
151
  /**
129
152
  * The IAU pole (ICRF equatorial RA/Dec) as an ecliptic-J2000 unit vector.
@@ -272,9 +295,9 @@ function createPlanetSpinChannel(deps) {
272
295
  const stepYr = deps.stepYr ?? (cassiniLocked ? STEP_MAX_YR
273
296
  : Math.min(STEP_MAX_YR, Math.max(STEP_MIN_YR, axialPrecessionPeriodYearsJ2000 / STEPS_PER_PRECESSION_PERIOD)));
274
297
  // append-only trajectories from J2000, one per direction: sample i sits at t = sign · i · step
275
- /** @typedef {{ eps: number[], last: number[] }} Track */
298
+ /** @typedef {{ eps: number[], sv: number[][], last: number[] }} Track — the obliquity and the unit spin vector per sample */
276
299
  /** @returns {Track} */
277
- const mkTrack = () => ({ eps: [obliquityJ2000], last: s0.slice() });
300
+ const mkTrack = () => ({ eps: [obliquityJ2000], sv: [s0.slice()], last: s0.slice() });
278
301
  const fwd = mkTrack(), bwd = mkTrack();
279
302
  /** @param {Track} tr @param {number} sign @param {number} count */
280
303
  const grow = (tr, sign, count) => {
@@ -284,6 +307,7 @@ function createPlanetSpinChannel(deps) {
284
307
  const h = sign * stepYr;
285
308
  const s = rk4(tr.last, t, h);
286
309
  tr.eps.push(angleDeg(s, orbitNormalAt(t + h)));
310
+ tr.sv.push(s);
287
311
  tr.last = s;
288
312
  }
289
313
  };
@@ -333,6 +357,24 @@ function createPlanetSpinChannel(deps) {
333
357
  }
334
358
  return { minDeg: mn, meanDeg: sum / cnt, maxDeg: mx };
335
359
  };
360
+ /** the planet's orbit normal of date n̂(t), a unit vector in the J2000 ecliptic (the ζ table at the chain's anchor) @param {number} year */
361
+ const orbitNormalEclipticJ2000AtYear = (year) => orbitNormalAt(year - 2000);
362
+ /**
363
+ * the spin axis of date ŝ(t), a unit vector in the J2000 ecliptic in the
364
+ * angular-momentum sense (Venus and Uranus point south of their orbits):
365
+ * the integrated pole, interpolated linearly between the track's samples
366
+ * and renormalized (≤ 1.2° of pole motion per sample — the chord error is
367
+ * arcsecond-class, below what any renderer resolves); Mercury (Cassini
368
+ * lock) carries the J2000 pole with its orbit normal; null beyond ±10 Myr
369
+ * @param {number} year
370
+ */
371
+ const spinAxisEclipticJ2000AtYear = (year) => {
372
+ if (cassiniLocked) return rotateAligned(n0, orbitNormalAt(year - 2000), s0);
373
+ const b = bracket(year - 2000);
374
+ if (!b) return null;
375
+ const a = b.tr.sv[b.i], c = b.tr.sv[b.i + 1];
376
+ return unit([a[0] + b.f * (c[0] - a[0]), a[1] + b.f * (c[1] - a[1]), a[2] + b.f * (c[2] - a[2])]);
377
+ };
336
378
 
337
379
  return Object.freeze({
338
380
  key,
@@ -350,6 +392,8 @@ function createPlanetSpinChannel(deps) {
350
392
  obliquityDegAtYear,
351
393
  spinPrecessionRateArcsecPerYrAtYear,
352
394
  obliquityEnvelopeDeg,
395
+ spinAxisEclipticJ2000AtYear,
396
+ orbitNormalEclipticJ2000AtYear,
353
397
  stepYr,
354
398
  maxSpanYr: MAX_SPAN_YR,
355
399
  });
@@ -73,7 +73,9 @@ export function laggedL1Terms(l1Terms: Array<{
73
73
  * j2RateJ2000PerYr?: number,
74
74
  * j2J2000?: number,
75
75
  * }} cfg - relaxationKyr, alphaGiaRateJ2000PerYr and j2RateJ2000PerYr are
76
- * model-parameters deepTime constants; alphaJ2000 the IERS
76
+ * assembled deepTime block (DEFAULT_CONSTANTS.deepTime: τ the banked record
77
+ * data/deep-time-fitted.json, the rate derived from astro-reference
78
+ * giaCoxChaoPeltier — plan 11 step 1); alphaJ2000 the IERS
77
79
  * moment-of-inertia factor; j2J2000 Earth's J₂ (astro-reference)
78
80
  * @returns {{
79
81
  * alphaAt: (year: number) => number,
@@ -1,6 +1,6 @@
1
1
  // GENERATED — do not edit. Regenerate: node tools/constants/generate.mjs --write
2
2
  // The fitted coefficients' shapes for TypeScript consumers (§2g); values live
3
- // in coefficients.js, emitted VERBATIM from fitted-coefficients.json.
3
+ // in coefficients.js, emitted VERBATIM from the fit artifacts under data/.
4
4
 
5
5
  export declare const COEFFICIENTS_HASH: "91e2d041c7b6e038";
6
6
 
@@ -2,56 +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: "c161ec19e5984b9e";
5
+ export declare const CONSTANTS_HASH: "f4f43386df2781b8";
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: "c161ec19e5984b9e";
13
- readonly additionalBodies: {
14
- "pluto": {
15
- "name": string;
16
- "orbitalEccentricityBase": number;
17
- "type": string;
18
- "angleCorrection": number;
19
- "startpos": number;
20
- "ascendingNodeInvPlane": number;
21
- "invPlaneInclinationMean": number;
22
- "invPlaneInclinationAmplitude": number;
23
- };
24
- "halleys": {
25
- "name": string;
26
- "orbitalEccentricityBase": number;
27
- "type": string;
28
- "angleCorrection": number;
29
- "startpos": number;
30
- "ascendingNodeInvPlane": number;
31
- "invPlaneInclinationMean": number;
32
- "invPlaneInclinationAmplitude": number;
33
- };
34
- "eros": {
35
- "name": string;
36
- "orbitalEccentricityBase": number;
37
- "type": string;
38
- "angleCorrection": number;
39
- "startpos": number;
40
- "ascendingNodeInvPlane": number;
41
- "invPlaneInclinationMean": number;
42
- "invPlaneInclinationAmplitude": number;
43
- };
44
- "ceres": {
45
- "name": string;
46
- "orbitalEccentricityBase": number;
47
- "orbitDistanceOverride": number;
48
- "angleCorrection": number;
49
- "startpos": number;
50
- "ascendingNodeInvPlane": number;
51
- "invPlaneInclinationMean": number;
52
- "invPlaneInclinationAmplitude": number;
53
- };
54
- };
12
+ readonly hash: "f4f43386df2781b8";
55
13
  readonly additionalBodiesReference: {
56
14
  "pluto": {
57
15
  "solarYearInput": number;
@@ -64,6 +22,7 @@ export declare const DEFAULT_CONSTANTS: {
64
22
  "meanAnomaly": number;
65
23
  "trueAnomaly": number;
66
24
  "rotationPeriodDays": number;
25
+ "ascendingNodeInvPlaneClosedForm": number;
67
26
  };
68
27
  "halleys": {
69
28
  "solarYearInput": number;
@@ -143,21 +102,6 @@ export declare const DEFAULT_CONSTANTS: {
143
102
  "thermalPumpFactor": number;
144
103
  };
145
104
  };
146
- readonly earth: {
147
- "earthtiltMean": number;
148
- "earthInvPlaneInclinationAmplitude": number;
149
- "eccentricityBase": number;
150
- "eccentricityAmplitude": number;
151
- "kDeviceInclinationPhaseJ2000Deg": number;
152
- "kDeviceWheelPeriodYears": {
153
- "3": number;
154
- "5": number;
155
- "8": number;
156
- "13": number;
157
- "16": number;
158
- };
159
- "kDeviceWheelPhaseAtJ2000Cycles": number;
160
- };
161
105
  readonly earthOrbital: {
162
106
  "j2000EpochYear": number;
163
107
  "perihelionalignmentYear": number;
@@ -177,19 +121,9 @@ export declare const DEFAULT_CONSTANTS: {
177
121
  "deltaTStart": number;
178
122
  "sunTilt": number;
179
123
  };
180
- readonly foundational: {
181
- "startmodelJD": number;
182
- "startmodelYear": number;
183
- "correctionDays": number;
184
- "correctionSun": number;
185
- "startAngleModel": number;
186
- "useVariableSpeed": boolean;
187
- };
188
- readonly moon: {
189
- "moonStartposApsidal": number;
190
- "moonStartposNodal": number;
191
- "moonStartposMoon": number;
192
- "moonMeeusLpCorrection": number;
124
+ readonly giaCoxChaoPeltier: {
125
+ "dJ2DtPerYr": number;
126
+ "j2ToAlphaFactor": number;
193
127
  };
194
128
  readonly moonMeeus: {
195
129
  "elpW1T2Decomposition_arcsecPerCy2": {
@@ -216,21 +150,13 @@ export declare const DEFAULT_CONSTANTS: {
216
150
  "moonApsidalPrecessionDaysInputICRF": number;
217
151
  "moonNodalPrecessionDaysInputICRF": number;
218
152
  "moonDistance": number;
153
+ "moonRecessionAlpha1PerMa": number;
219
154
  "moonEclipticInclinationJ2000": number;
220
155
  "moonInclinationConstantBrownELP": number;
221
156
  "moonOrbitalEccentricityBase": number;
222
157
  "moonObliquityEclipticJ2000": number;
223
158
  "moonTilt": number;
224
159
  };
225
- readonly perihelionPassageRef: {
226
- "mercury": number;
227
- "venus": number;
228
- "mars": number;
229
- "jupiter": number;
230
- "saturn": number;
231
- "uranus": number;
232
- "neptune": number;
233
- };
234
160
  readonly physicalConstants: {
235
161
  "currentAUDistance": number;
236
162
  "G_CONSTANT": number;
@@ -295,6 +221,7 @@ export declare const DEFAULT_CONSTANTS: {
295
221
  "invPlaneInclinationJ2000": number;
296
222
  "meanAnomaly": number;
297
223
  "trueAnomaly": number;
224
+ "ascendingNodeInvPlaneClosedForm": number;
298
225
  };
299
226
  "venus": {
300
227
  "solarYearInput": number;
@@ -307,6 +234,7 @@ export declare const DEFAULT_CONSTANTS: {
307
234
  "meanAnomaly": number;
308
235
  "trueAnomaly": number;
309
236
  "rotationPeriodDays": number;
237
+ "ascendingNodeInvPlaneClosedForm": number;
310
238
  };
311
239
  "mars": {
312
240
  "solarYearInput": number;
@@ -319,6 +247,7 @@ export declare const DEFAULT_CONSTANTS: {
319
247
  "meanAnomaly": number;
320
248
  "trueAnomaly": number;
321
249
  "rotationPeriodDays": number;
250
+ "ascendingNodeInvPlaneClosedForm": number;
322
251
  };
323
252
  "jupiter": {
324
253
  "solarYearInput": number;
@@ -331,6 +260,7 @@ export declare const DEFAULT_CONSTANTS: {
331
260
  "meanAnomaly": number;
332
261
  "trueAnomaly": number;
333
262
  "rotationPeriodDays": number;
263
+ "ascendingNodeInvPlaneClosedForm": number;
334
264
  };
335
265
  "saturn": {
336
266
  "solarYearInput": number;
@@ -343,6 +273,7 @@ export declare const DEFAULT_CONSTANTS: {
343
273
  "meanAnomaly": number;
344
274
  "trueAnomaly": number;
345
275
  "rotationPeriodDays": number;
276
+ "ascendingNodeInvPlaneClosedForm": number;
346
277
  };
347
278
  "uranus": {
348
279
  "solarYearInput": number;
@@ -355,6 +286,7 @@ export declare const DEFAULT_CONSTANTS: {
355
286
  "meanAnomaly": number;
356
287
  "trueAnomaly": number;
357
288
  "rotationPeriodDays": number;
289
+ "ascendingNodeInvPlaneClosedForm": number;
358
290
  };
359
291
  "neptune": {
360
292
  "solarYearInput": number;
@@ -367,6 +299,7 @@ export declare const DEFAULT_CONSTANTS: {
367
299
  "meanAnomaly": number;
368
300
  "trueAnomaly": number;
369
301
  "rotationPeriodDays": number;
302
+ "ascendingNodeInvPlaneClosedForm": number;
370
303
  };
371
304
  };
372
305
  readonly planetSpinPhysical: {
@@ -476,72 +409,9 @@ export declare const DEFAULT_CONSTANTS: {
476
409
  }>;
477
410
  };
478
411
  };
479
- readonly planets: {
480
- "mercury": {
481
- "name": string;
482
- "eocFraction": number;
483
- "startpos": number;
484
- "angleCorrection": number;
485
- "type": string;
486
- "mirrorPair": string;
487
- "ascendingNodeInvPlane": number;
488
- };
489
- "venus": {
490
- "name": string;
491
- "eocFraction": number;
492
- "startpos": number;
493
- "angleCorrection": number;
494
- "type": string;
495
- "mirrorPair": string;
496
- "ascendingNodeInvPlane": number;
497
- };
498
- "mars": {
499
- "name": string;
500
- "eocFraction": number;
501
- "startpos": number;
502
- "angleCorrection": number;
503
- "type": string;
504
- "mirrorPair": string;
505
- "ascendingNodeInvPlane": number;
506
- };
507
- "jupiter": {
508
- "name": string;
509
- "eocFraction": number;
510
- "startpos": number;
511
- "angleCorrection": number;
512
- "type": string;
513
- "mirrorPair": string;
514
- "ascendingNodeInvPlane": number;
515
- };
516
- "saturn": {
517
- "name": string;
518
- "eocFraction": number;
519
- "startpos": number;
520
- "angleCorrection": number;
521
- "type": string;
522
- "mirrorPair": string;
523
- "ascendingNodeInvPlane": number;
524
- };
525
- "uranus": {
526
- "name": string;
527
- "eocFraction": number;
528
- "startpos": number;
529
- "angleCorrection": number;
530
- "type": string;
531
- "mirrorPair": string;
532
- "ascendingNodeInvPlane": number;
533
- };
534
- "neptune": {
535
- "name": string;
536
- "eocFraction": number;
537
- "startpos": number;
538
- "angleCorrection": number;
539
- "type": string;
540
- "mirrorPair": string;
541
- "ascendingNodeInvPlane": number;
542
- };
543
- };
544
412
  readonly timeReference: {
413
+ "sceneEpochJD": number;
414
+ "sceneEpochYear": number;
545
415
  "j2000JD": number;
546
416
  "julianCenturyDays": number;
547
417
  "gregorianStartJD": number;
@@ -598,10 +468,6 @@ export declare const REFERENCE_DATA: {
598
468
  "greatattractorDistance": number;
599
469
  "milkywaySpeed": number;
600
470
  };
601
- readonly giaCoxChaoPeltier: {
602
- "dJ2DtPerYr": number;
603
- "j2ToAlphaFactor": number;
604
- };
605
471
  readonly jplEclipticInclinationTrends: {
606
472
  "mercury": number;
607
473
  "venus": number;
@@ -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: the equinox along world +X. */
46
+ export const SCENE_EQUINOX_VIEW_AZIMUTH_DEG: 90;
package/types/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export { createDeepEccChannel } from "./moon/deep-ecc-channel.cjs";
15
15
  export { createDeepOrbitalHistory } from "./earth/deep-orbital-history.cjs";
16
16
  export { createSiderealYearChannel } from "./earth/sidereal-year-channel.cjs";
17
17
  export { createPlanetModel } from "./planets/model.cjs";
18
+ export { PLANET_DISPLAY_NAMES } from "./planets/display-names.cjs";
18
19
  export { createDeltaTCycles } from "./deltat/cycles.cjs";
19
20
  export { createDeepTimeLod } from "./deltat/deep-time.cjs";
20
21
  export { deltaTEspenakMeeusCanonSeconds } from "./deltat/historical.cjs";
@@ -56,7 +57,7 @@ import { REFERENCE_DATA } from './constants/index.js';
56
57
  import { assembleModel } from './model.js';
57
58
  export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA };
58
59
  export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from "./constants/index.js";
59
- export { computeEarthFrameOfDate, solveWheelAngleForLongitude } from "./earth/frame-of-date.cjs";
60
+ export { computeEarthFrameOfDate, solveWheelAngleForLongitude, computeSceneWorldFrameJ2000, SCENE_EQUINOX_VIEW_AZIMUTH_DEG } from "./earth/frame-of-date.cjs";
60
61
  export { derivePlanetGeometry, scaffoldOrbitInputs } from "./planets/geometry.cjs";
61
62
  export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, computeApsidalSecularDegPerYr, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from "./planets/keplerian-chain.cjs";
62
63
  export { computeEquatorNodeOriginSFrameDeg, convertNodeSFrameToEquatorOriginDeg } from "./planets/inv-plane-frame.cjs";
package/types/model.d.ts CHANGED
@@ -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
  }>;
@@ -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
  * },
@@ -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
  };
@@ -0,0 +1,2 @@
1
+ /** @type {Readonly<Record<string, string>>} */
2
+ export const PLANET_DISPLAY_NAMES: Readonly<Record<string, string>>;
@@ -1,6 +1,5 @@
1
1
  export type PlanetGeometryBody = {
2
2
  key: string;
3
- type?: string;
4
3
  periodDays: number;
5
4
  semiMajorAxisAu?: number;
6
5
  orbitalEccentricityBase?: number;
@@ -12,7 +11,6 @@ export type PlanetGeometryBody = {
12
11
  /**
13
12
  * @typedef {{
14
13
  * key: string,
15
- * type?: string,
16
14
  * periodDays: number,
17
15
  * semiMajorAxisAu?: number,
18
16
  * orbitalEccentricityBase?: number,
@@ -40,6 +38,7 @@ export type PlanetGeometryBody = {
40
38
  * elipticOrbit: (number | undefined), perihelionDistance: (number | undefined),
41
39
  * speedKmh: number, rotationPeriodHours: (number | undefined),
42
40
  * eccentricityPerihelion: (number | undefined), lowestPoint: (number | undefined),
41
+ * ellipseFamily: (string | undefined),
43
42
  * }}
44
43
  */
45
44
  export function derivePlanetGeometry(body: PlanetGeometryBody, env: {
@@ -58,6 +57,7 @@ export function derivePlanetGeometry(body: PlanetGeometryBody, env: {
58
57
  rotationPeriodHours: (number | undefined);
59
58
  eccentricityPerihelion: (number | undefined);
60
59
  lowestPoint: (number | undefined);
60
+ ellipseFamily: (string | undefined);
61
61
  };
62
62
  /**
63
63
  * The scaffold's orbit inputs for one body — ONE home for the rule (plan 09
@@ -74,3 +74,10 @@ export function scaffoldOrbitInputs(key: string, chainArtifact: any, fallbackPer
74
74
  periodDays: number;
75
75
  semiMajorAxisAu: (number | undefined);
76
76
  };
77
+ /**
78
+ * Each body's scaffold ellipse family (the survey's measured taxonomy above).
79
+ * Pluto, Halley and Ceres take their body-name branches; a key absent here
80
+ * has no ellipse family (geometry-only).
81
+ * @type {Readonly<Record<string, string>>}
82
+ */
83
+ export const SCAFFOLD_ELLIPSE_FAMILY: Readonly<Record<string, string>>;
@@ -1,8 +1,4 @@
1
1
  export type PlanetModelBody = {
2
- /**
3
- * - geometry type branch ('I' | 'II' | 'III')
4
- */
5
- type?: string | undefined;
6
2
  /**
7
3
  * - the observed sidereal period input, SI days (the scaffold period of the no-chain bodies; the chain planets ride the artifact's elements)
8
4
  */
@@ -47,7 +43,6 @@ export type PlanetModelRecord = {
47
43
  };
48
44
  /**
49
45
  * @typedef {Object} PlanetModelBody
50
- * @property {string} [type] - geometry type branch ('I' | 'II' | 'III')
51
46
  * @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)
52
47
  * @property {number} [invPlaneInclinationJ2000]
53
48
  * @property {number} [longitudePerihelion]
@@ -99,6 +99,8 @@ export function createPlanetSpinChannel(deps: {
99
99
  meanDeg: number;
100
100
  maxDeg: number;
101
101
  } | null;
102
+ spinAxisEclipticJ2000AtYear: (year: number) => number[] | null;
103
+ orbitNormalEclipticJ2000AtYear: (year: number) => number[];
102
104
  stepYr: number;
103
105
  maxSpanYr: 10000000;
104
106
  }>;
@@ -152,6 +154,8 @@ export function createPlanetSpinChannelFromArtifacts(deps: {
152
154
  meanDeg: number;
153
155
  maxDeg: number;
154
156
  } | null;
157
+ spinAxisEclipticJ2000AtYear: (year: number) => number[] | null;
158
+ orbitNormalEclipticJ2000AtYear: (year: number) => number[];
155
159
  stepYr: number;
156
160
  maxSpanYr: 10000000;
157
161
  }>;