@essrt/physics 2.5.0 → 3.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.
- package/package.json +3 -2
- package/src/constants/generated.js +1 -1
- package/src/index.js +10 -2
- package/src/model.js +12 -5
- package/src/planets/chain-artifact.js +17 -0
- package/src/planets/keplerian-chain.cjs +304 -0
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@essrt/physics",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"description": "ESSRT (Expanding Solar System Resonance Theory) physics core \u2014 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": "
|
|
6
|
+
"modelVersion": "v13.0",
|
|
7
7
|
"_note": "The model identity this package version ships (IP-unified-architecture \u00a710: 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",
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
"./planets/asc-node-integrator": "./src/planets/asc-node-integrator.cjs",
|
|
46
46
|
"./planets/orbit-chain": "./src/planets/orbit-chain.cjs",
|
|
47
47
|
"./planets/corrections": "./src/planets/corrections.cjs",
|
|
48
|
+
"./planets/keplerian-chain": "./src/planets/keplerian-chain.cjs",
|
|
48
49
|
"./planets/predict": "./src/planets/predict.cjs",
|
|
49
50
|
"./planets/model": "./src/planets/model.cjs",
|
|
50
51
|
"./deltat/cycles": "./src/deltat/cycles.cjs",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
export const CONSTANTS_HASH = "ffbce6e075ca2f25";
|
|
36
36
|
|
|
37
37
|
/** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
|
|
38
|
-
export const MODEL_VERSION = "
|
|
38
|
+
export const MODEL_VERSION = "v13.0";
|
|
39
39
|
|
|
40
40
|
/** Canonical preprint DOI — single source: public/input/model-version.json. */
|
|
41
41
|
export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
|
package/src/index.js
CHANGED
|
@@ -118,6 +118,10 @@ export * as planetOrientation from './planets/orientation.cjs';
|
|
|
118
118
|
export { integrateAscendingNode } from './planets/asc-node-integrator.cjs';
|
|
119
119
|
export * as planetOrbitChain from './planets/orbit-chain.cjs';
|
|
120
120
|
export { evaluateParallaxBasis, gravitationTermDeltasDeg, evaluateElongationBasis } from './planets/corrections.cjs';
|
|
121
|
+
// P5/K4.6c — the engine-D Keplerian chain (pure evaluator + the embedded
|
|
122
|
+
// governed artifact; the browser flag path consumes exactly these).
|
|
123
|
+
export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from './planets/keplerian-chain.cjs';
|
|
124
|
+
export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from './planets/chain-artifact.js';
|
|
121
125
|
export { createPredictivePrecession, calcPlanetPerihelionLongDeg } from './planets/predict.cjs';
|
|
122
126
|
// L10 — the composition front door: one law set, N body records. Thin by
|
|
123
127
|
// design; engines keep their direct call sites (see planets/model.cjs).
|
|
@@ -145,9 +149,11 @@ export { createSunLongitudeCorrection } from './sun/longitude-correction.cjs';
|
|
|
145
149
|
* even though the body is empty.
|
|
146
150
|
*
|
|
147
151
|
* @param {Constants} [constants]
|
|
152
|
+
* @param {{ laws?: { eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number } }} [opts]
|
|
153
|
+
* `laws` — research overrides for Earth's orbit laws (doc 109 §7); absent = the shipped laws, bit-identical. Not part of the hash.
|
|
148
154
|
* @returns {Model}
|
|
149
155
|
*/
|
|
150
|
-
export const createModel = (constants = GENERATED) => {
|
|
156
|
+
export const createModel = (constants = GENERATED, opts = {}) => {
|
|
151
157
|
// Validation targets are not merely absent from DEFAULT_CONSTANTS — they are
|
|
152
158
|
// REFUSED here. Absence alone only stops the spread form
|
|
153
159
|
// `{...DEFAULT_CONSTANTS, x}`; nothing stopped a caller passing a bound
|
|
@@ -183,7 +189,9 @@ export const createModel = (constants = GENERATED) => {
|
|
|
183
189
|
|
|
184
190
|
// The §7a assembly: every factory wired from THIS context, so counterfactual
|
|
185
191
|
// constants flow through the entire motion model.
|
|
186
|
-
|
|
192
|
+
// opts.laws — research overrides for Earth's orbit laws (see assembleModel);
|
|
193
|
+
// absent = the shipped laws, bit-identical. Never part of the hash.
|
|
194
|
+
const surfaces = assembleModel(ctx, FITTED, opts.laws ?? {});
|
|
187
195
|
|
|
188
196
|
return {
|
|
189
197
|
constants: ctx,
|
package/src/model.js
CHANGED
|
@@ -65,9 +65,16 @@ const MOON_ECC_SENSITIVITY_NODE = 1.018;
|
|
|
65
65
|
*
|
|
66
66
|
* @param {Readonly<Record<string, any>>} C the frozen constants context
|
|
67
67
|
* @param {Readonly<Record<string, any>>} F the fitted coefficients
|
|
68
|
+
* @param {{ eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number }} [laws]
|
|
69
|
+
* RESEARCH OVERRIDES for Earth's orbit laws (doc 109 §7): an alternative e(t),
|
|
70
|
+
* de/dt(t) and ϖ_of-date(t) flow through every consumer (the eclipse Sun, the
|
|
71
|
+
* Moon's E-factor, the cardinal points) exactly as the shipped laws do. Default
|
|
72
|
+
* {} = the shipped laws, bit-identical to before this parameter existed. Not a
|
|
73
|
+
* counterfactual in the §2d sense (no hash change) — callers must say when
|
|
74
|
+
* they used it; the generators refuse to --write under an override.
|
|
68
75
|
* @returns the assembled surfaces (epoch, earth, lengths, cardinal, moon) — type inferred so ReturnType stays precise
|
|
69
76
|
*/
|
|
70
|
-
export function assembleModel(C, F) {
|
|
77
|
+
export function assembleModel(C, F, laws = {}) {
|
|
71
78
|
// ── Derived constants (constants.js §9 order) ─────────────────────────────
|
|
72
79
|
const H = C.foundational.holisticyearLength;
|
|
73
80
|
const meanSolarYearDays = Math.round(C.foundational.inputmeanlengthsolaryearindays * (H / 8)) / (H / 8);
|
|
@@ -290,14 +297,14 @@ export function assembleModel(C, F) {
|
|
|
290
297
|
|
|
291
298
|
// ── Earth scalars (integrated-phase display semantics) ────────────────────
|
|
292
299
|
/** @param {number} year @returns {number} */
|
|
293
|
-
const earthPerihelionDeg = (year) => {
|
|
300
|
+
const earthPerihelionDeg = laws.perihelionLongitudeDegAt ?? ((year) => {
|
|
294
301
|
let longitude = 270.0 + 360.0 * cyclesBetween(balancedYear, year, 16);
|
|
295
302
|
for (const [div, sinC, cosC] of F.PERI_HARMONICS_RAW) {
|
|
296
303
|
const ph = phaseRadians(balancedYear, year, div);
|
|
297
304
|
longitude += sinC * Math.sin(ph) + cosC * Math.cos(ph);
|
|
298
305
|
}
|
|
299
306
|
return (((longitude + F.PERI_OFFSET) % 360) + 360) % 360;
|
|
300
|
-
};
|
|
307
|
+
});
|
|
301
308
|
/** @param {number} year @returns {number} */
|
|
302
309
|
const obliquityDeg = (year) => {
|
|
303
310
|
let obliq = solsticeObliquityMean;
|
|
@@ -343,10 +350,10 @@ export function assembleModel(C, F) {
|
|
|
343
350
|
eccentricityJ2000: C.earthOrbital.earthEccentricityJ2000,
|
|
344
351
|
});
|
|
345
352
|
/** @param {number} year @returns {number} */
|
|
346
|
-
const eccentricityAt = (year) => moonEcc.eccAt(year - 2000);
|
|
353
|
+
const eccentricityAt = laws.eccentricityAt ?? ((year) => moonEcc.eccAt(year - 2000));
|
|
347
354
|
/** de/dyear of the one law — the cardinal braid's equation-of-centre
|
|
348
355
|
* derivative rides it. @param {number} year @returns {number} */
|
|
349
|
-
const eccentricityRateAt = (year) => moonEcc.eccRateAt(year - 2000);
|
|
356
|
+
const eccentricityRateAt = laws.eccentricityRateAt ?? ((year) => moonEcc.eccRateAt(year - 2000));
|
|
350
357
|
/** @param {number} year @returns {number} */
|
|
351
358
|
const inclinationDeg = (year) => earthInclMean
|
|
352
359
|
- earthInclAmplitude * Math.cos(phaseRadians(balancedYear, year, 3));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GENERATED — do not edit. Regenerate:
|
|
3
|
+
* node tools/constants/generate.mjs --write
|
|
4
|
+
*
|
|
5
|
+
* Source: data/nbody-secular-frequencies.json (the governed engine-D
|
|
6
|
+
* artifact), emitted VERBATIM. Two gates guard the two legs of the causal
|
|
7
|
+
* chain: check:artifacts pins artifact ↔ engine (input hashes name the
|
|
8
|
+
* regeneration command), this module's staleness check pins embed ↔ artifact.
|
|
9
|
+
* A changed planet mass therefore propagates engine → artifact → here → the
|
|
10
|
+
* browser scene, or a gate goes red.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/** @type {string} */
|
|
14
|
+
export const CHAIN_ARTIFACT_HASH = "e880abed97ebf1ba";
|
|
15
|
+
|
|
16
|
+
/** @type {Readonly<Record<string, unknown>>} */
|
|
17
|
+
export const CHAIN_ARTIFACT = Object.freeze({"_description":"Engine-D secular frequencies from the model’s own N-body pipeline (WH 1-Myr, 1PN on, NAFF), the 1800–2100 window rates (B), the Keplerian chain’s governed inputs (K2.1/P5: windowElementRates + j2000AnchorElements — era-typed window values and the t=0 anchor, the chain’s ONE home), the derived instantaneous 1PN apsidal supplement, and the K4.5/K4.7b derived periodic-term layer (periodicTerms: λ̄/a/z/ζ lines + era window affine, engine-measured — tools/explore/k45e-amplitude-solve.mjs). Frames: g ecliptic-J2000 z-modes, s INVARIABLE-plane ζ-modes. Laskar 2004 values are external reference labels (theory), never inputs. See tools/verify/nbody-secular.js for the assertions carried.","meta":{"integrator":"wh","order":2,"dtDays":2,"spanYears":1000000,"sampleDays":1000,"gr":true,"seed":"JPL Horizons J2000 heliocentric state vectors (tools/explore/j2000-state.mjs, the one home)","masses":"DE440 mass ratios (astro-reference physicalConstants)","naffTerms":8,"windowYears":[1800,2100],"laskarRef":"Laskar, J. et al. (2004), A&A 428, 261–285, Table 3","conservationMaxDE":1.1113907520896154e-8,"note1PN":"Mercury eigen-level 1PN shift ≈ +0.473 ″/yr (cycle-average of 1/(1−e²)) vs +0.430 instantaneous — not a discrepancy; only the instantaneous value is asserted (P8b).","periodicTermsMethod":"k45e era-centered LSQ (self-seeded prewhitening, golden-refined frequencies; K4.7b)","periodicTermsSpanYr":2500,"periodicTermsCadenceYr":0.1},"g":{"mercury":{"arcsecPerYr":5.575712797823945,"amplitude":0.17545096694269685,"nearestLaskar":{"mode":"g1","arcsecPerYr":5.5965}},"venus":{"arcsecPerYr":7.405845742227483,"amplitude":0.022570769830788477,"nearestLaskar":{"mode":"g2","arcsecPerYr":7.4555}},"earth":{"arcsecPerYr":4.346410041032439,"amplitude":0.019341964493845513,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"mars":{"arcsecPerYr":17.916696630844026,"amplitude":0.08882914197372903,"nearestLaskar":{"mode":"g4","arcsecPerYr":17.9159}},"jupiter":{"arcsecPerYr":4.256769523195223,"amplitude":0.044182672664934045,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"saturn":{"arcsecPerYr":28.245581358956457,"amplitude":0.04819349426795283,"nearestLaskar":{"mode":"g6","arcsecPerYr":28.2455}},"uranus":{"arcsecPerYr":3.921148698318919,"amplitude":0.0332189082697614,"nearestLaskar":{"mode":"g5","arcsecPerYr":4.2575}},"neptune":{"arcsecPerYr":0.6065154396549126,"amplitude":0.009569000717364112,"nearestLaskar":{"mode":"g8","arcsecPerYr":0.673}}},"s":{"mercury":{"arcsecPerYr":-5.586173808637174,"amplitude":0.059409340430501154,"nearestLaskar":{"mode":"s1","arcsecPerYr":-5.6197}},"venus":{"arcsecPerYr":-18.3363903851603,"amplitude":0.013576723462640201,"nearestLaskar":{"mode":"s3","arcsecPerYr":-18.8506}},"earth":{"arcsecPerYr":-18.39611848918824,"amplitude":0.01184463735421656,"nearestLaskar":{"mode":"s3","arcsecPerYr":-18.8506}},"mars":{"arcsecPerYr":-17.545402434182556,"amplitude":0.021473581268835227,"nearestLaskar":{"mode":"s4","arcsecPerYr":-17.7553}},"jupiter":{"arcsecPerYr":-26.347747510182444,"amplitude":0.0031511446932465333,"nearestLaskar":{"mode":"s6","arcsecPerYr":-26.3475}},"saturn":{"arcsecPerYr":-26.34770515585438,"amplitude":0.007853480398801458,"nearestLaskar":{"mode":"s6","arcsecPerYr":-26.3475}},"uranus":{"arcsecPerYr":-2.999782557988895,"amplitude":0.008744980387074497,"nearestLaskar":{"mode":"s7","arcsecPerYr":-2.9927}},"neptune":{"arcsecPerYr":-0.7119237190344891,"amplitude":0.005960579851589255,"nearestLaskar":{"mode":"s8","arcsecPerYr":-0.6919}}},"secularModes":{"mercury":{"z":[{"omegaRadPerYr":0.000027031818463225768,"re":0.0061578259451980115,"im":0.17534287262605214},{"omegaRadPerYr":0.00003762575562965475,"re":0.022801391439964295,"im":0.008306970885650663},{"omegaRadPerYr":0.00001819756010161927,"re":0.019634392385947316,"im":0.014089365629220058},{"omegaRadPerYr":0.000011448057114609211,"re":-0.005593515523159691,"im":-0.0029052231145468826},{"omegaRadPerYr":0.00004414416237516322,"re":-0.0058059195322990535,"im":-0.0014204432190273834}],"zeta":[{"omegaRadPerYr":-0.000027080770518521117,"re":0.058209232182515294,"im":0.011937299831838749},{"omegaRadPerYr":-0.00003532228218977498,"re":0.004745715778503308,"im":0.009067515752921801},{"omegaRadPerYr":6.775714890718091e-8,"re":-0.0039039071253357234,"im":0.013489752627573397},{"omegaRadPerYr":-0.000014531803306709756,"re":-0.0027805829079540424,"im":0.001873307195814228},{"omegaRadPerYr":-0.00008871641521465394,"re":-0.00011206141890946473,"im":-0.0024785290535285108},{"omegaRadPerYr":-0.00004086484773308675,"re":-0.0009298161832617493,"im":0.0013601243172003264},{"omegaRadPerYr":-0.0000320673476361423,"re":-0.013260807519741909,"im":0.010385681846746578}]},"venus":{"z":[{"omegaRadPerYr":0.000035904553360186896,"re":-0.0211984643558249,"im":-0.007750145786322514},{"omegaRadPerYr":0.000021373474422862907,"re":0.016886761236088624,"im":0.011238461694226397},{"omegaRadPerYr":0.0000891126674473552,"re":0.0050874946506860065,"im":-0.005109367673184332},{"omegaRadPerYr":0.00002871637284884016,"re":-0.0017393876896891237,"im":0.005587660035943027},{"omegaRadPerYr":0.0000799342923050964,"re":-0.0044448366327981305,"im":-0.0000503440797393948},{"omegaRadPerYr":0.000012541690188563,"re":0.0004535723363856848,"im":0.0009117376424311817}],"zeta":[{"omegaRadPerYr":-0.00008889595040236661,"re":0.0014429354865157266,"im":0.013492668736937167},{"omegaRadPerYr":-2.9208356071391507e-8,"re":-0.0038419612953034085,"im":0.01343833962446885},{"omegaRadPerYr":-0.000027486544944080902,"re":0.008423422326469315,"im":0.0009256786850090009},{"omegaRadPerYr":-0.000035402171418589797,"re":0.0007435050926828158,"im":-0.0028971907452019956},{"omegaRadPerYr":-0.0000816605133107709,"re":-0.0010567171844393416,"im":0.0017536585345055515},{"omegaRadPerYr":-0.00009527377513796924,"re":0.001562527173160095,"im":0.00142794192883987},{"omegaRadPerYr":-0.000022714283438616226,"re":0.0006900663832152563,"im":0.0009409483713469917},{"omegaRadPerYr":-0.000012901293108561725,"re":-0.0007909153616483306,"im":0.0007730683997926797}]},"earth":{"z":[{"omegaRadPerYr":0.000021071990516043863,"re":0.016301183796398024,"im":0.010410715504576574},{"omegaRadPerYr":0.000035854880135688966,"re":-0.016689300824841616,"im":-0.00587694407980285},{"omegaRadPerYr":0.00008867935711133655,"re":-0.006205359589321793,"im":0.0059045379227095785},{"omegaRadPerYr":0.00007976873965068339,"re":0.003442662776173624,"im":0.00018161801434096533},{"omegaRadPerYr":0.000028440629463153055,"re":-0.0007693818323351555,"im":0.0036759836693912766},{"omegaRadPerYr":0.0001368996733554364,"re":-0.0008112549290125483,"im":0.0011800841029160098}],"zeta":[{"omegaRadPerYr":-2.789132719584616e-8,"re":-0.003980175066603849,"im":0.01346535718722163},{"omegaRadPerYr":-0.00008918684866422754,"re":-0.0017818272301117842,"im":-0.01171473788270621},{"omegaRadPerYr":-0.000027565953011645597,"re":0.005837345967007995,"im":0.0005767264828698533},{"omegaRadPerYr":-0.000035436881992393566,"re":0.0005316599469742484,"im":-0.002298310523068399},{"omegaRadPerYr":-0.00012766579969759884,"re":-0.0006080730450000734,"im":0.0011811620431347754},{"omegaRadPerYr":-0.00008175633290332968,"re":0.0008468767179477169,"im":-0.0014453751935461902},{"omegaRadPerYr":-0.00009544829395201416,"re":-0.0013543922729998166,"im":-0.0011678254911581005},{"omegaRadPerYr":-0.000022618656478089485,"re":0.0008212474154199974,"im":0.0007376186464093101}]},"mars":{"z":[{"omegaRadPerYr":0.00008686259646922313,"re":0.06413361286031954,"im":-0.061461338785219796},{"omegaRadPerYr":0.000020710599293705756,"re":0.0168815770314768,"im":0.010181016750981363},{"omegaRadPerYr":0.00013701274439308748,"re":-0.004154546031788784,"im":0.0052484404204072264},{"omegaRadPerYr":0.00007830364627518509,"re":0.006610030627920962,"im":0.00716773876788036},{"omegaRadPerYr":0.0000967464223286991,"re":0.00669811842776162,"im":-0.0005917424234258758},{"omegaRadPerYr":0.00003622387429863297,"re":-0.0037118530783633074,"im":-0.001197130016454561},{"omegaRadPerYr":0.00007107828755070232,"re":-0.0030272556571569256,"im":-0.0021089438693236047}],"zeta":[{"omegaRadPerYr":-0.00008506290699879281,"re":0.007775523866870005,"im":-0.02001096343618598},{"omegaRadPerYr":-0.00009339911610380382,"re":0.009574153430346467,"im":0.01499249567600023},{"omegaRadPerYr":-2.1361701870262538e-8,"re":-0.003652982290513836,"im":0.013619195708169822},{"omegaRadPerYr":-0.00012775359218502626,"re":-0.0023045039444621073,"im":0.0035319422124707343},{"omegaRadPerYr":-0.00007647491607131078,"re":0.0003559447186960134,"im":0.00225681738420922},{"omegaRadPerYr":-0.00009952035224595763,"re":-0.002686141523001369,"im":-0.0032247663817401412}]},"jupiter":{"z":[{"omegaRadPerYr":0.000020637401021751606,"re":0.03775130376392058,"im":0.022955339856793808},{"omegaRadPerYr":0.0001369384796979771,"re":0.009695326488717567,"im":-0.012378818304894155},{"omegaRadPerYr":0.00001285183951543766,"re":-0.0008196553575553386,"im":0.0013298147968340598},{"omegaRadPerYr":0.0002532450446505381,"re":0.00041541273181667615,"im":0.0003999550758746959},{"omegaRadPerYr":0.000006063027991986138,"re":0.00018743032373578906,"im":-0.0002594778854773961},{"omegaRadPerYr":0.000031414566802098374,"re":-0.00014101517848288215,"im":0.00024144519615503003}],"zeta":[{"omegaRadPerYr":-2.1490404832806168e-8,"re":-0.0036895385366188783,"im":0.013265898846260308},{"omegaRadPerYr":-0.0001277374796658874,"re":0.0018884354550522274,"im":-0.00251606466916287},{"omegaRadPerYr":-0.000015175434386812629,"re":-0.0004021019571492075,"im":0.0003117907932519991},{"omegaRadPerYr":-0.000006632717903107953,"re":0.0003009472423168709,"im":0.0001317099906824581},{"omegaRadPerYr":0.000003955724900485721,"re":-0.0002689226108809528,"im":2.564175400368284e-7},{"omegaRadPerYr":-0.000020525770532327617,"re":0.00010370417805463956,"im":-0.000024424616444032364}]},"saturn":{"z":[{"omegaRadPerYr":0.0001369384427371457,"re":-0.02960653952726686,"im":0.03802717064120847},{"omegaRadPerYr":0.00002063674100262723,"re":0.028150073232470787,"im":0.01709774750149962},{"omegaRadPerYr":0.00025324837081694125,"re":-0.0013606989653353102,"im":-0.0013821126035298548},{"omegaRadPerYr":0.000012847385779998076,"re":-0.0006853047928644228,"im":0.0011218181664192914},{"omegaRadPerYr":0.00012770394549879298,"re":0.00030532747308216533,"im":0.00020649598646880408},{"omegaRadPerYr":0.00014631533310756968,"re":0.0002679684896809784,"im":0.00022796694930874033},{"omegaRadPerYr":-0.00009568507237176567,"re":-0.000049572612945519304,"im":0.00011688249888045971}],"zeta":[{"omegaRadPerYr":-1.9284984538258004e-8,"re":-0.003708721248959303,"im":0.013267262775914458},{"omegaRadPerYr":-0.0001277372896899594,"re":-0.00473585842558015,"im":0.006270978893125488},{"omegaRadPerYr":-0.000015325638313367067,"re":-0.000342091983477944,"im":0.0002459194020261331},{"omegaRadPerYr":-0.0000065831107802777746,"re":0.0002849200201049732,"im":0.00012107400921002766},{"omegaRadPerYr":0.000003999922886015977,"re":-0.00025809587923422754,"im":-0.000010818807501830861},{"omegaRadPerYr":-0.000020373996231109695,"re":0.00011127740663504409,"im":-0.00002191187386888525}]},"uranus":{"z":[{"omegaRadPerYr":0.000019010265346098605,"re":-0.033200286080063916,"im":0.0011121469492544251},{"omegaRadPerYr":0.000012033775574177009,"re":-0.008077561115556027,"im":0.02293125999571007},{"omegaRadPerYr":0.000023775733149813484,"re":-0.008710621833115826,"im":-0.016095355591969604},{"omegaRadPerYr":0.000007822007075432675,"re":0.0016021840612059168,"im":-0.009621969113692156},{"omegaRadPerYr":0.00002952547228417886,"re":0.0016566445996550965,"im":0.006018707505057967},{"omegaRadPerYr":0.00013694007244464723,"re":0.0009292339240691288,"im":-0.0016372467645427197}],"zeta":[{"omegaRadPerYr":7.599421366412143e-8,"re":-0.004660490353585718,"im":0.01324646340758287},{"omegaRadPerYr":-0.000014567449496838837,"re":0.006613328514408994,"im":-0.005878235417711313},{"omegaRadPerYr":-0.000007051181231496491,"re":-0.0004558064482609971,"im":-0.00031393562385899923},{"omegaRadPerYr":0.000003329914022932244,"re":0.0003411959761619822,"im":-0.0003305440071371085},{"omegaRadPerYr":-0.0001277295137673612,"re":0.00021735572403603482,"im":-0.00029463734768672754},{"omegaRadPerYr":-0.00002335403426632458,"re":-0.00006477073255467024,"im":-0.00008547519620498973}]},"neptune":{"z":[{"omegaRadPerYr":0.0000029404698294886683,"re":0.002583276204603991,"im":0.009213710369858697},{"omegaRadPerYr":0.000015819958189246093,"re":0.002410719467240076,"im":-0.0028958675920111618},{"omegaRadPerYr":0.00002325097119532629,"re":0.001159396623354508,"im":0.001106111966705049},{"omegaRadPerYr":-0.0000035890886114523422,"re":-0.00020879605377416773,"im":-0.0006167290950842672},{"omegaRadPerYr":0.000030374670292163826,"re":-0.0002774301776095828,"im":-0.0002388641303570229}],"zeta":[{"omegaRadPerYr":-3.301733513849372e-7,"re":-0.008762838168102518,"im":0.010494876534409803},{"omegaRadPerYr":-0.000007353421929989998,"re":-0.0024807316856027294,"im":-0.0014503561615380218},{"omegaRadPerYr":0.000004080233598697059,"re":0.0018281727993976064,"im":0.002054509738245118},{"omegaRadPerYr":-0.000014881778065736648,"re":-0.00013356695251210882,"im":0.0011500105634289276},{"omegaRadPerYr":0.00001160480877156738,"re":-0.0005630431963197903,"im":-0.0005345014452666219},{"omegaRadPerYr":-0.000020788597979173094,"re":-0.0005111003177756488,"im":-0.00044451839396914716}]}},"windowRatesArcsecCy":{"gr":{"mercury":572.0163954148283,"venus":22.72580010599836,"earth":1154.4288756665303,"mars":1597.8081246982024,"jupiter":488.52901897634354,"saturn":-1576.6419790262526,"uranus":806.6031271547791,"neptune":9101.672820143169},"newton":{"mercury":529.0318184207404,"venus":14.090631090521121,"earth":1150.5947011086469,"mars":1596.4568002639046,"jupiter":488.4665375503103,"saturn":-1576.655982201358,"uranus":806.6007460587327,"neptune":9101.678202054029}},"windowElementRates":{"mercury":{"meanMotionDegPerYr":1494.7257434850626,"nodeRateArcsecCy":-451.23114506979533,"eccDotPerCy":0.000020426777739608027,"inclDotArcsecCy":-21.43063243338586},"venus":{"meanMotionDegPerYr":585.1779096296486,"nodeRateArcsecCy":-1000.3062148126329,"eccDotPerCy":-0.00004798428729899649,"inclDotArcsecCy":-2.9741785335138227},"earth":{"meanMotionDegPerYr":359.9936510408777,"nodeRateArcsecCy":287648.7600662079,"eccDotPerCy":-0.00004200482595462892,"inclDotArcsecCy":-22.64742397865307},"mars":{"meanMotionDegPerYr":191.40299923220516,"nodeRateArcsecCy":-1059.1798892427676,"eccDotPerCy":0.0000917178876575738,"inclDotArcsecCy":-29.268508116285304},"jupiter":{"meanMotionDegPerYr":30.347302970895168,"nodeRateArcsecCy":724.7057759408735,"eccDotPerCy":-0.0000876138498378255,"inclDotArcsecCy":-7.070016683580993},"saturn":{"meanMotionDegPerYr":12.225441692771112,"nodeRateArcsecCy":-1041.0659036365291,"eccDotPerCy":-0.00027446940576446793,"inclDotArcsecCy":8.397686122084723},"uranus":{"meanMotionDegPerYr":4.284939547595869,"nodeRateArcsecCy":114.5093750648986,"eccDotPerCy":-0.00009620843043291943,"inclDotArcsecCy":-8.163218561711115},"neptune":{"meanMotionDegPerYr":2.184556718701332,"nodeRateArcsecCy":-12.96633501054956,"eccDotPerCy":0.00038317519496411644,"inclDotArcsecCy":1.294056435039746}},"j2000AnchorElements":{"mercury":{"aAU":0.3870982306507114,"e":0.20563023607048908,"inclEclipticDeg":7.005014303274938,"ascNodeEclipticDeg":48.33053855197437,"lonPeriEclipticDeg":77.45482144099158,"meanLonEclipticDeg":252.25070308850388},"venus":{"aAU":0.723326980236553,"e":0.006755832524369414,"inclEclipticDeg":3.3945896490801655,"ascNodeEclipticDeg":76.67837411646671,"lonPeriEclipticDeg":131.86481574575365,"meanLonEclipticDeg":181.97911300917644},"earth":{"aAU":0.9999965019964896,"e":0.016702435651957018,"inclEclipticDeg":0.00010345820355474172,"ascNodeEclipticDeg":140.29217988414328,"lonPeriEclipticDeg":462.9179213996577,"meanLonEclipticDeg":100.46313620647612},"mars":{"aAU":1.5236791234560592,"e":0.09331517469683501,"inclEclipticDeg":1.8498764556630205,"ascNodeEclipticDeg":49.56200645402683,"lonPeriEclipticDeg":336.0994054433697,"meanLonEclipticDeg":355.4558712806536},"jupiter":{"aAU":5.204267043121455,"e":0.04877494875045604,"inclEclipticDeg":1.304625372772227,"ascNodeEclipticDeg":100.49162135259076,"lonPeriEclipticDeg":375.5576634246116,"meanLonEclipticDeg":34.37610122976946},"saturn":{"aAU":9.582017927199528,"e":0.05572345073837687,"inclEclipticDeg":2.4852504409844323,"ascNodeEclipticDeg":113.64296212519966,"lonPeriEclipticDeg":449.65653541437854,"meanLonEclipticDeg":50.00443784290724},"uranus":{"aAU":19.22941789809548,"e":0.04440546894120367,"inclEclipticDeg":0.7725675263742898,"ascNodeEclipticDeg":73.98941630128037,"lonPeriEclipticDeg":170.53113765495846,"meanLonEclipticDeg":313.4868371274142},"neptune":{"aAU":30.103641823294048,"e":0.01121513931197063,"inclEclipticDeg":1.7679863485740834,"ascNodeEclipticDeg":131.79386605766496,"lonPeriEclipticDeg":397.44244290669224,"meanLonEclipticDeg":305.20853660850446}},"relativisticSupplementArcsecCy":{"mercury":42.98142753750674,"venus":8.624988679409013,"earth":3.838964853078437,"mars":1.3510691613456707,"jupiter":0.06243854269534776,"saturn":0.013727538363259385,"uranus":0.0023997870642552053,"neptune":0.0007833188044413818},"checks":{"mercuryClosureArcsecCy":{"measuredWindowDelta":42.98457699408789,"derivedInstantaneous":42.98142753750674,"diff":0.003149456581148513,"tolerance":0.1},"earthMeanMotionVsSiderealAnchor":{"engineDegPerYr":359.9936510408777,"modelSiderealDegPerYr":359.9937285652708,"diffArcsecPerYr":-0.279087815283674,"tolerance":2},"saturnG6":{"measured":28.245581358956457,"laskar":28.2455},"jupiterG5":{"measured":4.256769523195223,"laskar":4.2575}},"inputs":{"generator":"node tools/verify/nbody-secular.js --write","files":{"packages/physics/src/planets/keplerian-chain.cjs":"sha256:1adb5ac0df1cbb36ad9ccfa855eae8d339f894883ad7e06ec799ccc1110a7871","public/input/astro-reference.json":"sha256:0e61f5bec0ee3c44016781599498db75067070e74aeddc89b2f5bd6bc2782918","tools/explore/j2000-state.mjs":"sha256:ef15efde06948b36b589e3f790e6c5ccda64b8c1e1899cb4ff1e5f1571149611","tools/explore/k45-residual-naff.mjs":"sha256:228eb4874adca9171d61c1697ffbbaac3ce82891476a34762bf882840ccae406","tools/explore/k45e-amplitude-solve.mjs":"sha256:d5ce9f8d3e38d49988b089542882833dd4c631125b5b4e21eff13b119eee45e8","tools/explore/lattice-long-window-test.mjs":"sha256:893ff6900a458b9a6f8d4f0978e496495f58be792cbaf1379629d62ab3d42626","tools/explore/naff-frequencies.mjs":"sha256:85178139faf0894c8cf62a7aa0a92395dab7afa6ab33efee93b63712ef257ed2","tools/explore/nbody-wh.mjs":"sha256:42947b7492e81dd412a97e0a794412706d16d6a42f2fde38310877fd1051c777","tools/lib/keplerian-chain.js":"sha256:7be1a96b20174d8c2726ec984250646093a847a5cf7e06d8e1e2ffae926ff5c9","tools/verify/nbody-secular.js":"sha256:f71112a27cca71d97811597fb86cf762a2ccab21c6af7d1ca8c0340acdaf8d81"}},"periodicTerms":{"mercury":{"mlonArcsec":[{"omegaRadPerYr":1.1094782578638633,"cos":0.4283393261961084,"sin":-7.326527509234423},{"omegaRadPerYr":5.661360380927949,"cos":-2.042649039570386,"sin":2.931772290428614}],"aPpm":[],"z":[],"zeta":[],"windowAffine":{"mlon":{"off":-3.0393736875871302,"slope":2.841277225316435},"a":{"off":0.2758746522782975,"slope":-7.212979068927238e-8},"k":{"off":-0.000010308133413000659,"slope":-3.078102566616934e-7},"h":{"off":-0.000016422197583177168,"slope":3.7560192853821967e-7},"q":{"off":0.000010395164103761334,"slope":-1.838228216218485e-7},"p":{"off":-0.0000045514783478873524,"slope":-4.54454512200622e-8}}},"venus":{"mlonArcsec":[],"aPpm":[],"z":[{"omegaRadPerYr":1.5773449192709434,"re":5.7688362360462365e-8,"im":5.534221828564653e-8},{"omegaRadPerYr":-1.5773449192709434,"re":0.000010314865584099027,"im":-0.0000198748787238016}],"zeta":[],"windowAffine":{"mlon":{"off":3.5948127312304887,"slope":0.5465947510597761},"a":{"off":4.008943004747135,"slope":7.075860643009611e-7},"k":{"off":0.00001907619455854608,"slope":-1.3082845363477187e-8},"h":{"off":0.00003129559857960834,"slope":-1.441522288917906e-8},"q":{"off":0.00000369074550376789,"slope":-5.1716895028481445e-8},"p":{"off":0.000005182645310723055,"slope":4.982987600455474e-8}}},"mars":{"mlonArcsec":[{"omegaRadPerYr":0.003412137087635026,"cos":53.66134652943842,"sin":17.0702224095311},{"omegaRadPerYr":0.19158768233986423,"cos":4.119097641894965,"sin":-4.748875287824893},{"omegaRadPerYr":0.39807082074986866,"cos":12.712294840261926,"sin":-4.8937042567324385},{"omegaRadPerYr":0.7961398668364265,"cos":1.4218153844689059,"sin":4.144231910196455}],"aPpm":[],"z":[{"omegaRadPerYr":0.3981475229837692,"re":-0.000006022352586612927,"im":-0.000016334865019193796},{"omegaRadPerYr":-0.3981475229837692,"re":-1.906831770330436e-7,"im":-4.274257222159089e-7},{"omegaRadPerYr":0.5296892164591163,"re":-0.00003701074387998172,"im":-0.000026873075674723054},{"omegaRadPerYr":-0.5296892164591163,"re":-4.860521864995133e-7,"im":3.4682346833132817e-7}],"zeta":[],"windowAffine":{"mlon":{"off":-83.40368679689061,"slope":-0.1308571754299822},"a":{"off":0.22572896074793633,"slope":0.00002462826981976612},"k":{"off":0.000055581565502195474,"slope":-3.330033606281005e-7},"h":{"off":-0.00011828467060704684,"slope":8.036921269251493e-8},"q":{"off":-0.000004188215333238016,"slope":1.6809402416370802e-7},"p":{"off":-0.000015868506481068194,"slope":-5.921860993754493e-8}}},"jupiter":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":193.3832216620771,"sin":380.597621447694},{"omegaRadPerYr":0.0012063073379189023,"cos":-3.9274841583289564,"sin":-80.09301290875467},{"omegaRadPerYr":0.004160979269962051,"cos":-1.69943829568573,"sin":10.726068111658648},{"omegaRadPerYr":0.005711423877210773,"cos":58.571129321431584,"sin":-126.86137607602102},{"omegaRadPerYr":0.0060611490662863445,"cos":-197.7236817832274,"sin":527.5745834567023},{"omegaRadPerYr":0.006400320486794552,"cos":379.14030538693584,"sin":-996.4275081012628},{"omegaRadPerYr":0.006927123132186677,"cos":-96.86651973973018,"sin":-625.8640378432207},{"omegaRadPerYr":0.00734753548346981,"cos":8.43825109969694,"sin":46.700085406090466},{"omegaRadPerYr":0.013416263751242975,"cos":2.917377177432902,"sin":-10.573630606149845},{"omegaRadPerYr":0.10286332259410932,"cos":-55.41328203440606,"sin":28.51871156692714},{"omegaRadPerYr":0.10341539484729162,"cos":-77.12097788008923,"sin":9.202995253429414},{"omegaRadPerYr":0.1100425288520466,"cos":3.899298688610127,"sin":-10.215251943431543},{"omegaRadPerYr":0.20645396403363098,"cos":-12.573442445414853,"sin":6.295822342082753},{"omegaRadPerYr":0.21316426593910423,"cos":10.054032585538861,"sin":-1.4152085169745214},{"omegaRadPerYr":0.3163921030750765,"cos":14.356082594113289,"sin":-47.02291299274492},{"omegaRadPerYr":0.4196206573492547,"cos":-18.86823087866421,"sin":-20.24646022413696},{"omegaRadPerYr":0.5228460556683714,"cos":-3.4375496090271564,"sin":0.6151505966978332},{"omegaRadPerYr":0.5295794256693848,"cos":3.217907378493207,"sin":1.975307816916936},{"omegaRadPerYr":0.6327839673705462,"cos":35.3349228950653,"sin":-56.4049785284849},{"omegaRadPerYr":0.7360122252144383,"cos":-4.7168510713684295,"sin":-9.5724698724},{"omegaRadPerYr":0.949175502963057,"cos":17.822449799701438,"sin":-16.382728937959474},{"omegaRadPerYr":1.2655672106357103,"cos":8.87498412842184,"sin":-4.569657084971597}],"aPpm":[{"omegaRadPerYr":0.006719118472690749,"cos":48.57374276056867,"sin":5.718778591306203},{"omegaRadPerYr":0.10316587166928487,"cos":-20.64279315909391,"sin":-58.4592094563138},{"omegaRadPerYr":0.31639212053382026,"cos":37.85268365288874,"sin":11.814375674076771},{"omegaRadPerYr":0.4196197886355212,"cos":32.19572358006155,"sin":-26.99428023819792},{"omegaRadPerYr":0.6327837640748681,"cos":112.58712391466997,"sin":70.37241144145064},{"omegaRadPerYr":0.7360111762024295,"cos":20.869632878207252,"sin":-9.118091922845995},{"omegaRadPerYr":0.9491754071485186,"cos":40.75667943910494,"sin":43.811460605574815}],"z":[{"omegaRadPerYr":-0.0006207787083493434,"re":-0.000007760801206480335,"im":0.0000016579719102905573},{"omegaRadPerYr":0.0006207787083493449,"re":-0.000008695682534227633,"im":-0.000006359405183752185},{"omegaRadPerYr":-0.004432186705238992,"re":3.2207615300300247e-7,"im":-6.196347944817902e-7},{"omegaRadPerYr":0.006185044486880686,"re":-0.000004731941541673283,"im":-0.0000017729858354297809},{"omegaRadPerYr":0.006526633569639799,"re":0.00004150382284636084,"im":0.000017534400952133703},{"omegaRadPerYr":0.006841730692169909,"re":-0.0002026998234541423,"im":0.0003233646880686746},{"omegaRadPerYr":0.007470533994347621,"re":-0.0000049281296015436406,"im":-0.0000012002820271097082},{"omegaRadPerYr":0.013548716908851125,"re":-0.000002377738793176193,"im":0.000006656435245445941},{"omegaRadPerYr":-0.0963835641459155,"re":0.000004243818371947522,"im":0.000006318732294994447},{"omegaRadPerYr":-0.10309304895354462,"re":0.0002599772038145943,"im":0.0005935193398974658},{"omegaRadPerYr":0.10334256718399279,"re":0.00001068106998793681,"im":-7.548205310553664e-7},{"omegaRadPerYr":-0.10355795380749366,"re":-2.1154636946827e-7,"im":-5.390710095107589e-8},{"omegaRadPerYr":0.10974751126305515,"re":0.0000011302669198675927,"im":0.000006702466721595302},{"omegaRadPerYr":-0.10980538631044515,"re":-0.000002866815045583102,"im":-0.000009885070817152992},{"omegaRadPerYr":0.11007006680531065,"re":-0.00013061727670124666,"im":0.000009881348055011194},{"omegaRadPerYr":0.20631979856483246,"re":5.04298118741976e-7,"im":2.480806224515503e-7},{"omegaRadPerYr":-0.20631979856483246,"re":0.00006341492203955716,"im":0.000011273250168154838},{"omegaRadPerYr":0.2132961022923942,"re":-0.00005065824330209699,"im":-0.00006271190037317963},{"omegaRadPerYr":-0.2132961022923942,"re":-0.000004406921581341513,"im":-0.0000016060783929656262},{"omegaRadPerYr":-0.30955001412647276,"re":0.0000056019124603202195,"im":-0.000005441874625394522},{"omegaRadPerYr":0.41948265838592674,"re":-9.509570952152945e-8,"im":-0.0000012590269907950825},{"omegaRadPerYr":-0.41948265838592674,"re":0.000014641220619062486,"im":0.00010495558350565439},{"omegaRadPerYr":0.426466505091871,"re":-0.0000064497978114164694,"im":0.000013430976495086736},{"omegaRadPerYr":-0.426466505091871,"re":-1.7392937473622375e-8,"im":-0.000002543548554022179},{"omegaRadPerYr":0.5227123063902634,"re":-6.493200167943617e-8,"im":-1.9428718738465597e-7},{"omegaRadPerYr":-0.5227123063902634,"re":0.00001824269392489439,"im":0.00000906975764089715},{"omegaRadPerYr":0.5296909646421464,"re":-0.000023988048624019953,"im":-0.000016305548718652476},{"omegaRadPerYr":0.7358764924026054,"re":-5.772321676657591e-7,"im":-9.031194308086103e-8},{"omegaRadPerYr":-0.7358764924026054,"re":-0.000004926448326111552,"im":0.00003725847350296657}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.0000017148670408172224,"im":-1.1979774717324106e-7},{"omegaRadPerYr":0.0006207787083493434,"re":0.0000073648358837529556,"im":-0.000001424067731329963},{"omegaRadPerYr":0.0011047092477748065,"re":-7.000878721120519e-7,"im":-2.3731715104835338e-7},{"omegaRadPerYr":0.0071090112684356,"re":-0.000003975092067696403,"im":0.0000075798744823925934}],"windowAffine":{"mlon":{"off":-276.6789283580293,"slope":6.146016597905851},"a":{"off":-319.6050905273606,"slope":0.0007796076926885039},"k":{"off":0.000014289210688706095,"slope":2.880479286878237e-8},"h":{"off":-0.001073832363366988,"slope":-2.534500776380545e-8},"q":{"off":-0.0000010335341247600158,"slope":1.4914208056557646e-9},"p":{"off":-0.000008818002194016852,"slope":3.0856264717746908e-9}}},"saturn":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":-451.253615891754,"sin":145.98152908438132},{"omegaRadPerYr":0.004165525534002769,"cos":5.787274939055933,"sin":-12.703810065013153},{"omegaRadPerYr":0.005711612505032101,"cos":-189.54704549967167,"sin":-160.138901914935},{"omegaRadPerYr":0.006061128582866573,"cos":603.7466010253094,"sin":-8.700856030526818},{"omegaRadPerYr":0.0064003167157022246,"cos":-1037.3698907699634,"sin":1226.0959465379547},{"omegaRadPerYr":0.006927098454757736,"cos":279.6703017478956,"sin":2098.4367623243365},{"omegaRadPerYr":0.007347527790309774,"cos":-31.43305366096744,"sin":-283.15643985756446},{"omegaRadPerYr":0.009480611716879448,"cos":-0.4507335945350436,"sin":4.79424382361373},{"omegaRadPerYr":0.010945707057204556,"cos":25.998025191315012,"sin":6.51039808953889},{"omegaRadPerYr":0.01341613162135763,"cos":-7.425964486999675,"sin":26.129189937928867},{"omegaRadPerYr":0.06380203049325128,"cos":-4.956781443209341,"sin":-5.857273277892975},{"omegaRadPerYr":0.09641501836240508,"cos":1.093655918412904,"sin":-3.2100722037931555},{"omegaRadPerYr":0.10286386181613702,"cos":99.08099439180381,"sin":-63.162454954986316},{"omegaRadPerYr":0.10333438844615983,"cos":212.53124729979737,"sin":-24.123206548331538},{"omegaRadPerYr":0.11004419279928404,"cos":-8.76642821816064,"sin":25.14155702073091},{"omegaRadPerYr":0.1384221456508977,"cos":-4.142308935304489,"sin":0.3359277714106255},{"omegaRadPerYr":0.2064531916682817,"cos":30.963724773182314,"sin":-15.259788419608947},{"omegaRadPerYr":0.2131887934790523,"cos":-24.29491341571394,"sin":-6.982168144064149},{"omegaRadPerYr":0.2770241887124282,"cos":1.4543542593835515,"sin":6.3793376087284965},{"omegaRadPerYr":0.31639189446899674,"cos":-148.12974553923905,"sin":514.8691214437579},{"omegaRadPerYr":0.3231050733335511,"cos":2.178111128712694,"sin":-4.849441591870168},{"omegaRadPerYr":0.41962101131042784,"cos":43.79639605758242,"sin":47.62049382853528},{"omegaRadPerYr":0.4263384811647367,"cos":-1.9599761156575544,"sin":-4.910375543643042},{"omegaRadPerYr":0.5228461938866507,"cos":7.6492352759963484,"sin":-1.4042408711820147},{"omegaRadPerYr":0.5296206925660197,"cos":20.82311358880523,"sin":-21.723522060178187},{"omegaRadPerYr":0.6327839463508664,"cos":-77.8067933782241,"sin":124.58143011814512},{"omegaRadPerYr":0.7360122996869195,"cos":11.252910261739688,"sin":22.663624511588285},{"omegaRadPerYr":0.8460438288764272,"cos":1.8113799261773025,"sin":20.756673170052206},{"omegaRadPerYr":0.9491754962353995,"cos":-40.339539075190224,"sin":37.047932328557295},{"omegaRadPerYr":1.2655672066097283,"cos":-20.25042369756606,"sin":10.420773654426046}],"aPpm":[{"omegaRadPerYr":0.006719059935042215,"cos":-298.1739213236028,"sin":-35.65492072514902},{"omegaRadPerYr":0.10311278023647517,"cos":329.05242810267646,"sin":168.2053446152665},{"omegaRadPerYr":0.1099870935042278,"cos":-80.20082859738086,"sin":25.677992848453474},{"omegaRadPerYr":0.20645076221400505,"cos":22.365346624696144,"sin":52.11596047023494},{"omegaRadPerYr":0.21316470395286807,"cos":22.417376358933,"sin":148.19540823121667},{"omegaRadPerYr":0.3096741611131529,"cos":40.76320120805859,"sin":6.028630477781981},{"omegaRadPerYr":0.31639181272876266,"cos":3380.8172681042483,"sin":952.19154868527},{"omegaRadPerYr":0.41962072059820554,"cos":-117.61845886216751,"sin":102.62640456035058},{"omegaRadPerYr":0.522848349625552,"cos":2.3692526123597575,"sin":25.55482510964822},{"omegaRadPerYr":0.6327843055552796,"cos":-267.8385275274031,"sin":-178.81334724872872},{"omegaRadPerYr":0.7360113200820578,"cos":-70.20882189811421,"sin":30.840529284060356},{"omegaRadPerYr":0.8460447241275829,"cos":152.71397931748962,"sin":-11.548664498369881},{"omegaRadPerYr":0.9491754312473957,"cos":-100.97703552341146,"sin":-108.78710325854236},{"omegaRadPerYr":1.265567050136826,"cos":-32.69042937836259,"sin":-61.98759537925285}],"z":[{"omegaRadPerYr":-0.004358110846151278,"re":-0.000002445279424852449,"im":0.0000017621954362468656},{"omegaRadPerYr":0.006181644107420951,"re":0.000019239809643427013,"im":0.000026302645815428275},{"omegaRadPerYr":0.006525673611358515,"re":-0.00017162207988757243,"im":-0.00012381490122963492},{"omegaRadPerYr":0.006842443147971666,"re":0.0008160379290510822,"im":-0.0012855611879206686},{"omegaRadPerYr":0.007464263599308896,"re":0.000012700556847236648,"im":-0.000011961876101686816},{"omegaRadPerYr":0.011038687923256879,"re":-0.000039869855044714435,"im":0.00003195328235370556},{"omegaRadPerYr":0.013549298871283269,"re":0.000009801001526091865,"im":-0.000026447688535276757},{"omegaRadPerYr":-0.06373626925966255,"re":-0.00003596115998384089,"im":-0.000028529187552461677},{"omegaRadPerYr":-0.09638538445927783,"re":0.000015535362203103386,"im":0.000026853064771238423},{"omegaRadPerYr":-0.10309247938025248,"re":0.0002905044325100417,"im":0.0006021956537131266},{"omegaRadPerYr":0.10334344954127525,"re":-0.000019533843400768672,"im":0.000010878621921404595},{"omegaRadPerYr":0.10921440834492788,"re":-0.00003560780226338562,"im":0.000008050131621592458},{"omegaRadPerYr":-0.10921440834492788,"re":0.0000017934499315039944,"im":0.00000405315797293809},{"omegaRadPerYr":0.10975358535397606,"re":0.00017369831673455462,"im":-0.00007535465148308143},{"omegaRadPerYr":-0.10975358535397606,"re":-0.000004563988896924535,"im":-0.0000154375327254865},{"omegaRadPerYr":0.11042109885467918,"re":0.00018688710085717507,"im":-0.00012925303231366497},{"omegaRadPerYr":0.1107948956846119,"re":-0.00005742819467953064,"im":0.00002446019747635651},{"omegaRadPerYr":-0.1107948956846119,"re":3.2507064761096937e-7,"im":0.0000014893262878712717},{"omegaRadPerYr":0.2063193110741841,"re":-0.000012094578924974436,"im":-0.000015066272817853064},{"omegaRadPerYr":-0.2063193110741841,"re":-0.0002645706853712598,"im":-0.000043660297027029056},{"omegaRadPerYr":0.2130228704680447,"re":0.0007392110656689748,"im":0.0008891228393192088},{"omegaRadPerYr":-0.2130228704680447,"re":0.000018380819773470427,"im":0.000004389860388892079},{"omegaRadPerYr":-0.30955014898803845,"re":-0.000024631815470831895,"im":0.00002635073382218204},{"omegaRadPerYr":0.3161372566474592,"re":0.000010638067732514132,"im":0.00002903644464320735},{"omegaRadPerYr":-0.3161372566474592,"re":0.000044785364090127505,"im":-0.00007235123203278041},{"omegaRadPerYr":0.3232395099583198,"re":-0.0000030767740423315698,"im":-0.00002580327386509728},{"omegaRadPerYr":-0.3232395099583198,"re":-8.037783708694097e-7,"im":0.0000013792616646490144},{"omegaRadPerYr":0.41948429875117665,"re":-0.0000024400754535557023,"im":8.894450263194997e-7},{"omegaRadPerYr":-0.41948429875117665,"re":-0.00005542845317142494,"im":-0.00044582635037752926},{"omegaRadPerYr":0.42644865463819764,"re":0.00007629843791169079,"im":-0.00004431512896241777},{"omegaRadPerYr":-0.42644865463819764,"re":-3.142917811194328e-7,"im":0.000010823856186704562},{"omegaRadPerYr":0.5227089862323508,"re":0.000003410979417831606,"im":0.0000030363670326161395},{"omegaRadPerYr":-0.5227089862323508,"re":-0.00007781393434095757,"im":-0.000038627649196321925},{"omegaRadPerYr":0.5296908859098071,"re":0.0016272720362705665,"im":0.0011111321002679347},{"omegaRadPerYr":-0.6327562885720048,"re":0.000029869908761550486,"im":0.00004153187994553486},{"omegaRadPerYr":0.7358761721222311,"re":0.000002104902323996618,"im":-5.169275046806296e-7},{"omegaRadPerYr":-0.7358761721222311,"re":0.00002159732009990703,"im":-0.00016115133722286416},{"omegaRadPerYr":0.8391031676474132,"re":-3.2200579003446994e-7,"im":-1.921602155098948e-7},{"omegaRadPerYr":-0.8391031676474132,"re":-0.000029573064620902294,"im":-0.00002687687857849615},{"omegaRadPerYr":0.8460633253903981,"re":-0.0000182912621724972,"im":-0.000004960467884280318},{"omegaRadPerYr":-0.8460633253903981,"re":0.000002270968484351811,"im":-4.1450617474219755e-7},{"omegaRadPerYr":1.0522678070946976,"re":0.000002112495108837071,"im":-6.772836661571395e-7},{"omegaRadPerYr":-1.0522678070946976,"re":0.000026798123887720964,"im":-0.00006313630230370938},{"omegaRadPerYr":1.0593357383703628,"re":0.000055178325520269776,"im":0.00007541106198902492},{"omegaRadPerYr":-1.0593357383703628,"re":-0.0000011488133127119404,"im":0.0000024971143397116498}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":-8.436595912367323e-7,"im":0.000001633263627834134},{"omegaRadPerYr":0.0006207787083493434,"re":-0.000021424440269056364,"im":0.00000406741893133285},{"omegaRadPerYr":0.0011035308302650994,"re":0.0000028014305555000514,"im":3.03429131598728e-7},{"omegaRadPerYr":0.007110979736486372,"re":0.000009782653039468542,"im":-0.000018356544025335236},{"omegaRadPerYr":0.11036111149309716,"re":0.0000053050503083409155,"im":-7.394158520138554e-7},{"omegaRadPerYr":-0.11036111149309716,"re":-1.2281150228540698e-7,"im":-3.07875979063758e-7},{"omegaRadPerYr":0.31648864888649864,"re":5.930263050595727e-7,"im":-0.0000017212036515675988},{"omegaRadPerYr":-0.31648864888649864,"re":0.000006094478957977664,"im":-0.0000045938972600486}],"windowAffine":{"mlon":{"off":709.9722654779956,"slope":-15.579934294638058},"a":{"off":-2829.2103263877525,"slope":-0.004510524074380032},"k":{"off":-0.0032950974609698065,"slope":-2.0051399643096954e-8},"h":{"off":-0.0002907698308219252,"slope":-1.3596818437416563e-8},"q":{"off":-0.0000010497861227947909,"slope":-1.844836227990879e-9},"p":{"off":0.00001949409542224931,"slope":-8.310665514904321e-10}}},"uranus":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":1801.9688215276547,"sin":3696.0402015231675},{"omegaRadPerYr":0.0011579316488608284,"cos":-2487.6534406001147,"sin":-459.55088689711397},{"omegaRadPerYr":0.0016224830408352498,"cos":-1220.2966969515146,"sin":1099.2432996165028},{"omegaRadPerYr":0.002935118567074053,"cos":-86.83674347331831,"sin":-108.24685231024809},{"omegaRadPerYr":0.004155546482813653,"cos":7.118744517059694,"sin":23.57760406645599},{"omegaRadPerYr":0.009315002243089728,"cos":3.7516023313568363,"sin":7.101267898351473},{"omegaRadPerYr":0.010640504204457963,"cos":-45.57910944323328,"sin":-40.20883229440988},{"omegaRadPerYr":0.01119673478710359,"cos":-81.22235365041975,"sin":1.901281748995162},{"omegaRadPerYr":0.012145759710583907,"cos":6.889745560125585,"sin":0.1337542919867262},{"omegaRadPerYr":0.03510485087576988,"cos":-13.688922570681836,"sin":-0.13357807007057396},{"omegaRadPerYr":0.036426329598293165,"cos":-5.668712161443024,"sin":-24.347642616449427},{"omegaRadPerYr":0.03764711514559774,"cos":1.138953309753275,"sin":-6.871151194186152},{"omegaRadPerYr":0.06379838901039833,"cos":20.403291982312666,"sin":27.239956687524646},{"omegaRadPerYr":0.07318148932273885,"cos":-9.790209397106063,"sin":-27.80021241193281},{"omegaRadPerYr":0.07471215976498653,"cos":7.902379642110793,"sin":-0.774442117625175},{"omegaRadPerYr":0.10992640338436127,"cos":-5.939904215836388,"sin":-10.882753324742827},{"omegaRadPerYr":0.1385175392010205,"cos":155.21118912477402,"sin":-15.812055598809634},{"omegaRadPerYr":0.14663782569970274,"cos":-3.7488763779317598,"sin":-4.791075382227249},{"omegaRadPerYr":0.18317858258233016,"cos":-2.2663688645635784,"sin":-2.0807781596480717},{"omegaRadPerYr":0.20224498577277328,"cos":8.906763705097376,"sin":0.1380298652243485},{"omegaRadPerYr":0.21324964619950887,"cos":7.79719866947626,"sin":3.241509288620873},{"omegaRadPerYr":0.2770253845805853,"cos":-5.372427211086557,"sin":-26.160552277645316},{"omegaRadPerYr":0.34075769983231263,"cos":-0.34413062425412416,"sin":-3.4023598781892685},{"omegaRadPerYr":0.35171296920155715,"cos":6.530654205490572,"sin":4.862791616448076},{"omegaRadPerYr":0.3801532980579145,"cos":-10.061663279866217,"sin":6.615060134886086},{"omegaRadPerYr":0.4155393874689375,"cos":-8.765446247114845,"sin":2.7918680516072425},{"omegaRadPerYr":0.4549044622840928,"cos":693.1080948896936,"sin":120.18474838738872},{"omegaRadPerYr":0.45610432617458596,"cos":1.4784723033153024,"sin":-4.600733971723476},{"omegaRadPerYr":0.5296580495362411,"cos":25.53148607890865,"sin":29.126214483562098},{"omegaRadPerYr":0.9098120073368585,"cos":1.5179157507850387,"sin":-4.917034352655555},{"omegaRadPerYr":0.9845575209673397,"cos":34.71485095170867,"sin":-6.198872286264103}],"aPpm":[{"omegaRadPerYr":0.0015195464620650877,"cos":-97.92780120015847,"sin":-170.5428140152202},{"omegaRadPerYr":0.010971188991961797,"cos":15.922068967567228,"sin":-63.432796546205935},{"omegaRadPerYr":0.036210324842414696,"cos":16.212587942173556,"sin":-6.129790120421755},{"omegaRadPerYr":0.0638251399824393,"cos":10.100213421265115,"sin":75.06714450826473},{"omegaRadPerYr":0.0733720075467266,"cos":42.98239259300776,"sin":-17.9418140413923},{"omegaRadPerYr":0.07480628721946354,"cos":-98.25061077714025,"sin":-132.202002201576},{"omegaRadPerYr":0.10992773337349732,"cos":23.527834427275085,"sin":-13.195939312161588},{"omegaRadPerYr":0.13851260798083515,"cos":-111.93654476921755,"sin":-1070.016527121048},{"omegaRadPerYr":0.20224432811824086,"cos":-1.6198240173862555,"sin":23.993058869923644},{"omegaRadPerYr":0.2770277343049128,"cos":61.913236841972406,"sin":-9.835654134674343},{"omegaRadPerYr":0.35171020655145807,"cos":33.74734368162499,"sin":-41.87577534787228},{"omegaRadPerYr":0.38014999979161623,"cos":101.22109160185427,"sin":184.81826525347103},{"omegaRadPerYr":0.4155326059030616,"cos":-8.50929116085849,"sin":-24.32921998914257},{"omegaRadPerYr":0.45490446743623597,"cos":713.139927237936,"sin":-4114.6325172160405},{"omegaRadPerYr":0.4561160600364418,"cos":-27.913180144325082,"sin":-8.624546428335371},{"omegaRadPerYr":0.984557509897134,"cos":-33.18844015424147,"sin":-186.75405236611599}],"z":[{"omegaRadPerYr":-0.0006207787083493432,"re":-0.0010010271541711772,"im":0.0018777044315025746},{"omegaRadPerYr":0.0006207787083493464,"re":0.004669404370945987,"im":-0.009340747389266558},{"omegaRadPerYr":0.0009435296146423852,"re":-0.002693731244410169,"im":0.005515123870617622},{"omegaRadPerYr":-0.0011535901883012222,"re":0.00014035425010575732,"im":-0.00024989373718838423},{"omegaRadPerYr":0.0014837575606668784,"re":-0.00045779885526748995,"im":0.001029220718337651},{"omegaRadPerYr":0.0029527987688873665,"re":0.00009183113654454647,"im":0.00014226780874768813},{"omegaRadPerYr":0.004292938112541269,"re":0.00002604331453241119,"im":-0.0000026087586213451956},{"omegaRadPerYr":0.009597120283040226,"re":-0.000007669844938360622,"im":0.000021294192837364352},{"omegaRadPerYr":-0.009597120283040226,"re":-3.9726713006760554e-7,"im":6.855988059585005e-7},{"omegaRadPerYr":0.010674384178493406,"re":-0.000010533262678437352,"im":-0.0001455148230309594},{"omegaRadPerYr":0.011227739550618343,"re":0.00006715354281438808,"im":-0.00012622016168569206},{"omegaRadPerYr":0.03372910794138875,"re":-5.792844472104949e-7,"im":2.4314285495180073e-7},{"omegaRadPerYr":-0.03372910794138875,"re":-0.00000880378752168949,"im":-0.000006800427022328312},{"omegaRadPerYr":-0.03516446737018353,"re":0.000017036805195683028,"im":-0.00006576383803542369},{"omegaRadPerYr":0.03813277064323463,"re":-0.000014411793574417915,"im":0.000021543930065801352},{"omegaRadPerYr":0.03956799170730824,"re":0.0000060071290961077885,"im":0.000009377006777274802},{"omegaRadPerYr":-0.03956799170730824,"re":2.6935210872742854e-7,"im":-4.916863023382216e-8},{"omegaRadPerYr":0.05268030494966354,"re":-4.237037805796693e-8,"im":-2.2749652861175358e-7},{"omegaRadPerYr":-0.05268030494966354,"re":-0.00001162431242526334,"im":0.000006194880630876984},{"omegaRadPerYr":-0.06373512207652907,"re":-0.00022367795746631777,"im":-0.00017316839062164822},{"omegaRadPerYr":0.07165168074871991,"re":0.0000017015187480928225,"im":7.242338771966972e-7},{"omegaRadPerYr":-0.07165168074871991,"re":0.0000022253065719657005,"im":-0.0000239819546465497},{"omegaRadPerYr":0.07478159870524997,"re":0.0009483157794586808,"im":-0.0009764231771624703},{"omegaRadPerYr":0.10845808945136469,"re":-3.004883965295506e-7,"im":1.7055087357327652e-7},{"omegaRadPerYr":-0.10845808945136469,"re":-9.064387638229779e-7,"im":-0.000011385527941028099},{"omegaRadPerYr":-0.12747767226472656,"re":0.000021699265157246156,"im":0.00002376114754738344},{"omegaRadPerYr":0.13850950308176996,"re":-0.0000010910229098697519,"im":-0.000007886168725902355},{"omegaRadPerYr":-0.13850950308176996,"re":-0.000001434320086571384,"im":-0.00001963808508671571},{"omegaRadPerYr":0.1495497617854712,"re":0.000014732954282267382,"im":0.00008515250779883778},{"omegaRadPerYr":0.20222937823935716,"re":-1.1385591675988417e-7,"im":7.147831866493965e-7},{"omegaRadPerYr":-0.20222937823935716,"re":0.00004353415832027236,"im":-0.00006511784459661798},{"omegaRadPerYr":0.21329897373317086,"re":0.0003933511417178107,"im":0.00047058009044412887},{"omegaRadPerYr":-0.21329897373317086,"re":2.8327811431341513e-7,"im":-3.560359246154832e-7},{"omegaRadPerYr":0.2769038067800174,"re":-6.922779079018568e-7,"im":-0.0000013818132165140064},{"omegaRadPerYr":-0.2769038067800174,"re":-2.3494785512648875e-7,"im":-0.000016621555907303974},{"omegaRadPerYr":0.3053633220183532,"re":-3.828674197691803e-8,"im":-3.0064823844297327e-8},{"omegaRadPerYr":-0.3053633220183532,"re":0.00007882762566993446,"im":0.0000236123586415603},{"omegaRadPerYr":0.3407483470470682,"re":-1.3758316558774432e-7,"im":-2.4367154579582864e-7},{"omegaRadPerYr":-0.3407483470470682,"re":-0.000024185839542396282,"im":-0.000011566031399227259},{"omegaRadPerYr":0.38011803010191847,"re":-5.112230464978982e-8,"im":3.5576083426589514e-7},{"omegaRadPerYr":-0.38011803010191847,"re":-0.000683808108807156,"im":-0.0009409743748576826},{"omegaRadPerYr":0.38132830185858746,"re":-5.8177806967052385e-8,"im":1.6800244502590846e-7},{"omegaRadPerYr":-0.38132830185858746,"re":-0.000014034035119495699,"im":0.000007393494708343985},{"omegaRadPerYr":0.4264958876223484,"re":0.000033536519266374154,"im":0.0000032361816570982316},{"omegaRadPerYr":-0.4264958876223484,"re":2.1135509106302237e-9,"im":-2.2152515698741622e-7},{"omegaRadPerYr":0.4548421909364264,"re":-0.000006897616144456808,"im":-0.00002246641860475243},{"omegaRadPerYr":-0.4548421909364264,"re":0.00000407137788831569,"im":-0.00007288075699841603},{"omegaRadPerYr":0.5296909155630158,"re":0.0022676944652803236,"im":0.0015486566265643551},{"omegaRadPerYr":0.6044398037682881,"re":0.00001772821682494471,"im":-0.000001325745633927324},{"omegaRadPerYr":-0.6044398037682881,"re":1.8671243007549463e-7,"im":5.135484152882108e-9},{"omegaRadPerYr":0.8350185854831645,"re":1.3389962716219148e-7,"im":4.84551878795857e-8},{"omegaRadPerYr":-0.8350185854831645,"re":0.000018812120588273927,"im":-0.000007750077895326201},{"omegaRadPerYr":0.9097702890415831,"re":-5.782380719892394e-7,"im":1.9729873306333605e-7},{"omegaRadPerYr":-0.9097702890415831,"re":-0.00004113467597080967,"im":-0.000028046600646821318},{"omegaRadPerYr":1.0593442234385404,"re":0.00007767832087815946,"im":0.00010783753098964789},{"omegaRadPerYr":-1.0593442234385404,"re":-1.3556647669744362e-9,"im":3.814197973272324e-8}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.000009629466068512008,"im":-0.00002700542307681737},{"omegaRadPerYr":0.0006207787083493434,"re":-0.000049798841708766556,"im":0.00013244063973719405},{"omegaRadPerYr":0.0009514858307923093,"re":0.000026789231695805917,"im":-0.00007644359257728086},{"omegaRadPerYr":0.0014527887892821479,"re":-0.0000023897704328165434,"im":0.000013648719577168508},{"omegaRadPerYr":-0.0014792753244575146,"re":0.000002151034415423666,"im":0.000005190682098271777},{"omegaRadPerYr":0.0029820480249223872,"re":-0.0000013160358614767749,"im":-0.000005115909165770176},{"omegaRadPerYr":0.00445001839713232,"re":-6.717165830591991e-7,"im":9.251686604741414e-9},{"omegaRadPerYr":0.011102305337337318,"re":-0.000004628968123150622,"im":-0.0000046908160229297634},{"omegaRadPerYr":0.03663431002433444,"re":-6.097607617781723e-7,"im":9.248254018616485e-8},{"omegaRadPerYr":-0.036662600049736954,"re":4.790966947907778e-7,"im":-2.7030397322901033e-7},{"omegaRadPerYr":-0.1385862814842433,"re":0.0000034400542443838532,"im":0.0000021585069767270156},{"omegaRadPerYr":0.1496020811421664,"re":8.15990123336191e-7,"im":-7.942505016386517e-7},{"omegaRadPerYr":0.2881502651212958,"re":-0.0000010962716988804577,"im":-0.0000016121125699103533},{"omegaRadPerYr":0.45486894002023015,"re":-2.2992966985781707e-8,"im":-9.354657471556091e-9},{"omegaRadPerYr":-0.45486894002023015,"re":0.0000041579007491430415,"im":0.000004891978906915924},{"omegaRadPerYr":0.6044418164850311,"re":-0.0000037738318413916955,"im":-0.0000030151035436098662},{"omegaRadPerYr":-0.6044418164850311,"re":-7.35866162994619e-11,"im":-1.0864146466816922e-9}],"windowAffine":{"mlon":{"off":1210.0916981086646,"slope":-2.356561618102263},"a":{"off":-570.5850928990467,"slope":-0.008328826998351968},"k":{"off":-0.00366228365357873,"slope":-0.000002706626332717455},"h":{"off":0.0013833912074699532,"slope":-0.0000013941565327430463},"q":{"off":0.000017812451313420837,"slope":4.3356058040235435e-8},"p":{"off":-0.00003762382414202915,"slope":1.7014936480391533e-8}}},"neptune":{"mlonArcsec":[{"omegaRadPerYr":0.0006208681133576669,"cos":1064.212149451297,"sin":-18540.652753959734},{"omegaRadPerYr":0.0010884207287489497,"cos":-924.0362482426459,"sin":8383.82201986771},{"omegaRadPerYr":0.0014542551964391568,"cos":2226.955694353464,"sin":-3270.274366253071},{"omegaRadPerYr":0.0029389628530379795,"cos":48.078439095229676,"sin":94.12365761816456},{"omegaRadPerYr":0.035319889560920095,"cos":9.257473045853379,"sin":2.0734856552080676},{"omegaRadPerYr":0.03664876565539879,"cos":4.7094553822663965,"sin":32.60593260837659},{"omegaRadPerYr":0.0379634784712963,"cos":2.9744193339631977,"sin":2.513917234979188},{"omegaRadPerYr":0.07185421776935363,"cos":2.8052710744993297,"sin":0.02846273088874038},{"omegaRadPerYr":0.0732973641270625,"cos":6.1965389050552835,"sin":17.0773714633508},{"omegaRadPerYr":0.10987969317187546,"cos":3.60363735367916,"sin":6.863360280812679},{"omegaRadPerYr":0.1465411070471313,"cos":2.3029358223686502,"sin":2.954488343602723},{"omegaRadPerYr":0.17516600735395105,"cos":184.4413301288469,"sin":-52.32109605114765},{"omegaRadPerYr":0.35033794653247485,"cos":-1.7861093063080808,"sin":-2.9405528996126975},{"omegaRadPerYr":0.38836651611040063,"cos":9.70081182993168,"sin":5.3192582532981545},{"omegaRadPerYr":0.4915611841446312,"cos":911.0889137852095,"sin":-1.0510799754510758},{"omegaRadPerYr":0.49279773384983616,"cos":-0.5592399822047331,"sin":3.9702700781104827},{"omegaRadPerYr":0.5297024373268707,"cos":2.40320968051373,"sin":-9.399068768105197},{"omegaRadPerYr":1.021214758421749,"cos":42.2020577057518,"sin":-15.309967518050174}],"aPpm":[{"omegaRadPerYr":0.0015262400589186877,"cos":128.59464307443753,"sin":231.15748494462574},{"omegaRadPerYr":0.0028522808070564833,"cos":-21.37258121508621,"sin":10.41064755989285},{"omegaRadPerYr":0.03669498740393444,"cos":151.68816464488373,"sin":-28.109847919847983},{"omegaRadPerYr":0.0732428963963061,"cos":-33.097418893495544,"sin":11.320551289859745},{"omegaRadPerYr":0.11007776654950899,"cos":-15.641429019477593,"sin":8.577259144710313},{"omegaRadPerYr":0.17516937472508654,"cos":-326.96669731853905,"sin":-1149.3821777931403},{"omegaRadPerYr":0.38836651718787407,"cos":29.53675612865252,"sin":-54.13457963760843},{"omegaRadPerYr":0.4534159750526987,"cos":-46.68270557697238,"sin":11.759966469069417},{"omegaRadPerYr":0.49156118009313077,"cos":-5.290056175958509,"sin":-4922.302879177644},{"omegaRadPerYr":0.4928261722960873,"cos":22.10668376967481,"sin":2.1304175891318873},{"omegaRadPerYr":1.0212147268897795,"cos":-78.57315117147935,"sin":-216.34180136813907}],"z":[{"omegaRadPerYr":-0.0006207787083493432,"re":0.00000822910599695662,"im":0.00000566645788782689},{"omegaRadPerYr":0.0006207787083493453,"re":-0.0000033482623738817215,"im":-0.000011998582333036538},{"omegaRadPerYr":0.0014837734825010177,"re":0.0002465285902965811,"im":-0.000542946526804817},{"omegaRadPerYr":0.002952491806788975,"re":-0.00011247629571556469,"im":-0.00011171907883842821},{"omegaRadPerYr":-0.004414051602461347,"re":-1.1949180023376013e-8,"im":-5.895393912563796e-8},{"omegaRadPerYr":0.00441745151969733,"re":-0.000011139829747812603,"im":0.000005957961387581304},{"omegaRadPerYr":-0.0336947851363493,"re":0.000008788563557474915,"im":0.0000066100893572258815},{"omegaRadPerYr":-0.03516438841507151,"re":-0.000016831823497116864,"im":0.00006611363801678594},{"omegaRadPerYr":0.03666424259143439,"re":0.0000067161349630566706,"im":8.5863061450533e-7},{"omegaRadPerYr":0.03813296419381759,"re":0.0007689836932573089,"im":-0.0011245762260255845},{"omegaRadPerYr":-0.07181296843697238,"re":-0.0000023474904524169503,"im":0.000024443385640750307},{"omegaRadPerYr":0.07478167259300009,"re":0.00006051155974368794,"im":-0.00006241188917030075},{"omegaRadPerYr":0.08068029609791652,"re":-2.1385174933710793e-7,"im":9.47807650713311e-8},{"omegaRadPerYr":0.10840999361006448,"re":-2.1894562976651773e-8,"im":-1.842804538376415e-8},{"omegaRadPerYr":-0.10840999361006448,"re":5.153826226655718e-7,"im":0.000011407506356300657},{"omegaRadPerYr":-0.13703303990304816,"re":-0.0003233037620025506,"im":-0.00010732690949601281},{"omegaRadPerYr":0.21329898735568126,"re":0.00048778689719744165,"im":0.0005843247148884207},{"omegaRadPerYr":-0.3121996849254518,"re":2.6584347616665e-7,"im":-0.000009497238475246992},{"omegaRadPerYr":0.3502350293271937,"re":4.843040927610671e-8,"im":-1.0702237146150716e-7},{"omegaRadPerYr":-0.3502350293271937,"re":-0.000007616440459433557,"im":-0.000014833156682859016},{"omegaRadPerYr":0.41529137321236287,"re":1.442005878816463e-7,"im":-3.484512197119509e-7},{"omegaRadPerYr":-0.41529137321236287,"re":-0.00000707795193580432,"im":0.00001836075632727175},{"omegaRadPerYr":0.42649606358473324,"re":0.00004218844308149576,"im":0.000004227571689777453},{"omegaRadPerYr":-0.42649606358473324,"re":-5.658292052953387e-8,"im":-6.845099901226937e-8},{"omegaRadPerYr":0.45343148629777286,"re":-5.680507946629673e-8,"im":-9.841661999629342e-8},{"omegaRadPerYr":-0.45343148629777286,"re":-0.0010841004899122212,"im":-0.000736390221813403},{"omegaRadPerYr":0.4546133901012304,"re":6.67914668314911e-8,"im":6.897609009672202e-8},{"omegaRadPerYr":-0.4546133901012304,"re":0.00000818929299076697,"im":-0.000008038397570237945},{"omegaRadPerYr":0.4915675955310438,"re":-0.000004083522353726188,"im":0.000003744270434963885},{"omegaRadPerYr":-0.4915675955310438,"re":-0.000012301739812453286,"im":0.000010686366413055363},{"omegaRadPerYr":0.5296909041466622,"re":0.002839613383622111,"im":0.0019403577470709873},{"omegaRadPerYr":0.9830852238230905,"re":-6.720721583920492e-8,"im":3.425816645371005e-8},{"omegaRadPerYr":-0.9830852238230905,"re":-0.00005758151994324185,"im":-0.000014754794069635932},{"omegaRadPerYr":1.0593442030083966,"re":0.00009721226174654751,"im":0.0001350049744357107},{"omegaRadPerYr":-1.0593442030083966,"re":-4.1559879847366785e-8,"im":9.802298292992387e-9}],"zeta":[{"omegaRadPerYr":-0.0006207787083493432,"re":-5.057373983794714e-7,"im":0.0000031433152031555667},{"omegaRadPerYr":0.0006207787083493438,"re":0.0000029115733404898485,"im":-0.000004309627443672908},{"omegaRadPerYr":0.0014366584800648346,"re":-0.0000013572071156821169,"im":-0.000001020104238423996},{"omegaRadPerYr":-0.001480323771534016,"re":-0.0000011783259528824155,"im":-0.0000018211874549353222},{"omegaRadPerYr":0.002982469348844243,"re":9.458475398560309e-7,"im":0.000003122123819843002},{"omegaRadPerYr":0.0044510414024656955,"re":3.971188256100343e-7,"im":2.94455272695886e-8},{"omegaRadPerYr":0.03663380433896722,"re":3.593149192869475e-7,"im":-5.5827146617815774e-8},{"omegaRadPerYr":-0.17494555869955136,"re":9.099409535530744e-7,"im":-9.024205485759674e-7},{"omegaRadPerYr":-0.17549754071699553,"re":0.000001505121306046405,"im":-3.070442234723798e-7},{"omegaRadPerYr":0.49159407636236985,"re":4.796686684990757e-9,"im":3.358344123813994e-10},{"omegaRadPerYr":-0.49159407636236985,"re":-3.98804489842816e-7,"im":-0.00001005615352417885},{"omegaRadPerYr":0.5676217845108422,"re":0.000004880876845321145,"im":-0.0000023244672855910403},{"omegaRadPerYr":0.5681730424584401,"re":0.000003985093304959338,"im":-7.238476904721648e-7}],"windowAffine":{"mlon":{"off":-3600.978375847875,"slope":6.706848240846746},"a":{"off":228.34220468445073,"slope":0.013417433557641792},"k":{"off":-0.0029101681444154044,"slope":2.5117803834315305e-9},"h":{"off":-0.00012102457242531213,"slope":1.8162297961597065e-8},"q":{"off":-0.000011703165443191566,"slope":-2.5174396402677695e-9},"p":{"off":0.00001578707593265369,"slope":-1.0378417602521395e-8}}}}});
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Keplerian planet chain — THE shared implementation (P5/K2 → K4.7b).
|
|
3
|
+
* Engine-D-driven elements → heliocentric positions; lives ONCE here, consumed
|
|
4
|
+
* by tools/lib/keplerian-chain.js (Node binding: fs artifact loader + the
|
|
5
|
+
* model's AU) and by the browser scene (src/script.js) through the embedded
|
|
6
|
+
* chain artifact.
|
|
7
|
+
*
|
|
8
|
+
* SOURCE-OF-TRUTH DOCTRINE (plan 02 §P5): engine D is the truth because it is
|
|
9
|
+
* causally ours. The ONLY inputs are (1) the J2000 Horizons state vectors —
|
|
10
|
+
* the anchor, the numbers left to nature — and (2) element evolution measured
|
|
11
|
+
* by the model's own N-body pipeline (the governed artifact
|
|
12
|
+
* data/nbody-secular-frequencies.json: era-typed window rates, the K4.7
|
|
13
|
+
* multi-mode secular tables, the K4.5/K4.7b derived periodic layer;
|
|
14
|
+
* regenerated from the constants whenever they change, so a changed planet
|
|
15
|
+
* mass propagates engine → artifact → here). No Meeus/JPL/Laskar series or
|
|
16
|
+
* rates enter this module, ever; external ephemerides are anchors and
|
|
17
|
+
* comparison surfaces only. The model's planet positions MAY DIFFER from
|
|
18
|
+
* JPL — that difference is published model content, not a defect.
|
|
19
|
+
*
|
|
20
|
+
* PURITY: every function is pure; the artifact object and the model's AU are
|
|
21
|
+
* passed in by the caller (the two engines bind their own single homes).
|
|
22
|
+
* Units/frames: AU and years internally where named; ecliptic-J2000 frame
|
|
23
|
+
* throughout (the HZ seed frame); angles degrees in the public API.
|
|
24
|
+
* MATCHED PAIR: this file is hashed as an input of the governed artifact —
|
|
25
|
+
* terms and evaluation form ship together (the ~1162-minute-class rule).
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
'use strict';
|
|
29
|
+
|
|
30
|
+
/** @typedef {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
|
|
31
|
+
* lonPeriEclipticDeg:number,meanLonEclipticDeg:number,
|
|
32
|
+
* meanMotionDegPerYr?:number,argPeriDeg?:number,meanAnomalyDeg?:number}} KcElements */
|
|
33
|
+
/** @typedef {{omegaRadPerYr:number,cos:number,sin:number}} KcCosSinTerm */
|
|
34
|
+
/** @typedef {{omegaRadPerYr:number,re:number,im:number}} KcComplexTerm */
|
|
35
|
+
/** @typedef {{comps:Array<{planet:string,sLam?:number,sPom?:number}>,cos:number,sin:number}} KcPoissonCosSinTerm */
|
|
36
|
+
/** @typedef {{comps:Array<{planet:string,sLam?:number,sPom?:number}>,re:number,im:number}} KcPoissonComplexTerm */
|
|
37
|
+
/** @typedef {{off:number,slope?:number}} KcAffine */
|
|
38
|
+
/** @typedef {{windowAffine?:Object<string,KcAffine>,mlonArcsec?:KcCosSinTerm[],aPpm?:KcCosSinTerm[],
|
|
39
|
+
* z?:KcComplexTerm[],zeta?:KcComplexTerm[],
|
|
40
|
+
* poissonMlonArcsec?:KcPoissonCosSinTerm[],poissonZ?:KcPoissonComplexTerm[]}} KcPeriodicTerms */
|
|
41
|
+
/** @typedef {{anchor:KcElements,periRateArcsecCy:number,meanMotionDegPerYr:(number|null),
|
|
42
|
+
* windowRates?:{meanMotionDegPerYr?:number,nodeRateArcsecCy?:number,eccDotPerCy?:number,inclDotArcsecCy?:number},
|
|
43
|
+
* secularModes?:({z:KcComplexTerm[],zeta:KcComplexTerm[]}|null),
|
|
44
|
+
* periodicTerms?:(KcPeriodicTerms|undefined)}} KcPlanetChain */
|
|
45
|
+
|
|
46
|
+
const D2R = Math.PI / 180;
|
|
47
|
+
|
|
48
|
+
// The anchor epoch of the HZ state vectors: J2000.0 (JD 2451545.0), carried
|
|
49
|
+
// in this module's `year` coordinate as 2000.0 by convention. PRECISION NOTE
|
|
50
|
+
// (K3): JD 2451545.0 is Jan 1, 12:00 TT — when the chain meets a scene
|
|
51
|
+
// calendar, the epoch maps through the model's OWN JD→year machinery (the
|
|
52
|
+
// linear-vs-calendar JD→year trap), never a hand-made offset; a half-day
|
|
53
|
+
// slip is 2° of Mercury mean longitude.
|
|
54
|
+
const ANCHOR_EPOCH_YEAR = 2000;
|
|
55
|
+
const ANCHOR_EPOCH_JD = 2451545.0;
|
|
56
|
+
|
|
57
|
+
/** Full osculating elements from a heliocentric ecliptic-J2000 state vector.
|
|
58
|
+
* @param {number[]} rKm heliocentric position, km
|
|
59
|
+
* @param {number[]} vKmS heliocentric velocity, km/s
|
|
60
|
+
* @param {number} muKm3S2 GM_Sun + GM_planet
|
|
61
|
+
* @param {number} auKm the model's AU in km (caller's single home)
|
|
62
|
+
* @returns {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
|
|
63
|
+
* argPeriDeg:number,lonPeriEclipticDeg:number,meanAnomalyDeg:number,
|
|
64
|
+
* meanLonEclipticDeg:number,meanMotionDegPerYr:number}} */
|
|
65
|
+
function computeOsculatingElements(rKm, vKmS, muKm3S2, auKm) {
|
|
66
|
+
const r = rKm, v = vKmS, mu = muKm3S2;
|
|
67
|
+
const rn = Math.hypot(r[0], r[1], r[2]);
|
|
68
|
+
const v2 = v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
|
|
69
|
+
const h = [r[1] * v[2] - r[2] * v[1], r[2] * v[0] - r[0] * v[2], r[0] * v[1] - r[1] * v[0]];
|
|
70
|
+
const hn = Math.hypot(h[0], h[1], h[2]);
|
|
71
|
+
const ev = [0, 1, 2].map((c) =>
|
|
72
|
+
(v[(c + 1) % 3] * h[(c + 2) % 3] - v[(c + 2) % 3] * h[(c + 1) % 3]) / mu - r[c] / rn);
|
|
73
|
+
const e = Math.hypot(ev[0], ev[1], ev[2]);
|
|
74
|
+
const aKm = 1 / (2 / rn - v2 / mu);
|
|
75
|
+
const incl = Math.acos(h[2] / hn);
|
|
76
|
+
const Om = Math.atan2(h[0], -h[1]); // ascending node
|
|
77
|
+
// argument of perihelion
|
|
78
|
+
const nodeU = [Math.cos(Om), Math.sin(Om), 0];
|
|
79
|
+
let argw = Math.acos(Math.max(-1, Math.min(1, (nodeU[0] * ev[0] + nodeU[1] * ev[1]) / e)));
|
|
80
|
+
if (ev[2] < 0) argw = 2 * Math.PI - argw;
|
|
81
|
+
// true anomaly → eccentric → mean
|
|
82
|
+
let nu = Math.acos(Math.max(-1, Math.min(1, (ev[0] * r[0] + ev[1] * r[1] + ev[2] * r[2]) / (e * rn))));
|
|
83
|
+
const rv = r[0] * v[0] + r[1] * v[1] + r[2] * v[2];
|
|
84
|
+
if (rv < 0) nu = 2 * Math.PI - nu;
|
|
85
|
+
const E = Math.atan2(Math.sqrt(1 - e * e) * Math.sin(nu), e + Math.cos(nu));
|
|
86
|
+
const M = E - e * Math.sin(E);
|
|
87
|
+
const nRadS = Math.sqrt(mu / (aKm * aKm * aKm)); // rad/s
|
|
88
|
+
const meanMotionDegPerYr = nRadS * 86400 * 365.25 / D2R;
|
|
89
|
+
const wrap = (/** @type {number} */ x) => ((x % 360) + 360) % 360;
|
|
90
|
+
const lonPeri = wrap((Om + argw) / D2R);
|
|
91
|
+
return {
|
|
92
|
+
aAU: aKm / auKm,
|
|
93
|
+
e,
|
|
94
|
+
inclEclipticDeg: incl / D2R,
|
|
95
|
+
ascNodeEclipticDeg: wrap(Om / D2R),
|
|
96
|
+
argPeriDeg: wrap(argw / D2R),
|
|
97
|
+
lonPeriEclipticDeg: lonPeri,
|
|
98
|
+
meanAnomalyDeg: wrap(M / D2R),
|
|
99
|
+
meanLonEclipticDeg: wrap(lonPeri + M / D2R),
|
|
100
|
+
meanMotionDegPerYr,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Solve Kepler's equation E − e·sinE = M (radians), Newton iteration.
|
|
105
|
+
* @param {number} meanAnomalyRad @param {number} e @returns {number} */
|
|
106
|
+
function solveKeplerRad(meanAnomalyRad, e) {
|
|
107
|
+
let E = e < 0.8 ? meanAnomalyRad : Math.PI;
|
|
108
|
+
for (let i = 0; i < 30; i++) {
|
|
109
|
+
const d = (E - e * Math.sin(E) - meanAnomalyRad) / (1 - e * Math.cos(E));
|
|
110
|
+
E -= d;
|
|
111
|
+
if (Math.abs(d) < 1e-14) break;
|
|
112
|
+
}
|
|
113
|
+
return E;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Heliocentric ecliptic-J2000 position from elements-of-date.
|
|
117
|
+
* @param {{aAU:number,e:number,inclEclipticDeg:number,ascNodeEclipticDeg:number,
|
|
118
|
+
* lonPeriEclipticDeg:number,meanLonEclipticDeg:number}} el
|
|
119
|
+
* @returns {{xAU:number,yAU:number,zAU:number,rAU:number}} */
|
|
120
|
+
function computeHeliocentricEclipticFromElements(el) {
|
|
121
|
+
const Mdeg = el.meanLonEclipticDeg - el.lonPeriEclipticDeg;
|
|
122
|
+
const E = solveKeplerRad(((Mdeg % 360) + 360) % 360 * D2R, el.e);
|
|
123
|
+
const xp = el.aAU * (Math.cos(E) - el.e);
|
|
124
|
+
const yp = el.aAU * Math.sqrt(1 - el.e * el.e) * Math.sin(E);
|
|
125
|
+
const w = (el.lonPeriEclipticDeg - el.ascNodeEclipticDeg) * D2R;
|
|
126
|
+
const Om = el.ascNodeEclipticDeg * D2R;
|
|
127
|
+
const inc = el.inclEclipticDeg * D2R;
|
|
128
|
+
const cw = Math.cos(w), sw = Math.sin(w), cO = Math.cos(Om), sO = Math.sin(Om), ci = Math.cos(inc), si = Math.sin(inc);
|
|
129
|
+
const xAU = (cw * cO - sw * sO * ci) * xp + (-sw * cO - cw * sO * ci) * yp;
|
|
130
|
+
const yAU = (cw * sO + sw * cO * ci) * xp + (-sw * sO + cw * cO * ci) * yp;
|
|
131
|
+
const zAU = (sw * si) * xp + (cw * si) * yp;
|
|
132
|
+
return { xAU, yAU, zAU, rAU: Math.hypot(xAU, yAU, zAU) };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Poisson argument θ (radians) at `year`: Σ comps of s_lam·λ̄ + s_pom·ϖ over
|
|
136
|
+
* the referenced planets — λ̄ from the linear skeleton, ϖ(t) from the
|
|
137
|
+
* multi-mode secular sum (d'Alembert-complete arguments; K4.7b — RECORD
|
|
138
|
+
* ONLY: the era solve measured Poisson columns negative, no terms are
|
|
139
|
+
* exported; the machinery stands as the campaign record).
|
|
140
|
+
* @param {number} year @param {Object<string,KcPlanetChain>} allChains
|
|
141
|
+
* @param {Array<{planet:string,sLam?:number,sPom?:number}>} comps
|
|
142
|
+
* @returns {number} */
|
|
143
|
+
function computePoissonArgRad(year, allChains, comps) {
|
|
144
|
+
let th = 0;
|
|
145
|
+
for (const c of comps) {
|
|
146
|
+
const ch = allChains[c.planet], a = ch.anchor;
|
|
147
|
+
if (c.sLam) th += c.sLam * (a.meanLonEclipticDeg + (ch.meanMotionDegPerYr ?? a.meanMotionDegPerYr ?? 0) * (year - ANCHOR_EPOCH_YEAR)) * D2R;
|
|
148
|
+
if (c.sPom) {
|
|
149
|
+
// secular-only ϖ(t): the periodic terms are stripped BY CONSTRUCTION —
|
|
150
|
+
// a runtime chain carrying poissonZ terms would otherwise recurse
|
|
151
|
+
// through this very argument.
|
|
152
|
+
const el = computePlanetElementsAtYear(year, { ...ch, periodicTerms: undefined });
|
|
153
|
+
th += c.sPom * el.lonPeriEclipticDeg * D2R;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return th;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/** Elements-of-date for one planet.
|
|
160
|
+
* @param {number} year decimal year (epoch parameter first, per naming rule)
|
|
161
|
+
* @param {KcPlanetChain} planetChain
|
|
162
|
+
* @param {Object<string,KcPlanetChain>=} allChains full chain set — required
|
|
163
|
+
* only when planetChain.periodicTerms carries Poisson-argument terms
|
|
164
|
+
* @returns {KcElements} elements at `year` */
|
|
165
|
+
function computePlanetElementsAtYear(year, planetChain, allChains) {
|
|
166
|
+
const dt = year - ANCHOR_EPOCH_YEAR;
|
|
167
|
+
const a = planetChain.anchor;
|
|
168
|
+
const n = planetChain.meanMotionDegPerYr ?? a.meanMotionDegPerYr ?? 0;
|
|
169
|
+
const r = planetChain.windowRates || {}; // K2.1 era-typed drifts (legacy linear path)
|
|
170
|
+
const wrap = (/** @type {number} */ x) => ((x % 360) + 360) % 360;
|
|
171
|
+
const out = {
|
|
172
|
+
aAU: a.aAU,
|
|
173
|
+
meanLonEclipticDeg: wrap(a.meanLonEclipticDeg + n * dt),
|
|
174
|
+
e: 0, inclEclipticDeg: 0, ascNodeEclipticDeg: 0, lonPeriEclipticDeg: 0,
|
|
175
|
+
};
|
|
176
|
+
const SM = planetChain.secularModes;
|
|
177
|
+
if (SM) {
|
|
178
|
+
// K4.7 — THE MULTI-MODE SECULAR SKELETON (same physics for all planets):
|
|
179
|
+
// z(t) = Σ modes + constant remainder; the linear-drift tangent was
|
|
180
|
+
// measured leaving the eigenmode-rotation curvature as an unfixable
|
|
181
|
+
// residual (Saturn ~700µ sagitta over ±2.5 kyr). The constant remainder
|
|
182
|
+
// z₀ − Σmodes(0) is the content a 1-Myr NAFF cannot resolve
|
|
183
|
+
// (ultra-long modes + short-period at the anchor) — itself physical.
|
|
184
|
+
const sum = (/** @type {KcComplexTerm[]} */ modes, /** @type {number} */ t2) => {
|
|
185
|
+
let re = 0, im = 0;
|
|
186
|
+
for (const m of modes) { const c = Math.cos(m.omegaRadPerYr * t2), s = Math.sin(m.omegaRadPerYr * t2); re += m.re * c - m.im * s; im += m.re * s + m.im * c; }
|
|
187
|
+
return [re, im];
|
|
188
|
+
};
|
|
189
|
+
const [zk, zh] = sum(SM.z, dt), [zk0, zh0] = sum(SM.z, 0);
|
|
190
|
+
const k0 = zk + (a.e * Math.cos(a.lonPeriEclipticDeg * D2R) - zk0);
|
|
191
|
+
const h0 = zh + (a.e * Math.sin(a.lonPeriEclipticDeg * D2R) - zh0);
|
|
192
|
+
out.e = Math.hypot(k0, h0);
|
|
193
|
+
out.lonPeriEclipticDeg = wrap(Math.atan2(h0, k0) / D2R);
|
|
194
|
+
const [zq, zp] = sum(SM.zeta, dt), [zq0, zp0] = sum(SM.zeta, 0);
|
|
195
|
+
const s2a = Math.sin(a.inclEclipticDeg / 2 * D2R);
|
|
196
|
+
const q0 = zq + (s2a * Math.cos(a.ascNodeEclipticDeg * D2R) - zq0);
|
|
197
|
+
const p0 = zp + (s2a * Math.sin(a.ascNodeEclipticDeg * D2R) - zp0);
|
|
198
|
+
out.inclEclipticDeg = 2 * Math.asin(Math.hypot(q0, p0)) / D2R;
|
|
199
|
+
out.ascNodeEclipticDeg = wrap(Math.atan2(p0, q0) / D2R);
|
|
200
|
+
} else {
|
|
201
|
+
// legacy linear path (frozen-element gating; pre-K4.7 artifacts)
|
|
202
|
+
out.e = a.e + ((r.eccDotPerCy || 0) / 100) * dt;
|
|
203
|
+
out.inclEclipticDeg = a.inclEclipticDeg + ((r.inclDotArcsecCy || 0) / 3600 / 100) * dt;
|
|
204
|
+
out.ascNodeEclipticDeg = wrap(a.ascNodeEclipticDeg + ((r.nodeRateArcsecCy || 0) / 3600 / 100) * dt);
|
|
205
|
+
out.lonPeriEclipticDeg = wrap(a.lonPeriEclipticDeg + (planetChain.periRateArcsecCy / 3600 / 100) * dt);
|
|
206
|
+
}
|
|
207
|
+
// K4.5 — the DERIVED periodic layer: engine-extracted/era-solved terms in
|
|
208
|
+
// the mean longitude, the semi-major axis, and the nonsingular z-vector
|
|
209
|
+
// (z = k + i·h = e·e^{iϖ}), plus the era-typed in-window affine (anchor-
|
|
210
|
+
// snapshot vs window content). All quantities measured from the model's
|
|
211
|
+
// own N-body runs (k45-residual-naff / k45e-amplitude-solve are the
|
|
212
|
+
// record) — nothing observation-fitted.
|
|
213
|
+
const P = planetChain.periodicTerms;
|
|
214
|
+
if (P) {
|
|
215
|
+
const w = P.windowAffine || {};
|
|
216
|
+
// K4.7b — the semi-major-axis channel: heliocentric osculating elements
|
|
217
|
+
// slosh TOGETHER at the synodic periods (largely the Sun's giant-planet
|
|
218
|
+
// reflex, physical on both sides of any comparison); fitting λ̄/z wobbles
|
|
219
|
+
// while freezing a at the anchor leaves an element-INCONSISTENT set — the
|
|
220
|
+
// reconstructed position needs all channels or none (measured: U/N δa/a
|
|
221
|
+
// residual 3000–3800 ppm at the J/S synodics, k47b spectrum).
|
|
222
|
+
if (P.aPpm || w.a) {
|
|
223
|
+
let dA = w.a ? w.a.off + (w.a.slope || 0) * dt : 0;
|
|
224
|
+
for (const tm of P.aPpm || []) dA += tm.cos * Math.cos(tm.omegaRadPerYr * dt) + tm.sin * Math.sin(tm.omegaRadPerYr * dt);
|
|
225
|
+
out.aAU = a.aAU * (1 + dA * 1e-6);
|
|
226
|
+
}
|
|
227
|
+
let dMlon = w.mlon ? w.mlon.off + (w.mlon.slope || 0) * dt : 0;
|
|
228
|
+
for (const tm of P.mlonArcsec || []) dMlon += tm.cos * Math.cos(tm.omegaRadPerYr * dt) + tm.sin * Math.sin(tm.omegaRadPerYr * dt);
|
|
229
|
+
// K4.7b — Poisson-argument terms (record only; none currently exported)
|
|
230
|
+
for (const tm of P.poissonMlonArcsec || []) {
|
|
231
|
+
const th = computePoissonArgRad(year, allChains || {}, tm.comps);
|
|
232
|
+
dMlon += tm.cos * Math.cos(th) + tm.sin * Math.sin(th);
|
|
233
|
+
}
|
|
234
|
+
out.meanLonEclipticDeg = wrap(out.meanLonEclipticDeg + dMlon / 3600);
|
|
235
|
+
let k0 = out.e * Math.cos(out.lonPeriEclipticDeg * D2R) + (w.k ? w.k.off + (w.k.slope || 0) * dt : 0);
|
|
236
|
+
let h0 = out.e * Math.sin(out.lonPeriEclipticDeg * D2R) + (w.h ? w.h.off + (w.h.slope || 0) * dt : 0);
|
|
237
|
+
for (const tm of P.z || []) {
|
|
238
|
+
const c = Math.cos(tm.omegaRadPerYr * dt), s = Math.sin(tm.omegaRadPerYr * dt);
|
|
239
|
+
k0 += tm.re * c - tm.im * s; h0 += tm.re * s + tm.im * c;
|
|
240
|
+
}
|
|
241
|
+
for (const tm of P.poissonZ || []) {
|
|
242
|
+
const th = computePoissonArgRad(year, allChains || {}, tm.comps);
|
|
243
|
+
const c = Math.cos(th), s = Math.sin(th);
|
|
244
|
+
k0 += tm.re * c - tm.im * s; h0 += tm.re * s + tm.im * c;
|
|
245
|
+
}
|
|
246
|
+
out.e = Math.hypot(k0, h0);
|
|
247
|
+
out.lonPeriEclipticDeg = wrap(Math.atan2(h0, k0) / D2R);
|
|
248
|
+
// K4.5c — the out-of-plane channel: ζ = q + i·p = sin(i/2)·e^{iΩ}
|
|
249
|
+
if (P.zeta || w.q || w.p) {
|
|
250
|
+
let q0 = Math.sin(out.inclEclipticDeg / 2 * D2R) * Math.cos(out.ascNodeEclipticDeg * D2R) + (w.q ? w.q.off + (w.q.slope || 0) * dt : 0);
|
|
251
|
+
let p0 = Math.sin(out.inclEclipticDeg / 2 * D2R) * Math.sin(out.ascNodeEclipticDeg * D2R) + (w.p ? w.p.off + (w.p.slope || 0) * dt : 0);
|
|
252
|
+
for (const tm of P.zeta || []) {
|
|
253
|
+
const c = Math.cos(tm.omegaRadPerYr * dt), s = Math.sin(tm.omegaRadPerYr * dt);
|
|
254
|
+
q0 += tm.re * c - tm.im * s; p0 += tm.re * s + tm.im * c;
|
|
255
|
+
}
|
|
256
|
+
out.inclEclipticDeg = 2 * Math.asin(Math.hypot(q0, p0)) / D2R;
|
|
257
|
+
out.ascNodeEclipticDeg = wrap(Math.atan2(p0, q0) / D2R);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** The chain's canonical constructor from a PARSED governed artifact (K2.1 →
|
|
264
|
+
* K4.6c): anchors (the engine-extracted t=0 elements), era-typed window
|
|
265
|
+
* rates, the K4.7 secular mode tables, and the K4.5/K4.7b periodic layer.
|
|
266
|
+
* @param {*} art the governed engine-D artifact, parsed (deep JSON —
|
|
267
|
+
* shape enforced by the generator's assertions, not retyped here)
|
|
268
|
+
* @param {{skeletonOnly?:boolean}=} opts skeletonOnly omits the periodic
|
|
269
|
+
* layer — REQUIRED by the extraction/solve instruments, which
|
|
270
|
+
* measure the residual AGAINST the skeleton; a terms-bearing chain
|
|
271
|
+
* there would extract its own output.
|
|
272
|
+
* @returns {Object<string,KcPlanetChain>} */
|
|
273
|
+
function buildPlanetChainsFromArtifactData(art, opts = {}) {
|
|
274
|
+
if (!art.windowElementRates || !art.j2000AnchorElements) {
|
|
275
|
+
throw new Error('artifact predates K2.1 — regenerate: node tools/verify/nbody-secular.js --write');
|
|
276
|
+
}
|
|
277
|
+
/** @type {Object<string,KcPlanetChain>} */
|
|
278
|
+
const chains = {};
|
|
279
|
+
for (const key of Object.keys(art.j2000AnchorElements)) {
|
|
280
|
+
const n = art.windowElementRates[key].meanMotionDegPerYr;
|
|
281
|
+
chains[key] = {
|
|
282
|
+
anchor: { ...art.j2000AnchorElements[key], meanMotionDegPerYr: n },
|
|
283
|
+
periRateArcsecCy: art.windowRatesArcsecCy.gr[key],
|
|
284
|
+
meanMotionDegPerYr: n,
|
|
285
|
+
windowRates: art.windowElementRates[key],
|
|
286
|
+
secularModes: art.secularModes ? art.secularModes[key] : null, // K4.7 multi-mode skeleton
|
|
287
|
+
};
|
|
288
|
+
if (!opts.skeletonOnly && art.periodicTerms && art.periodicTerms[key]) {
|
|
289
|
+
chains[key].periodicTerms = art.periodicTerms[key];
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
return chains;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
module.exports = {
|
|
296
|
+
ANCHOR_EPOCH_YEAR,
|
|
297
|
+
ANCHOR_EPOCH_JD,
|
|
298
|
+
computeOsculatingElements,
|
|
299
|
+
solveKeplerRad,
|
|
300
|
+
computeHeliocentricEclipticFromElements,
|
|
301
|
+
computePoissonArgRad,
|
|
302
|
+
computePlanetElementsAtYear,
|
|
303
|
+
buildPlanetChainsFromArtifactData,
|
|
304
|
+
};
|