@essrt/physics 7.0.0 → 9.1.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 (41) hide show
  1. package/README.md +2 -2
  2. package/package.json +4 -2
  3. package/src/constants/coefficients.d.ts +1 -38
  4. package/src/constants/coefficients.js +2 -5
  5. package/src/constants/generated.d.ts +109 -25
  6. package/src/constants/generated.js +226 -96
  7. package/src/earth/deep-orbital-history.cjs +10 -0
  8. package/src/earth/frame-of-date.cjs +105 -0
  9. package/src/eclipse/besselian.cjs +41 -17
  10. package/src/eclipse/sun-planetary-completion.cjs +55 -14
  11. package/src/index.js +9 -1
  12. package/src/model.js +262 -124
  13. package/src/moon/apparent.cjs +45 -126
  14. package/src/moon/deep-ecc-channel.cjs +59 -12
  15. package/src/moon/deep-modes-artifact.cjs +4 -2
  16. package/src/moon/month-chain.cjs +21 -10
  17. package/src/moon/series-extension.cjs +2 -1
  18. package/src/moon/series.cjs +21 -4
  19. package/src/planets/chain-artifact.js +2 -2
  20. package/src/planets/fibonacci-laws.cjs +7 -42
  21. package/src/planets/model.cjs +10 -13
  22. package/src/planets/secular-shape.cjs +36 -0
  23. package/src/planets/spin-channel.cjs +391 -0
  24. package/types/constants/coefficients.d.ts +1 -38
  25. package/types/constants/generated.d.ts +109 -25
  26. package/types/earth/deep-orbital-history.d.cts +2 -0
  27. package/types/earth/frame-of-date.d.cts +37 -0
  28. package/types/eclipse/besselian.d.cts +5 -7
  29. package/types/eclipse/sun-planetary-completion.d.cts +14 -10
  30. package/types/index.d.ts +3 -1
  31. package/types/model.d.ts +26 -0
  32. package/types/moon/apparent.d.cts +7 -68
  33. package/types/moon/deep-ecc-channel.d.cts +31 -2
  34. package/types/moon/deep-modes-artifact.d.cts +2 -0
  35. package/types/moon/month-chain.d.cts +4 -0
  36. package/types/planets/fibonacci-laws.d.cts +0 -29
  37. package/types/planets/model.d.cts +10 -4
  38. package/types/planets/secular-shape.d.cts +30 -0
  39. package/types/planets/spin-channel.d.cts +193 -0
  40. package/src/planets/predict.cjs +0 -324
  41. package/types/planets/predict.d.cts +0 -88
