@essrt/physics 21.0.0 → 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.
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@essrt/physics",
3
- "version": "21.0.0",
3
+ "version": "22.0.0",
4
4
  "description": "ESSRT (Expanding Solar System Resonance Theory) physics core — pure, injectable-constants, no I/O, no globals, no DOM. The complete model incl. fitted coefficients; every published version immutably ships one recorded model identity.",
5
5
  "essrt": {
6
- "modelVersion": "v24.0",
6
+ "modelVersion": "v25.0",
7
7
  "_note": "The model identity this package version ships (IP-unified-architecture §10: package semver tracks the API axis; the model version + CONSTANTS_HASH/COEFFICIENTS_HASH in src/constants/ carry the scientific identity). The version-pinning gate enforces this pairing against public/input/model-version.json."
8
8
  },
9
9
  "type": "module",
@@ -54,6 +54,7 @@
54
54
  "./planets/inv-plane-frame": { "types": "./types/planets/inv-plane-frame.d.cts", "default": "./src/planets/inv-plane-frame.cjs" },
55
55
  "./planets/secular-series": { "types": "./types/planets/secular-series.d.cts", "default": "./src/planets/secular-series.cjs" },
56
56
  "./planets/model": { "types": "./types/planets/model.d.cts", "default": "./src/planets/model.cjs" },
57
+ "./planets/display-names": { "types": "./types/planets/display-names.d.cts", "default": "./src/planets/display-names.cjs" },
57
58
  "./deltat/cycles": { "types": "./types/deltat/cycles.d.cts", "default": "./src/deltat/cycles.cjs" },
58
59
  "./deltat/deep-time": { "types": "./types/deltat/deep-time.d.cts", "default": "./src/deltat/deep-time.cjs" },
59
60
  "./deltat/historical": { "types": "./types/deltat/historical.d.cts", "default": "./src/deltat/historical.cjs" },
@@ -88,7 +88,9 @@ function laggedL1Terms(l1Terms, relaxationKyr) {
88
88
  * j2RateJ2000PerYr?: number,
89
89
  * j2J2000?: number,
90
90
  * }} cfg - relaxationKyr, alphaGiaRateJ2000PerYr and j2RateJ2000PerYr are
91
- * model-parameters deepTime constants; alphaJ2000 the IERS
91
+ * assembled deepTime block (DEFAULT_CONSTANTS.deepTime: τ the banked record
92
+ * data/deep-time-fitted.json, the rate derived from astro-reference
93
+ * giaCoxChaoPeltier — plan 11 step 1); alphaJ2000 the IERS
92
94
  * moment-of-inertia factor; j2J2000 Earth's J₂ (astro-reference)