@@ -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: "7940c564f7b5f0a6";
5
+ export declare const CONSTANTS_HASH: "b9c4d78647577e67";
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: "7940c564f7b5f0a6";
12
+ readonly hash: "b9c4d78647577e67";
13
13
  readonly additionalBodies: {
14
14
  "pluto": {
15
15
  "name": string;
@@ -372,6 +372,113 @@ export declare const DEFAULT_CONSTANTS: {
372
372
  "rotationPeriodDays": number;
373
373
  };
374
374
  };
375
+ readonly planetSpinPhysical: {
376
+ "mercury": {
377
+ "j2": number;
378
+ "j2ReferenceRadiusKm": number;
379
+ "momentOfInertiaFactor": number;
380
+ "momentOfInertiaFactorClass": string;
381
+ "rotationRateDegPerDay": number;
382
+ "poleRaJ2000Deg": number;
383
+ "poleDecJ2000Deg": number;
384
+ "cassiniLocked": boolean;
385
+ "satellites": unknown[];
386
+ };
387
+ "venus": {
388
+ "j2": number;
389
+ "j2ReferenceRadiusKm": number;
390
+ "momentOfInertiaFactor": number;
391
+ "momentOfInertiaFactorClass": string;
392
+ "rotationRateDegPerDay": number;
393
+ "poleRaJ2000Deg": number;
394
+ "poleDecJ2000Deg": number;
395
+ "cassiniLocked": boolean;
396
+ "satellites": unknown[];
397
+ };
398
+ "mars": {
399
+ "j2": number;
400
+ "j2ReferenceRadiusKm": number;
401
+ "momentOfInertiaFactor": number;
402
+ "momentOfInertiaFactorClass": string;
403
+ "rotationRateDegPerDay": number;
404
+ "poleRaJ2000Deg": number;
405
+ "poleDecJ2000Deg": number;
406
+ "cassiniLocked": boolean;
407
+ "satellites": Array<{
408
+ "name": string;
409
+ "gmKm3S2": number;
410
+ "semiMajorAxisKm": number;
411
+ "orbitalPeriodDays": number;
412
+ }>;
413
+ };
414
+ "jupiter": {
415
+ "j2": number;
416
+ "j2ReferenceRadiusKm": number;
417
+ "momentOfInertiaFactor": number;
418
+ "momentOfInertiaFactorClass": string;
419
+ "momentOfInertiaFactorAlternative": number;
420
+ "rotationRateDegPerDay": number;
421
+ "poleRaJ2000Deg": number;
422
+ "poleDecJ2000Deg": number;
423
+ "cassiniLocked": boolean;
424
+ "satellites": Array<{
425
+ "name": string;
426
+ "gmKm3S2": number;
427
+ "semiMajorAxisKm": number;
428
+ "orbitalPeriodDays": number;
429
+ }>;
430
+ };
431
+ "saturn": {
432
+ "j2": number;
433
+ "j2ReferenceRadiusKm": number;
434
+ "momentOfInertiaFactor": number;
435
+ "momentOfInertiaFactorClass": string;
436
+ "momentOfInertiaFactorAlternative": [number, number];
437
+ "rotationRateDegPerDay": number;
438
+ "poleRaJ2000Deg": number;
439
+ "poleDecJ2000Deg": number;
440
+ "cassiniLocked": boolean;
441
+ "satellites": Array<{
442
+ "name": string;
443
+ "gmKm3S2": number;
444
+ "semiMajorAxisKm": number;
445
+ "orbitalPeriodDays": number;
446
+ }>;
447
+ };
448
+ "uranus": {
449
+ "j2": number;
450
+ "j2ReferenceRadiusKm": number;
451
+ "momentOfInertiaFactor": number;
452
+ "momentOfInertiaFactorClass": string;
453
+ "rotationRateDegPerDay": number;
454
+ "poleRaJ2000Deg": number;
455
+ "poleDecJ2000Deg": number;
456
+ "cassiniLocked": boolean;
457
+ "satellites": Array<{
458
+ "name": string;
459
+ "gmKm3S2": number;
460
+ "semiMajorAxisKm": number;
461
+ "orbitalPeriodDays": number;
462
+ }>;
463
+ };
464
+ "neptune": {
465
+ "j2": number;
466
+ "j2ReferenceRadiusKm": number;
467
+ "momentOfInertiaFactor": number;
468
+ "momentOfInertiaFactorClass": string;
469
+ "rotationRateDegPerDay": number;
470
+ "poleRaJ2000Deg": number;
471
+ "poleDecJ2000Deg": number;
472
+ "cassiniLocked": boolean;
473
+ "satellites": Array<{
474
+ "name": string;
475
+ "gmKm3S2": number;
476
+ "semiMajorAxisKm": number;
477
+ "orbitalPeriodDays": number;
478
+ "retrograde": boolean;
479
+ }>;
480
+ };
481
+ };
375
482
  readonly planets: {
376
483
  "mercury": {
377
484
  "name": string;
@@ -386,9 +493,6 @@ export declare const DEFAULT_CONSTANTS: {
386
493
  "inclinationCycleAnchor": number;
387
494
  "antiPhase": boolean;
388
495
  "ascendingNodeCyclesIn8H": number;
389
- "obliquityCycleFraction": [number, number];
390
- "axialPrecessionFraction": [number, number];
391
- "eccentricityCycleFraction": [number, number];
392
496
  };
393
497
  "venus": {
394
498
  "name": string;
@@ -403,9 +507,6 @@ export declare const DEFAULT_CONSTANTS: {
403
507
  "inclinationCycleAnchor": number;
404
508
  "antiPhase": boolean;
405
509
  "ascendingNodeCyclesIn8H": number;
406
- "obliquityCycleFraction": null;
407
- "axialPrecessionFraction": [number, number];
408
- "eccentricityCycleFraction": [number, number];
409
510
  };
410
511
  "mars": {
411
512
  "name": string;
@@ -420,9 +521,6 @@ export declare const DEFAULT_CONSTANTS: {
420
521
  "inclinationCycleAnchor": number;
421
522
  "antiPhase": boolean;
422
523
  "ascendingNodeCyclesIn8H": number;
423
- "obliquityCycleFraction": [number, number];
424
- "axialPrecessionFraction": [number, number];
425
- "eccentricityCycleFraction": [number, number];
426
524
  };
427
525
  "jupiter": {
428
526
  "name": string;
@@ -437,9 +535,6 @@ export declare const DEFAULT_CONSTANTS: {
437
535
  "inclinationCycleAnchor": number;
438
536
  "antiPhase": boolean;
439
537
  "ascendingNodeCyclesIn8H": number;
440
- "obliquityCycleFraction": [number, number];
441
- "axialPrecessionFraction": [number, number];
442
- "eccentricityCycleFraction": [number, number];
443
538
  };
444
539
  "saturn": {
445
540
  "name": string;
@@ -454,9 +549,6 @@ export declare const DEFAULT_CONSTANTS: {
454
549
  "inclinationCycleAnchor": number;
455
550
  "antiPhase": boolean;
456
551
  "ascendingNodeCyclesIn8H": number;
457
- "obliquityCycleFraction": [number, number];
458
- "axialPrecessionFraction": [number, number];
459
- "eccentricityCycleFraction": [number, number];
460
552
  };
461
553
  "uranus": {
462
554
  "name": string;
@@ -471,10 +563,6 @@ export declare const DEFAULT_CONSTANTS: {
471
563
  "inclinationCycleAnchor": number;
472
564
  "antiPhase": boolean;
473
565
  "ascendingNodeCyclesIn8H": number;
474
- "obliquityCycleFraction": [number, number];
475
- "axialPrecessionFraction": [number, number];
476
- "eccentricityCycleFraction": [number, number];
477
- "eccentricityCycleApprox": boolean;
478
566
  };
479
567
  "neptune": {
480
568
  "name": string;
@@ -489,10 +577,6 @@ export declare const DEFAULT_CONSTANTS: {
489
577
  "inclinationCycleAnchor": number;
490
578
  "antiPhase": boolean;
491
579
  "ascendingNodeCyclesIn8H": number;
492
- "obliquityCycleFraction": null;
493
- "axialPrecessionFraction": [number, number];
494
- "eccentricityCycleFraction": [number, number];
495
- "eccentricityCycleApprox": boolean;
496
580
  };
497
581
  };
498
582
  readonly timeReference: {
@@ -33,7 +33,7 @@
33
33
  * carry it so a counterfactual is reproducible (§2d).
34
34
  * @type {string}
35
35
  */
36
- export const CONSTANTS_HASH = "7940c564f7b5f0a6";
36
+ export const CONSTANTS_HASH = "b9c4d78647577e67";
37
37
 
38
38
  /** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
39
39
  export const MODEL_VERSION = "v14.0";
@@ -43,7 +43,7 @@ export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
43
43
 
44
44
  /** @type {Readonly<Record<string, unknown>>} */
45
45
  export const DEFAULT_CONSTANTS = Object.freeze({
46
- hash: "7940c564f7b5f0a6",
46
+ hash: "b9c4d78647577e67",
47
47
  additionalBodies: {
48
48
  "pluto": {
49
49
  "name": "Pluto",
@@ -171,10 +171,10 @@ export const DEFAULT_CONSTANTS = Object.freeze({
171
171
  "eros": 16.84
172
172
  },
173
173
  cardinalPointAnchors: {
174
- "SS": 2451716.5748,
175
- "WS": 2451900.06782,
176
- "VE": 2451623.738137,
177
- "AE": 2451810.304796
174
+ "SS": 2451716.575,
175
+ "WS": 2451900.0674,
176
+ "VE": 2451623.816,
177
+ "AE": 2451810.2271
178
178
  },
179
179
  deepTime: {
180
180
  "alpha1PerMa": -0.000099375895103,
@@ -250,7 +250,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
250
250
  "moonStartposApsidal": 347.5476,
251
251
  "moonStartposNodal": 64.0435,
252
252
  "moonStartposMoon": 67.8443,
253
- "moonMeeusLpCorrection": 0.009097354859355077
253
+ "moonMeeusLpCorrection": 0
254
254
  },
255
255
  moonMeeus: {
256
256
  "elpW1T2Decomposition_arcsecPerCy2": {
@@ -430,6 +430,216 @@ export const DEFAULT_CONSTANTS = Object.freeze({
430
430
  "rotationPeriodDays": 0.671300001591743
431
431
  }
432
432
  },
433
+ planetSpinPhysical: {
434
+ "mercury": {
435
+ "j2": 0.0000503,
436
+ "j2ReferenceRadiusKm": 2440,
437
+ "momentOfInertiaFactor": 0.346,
438
+ "momentOfInertiaFactorClass": "spin-inferred",
439
+ "rotationRateDegPerDay": 6.1385108,
440
+ "poleRaJ2000Deg": 281.0103,
441
+ "poleDecJ2000Deg": 61.4155,
442
+ "cassiniLocked": true,
443
+ "satellites": []
444
+ },
445
+ "venus": {
446
+ "j2": 0.0000044044,
447
+ "j2ReferenceRadiusKm": 6051,
448
+ "momentOfInertiaFactor": 0.337,
449
+ "momentOfInertiaFactorClass": "spin-inferred",
450
+ "rotationRateDegPerDay": -1.4813688,
451
+ "poleRaJ2000Deg": 272.76,
452
+ "poleDecJ2000Deg": 67.16,
453
+ "cassiniLocked": false,
454
+ "satellites": []
455
+ },
456
+ "mars": {
457
+ "j2": 0.001956608,
458
+ "j2ReferenceRadiusKm": 3396,
459
+ "momentOfInertiaFactor": 0.3644,
460
+ "momentOfInertiaFactorClass": "spin-inferred",
461
+ "rotationRateDegPerDay": 350.891982443297,
462
+ "poleRaJ2000Deg": 317.68143,
463
+ "poleDecJ2000Deg": 52.8865,
464
+ "cassiniLocked": false,
465
+ "satellites": [
466
+ {
467
+ "name": "Phobos",
468
+ "gmKm3S2": 0.0007087,
469
+ "semiMajorAxisKm": 9375,
470
+ "orbitalPeriodDays": 0.3187
471
+ },
472
+ {
473
+ "name": "Deimos",
474
+ "gmKm3S2": 0.0000962,
475
+ "semiMajorAxisKm": 23457,
476
+ "orbitalPeriodDays": 1.2625
477
+ }
478
+ ]
479
+ },
480
+ "jupiter": {
481
+ "j2": 0.014696572,
482
+ "j2ReferenceRadiusKm": 71492,
483
+ "momentOfInertiaFactor": 0.26393,
484
+ "momentOfInertiaFactorClass": "gravity-constrained",
485
+ "momentOfInertiaFactorAlternative": 0.2756,
486
+ "rotationRateDegPerDay": 870.536,
487
+ "poleRaJ2000Deg": 268.056595,
488
+ "poleDecJ2000Deg": 64.495303,
489
+ "cassiniLocked": false,
490
+ "satellites": [
491
+ {
492
+ "name": "Io",
493
+ "gmKm3S2": 5959.91547,
494
+ "semiMajorAxisKm": 421800,
495
+ "orbitalPeriodDays": 1.762732
496
+ },
497
+ {
498
+ "name": "Europa",
499
+ "gmKm3S2": 3202.7121,
500
+ "semiMajorAxisKm": 671100,
501
+ "orbitalPeriodDays": 3.525463
502
+ },
503
+ {
504
+ "name": "Ganymede",
505
+ "gmKm3S2": 9887.83275,
506
+ "semiMajorAxisKm": 1070400,
507
+ "orbitalPeriodDays": 7.155588
508
+ },
509
+ {
510
+ "name": "Callisto",
511
+ "gmKm3S2": 7179.2834,
512
+ "semiMajorAxisKm": 1882700,
513
+ "orbitalPeriodDays": 16.69044
514
+ }
515
+ ]
516
+ },
517
+ "saturn": {
518
+ "j2": 0.016290573,
519
+ "j2ReferenceRadiusKm": 60330,
520
+ "momentOfInertiaFactor": 0.2181,
521
+ "momentOfInertiaFactorClass": "gravity-constrained",
522
+ "momentOfInertiaFactorAlternative": [
523
+ 0.2257,
524
+ 0.2438
525
+ ],
526
+ "rotationRateDegPerDay": 810.7939024,
527
+ "poleRaJ2000Deg": 40.589,
528
+ "poleDecJ2000Deg": 83.537,
529
+ "cassiniLocked": false,
530
+ "satellites": [
531
+ {
532
+ "name": "Mimas",
533
+ "gmKm3S2": 2.50349,
534
+ "semiMajorAxisKm": 186000,
535
+ "orbitalPeriodDays": 0.942422
536
+ },
537
+ {
538
+ "name": "Enceladus",
539
+ "gmKm3S2": 7.21037,
540
+ "semiMajorAxisKm": 238400,
541
+ "orbitalPeriodDays": 1.370218
542
+ },
543
+ {
544
+ "name": "Tethys",
545
+ "gmKm3S2": 41.21353,
546
+ "semiMajorAxisKm": 295000,
547
+ "orbitalPeriodDays": 1.887802
548
+ },
549
+ {
550
+ "name": "Dione",
551
+ "gmKm3S2": 73.11607,
552
+ "semiMajorAxisKm": 377700,
553
+ "orbitalPeriodDays": 2.736916
554
+ },
555
+ {
556
+ "name": "Rhea",
557
+ "gmKm3S2": 153.94175,
558
+ "semiMajorAxisKm": 527200,
559
+ "orbitalPeriodDays": 4.517503
560
+ },
561
+ {
562
+ "name": "Titan",
563
+ "gmKm3S2": 8978.1371,
564
+ "semiMajorAxisKm": 1221900,
565
+ "orbitalPeriodDays": 15.945448
566
+ },
567
+ {
568
+ "name": "Iapetus",
569
+ "gmKm3S2": 120.51511,
570
+ "semiMajorAxisKm": 3561700,
571
+ "orbitalPeriodDays": 79.331002
572
+ }
573
+ ]
574
+ },
575
+ "uranus": {
576
+ "j2": 0.00351068,
577
+ "j2ReferenceRadiusKm": 25559,
578
+ "momentOfInertiaFactor": 0.225,
579
+ "momentOfInertiaFactorClass": "interior-model",
580
+ "rotationRateDegPerDay": -501.1600928,
581
+ "poleRaJ2000Deg": 257.311,
582
+ "poleDecJ2000Deg": -15.175,
583
+ "cassiniLocked": false,
584
+ "satellites": [
585
+ {
586
+ "name": "Miranda",
587
+ "gmKm3S2": 4.3,
588
+ "semiMajorAxisKm": 129846,
589
+ "orbitalPeriodDays": 1.413479
590
+ },
591
+ {
592
+ "name": "Ariel",
593
+ "gmKm3S2": 83.5,
594
+ "semiMajorAxisKm": 190929,
595
+ "orbitalPeriodDays": 2.520379
596
+ },
597
+ {
598
+ "name": "Umbriel",
599
+ "gmKm3S2": 85.1,
600
+ "semiMajorAxisKm": 265986,
601
+ "orbitalPeriodDays": 4.144177
602
+ },
603
+ {
604
+ "name": "Titania",
605
+ "gmKm3S2": 226.9,
606
+ "semiMajorAxisKm": 436298,
607
+ "orbitalPeriodDays": 8.705869
608
+ },
609
+ {
610
+ "name": "Oberon",
611
+ "gmKm3S2": 205.3,
612
+ "semiMajorAxisKm": 583511,
613
+ "orbitalPeriodDays": 13.463237
614
+ }
615
+ ]
616
+ },
617
+ "neptune": {
618
+ "j2": 0.00340843,
619
+ "j2ReferenceRadiusKm": 25225,
620
+ "momentOfInertiaFactor": 0.23,
621
+ "momentOfInertiaFactorClass": "interior-model",
622
+ "rotationRateDegPerDay": 541.1397757,
623
+ "poleRaJ2000Deg": 299.36,
624
+ "poleDecJ2000Deg": 43.46,
625
+ "cassiniLocked": false,
626
+ "satellites": [
627
+ {
628
+ "name": "Triton",
629
+ "gmKm3S2": 1428.49546,
630
+ "semiMajorAxisKm": 354800,
631
+ "orbitalPeriodDays": 5.876994,
632
+ "retrograde": true
633
+ },
634
+ {
635
+ "name": "Proteus",
636
+ "gmKm3S2": 2.58342,
637
+ "semiMajorAxisKm": 117600,
638
+ "orbitalPeriodDays": 1.122315
639
+ }
640
+ ]
641
+ }
642
+ },
433
643
  planets: {
434
644
  "mercury": {
435
645
  "name": "Mercury",
@@ -446,19 +656,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
446
656
  "ascendingNodeInvPlane": 32.83,
447
657
  "inclinationCycleAnchor": 234.52,
448
658
  "antiPhase": false,
449
- "ascendingNodeCyclesIn8H": 9,
450
- "obliquityCycleFraction": [
451
- 8,
452
- 3
453
- ],
454
- "axialPrecessionFraction": [
455
- -8,
456
- 9
457
- ],
458
- "eccentricityCycleFraction": [
459
- 2,
460
- 21
461
- ]
659
+ "ascendingNodeCyclesIn8H": 9
462
660
  },
463
661
  "venus": {
464
662
  "name": "Venus",
@@ -475,16 +673,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
475
673
  "ascendingNodeInvPlane": 54.7,
476
674
  "inclinationCycleAnchor": 218.64,
477
675
  "antiPhase": false,
478
- "ascendingNodeCyclesIn8H": 1,
479
- "obliquityCycleFraction": null,
480
- "axialPrecessionFraction": [
481
- 8,
482
- 91
483
- ],
484
- "eccentricityCycleFraction": [
485
- 8,
486
- 19
487
- ]
676
+ "ascendingNodeCyclesIn8H": 1
488
677
  },
489
678
  "mars": {
490
679
  "name": "Mars",
@@ -501,19 +690,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
501
690
  "ascendingNodeInvPlane": 354.87,
502
691
  "inclinationCycleAnchor": 236.07,
503
692
  "antiPhase": false,
504
- "ascendingNodeCyclesIn8H": 64,
505
- "obliquityCycleFraction": [
506
- 8,
507
- 21
508
- ],
509
- "axialPrecessionFraction": [
510
- -1,
511
- 2
512
- ],
513
- "eccentricityCycleFraction": [
514
- 8,
515
- 52
516
- ]
693
+ "ascendingNodeCyclesIn8H": 64
517
694
  },
518
695
  "jupiter": {
519
696
  "name": "Jupiter",
@@ -530,19 +707,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
530
707
  "ascendingNodeInvPlane": 312.89,
531
708
  "inclinationCycleAnchor": 287.06,
532
709
  "antiPhase": false,
533
- "ascendingNodeCyclesIn8H": 36,
534
- "obliquityCycleFraction": [
535
- 1,
536
- 2
537
- ],
538
- "axialPrecessionFraction": [
539
- -8,
540
- 21
541
- ],
542
- "eccentricityCycleFraction": [
543
- 8,
544
- 44
545
- ]
710
+ "ascendingNodeCyclesIn8H": 36
546
711
  },
547
712
  "saturn": {
548
713
  "name": "Saturn",
@@ -559,19 +724,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
559
724
  "ascendingNodeInvPlane": 118.81,
560
725
  "inclinationCycleAnchor": 116.26,
561
726
  "antiPhase": true,
562
- "ascendingNodeCyclesIn8H": 36,
563
- "obliquityCycleFraction": [
564
- 1,
565
- 3
566
- ],
567
- "axialPrecessionFraction": [
568
- -4,
569
- 3
570
- ],
571
- "eccentricityCycleFraction": [
572
- 8,
573
- 163
574
- ]
727
+ "ascendingNodeCyclesIn8H": 36
575
728
  },
576
729
  "uranus": {
577
730
  "name": "Uranus",
@@ -588,20 +741,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
588
741
  "ascendingNodeInvPlane": 307.8,
589
742
  "inclinationCycleAnchor": 21.33,
590
743
  "antiPhase": false,
591
- "ascendingNodeCyclesIn8H": 11,
592
- "obliquityCycleFraction": [
593
- 1,
594
- 2
595
- ],
596
- "axialPrecessionFraction": [
597
- 610,
598
- 1
599
- ],
600
- "eccentricityCycleFraction": [
601
- 1,
602
- 10
603
- ],
604
- "eccentricityCycleApprox": true
744
+ "ascendingNodeCyclesIn8H": 11
605
745
  },
606
746
  "neptune": {
607
747
  "name": "Neptune",
@@ -618,17 +758,7 @@ export const DEFAULT_CONSTANTS = Object.freeze({
618
758
  "ascendingNodeInvPlane": 192.04,
619
759
  "inclinationCycleAnchor": 174.04,
620
760
  "antiPhase": false,
621
- "ascendingNodeCyclesIn8H": 3,
622
- "obliquityCycleFraction": null,
623
- "axialPrecessionFraction": [
624
- -68,
625
- 1
626
- ],
627
- "eccentricityCycleFraction": [
628
- 2,
629
- 25
630
- ],
631
- "eccentricityCycleApprox": true
761
+ "ascendingNodeCyclesIn8H": 3
632
762
  }
633
763
  },
634
764
  timeReference: {
@@ -766,8 +896,8 @@ export const REFERENCE_DATA = Object.freeze({
766
896
  "sunModelTrueErrorDeg": 0.003,
767
897
  "sunTropicalYearDiffSeconds": 0.1,
768
898
  "sunSiderealYearDiffSeconds": 0.02,
769
- "frameworkSunVsJplRmsArcsec": 0.8,
770
- "meeusCh25SunVsJplRmsArcsec": 1.22,
899
+ "frameworkSunVsJplRmsArcsec": 1.03,
900
+ "meeusCh25SunVsJplRmsArcsec": 1.02,
771
901
  "moonSeriesLonVsJplRmsArcsec": 2.84,
772
902
  "moonSeriesLatVsJplRmsArcsec": 0.35,
773
903
  "mercuryNewtonianArcsecCy": 532,
@@ -320,6 +320,14 @@ function createDeepOrbitalHistory({
320
320
  eSinPeri: e * Math.sin(periOfDateDeg * D2R),
321
321
  eCosPeri: e * Math.cos(periOfDateDeg * D2R),
322
322
  inclEclDeg: i * R2D,
323
+ // The orbit normal's in-plane components in the J2000 ecliptic frame
324
+ // (n̂ = (sin i sin Ω, −sin i cos Ω, cos i); the third component follows).
325
+ // With epsDeg and equinoxLonJ2000Deg these reconstruct the FULL Earth
326
+ // frame of date — n̂, the equinox ĝ and the spin axis ŝ — for the scene
327
+ // (earth/frame-of-date.cjs). Smooth and small (47″/cy): linear
328
+ // interpolation on the grid is exact to the ζ series' own resolution.
329
+ orbitNormalX: n[0],
330
+ orbitNormalY: n[1],
323
331
  // The equinox node (ŝ×n̂) longitude in the J2000 ecliptic frame —
324
332
  // its year-over-year retrograde advance IS the general precession of
325
333
  // date, wobble included (the n̂(t) geometry generates the equinox
@@ -420,6 +428,8 @@ function createDeepOrbitalHistory({
420
428
  eSinPeri: lerp(a.eSinPeri, b.eSinPeri),
421
429
  eCosPeri: lerp(a.eCosPeri, b.eCosPeri),
422
430
  inclEclDeg: lerp(a.inclEclDeg, b.inclEclDeg),
431
+ orbitNormalX: lerp(a.orbitNormalX, b.orbitNormalX),
432
+ orbitNormalY: lerp(a.orbitNormalY, b.orbitNormalY),
423
433
  // C1 (cubic Hermite) — linear interpolation here made the
424
434
  // realized equinox RATE piecewise-constant per grid cell (the
425
435
  // measured per-year precession staircase). Node rates come from