93
95
  * @returns {{
94
96
  * 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,7 +2,8 @@
2
2
  * GENERATED — do not edit. Regenerate:
3
3
  * node tools/constants/generate.mjs --write
4
4
  *
5
- * Source: public/input/fitted-coefficients.json, emitted VERBATIM.
5
+ * Source: the shipped fit artifacts under data/ (EXTRA_COEFFICIENT_SOURCES in
6
+ * the generator), each emitted VERBATIM.
6
7
  *
7
8
  * Separate from DEFAULT_CONSTANTS because the lifecycle differs (§2j): these are
8
9
  * fitting-pipeline output, regenerated wholesale when a step runs, never
@@ -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;
@@ -2,7 +2,11 @@
2
2
  * GENERATED — do not edit. Regenerate:
3
3
  * node tools/constants/generate.mjs --write
4
4
  *
5
- * Source of truth: public/input/{model-parameters,astro-reference}.json
5
+ * Source of truth: public/input/astro-reference.json (model-parameters.json is
6
+ * DELETED, plan 11 step 6 — its leaves have their homes); the deepTime block
7
+ * is ASSEMBLED from astro-reference.json (moonReference.moonRecessionAlpha1PerMa,
8
+ * giaCoxChaoPeltier), data/deep-time-fitted.json and data/deltaT-4flag-fit.json
9
+ * shipped_taper (plan 11 step 1).
6
10
  * Classification and rationale: tools/constants/generate.mjs
7
11
  *
8
12
  * Two exports, deliberately separate (§2d):
@@ -12,7 +16,6 @@
12
16
  * REFERENCE_DATA validation targets + presentation. Single-sourced so
13
17
  * nothing duplicates them, but NOT injectable:
14
18
  * moonGrailWilliams2014 target
15
- * giaCoxChaoPeltier target
16
19
  * obliquityChapront2002 target
17
20
  * planetSpinObserved target
18
21
  * ascendingNodesSouamiSouchay target
@@ -33,59 +36,17 @@
33
36
  * carry it so a counterfactual is reproducible (§2d).
34
37
  * @type {string}
35
38
  */
36
- export const CONSTANTS_HASH = "c161ec19e5984b9e";
39
+ export const CONSTANTS_HASH = "f4f43386df2781b8";
37
40
 
38
41
  /** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
39
- export const MODEL_VERSION = "v24.0";
42
+ export const MODEL_VERSION = "v25.0";
40
43
 
41
44
  /** Canonical preprint DOI — single source: public/input/model-version.json. */
42
45
  export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
43
46
 
44
47
  /** @type {Readonly<Record<string, unknown>>} */
45
48
  export const DEFAULT_CONSTANTS = Object.freeze({
46
- hash: "c161ec19e5984b9e",
47
- additionalBodies: {
48
- "pluto": {
49
- "name": "Pluto",
50
- "orbitalEccentricityBase": 0.2488273,
51
- "type": "I",
52
- "angleCorrection": 2.469281,
53
- "startpos": 71.555,
54
- "ascendingNodeInvPlane": 101.06,
55
- "invPlaneInclinationMean": 15.7162,
56
- "invPlaneInclinationAmplitude": 0.717024
57
- },
58
- "halleys": {
59
- "name": "Halley's",
60
- "orbitalEccentricityBase": 0.96714291,
61
- "type": "III",
62
- "angleCorrection": -1.619816,
63
- "startpos": 80,
64
- "ascendingNodeInvPlane": 59.56,
65
- "invPlaneInclinationMean": 150,
66
- "invPlaneInclinationAmplitude": 0.1
67
- },
68
- "eros": {
69
- "name": "Eros",
70
- "orbitalEccentricityBase": 0.2229512,
71
- "type": "II",
72
- "angleCorrection": 0.047888,
73
- "startpos": 57.402,
74
- "ascendingNodeInvPlane": 10.36,
75
- "invPlaneInclinationMean": 9.25,
76
- "invPlaneInclinationAmplitude": 0.5
77
- },
78
- "ceres": {
79
- "name": "Ceres",
80
- "orbitalEccentricityBase": 0.0755347,
81
- "orbitDistanceOverride": 2.76596,
82
- "angleCorrection": 0,
83
- "startpos": 0,
84
- "ascendingNodeInvPlane": 80.89,
85
- "invPlaneInclinationMean": 0.43,
86
- "invPlaneInclinationAmplitude": 0.05
87
- }
88
- },
49
+ hash: "f4f43386df2781b8",
89
50
  additionalBodiesReference: {
90
51
  "pluto": {
91
52
  "solarYearInput": 90465,
@@ -97,7 +58,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
97
58
  "ascendingNode": 110.30393,
98
59
  "meanAnomaly": 15.55009,
99
60
  "trueAnomaly": 26.31965048,
100
- "rotationPeriodDays": 6.38720012152536
61
+ "rotationPeriodDays": 6.38720012152536,
62
+ "ascendingNodeInvPlaneClosedForm": 101.06
101
63
  },
102
64
  "halleys": {
103
65
  "solarYearInput": 27503,
@@ -189,21 +151,6 @@ export const DEFAULT_CONSTANTS = Object.freeze({
189
151
  "thermalPumpFactor": 0.454
190
152
  }
191
153
  },
192
- earth: {
193
- "earthtiltMean": 23.413526608469965,
194
- "earthInvPlaneInclinationAmplitude": 0.636069722432876,
195
- "eccentricityBase": 0.015386009686374918,
196
- "eccentricityAmplitude": 0.0013559440307290061,
197
- "kDeviceInclinationPhaseJ2000Deg": 81.17719000000001,
198
- "kDeviceWheelPeriodYears": {
199
- "3": 111772.33333333333,
200
- "5": 67063.4,
201
- "8": 41914.625,
202
- "13": 25793.615384615383,
203
- "16": 20957.3125
204
- },
205
- "kDeviceWheelPhaseAtJ2000Cycles": 0.908498525276082
206
- },
207
154
  earthOrbital: {
208
155
  "j2000EpochYear": 2000,
209
156
  "perihelionalignmentYear": 1246.03125,
@@ -223,19 +170,9 @@ export const DEFAULT_CONSTANTS = Object.freeze({
223
170
  "deltaTStart": 56.07959443353602,
224
171
  "sunTilt": 7.155
225
172
  },
226
- foundational: {
227
- "startmodelJD": 2451716.5,
228
- "startmodelYear": 2000.5,
229
- "correctionDays": -0.828832119703292,
230
- "correctionSun": 0.4971540149655503,
231
- "startAngleModel": 89.91949879,
232
- "useVariableSpeed": true
233
- },
234
- moon: {
235
- "moonStartposApsidal": 347.5476,
236
- "moonStartposNodal": 64.0435,
237
- "moonStartposMoon": 67.8443,
238
- "moonMeeusLpCorrection": 0
173
+ giaCoxChaoPeltier: {
174
+ "dJ2DtPerYr": -2.7e-11,
175
+ "j2ToAlphaFactor": 2
239
176
  },
240
177
  moonMeeus: {
241
178
  "elpW1T2Decomposition_arcsecPerCy2": {
@@ -262,21 +199,13 @@ export const DEFAULT_CONSTANTS = Object.freeze({
262
199
  "moonApsidalPrecessionDaysInputICRF": 3231.493,
263
200
  "moonNodalPrecessionDaysInputICRF": 6798.38,
264
201
  "moonDistance": 384399.07,
202
+ "moonRecessionAlpha1PerMa": -0.000099375895103,
265
203
  "moonEclipticInclinationJ2000": 5.1573,
266
204
  "moonInclinationConstantBrownELP": 5.1453964,
267
205
  "moonOrbitalEccentricityBase": 0.054900489,
268
206
  "moonObliquityEclipticJ2000": 1.5424,
269
207
  "moonTilt": 6.687
270
208
  },
271
- perihelionPassageRef: {
272
- "mercury": 2460335.9,
273
- "venus": 2455464.42,
274
- "mars": 2456499.441,
275
- "jupiter": 2464224.5,
276
- "saturn": 2452875.9,
277
- "uranus": 2439699.8,
278
- "neptune": 2409432.4
279
- },
280
209
  physicalConstants: {
281
210
  "currentAUDistance": 149597870.698828,
282
211
  "G_CONSTANT": 6.6743e-20,
@@ -340,7 +269,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
340
269
  "ascendingNode": 48.33033155,
341
270
  "invPlaneInclinationJ2000": 6.3472858,
342
271
  "meanAnomaly": 156.6364301,
343
- "trueAnomaly": 164.1669319
272
+ "trueAnomaly": 164.1669319,
273
+ "ascendingNodeInvPlaneClosedForm": 32.83
344
274
  },
345
275
  "venus": {
346
276
  "solarYearInput": 224.695,
@@ -352,7 +282,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
352
282
  "invPlaneInclinationJ2000": 2.1545441,
353
283
  "meanAnomaly": 324.9668371,
354
284
  "trueAnomaly": 324.5198504,
355
- "rotationPeriodDays": 243.022699230302
285
+ "rotationPeriodDays": 243.022699230302,
286
+ "ascendingNodeInvPlaneClosedForm": 54.7
356
287
  },
357
288
  "mars": {
358
289
  "solarYearInput": 686.93,
@@ -364,7 +295,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
364
295
  "invPlaneInclinationJ2000": 1.6311858,
365
296
  "meanAnomaly": 109.2630844,
366
297
  "trueAnomaly": 118.9501056,
367
- "rotationPeriodDays": 1.02595659586635
298
+ "rotationPeriodDays": 1.02595659586635,
299
+ "ascendingNodeInvPlaneClosedForm": 354.87
368
300
  },
369
301
  "jupiter": {
370
302
  "solarYearInput": 4330.53,
@@ -376,7 +308,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
376
308
  "invPlaneInclinationJ2000": 0.3219652,
377
309
  "meanAnomaly": 32.47179744,
378
310
  "trueAnomaly": 35.69428061,
379
- "rotationPeriodDays": 0.413541666975253
311
+ "rotationPeriodDays": 0.413541666975253,
312
+ "ascendingNodeInvPlaneClosedForm": 312.89
380
313
  },
381
314
  "saturn": {
382
315
  "solarYearInput": 10747,
@@ -388,7 +321,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
388
321
  "invPlaneInclinationJ2000": 0.9254704,
389
322
  "meanAnomaly": 325.663876,
390
323
  "trueAnomaly": 321.7910116,
391
- "rotationPeriodDays": 0.440023148755863
324
+ "rotationPeriodDays": 0.440023148755863,
325
+ "ascendingNodeInvPlaneClosedForm": 118.81
392
326
  },
393
327
  "uranus": {
394
328
  "solarYearInput": 30586,
@@ -400,7 +334,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
400
334
  "invPlaneInclinationJ2000": 0.9946692,
401
335
  "meanAnomaly": 145.7292678,
402
336
  "trueAnomaly": 148.5142459,
403
- "rotationPeriodDays": 0.718329998141018
337
+ "rotationPeriodDays": 0.718329998141018,
338
+ "ascendingNodeInvPlaneClosedForm": 307.8
404
339
  },
405
340
  "neptune": {
406
341
  "solarYearInput": 59800,
@@ -412,7 +347,8 @@ export const DEFAULT_CONSTANTS = Object.freeze({
412
347
  "invPlaneInclinationJ2000": 0.7354155,
413
348
  "meanAnomaly": 262.5003424,
414
349
  "trueAnomaly": 261.2242728,
415
- "rotationPeriodDays": 0.671300001591743
350
+ "rotationPeriodDays": 0.671300001591743,
351
+ "ascendingNodeInvPlaneClosedForm": 192.04
416
352
  }
417
353
  },
418
354
  planetSpinPhysical: {
@@ -625,72 +561,9 @@ export const DEFAULT_CONSTANTS = Object.freeze({
625
561
  ]
626
562
  }
627
563
  },
628
- planets: {
629
- "mercury": {
630
- "name": "Mercury",
631
- "eocFraction": -0.527,
632
- "startpos": 83.64651142941864,
633
- "angleCorrection": 0.9727205912043573,
634
- "type": "I",
635
- "mirrorPair": "uranus",
636
- "ascendingNodeInvPlane": 32.83
637
- },
638
- "venus": {
639
- "name": "Venus",
640
- "eocFraction": 0.436,
641
- "startpos": 249.28769121856186,
642
- "angleCorrection": -2.789778861448692,
643
- "type": "I",
644
- "mirrorPair": "neptune",
645
- "ascendingNodeInvPlane": 54.7
646
- },
647
- "mars": {
648
- "name": "Mars",
649
- "eocFraction": -0.066224,
650
- "startpos": 121.4634461571797,
651
- "angleCorrection": -2.104652936098656,
652
- "type": "II",
653
- "mirrorPair": "jupiter",
654
- "ascendingNodeInvPlane": 354.87
655
- },
656
- "jupiter": {
657
- "name": "Jupiter",
658
- "eocFraction": 0.495,
659
- "startpos": 13.887946755371052,
660
- "angleCorrection": 0.9333205235053406,
661
- "type": "III",
662
- "mirrorPair": "mars",
663
- "ascendingNodeInvPlane": 312.89
664
- },
665
- "saturn": {
666
- "name": "Saturn",
667
- "eocFraction": 0.54,
668
- "startpos": 11.279308392461772,
669
- "angleCorrection": -0.1784695052193328,
670
- "type": "III",
671
- "mirrorPair": "earth",
672
- "ascendingNodeInvPlane": 118.81
673
- },
674
- "uranus": {
675
- "name": "Uranus",
676
- "eocFraction": 0.53,
677
- "startpos": 44.900388945775106,
678
- "angleCorrection": -0.7343433510960402,
679
- "type": "III",
680
- "mirrorPair": "mercury",
681
- "ascendingNodeInvPlane": 307.8
682
- },
683
- "neptune": {
684
- "name": "Neptune",
685
- "eocFraction": 0.585,
686
- "startpos": 47.9552024382285,
687
- "angleCorrection": 2.3327665835675617,
688
- "type": "III",
689
- "mirrorPair": "venus",
690
- "ascendingNodeInvPlane": 192.04
691
- }
692
- },
693
564
  timeReference: {
565
+ "sceneEpochJD": 2451716.5,
566
+ "sceneEpochYear": 2000.5,
694
567
  "j2000JD": 2451545,
695
568
  "julianCenturyDays": 36525,
696
569
  "gregorianStartJD": 2299160.5,
@@ -760,10 +633,6 @@ export const REFERENCE_DATA = Object.freeze({
760
633
  "greatattractorDistance": 200000000,
761
634
  "milkywaySpeed": 2160000
762
635
  },
763
- giaCoxChaoPeltier: {
764
- "dJ2DtPerYr": -2.7e-11,
765
- "j2ToAlphaFactor": 2
766
- },
767
636
  jplEclipticInclinationTrends: {
768
637
  "mercury": -0.00595,
769
638
  "venus": -0.00079,
@@ -26,11 +26,35 @@
26
26
  * the K sun plane and the RA frame's ecliptic parted by 20.5″ at J2000 and 10′
27
27
  * at −3000, the rendered Sun −19″ in declination against Horizons at the
28
28
  * March 2000 equinox (+19″ in September; 0.1–1″ at the solstice).
29
+ *
30
+ * THE SCENE'S WORLD FRAME (plan 11 step 4) is the J2000 ecliptic itself:
31
+ * world Y is the J2000 ecliptic pole and the J2000 equinox lies in the world
32
+ * XZ plane at the view azimuth `SCENE_EQUINOX_VIEW_AZIMUTH_DEG` (atan2(x, z)).
33
+ * `computeSceneWorldFrameJ2000` is the bridge R (ecliptic J2000 → world) both
34
+ * twins place every frame of date through. The azimuth is the ONE scene
35
+ * literal the retired K-device scaffold leaves behind — the pose the scaffold
36
+ * encoded at J2000, measured on the Node twin (its 0.026° pole tilt dropped),
37
+ * kept for visual continuity; no observable rides it (every physical reading
38
+ * is taken in the placed Earth frame, which is R-invariant by construction).
29
39
  */
30
40
  'use strict';
31
41
 
32
42
  const D2R = Math.PI / 180;
33
43
 
44
+ /** The J2000 equinox's azimuth in the scene's world XZ plane, degrees (atan2(x, z)) — the view convention. */
45
+ const SCENE_EQUINOX_VIEW_AZIMUTH_DEG = 158.2265109779131;
46
+
47
+ /**
48
+ * The scene's world frame: R maps a J2000-ecliptic vector to world, columns
49
+ * [ĝ, n̂ × ĝ, n̂] = [the equinox, longitude 90°, the ecliptic pole] with
50
+ * n̂ = world Y exactly and ĝ at the view azimuth.
51
+ * @returns {number[][]} a 3×3 rotation matrix, rows × columns
52
+ */
53
+ function computeSceneWorldFrameJ2000() {
54
+ const a = SCENE_EQUINOX_VIEW_AZIMUTH_DEG * D2R, s = Math.sin(a), c = Math.cos(a);
55
+ return [[s, c, 0], [0, 0, 1], [c, -s, 0]];
56
+ }
57
+
34
58
  /**
35
59
  * @typedef {{x: number, y: number, z: number}} Vec3
36
60
  */
@@ -102,4 +126,4 @@ function solveWheelAngleForLongitude(lambdaRad, e, periRad) {
102
126
  return Math.atan2(Math.sin(th), Math.cos(th));
103
127
  }
104
128
 
105
- module.exports = { computeEarthFrameOfDate, solveWheelAngleForLongitude };
129
+ module.exports = { computeEarthFrameOfDate, solveWheelAngleForLongitude, computeSceneWorldFrameJ2000, SCENE_EQUINOX_VIEW_AZIMUTH_DEG };