@essrt/physics 1.0.0 → 1.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/README.md CHANGED
@@ -40,6 +40,56 @@ corrections, predict, model, fibonacci-laws, …), deltat (cycles, deep-time,
40
40
  historical), cardinal points, phase, chain-cycles, sun, climate, eclipse
41
41
  finders, and the published reference curves.
42
42
 
43
+ For rendered display values (day/year lengths, precession rates, orbital
44
+ elements as preformatted strings), see
45
+ [`@essrt/model-values`](https://www.npmjs.com/package/@essrt/model-values) —
46
+ generated from this engine at the same model version.
47
+
48
+ ## The assembled model — `createModel()`
49
+
50
+ The canonical assembly, wired once inside the package:
51
+
52
+ ```js
53
+ import { createModel, DEFAULT_CONSTANTS } from '@essrt/physics';
54
+
55
+ const model = createModel();
56
+ model.identity.modelVersion; // 'v10.0' + both content hashes
57
+ model.epoch.hAtYear(2000 - 380e6); // 306189 — Devonian H (the Wells 1963 match)
58
+ model.earth.obliquityDeg(2000); // 23.4393
59
+ model.cardinal.jd(2000, 'SS'); // 2451716.575 — June solstice 2000 (USNO)
60
+ model.lengths.tropicalYearDays(2000); // 365.24219
61
+
62
+ // Counterfactual (§2d): inject different constants, get a different solar
63
+ // system — self-identifying, with its own constants hash.
64
+ const cf = createModel({
65
+ ...DEFAULT_CONSTANTS,
66
+ foundational: { ...DEFAULT_CONSTANTS.foundational, holisticyearLength: 400000 },
67
+ });
68
+ cf.epoch.hAtYear(2000); // 400000
69
+ cf.identity.counterfactual; // true
70
+ ```
71
+
72
+ The surface groups: `time` (exact JD ↔ model-year conversion on the SI
73
+ axis the fits were anchored on — callers holding a JD convert here, never
74
+ with their own formula), `identity` (version + hashes + citation DOI), `epoch`
75
+ (H, LOD, α, ΔT, deep-time quantities at any year ±500 Myr), `earth`
76
+ (obliquity, eccentricity, inclination, perihelion), `lengths` (year and
77
+ day lengths), `cardinal` (solstice/equinox JD, RA, year length), `moon`
78
+ (distance, sidereal month). Validation targets are refused as inputs —
79
+ a counterfactual cannot move the goalposts it is judged by.
80
+
81
+ ## Underneath: a parts library
82
+
83
+ `createModel()` is assembly over unassembled factories. Each factory
84
+ receives everything through one deps object — plain numbers plus
85
+ functions — and no module imports another; that is what makes
86
+ counterfactuals first-class and lets the same core run in Node and the
87
+ browser. For custom wiring (different α channel, subset assembly), use
88
+ the factories directly: the reference adapter is `tools/lib/` in the
89
+ [public repository](https://github.com/dvansonsbeek/3d) — the hosted
90
+ simulator and the project's verification gates run on it. A service
91
+ surface (API/MCP) over `createModel()` is on the project roadmap.
92
+
43
93
  ## Provenance
44
94
 
45
95
  Every value derives from the model parameters and fitted coefficients in
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@essrt/physics",
3
- "version": "1.0.0",
3
+ "version": "1.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
6
  "modelVersion": "v10.0",
@@ -17,7 +17,7 @@
17
17
  */
18
18
 
19
19
  /** @type {string} */
20
- export const COEFFICIENTS_HASH = "6ff0418968c5f28e";
20
+ export const COEFFICIENTS_HASH = "19f53e968ab084a9";
21
21
 
22
22
  /** @type {Readonly<Record<string, unknown>>} */
23
23
  export const FITTED_COEFFICIENTS = Object.freeze({
@@ -29,7 +29,7 @@ export const FITTED_COEFFICIENTS = Object.freeze({
29
29
  CARDINAL_POINT_ECC_TERMS: {"SS":[{"order":1,"sin":116.05878933096193,"cos":6.053835966388666},{"order":2,"sin":-36.94641060512612,"cos":-3.6483119819549628}],"WS":[{"order":1,"sin":-116.03037928422094,"cos":-5.962252492120318},{"order":2,"sin":-42.131690533380095,"cos":-4.170223805142553}],"VE":[{"order":1,"sin":-5.9924039162609315,"cos":116.25494834666672},{"order":2,"sin":39.492321674775944,"cos":7.1383778514204534}],"AE":[{"order":1,"sin":5.900809238629194,"cos":-116.36664741389453},{"order":2,"sin":40.1142516966173,"cos":0.6760377717874158}]},
30
30
  CARDINAL_POINT_HARMONICS: {"SS":[[2,-0.0021263537553013138,0.0005395169758932997],[3,-0.007460739084007917,0.00017235850287369416],[4,-0.004278742415321993,0.001602256569838718],[5,-0.007352193936244787,0.000953160956183136],[6,-0.012397619247231017,-0.0009175678001549948],[7,-0.06811088290503968,-0.03231160219280074],[8,0.03688918319841461,0.015354974790808244],[9,0.0031080031062757996,0.00804647663493118],[10,0.0001027726743483649,0.006366123252278851],[11,0.0008265329294285571,0.006070883193881894],[12,-0.00039971822147829433,0.004648050204708476],[13,-0.0237307498736488,0.0037319159567338793],[14,-0.0013954966160393734,0.0010734919088238133],[15,-0.00008786831170625826,0.003722369308591496],[17,-0.00016245215703693673,0.0010098887973135587],[18,-0.0002716645738444743,0.0004939760907387072],[19,0.02253313186107514,0.0026135055828589646],[22,0.0007279740064232152,0.00025313914522270776],[23,0.001514232387144077,0.0009132347720956812],[24,-0.024186270444397466,-0.002633773306876702],[29,0.001494098849250974,0.00003499312126213944],[40,0.0013850859395228387,0.00017554926351556177],[48,0.00026353708701570177,0.000015854257427251558]],"WS":[[2,0.0010176082594428241,-0.0001929748322869152],[3,0.005674643796068353,-0.00038751032557975416],[4,0.0017823169864410006,0.000060840150253674195],[5,0.003902350115173372,0.0014943336753829987],[6,0.008701338455584007,0.003566955934104406],[7,0.06450443942934096,0.03585413473036107],[8,-0.04051461221456849,-0.006219814445349873],[9,-0.00609389958994842,-0.004782187176790898],[10,-0.003089830394353246,-0.0026906957144992483],[11,-0.003442518106690335,-0.0024410319700027745],[12,-0.0022616973859285214,-0.0021203178110572713],[13,0.021245500707680585,-0.0019863972877098434],[14,-0.0016335454958234703,-0.003040081796799866],[15,-0.0007374632894410084,-0.00038183352578103794],[17,-0.0005132043784786084,-0.00033082820944784554],[18,-0.00018870607216962194,-0.0001056600454742545],[19,-0.022722948377056483,-0.002656027088285117],[22,-0.00011725549396773591,0.00004222146728093096],[23,0.0014865134976541309,0.0008791017104325932],[24,0.023201945164141365,0.002362194517433196],[29,-0.0009371061463392303,0.000005809777032338154],[40,-0.0007389257062746273,-0.00004858499516087768],[48,0.00016169791080987097,0.000027838870110670492]],"VE":[[2,0.00023382686550988557,0.0013012690894998854],[3,0.0006768693772480606,0.0017633152103251936],[4,0.0004870205748665226,0.0038107658432373613],[5,0.001695016898998875,0.0031707710324003387],[6,0.004137323645613241,-0.00011763114983737229],[7,0.03662869459686472,-0.054460829908007095],[8,-0.008305363473843638,0.049678485560980624],[9,-0.0033871781141855887,0.01693131909427162],[10,-0.0015308607275127664,0.013836167297877464],[11,-0.0012984522292724427,0.013570132292706451],[12,-0.0007127616014617856,0.011177814913562484],[13,-0.00038177291846210585,-0.013503625822819353],[14,0.00034917468779335537,0.009027401377607817],[15,-0.0009059684907700966,0.004402707201698416],[17,0.0000185452031310814,0.0023828543812022098],[18,0.0000920843886282628,0.001162867581590914],[19,-0.0024912708532988503,0.023134772316608085],[22,-0.00019306319520862917,0.00010657201733974396],[23,-0.001459800845078806,-0.0010452969993960646],[24,0.0030771918634453633,-0.023553574795690507],[29,-0.00028332442093710863,0.0011754980172236009],[40,-0.00043028461825844543,0.0009476095286869555],[48,-0.00019895740011646612,0.00002534765455826324]],"AE":[[2,-0.0013168083603973427,-0.0017062749415338067],[3,-0.0023888831633842983,-0.00382587072239345],[4,-0.0027741804119988576,-0.005421062780396318],[5,-0.004716987188583744,-0.005418621651305338],[6,-0.007073800846606896,-0.003112700938128756],[7,-0.03884750575663966,0.051019584217455304],[8,0.0057073793159041495,-0.04862974809386755],[9,0.0019266340158542571,-0.021750791808213717],[10,0.00042568874139843437,-0.01789445951527781],[11,0.0008002748771934056,-0.016959151398793167],[12,0.000547840376846554,-0.013961686776188286],[13,0.0008691257278281115,0.012017817826432122],[14,0.0010415931945980145,-0.006765227441041762],[15,0.0007188491286263069,-0.007883253528404684],[17,0.0004008867799065113,-0.0031001430938628746],[18,0.00019044788357681412,-0.0015873821724755747],[19,0.002579253675391189,-0.023427869016830194],[22,-0.00013275872731161452,-0.0003639917290360791],[23,-0.0015179007675886482,-0.0007438057276552294],[24,-0.0019837404043797136,0.0240753672774524],[29,-0.00022683018096580752,-0.001226849673275034],[40,-0.0002006324309908082,-0.0010769701927092628],[48,-0.00022039472841982804,-0.00006869982617116371]]},
31
31
  CARDINAL_POINT_JOINT_TERMS: {"quadratureDeg":{"SS":0,"AE":90,"WS":180,"VE":270},"terms":[{"order":1,"div":20,"sin":0.00012298718625863202,"cos":-0.00004570865428244551},{"order":1,"div":21,"sin":-0.00003702220541142342,"cos":-0.000054594667698307694},{"order":1,"div":25,"sin":-0.00019689034303241199,"cos":0.00009610288028515778},{"order":1,"div":26,"sin":-0.0002472253165408766,"cos":0.0001285175417257623},{"order":1,"div":27,"sin":0.0006887110310923808,"cos":-0.00000992591081069649},{"order":1,"div":28,"sin":-0.00022514721185305626,"cos":0.0001272776902790914},{"order":1,"div":30,"sin":-0.0001216143492784022,"cos":0.000037513740681370165},{"order":1,"div":31,"sin":-0.00014744654640213897,"cos":-0.000015049935231815},{"order":1,"div":33,"sin":-0.00006573337723741824,"cos":-0.00008197081294359976},{"order":1,"div":34,"sin":-0.00010697200298420013,"cos":-0.00007190259861871528},{"order":1,"div":35,"sin":0.0008396730326691823,"cos":-0.0001614825119037259},{"order":1,"div":36,"sin":-0.00013829392187181036,"cos":-0.00003067139069964671},{"order":1,"div":37,"sin":-0.00011661732904204659,"cos":-0.000004122283056231254},{"order":2,"div":20,"sin":0.00006554579568392791,"cos":-0.000022078208656396927},{"order":2,"div":21,"sin":-0.00007973348839985569,"cos":0.000017621806735450313},{"order":2,"div":25,"sin":0.00005466836340098929,"cos":-0.000033413296449269965},{"order":2,"div":26,"sin":-0.00002548702993373088,"cos":0.00003515958855386493},{"order":2,"div":27,"sin":0.0000066181130745659535,"cos":0.000023186888746190917},{"order":2,"div":28,"sin":-0.000015323564949997447,"cos":0.000029766712997172834},{"order":2,"div":30,"sin":-0.000021685961975174492,"cos":0.000006001122709939856},{"order":2,"div":31,"sin":0.0000015806927876136162,"cos":-0.000027002383081133103},{"order":2,"div":33,"sin":-0.0000393505991158089,"cos":-0.000006565532033825103},{"order":2,"div":34,"sin":-0.00004522985055780593,"cos":-0.0000024142205715175256},{"order":2,"div":35,"sin":0.00019078545625530915,"cos":-0.00003317580946644653},{"order":2,"div":36,"sin":-0.000052512879391385674,"cos":0.000014524372567384369},{"order":2,"div":37,"sin":-0.00003931964500464408,"cos":0.000017325762654777968}],"note":"phase = order*lambda_X - 2*pi*div*cycles, self-corrected at 2000; counter-rotating — see plan §10g"},
32
- CLIMATE_FORMULA_COEFFS: {"config":{"H_kyr":335.317,"eight_H_kyr":2682.536,"L1_integers":[9,12,14,16,18,20,21,22,25,28,30,31,35,38,39,48,50,53,65,66,68,73,76,96,107,110,113,120,134,141,152,185],"L2_periods_kyr":{"405-kyr (fundamental)":404.5,"202-kyr (2nd harmonic)":202.25,"135-kyr (3rd harmonic)":134.83},"L3_transitions_ma":{"PETM":56,"EOT":34,"Mi-1":23,"MMCT":14,"iNHG":2.7,"MPT":1},"description":"Climate formula = intercept + L1 + L2 + L3 (in normalized units). De-normalize: y_raw = y_norm * y_std + y_mean + (trend_slope*t_kyr + trend_intercept)."},"regimes":{"lr04-post-mpt":{"label":"LR04 post-MPT","regime":"post-mpt","window_kyr":[0,1000],"n_samples":1001,"intercept":0.0012111612363188686,"L1":[{"n":9,"a":-0.0995251935331467,"b":0.0735958539001094},{"n":12,"a":0.1926144837989534,"b":-0.0802736374483427},{"n":14,"a":-0.0737669621963814,"b":-0.06751612296920122},{"n":16,"a":-0.02510150250086739,"b":-0.19506765074130583},{"n":18,"a":-0.06791098457240934,"b":0.04648625033661919},{"n":20,"a":-0.28116864673787,"b":-0.07638759281030251},{"n":21,"a":-0.2455952057968112,"b":0.12970817997145723},{"n":22,"a":-0.10129469171679499,"b":0.5195562020959481},{"n":25,"a":-0.18175433283296516,"b":0.4306624297267865},{"n":28,"a":-0.35824765409381143,"b":-0.6629684201652044},{"n":30,"a":-0.08984243767965358,"b":0.003209254704765256},{"n":31,"a":-0.01666645038841532,"b":0.4046950193876767},{"n":35,"a":-0.17980145973884165,"b":-0.13200740318932608},{"n":38,"a":-0.3593507889049426,"b":0.4002206673273417},{"n":39,"a":0.26598816861942776,"b":0.2575516599692471},{"n":48,"a":-0.19891038366180333,"b":-0.0554511942223533},{"n":50,"a":-0.022647425357587896,"b":0.11287891488448919},{"n":53,"a":-0.03154642045353713,"b":-0.045744861495295976},{"n":65,"a":-0.23249742943974538,"b":0.2894729129917759},{"n":66,"a":-0.19057663961367077,"b":-0.20321144307734298},{"n":68,"a":-0.05170080629061563,"b":-0.09394623038330009},{"n":73,"a":0.010571892367894058,"b":-0.06352637508810456},{"n":76,"a":-0.06325441449557727,"b":-0.019280335092855257},{"n":96,"a":0.011644688677859628,"b":0.0173448233994866},{"n":107,"a":-0.027557602263970027,"b":-0.04239264697467825},{"n":110,"a":-0.024897017314587534,"b":-0.051869808046730456},{"n":113,"a":-0.1652806100198844,"b":-0.09167808542003412},{"n":120,"a":0.09548113724866789,"b":0.17261908401201856},{"n":134,"a":0.014907506134757413,"b":0.03886314134667357},{"n":141,"a":0.06387644524968576,"b":-0.09030933699066153},{"n":152,"a":0.010576081970808749,"b":0.027723293634244323},{"n":185,"a":0.008492200395962825,"b":0.04050000466117239}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":-0.06871018523565597,"b":-0.044501924079275224},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.0012570138054152852,"b":0.010739728384415115},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.000713853261693815,"b":0.0003159747725457649}],"L3":[],"denormalization":{"y_mean":1.5012965895430689e-15,"y_std":0.43131092949760913,"trend_slope":-0.00008678094360729054,"trend_intercept":4.192006855420027},"r2":{"l1_only":0.8702417498406256,"l1_l2":0.8735160573771874,"l1_l2_l3":0.8735160573771874,"delta_l2":0.0032743075365617713,"delta_l3":0}},"lr04-inhg-mpt":{"label":"LR04 inhg-MPT","regime":"inhg-mpt","window_kyr":[1000,2700],"n_samples":1701,"intercept":0.008920278353108338,"L1":[{"n":9,"a":-0.07405028449453253,"b":0.15517081844707203},{"n":12,"a":0.01866923229432145,"b":-0.007063096527562734},{"n":14,"a":0.18279697169825898,"b":-0.07454169575921728},{"n":16,"a":0.10129829826713639,"b":0.10810604004092653},{"n":18,"a":0.038640928064159766,"b":0.02982469347024955},{"n":20,"a":-0.14787599025706077,"b":0.07577094969150679},{"n":21,"a":0.09677337243707089,"b":0.016860261470392657},{"n":22,"a":-0.022375864766743706,"b":0.02220905089979807},{"n":25,"a":-0.14076590923751678,"b":0.17555041743810823},{"n":28,"a":-0.21525004484676127,"b":-0.04578568753479185},{"n":30,"a":0.030143602368885667,"b":0.10254869314008506},{"n":31,"a":0.21710408149563598,"b":0.05383194958090321},{"n":35,"a":-0.0023973677459534523,"b":-0.10873258632641115},{"n":38,"a":0.004178455322226226,"b":-0.0011082608383255457},{"n":39,"a":-0.0875435703779072,"b":0.30052864306222427},{"n":48,"a":-0.10168222495799972,"b":0.04399372091035183},{"n":50,"a":-0.22835671100082874,"b":0.13718694296600267},{"n":53,"a":-0.09736101501073234,"b":-0.23337146539777567},{"n":65,"a":-0.07964560065133833,"b":0.6164308335693638},{"n":66,"a":0.25274046687246615,"b":-0.055605267629155186},{"n":68,"a":0.24482211095872197,"b":-0.21321398654701784},{"n":73,"a":0.008763221081432095,"b":-0.11335849212015736},{"n":76,"a":-0.0030493872100670004,"b":-0.16682188754319888},{"n":96,"a":0.11412815645319081,"b":0.014435303541047611},{"n":107,"a":-0.015380281657131366,"b":-0.0321802670584716},{"n":110,"a":0.04422499587380601,"b":-0.01588269092618962},{"n":113,"a":-0.1222035066635331,"b":-0.024574916330827413},{"n":120,"a":-0.018661416285125867,"b":0.13151829723736955},{"n":134,"a":-0.004310837767722002,"b":0.03107644805302884},{"n":141,"a":-0.007930364842267779,"b":-0.10629193080445061},{"n":152,"a":0.05066586999979433,"b":-0.001158007233720376},{"n":185,"a":-0.00797034945844687,"b":0.04741383351709869}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.09051490688867488,"b":0.07173880137358005},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.023909535713882123,"b":0.015217706592979607},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.00042536814705274734,"b":-0.004832147394600916}],"L3":[],"denormalization":{"y_mean":2.117321276827753e-15,"y_std":0.2533430989053228,"trend_slope":-0.00028446235786389366,"trend_intercept":4.264486402612575},"r2":{"l1_only":0.7215739272152626,"l1_l2":0.7288534879845776,"l1_l2_l3":0.7288534879845776,"delta_l2":0.007279560769315019,"delta_l3":0}},"lr04-pre-inhg":{"label":"LR04 pre-iNHG","regime":"pre-inhg","window_kyr":[2700,5320],"n_samples":2621,"intercept":0.004796508528784117,"L1":[{"n":9,"a":0.013779023691656556,"b":0.1887732393800048},{"n":12,"a":0.13129537834504676,"b":-0.03113522369142426},{"n":14,"a":0.1414594119329862,"b":0.11816702203867133},{"n":16,"a":0.1374774207957588,"b":-0.03532494932806938},{"n":18,"a":0.13889366703557265,"b":0.061983476126678046},{"n":20,"a":-0.08498932818178885,"b":0.09540707265299314},{"n":21,"a":-0.10835127103711396,"b":-0.028764326042978194},{"n":22,"a":0.11148882758014007,"b":-0.03865728945312771},{"n":25,"a":0.12735093632704228,"b":0.13982381914614075},{"n":28,"a":-0.05391956035920037,"b":0.09255118436355968},{"n":30,"a":-0.12842322409247706,"b":-0.022095279888407936},{"n":31,"a":0.060333412991577774,"b":0.09177578600913372},{"n":35,"a":-0.012478495685001064,"b":-0.04169256632491078},{"n":38,"a":-0.154256848048024,"b":-0.04574676829170835},{"n":39,"a":-0.1304853989733588,"b":0.07943845651841604},{"n":48,"a":-0.028123303831937296,"b":0.0662641289229987},{"n":50,"a":-0.12169089657630963,"b":0.22345682911110645},{"n":53,"a":-0.022223821871603613,"b":-0.17818151157130788},{"n":65,"a":0.231248153866511,"b":-0.2916791754030967},{"n":66,"a":-0.022864692071038147,"b":0.3181446212683465},{"n":68,"a":0.20471711753615746,"b":0.07437955465758662},{"n":73,"a":0.09271425866017498,"b":-0.07605761544176559},{"n":76,"a":0.05134351093719412,"b":-0.11159934131904131},{"n":96,"a":0.06193809192068687,"b":0.04756849127167064},{"n":107,"a":-0.08211876323001087,"b":0.004502440118732665},{"n":110,"a":0.03785327266780438,"b":-0.04550095466851478},{"n":113,"a":0.03639647062777348,"b":0.048238754955500465},{"n":120,"a":0.0368133955260415,"b":0.06701066470411021},{"n":134,"a":-0.028450773724023336,"b":0.031595793477797764},{"n":141,"a":-0.004500297237105567,"b":0.03908678223977317},{"n":152,"a":0.013099790949827193,"b":0.05640782705980925},{"n":185,"a":-0.02891241356346971,"b":0.02415316881767574}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.25891193485044134,"b":0.17371828100857337},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.016921027562455088,"b":-0.014197476885633338},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.012255018162150574,"b":0.004398149714187857}],"L3":[],"denormalization":{"y_mean":2.2229875746786803e-16,"y_std":0.1419188719967453,"trend_slope":-0.0001616384823512257,"trend_intercept":3.7150997304817532},"r2":{"l1_only":0.3813015022594486,"l1_l2":0.429750475284833,"l1_l2_l3":0.429750475284833,"delta_l2":0.04844897302538442,"delta_l3":0}},"lr04-full":{"label":"LR04 full","regime":"lr04-full","window_kyr":[0,5320],"n_samples":5321,"intercept":-0.0016330720932757827,"L1":[{"n":9,"a":-0.039185151843874236,"b":0.1028027878544019},{"n":12,"a":0.10301948451508858,"b":-0.02016680911380898},{"n":14,"a":0.055966767020889104,"b":0.02548225007193283},{"n":16,"a":0.0825862002141604,"b":-0.011142801627301923},{"n":18,"a":0.08795737198985376,"b":0.08505384386815164},{"n":20,"a":-0.0833847004330675,"b":0.05896022547761226},{"n":21,"a":0.04517410629977709,"b":0.07053289320749276},{"n":22,"a":-0.043187976112302504,"b":0.08310318850042439},{"n":25,"a":-0.06619299571246737,"b":0.2015362213761424},{"n":28,"a":-0.18004986253238145,"b":-0.15638338680106822},{"n":30,"a":0.08281826590512324,"b":0.09228691110994974},{"n":31,"a":0.07842938153386976,"b":0.13312690720033976},{"n":35,"a":-0.05983013686458974,"b":-0.11181828588827666},{"n":38,"a":-0.10003353278939382,"b":0.028430196111982324},{"n":39,"a":-0.09933535960424142,"b":0.12951479543338562},{"n":48,"a":-0.10124135193351344,"b":-0.004184617430671099},{"n":50,"a":-0.09567881414186163,"b":0.12225222459706246},{"n":53,"a":-0.039106538213266734,"b":-0.13283707936046205},{"n":65,"a":-0.11174691701044243,"b":0.25089233080359813},{"n":66,"a":0.020601599246667206,"b":-0.03797795334999951},{"n":68,"a":0.13350544838291886,"b":-0.09215169710518832},{"n":73,"a":0.038199430871435826,"b":-0.0841857203888797},{"n":76,"a":-0.005813074910088282,"b":-0.09082868201567769},{"n":96,"a":0.046438305781698386,"b":0.012844602230491898},{"n":107,"a":-0.04379619771020141,"b":-0.032852194511152386},{"n":110,"a":0.009950870224294472,"b":-0.04720533633465711},{"n":113,"a":-0.07680036454595568,"b":-0.038416915956664834},{"n":120,"a":0.033451248357208155,"b":0.09791337998530963},{"n":134,"a":-0.007268406349392994,"b":0.021288252328934228},{"n":141,"a":0.011560111434022273,"b":-0.054849284582987094},{"n":152,"a":0.020876832203619983,"b":0.016566773014120094},{"n":185,"a":-0.007060987512414488,"b":0.028239558896544135}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.07942892530837417,"b":0.07145000274630177},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.031051802518720632,"b":0.06979253345037166},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.015693036732781572,"b":-0.013993995124926967}],"L3":[{"label":"iNHG","t_kyr":2700,"beta":-0.19070682708954556},{"label":"MPT","t_kyr":1000,"beta":0.08523111265217007}],"denormalization":{"y_mean":8.786640107689267e-16,"y_std":0.26728652336026737,"trend_slope":-0.0002890388734746666,"trend_intercept":4.253595893576046},"r2":{"l1_only":0.23851034743183974,"l1_l2":0.2474557740025657,"l1_l2_l3":0.25525662694102225,"delta_l2":0.008945426570725945,"delta_l3":0.0078008529384565595}},"cenogrid-d18o":{"label":"CENOGRID δ¹⁸O","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":0.00001602686211273741,"L1":[{"n":9,"a":0.00962378075462271,"b":-0.003263475086878552},{"n":12,"a":0.0037269530675528356,"b":0.00787528999140077},{"n":14,"a":-0.0031536915286465507,"b":-0.002869531163041282},{"n":16,"a":-0.00022283423149329956,"b":-0.009746906077462656},{"n":18,"a":-0.0011693799218213778,"b":0.006890942568311449},{"n":20,"a":-0.0013096788048939253,"b":-0.007959970387753229},{"n":21,"a":0.003158870772980469,"b":0.0010743005808000303},{"n":22,"a":-0.0014208778904404391,"b":0.0013811686772555942},{"n":25,"a":-0.006546404540596593,"b":-0.0005082057100293619},{"n":28,"a":-0.009112937776092274,"b":-0.01654567050381012},{"n":30,"a":-0.0018422389136167707,"b":-0.001321814940870012},{"n":31,"a":0.007249316579560508,"b":0.01076606883574445},{"n":35,"a":-0.0003746519931765594,"b":-0.008535583295589575},{"n":38,"a":-0.002337493041692442,"b":0.0003424116815364203},{"n":39,"a":0.003253340413687406,"b":0.007527713085922034},{"n":48,"a":-0.0068470522070167615,"b":-0.008939408900639545},{"n":50,"a":-0.012231227013096086,"b":0.006279631132594548},{"n":53,"a":-0.01176198086471335,"b":-0.004470949479484912},{"n":65,"a":-0.007927658464132941,"b":0.012719422318754251},{"n":66,"a":-0.003620029612143832,"b":-0.00576365201448418},{"n":68,"a":0.008347937807959557,"b":-0.004428610084526836},{"n":73,"a":0.006492516280997703,"b":-0.003017982927162457},{"n":76,"a":0.0011690351630563851,"b":-0.005619440895051139},{"n":96,"a":0.0018567939998770625,"b":0.000299913281031477},{"n":107,"a":-0.0020019996095300254,"b":-0.004533038686529572},{"n":110,"a":0.0005001486931849433,"b":-0.002899913348978863},{"n":113,"a":-0.003686640337390224,"b":-0.003791287533903404},{"n":120,"a":0.0004731956477952011,"b":0.01016796154961575},{"n":134,"a":-0.005869594079637888,"b":0.00260064302771034},{"n":141,"a":-0.0010200380686295632,"b":0.0002626403150328052},{"n":152,"a":-0.002231018168438524,"b":-0.002114242582690146},{"n":185,"a":-0.0004689621628445171,"b":0.0000817723920968429}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.06570759747593674,"b":0.05222383705919761},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.003998270781965799,"b":-0.005580221960438302},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.0005452493435179027,"b":-0.005103620540960949}],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.9406820522647168},{"label":"EOT","t_kyr":34000,"beta":-1.6914958810434142},{"label":"Mi-1","t_kyr":23000,"beta":1.378424883226697},{"label":"MMCT","t_kyr":14000,"beta":-0.5721018868779643},{"label":"iNHG","t_kyr":2700,"beta":-0.9477478837426522},{"label":"MPT","t_kyr":1000,"beta":0.9598033678184575}],"denormalization":{"y_mean":3.1388799311243884e-16,"y_std":0.5138368170014185,"trend_slope":-0.000060475169948230774,"trend_intercept":3.5886100819307556},"r2":{"l1_only":0.001140303262665121,"l1_l2":0.0047003500178600666,"l1_l2_l3":0.6176613009398422,"delta_l2":0.0035600467551949455,"delta_l3":0.6129609509219821}},"cenogrid-d13c":{"label":"CENOGRID δ¹³C","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":0.00005414279487498172,"L1":[{"n":9,"a":0.005338473828240495,"b":-0.023091206831963005},{"n":12,"a":0.0003828507035659112,"b":0.00011796076309235661},{"n":14,"a":0.0037211222379592585,"b":-0.005440279318535575},{"n":16,"a":0.0015179010500321966,"b":-0.011153694047233856},{"n":18,"a":-0.0060441829402797425,"b":0.0014067013519241927},{"n":20,"a":0.011330299958277485,"b":-0.009365743651940341},{"n":21,"a":-0.006083184388396311,"b":-0.0071716042504788675},{"n":22,"a":0.005891788023228518,"b":-0.011625719098538915},{"n":25,"a":-0.002998708433273448,"b":-0.002425284508822263},{"n":28,"a":-0.004606115559338046,"b":-0.00522506041073265},{"n":30,"a":-0.0031268127627834628,"b":-0.0057408911878803134},{"n":31,"a":-0.0006975599235208692,"b":0.008223546177043826},{"n":35,"a":-0.0043981746116429675,"b":-0.010423318145693632},{"n":38,"a":0.002310842419578572,"b":-0.007315922976005076},{"n":39,"a":0.004005157049221934,"b":-0.0006981311160208023},{"n":48,"a":0.009237202711512037,"b":-0.006070723840607467},{"n":50,"a":0.0029511380883168953,"b":-0.007995750349815112},{"n":53,"a":-0.004356464801210605,"b":-0.002089561337944505},{"n":65,"a":0.0013634229096102686,"b":-0.014002661367543303},{"n":66,"a":0.009497211536255361,"b":-0.004104030174694335},{"n":68,"a":-0.005187392326990199,"b":0.005241392389860411},{"n":73,"a":0.006544317568239195,"b":0.000006970297478533888},{"n":76,"a":-0.005485396820039863,"b":-0.003637938532041029},{"n":96,"a":-0.0012790984070198625,"b":-0.0023466893606536765},{"n":107,"a":-0.0031720827718397576,"b":-0.0033220042224514144},{"n":110,"a":0.0028283855123447726,"b":-0.0017211884146841674},{"n":113,"a":0.0038613350038431975,"b":-0.0014070048283321617},{"n":120,"a":-0.0011869967366585062,"b":-0.0022822648297580253},{"n":134,"a":-0.0032142822976851653,"b":0.0013438701253102342},{"n":141,"a":-0.0023577629000963722,"b":0.004452885549992867},{"n":152,"a":-0.0015718917902917864,"b":-0.000023341513222700912},{"n":185,"a":0.0009140186026623447,"b":0.0004586784887968649}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.12063978416524974,"b":0.029906772026227803},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.003802666960653048,"b":-0.016731338007454265},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.016630805150028714,"b":-0.011290616856278541}],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.2947252119737593},{"label":"EOT","t_kyr":34000,"beta":-0.6511389830637635},{"label":"Mi-1","t_kyr":23000,"beta":-0.7995646857161036},{"label":"MMCT","t_kyr":14000,"beta":0.876145231687899},{"label":"iNHG","t_kyr":2700,"beta":1.326238410732585},{"label":"MPT","t_kyr":1000,"beta":-1.3292417525664886}],"denormalization":{"y_mean":-1.6966918546618317e-16,"y_std":0.5116419176812778,"trend_slope":0.000014091551862757799,"trend_intercept":0.17563680335949733},"r2":{"l1_only":0.001192811757378509,"l1_l2":0.00926748748963091,"l1_l2_l3":0.3513849547286956,"delta_l2":0.008074675732252401,"delta_l3":0.34211746723906467}},"epica-co2":{"label":"EPICA CO₂","regime":"epica-co2","window_kyr":[0,800],"n_samples":801,"intercept":0.02509868349579805,"L1":[{"n":9,"a":-0.13003386753012586,"b":0.08414979295891137},{"n":12,"a":-0.6236388603851609,"b":0.34247247340443243},{"n":14,"a":0.6631771893447128,"b":0.9687812023833793},{"n":16,"a":0.9068443378518338,"b":-0.3428782250083507},{"n":18,"a":-0.07606132538425875,"b":-0.5967175302058826},{"n":20,"a":0.5313227446554606,"b":0.15978812783889615},{"n":21,"a":-0.08258585443639624,"b":-0.2753833244031067},{"n":22,"a":0.39541340215045845,"b":-0.5841266391158294},{"n":25,"a":0.4568654969984005,"b":-0.6424030929602188},{"n":28,"a":0.14653083258036675,"b":0.21899842111633155},{"n":30,"a":-0.3510472972154039,"b":-0.22699235742763407},{"n":31,"a":0.07352733077244034,"b":-0.16702990660583567},{"n":35,"a":0.1334650859445657,"b":0.15082020828780487},{"n":38,"a":0.5198104249913299,"b":-0.7317366066994727},{"n":39,"a":-0.5685379187000535,"b":-0.10275769943020215},{"n":48,"a":0.10843173117562208,"b":0.0715025243352368},{"n":50,"a":-0.1027652959577797,"b":-0.009949537880590142},{"n":53,"a":-0.044570340872306206,"b":0.1042863559859665},{"n":65,"a":-0.14563851542868758,"b":0.049247801743060135},{"n":66,"a":0.46015546838724775,"b":0.2189781625962903},{"n":68,"a":0.16464748468015714,"b":-0.07979723358804339},{"n":73,"a":-0.06989554779284464,"b":0.04969251240079462},{"n":76,"a":-0.05535936251895954,"b":0.01884187757558046},{"n":96,"a":-0.019480164361414882,"b":0.06847314776774518},{"n":107,"a":0.02652405058532153,"b":0.06742222433960775},{"n":110,"a":0.020367387274551244,"b":0.04211384421026669},{"n":113,"a":0.15474869793452292,"b":0.059835282976371695},{"n":120,"a":-0.018576590780219695,"b":-0.05721197831802383},{"n":134,"a":-0.0033278247115,"b":-0.025503113862043878},{"n":141,"a":-0.0039267226298340075,"b":-0.03763392771970874},{"n":152,"a":0.0082486103359519,"b":0.018151792942286034},{"n":185,"a":0.05122046644997526,"b":-0.045923008600907284}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.15072042370599267,"b":0.02394293201461654},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.007223335228200088,"b":0.00029000470241465136},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.004616846508728569,"b":-0.0003472516198667081}],"L3":[],"denormalization":{"y_mean":2.980553797944989e-14,"y_std":25.51737494167102,"trend_slope":-0.006455378442643299,"trend_intercept":227.89326737247322},"r2":{"l1_only":0.8336437529715351,"l1_l2":0.8451857942676443,"l1_l2_l3":0.8451857942676443,"delta_l2":0.01154204129610914,"delta_l3":0},"carbon_amplification_ratios":{"9":{"n":9,"period_kyr":298.05955555555556,"lr04_post_mpt_amp":0.12378050678154681,"epica_amp":0.15488703741717694,"ratio":1.2513039528148666,"label":"g₂−g₇ Venus-Uranus ecc / Mercury Axial = 8H/9"},"12":{"n":12,"period_kyr":223.54466666666667,"lr04_post_mpt_amp":0.2086724616194606,"epica_amp":0.7114863478818493,"ratio":3.4095842947371295,"label":"s₅−s₁ Jupiter-Mercury nodal / Uranus AscNode = 8H/12"},"14":{"n":14,"period_kyr":191.6097142857143,"lr04_post_mpt_amp":0.09999995786236443,"epica_amp":1.1740276838978454,"ratio":11.740281786055608,"label":"g₂−g₈ Venus-Neptune ecc"},"16":{"n":16,"period_kyr":167.6585,"lr04_post_mpt_amp":0.19667606309241886,"epica_amp":0.969500969715249,"ratio":4.929430427228334,"label":"Mars Axial = 8H/16"},"18":{"n":18,"period_kyr":149.02977777777778,"lr04_post_mpt_amp":0.08229746834473614,"epica_amp":0.6015456226041533,"ratio":7.3094061664732735,"label":"s₄−s₆ Mars-Saturn nodal"},"20":{"n":20,"period_kyr":134.1268,"lr04_post_mpt_amp":0.2913603820764891,"epica_amp":0.5548297980340198,"ratio":1.9042733060679595,"label":"g₃−g₂ Earth-Venus ecc"},"21":{"n":21,"period_kyr":127.73980952380953,"lr04_post_mpt_amp":0.27774307743287857,"epica_amp":0.28750025862996426,"ratio":1.0351302408228111,"label":"Mars Obliq / Jupiter Axial = 8H/21"},"22":{"n":22,"period_kyr":121.93345454545455,"lr04_post_mpt_amp":0.5293385133412892,"epica_amp":0.7053762748526169,"ratio":1.3325617862190728,"label":"s₂−s₄ Venus-Mars nodal / g₄−g₂ (Round 1 C8: highest L2 ratio at 12.84)"},"25":{"n":25,"period_kyr":107.30144,"lr04_post_mpt_amp":0.46744493352879074,"epica_amp":0.7882942446779952,"ratio":1.6863895362542054,"label":"s₁−s₄ Mercury-Mars nodal (100-kyr centroid)"},"28":{"n":28,"period_kyr":95.80485714285714,"lr04_post_mpt_amp":0.753570506190407,"epica_amp":0.26349875397834727,"ratio":0.3496670209539334,"label":"g₄−g₅ Mars-Jupiter ecc (Berger 95k)"},"30":{"n":30,"period_kyr":89.41786666666667,"lr04_post_mpt_amp":0.08989973817527222,"epica_amp":0.41804274328445756,"ratio":4.65009967514504,"label":"g₃−g₇ Earth-Uranus ecc"},"31":{"n":31,"period_kyr":86.53341935483871,"lr04_post_mpt_amp":0.40503805905833284,"epica_amp":0.18249728236681784,"ratio":0.4505682325041334,"label":"g₄−g₇ Mars-Uranus"},"35":{"n":35,"period_kyr":76.64388571428572,"lr04_post_mpt_amp":0.22305721109394244,"epica_amp":0.20139430079862528,"ratio":0.9028818203676291,"label":"Mars apsidal = 8H/35"},"38":{"n":38,"period_kyr":70.59305263157894,"lr04_post_mpt_amp":0.5378750524448473,"epica_amp":0.8975752556269172,"ratio":1.6687430501695426,"label":"s₈−s₃ Neptune-Earth nodal"},"39":{"n":39,"period_kyr":68.78297435897436,"lr04_post_mpt_amp":0.37024662510066425,"epica_amp":0.5777495216717852,"ratio":1.560445072293918,"label":"s₅−s₃ Earth nodal"},"48":{"n":48,"period_kyr":55.88616666666667,"lr04_post_mpt_amp":0.2064949773461111,"epica_amp":0.12988476166222698,"ratio":0.6289971956292383,"label":"s₇−s₆ Uranus-Saturn nodal"},"50":{"n":50,"period_kyr":53.65072,"lr04_post_mpt_amp":0.11512842959420262,"epica_amp":0.10324582004772566,"ratio":0.8967882252163082,"label":"g₆−g₅ Saturn-Jupiter ecc"},"53":{"n":53,"period_kyr":50.61388679245283,"lr04_post_mpt_amp":0.055567697420850166,"epica_amp":0.11341146031290357,"ratio":2.0409602264777162,"label":"Mars Ecc cycle = 8H/53"},"65":{"n":65,"period_kyr":41.269784615384616,"lr04_post_mpt_amp":0.37128105533683464,"epica_amp":0.15373979040182092,"ratio":0.4140792755028793,"label":"k+s₃ Earth obliquity (Berger 41k)"},"66":{"n":66,"period_kyr":40.64448484848485,"lr04_post_mpt_amp":0.27859351421742606,"epica_amp":0.5096022868676461,"ratio":1.8291965205978595,"label":"obliquity-band arithmetic-mean (Round 2 C10: EPICA CO₂ ratio 15.79)"},"68":{"n":68,"period_kyr":39.44905882352941,"lr04_post_mpt_amp":0.10723277285574526,"epica_amp":0.18296555058209002,"ratio":1.706246567252571,"label":"k+s₄ Berger Mars obliquity sub-peak"},"73":{"n":73,"period_kyr":36.747068493150685,"lr04_post_mpt_amp":0.06440004068378287,"epica_amp":0.08575974224521059,"ratio":1.3316721749650462,"label":"2|s₄| Mars nodal harmonic"},"76":{"n":76,"period_kyr":35.29652631578947,"lr04_post_mpt_amp":0.06612754550466153,"epica_amp":0.058477990467172725,"ratio":0.884321201110518,"label":"g₄−s₃ Mars-Earth beat"},"96":{"n":96,"period_kyr":27.943083333333334,"lr04_post_mpt_amp":0.02089118649487506,"epica_amp":0.07119022944738418,"ratio":3.407668083612593,"label":"k+g₆ Saturn climatic precession sub-peak (Round 1 A1 sideband)"},"107":{"n":107,"period_kyr":25.070429906542056,"lr04_post_mpt_amp":0.05056241647764536,"epica_amp":0.07245192609139588,"ratio":1.4329205591554015,"label":"k+g₇ Uranus climatic precession sub-peak (Round 1 A1)"},"110":{"n":110,"period_kyr":24.38669090909091,"lr04_post_mpt_amp":0.057535540824498514,"epica_amp":0.04678040549800916,"ratio":0.8130697100893534,"label":"k+g₃ Earth secondary precession sideband (Round 1 A1)"},"113":{"n":113,"period_kyr":23.739256637168143,"lr04_post_mpt_amp":0.18900410417456068,"epica_amp":0.16591389514230775,"ratio":0.8778322347385259,"label":"k+g₅ Jupiter climatic precession (Berger 23.7k)"},"120":{"n":120,"period_kyr":22.354466666666667,"lr04_post_mpt_amp":0.19726630664015402,"epica_amp":0.06015230825228382,"ratio":0.30492945945407424,"label":"k+g₂ Venus climatic precession = H/15"},"134":{"n":134,"period_kyr":20.01892537313433,"lr04_post_mpt_amp":0.04162424166864014,"epica_amp":0.02571931635893234,"ratio":0.617892730963778,"label":"k+g₅ Jupiter precession sub-peak (Round 1 A1)"},"141":{"n":141,"period_kyr":19.0250780141844,"lr04_post_mpt_amp":0.11061634872580531,"epica_amp":0.037838230220557524,"ratio":0.3420672500621997,"label":"k+g₃ Earth climatic precession — Berger quintet 19-kyr peak (subthreshold LR04, 3σ in Cheng monsoon; beats with n=113 to form n=28 per Wigley 1976)"},"152":{"n":152,"period_kyr":17.648263157894736,"lr04_post_mpt_amp":0.029672116873991274,"epica_amp":0.019938083144926386,"ratio":0.6719467717654775,"label":"k+g₄ Mars climatic precession sub-peak (Round 1 A1)"},"185":{"n":185,"period_kyr":14.500194594594594,"lr04_post_mpt_amp":0.041380766608657416,"epica_amp":0.06879286956009355,"ratio":1.6624358415269462,"label":"k+g₂ Venus precession sub-peak (Round 1 A1)"}}},"cenco2pip":{"label":"CenCO2PIP CO₂ (deep-time)","regime":"cenco2pip","window_kyr":[0,66000],"n_samples":661,"intercept":0.016379319171493434,"L1":[{"n":9,"a":0.0006135442349535857,"b":0.0004105385698334332},{"n":12,"a":0.0009729852475356464,"b":0.0005557567257649787},{"n":14,"a":0.0004695868449019586,"b":0.00015407085145136278},{"n":16,"a":0.000842228378656555,"b":-0.0009167033431056666},{"n":18,"a":0.0014499143192751932,"b":-0.0008315948258633104},{"n":20,"a":0.00032353217406463664,"b":-0.0002458235013227764},{"n":21,"a":0.0005181933791588079,"b":-0.0038870728442294286},{"n":22,"a":-0.0009990008691799425,"b":-0.0018635121462031428},{"n":25,"a":-0.013842815571713638,"b":-0.01887004259261632},{"n":28,"a":0.02821324316085222,"b":0.0346425697982303},{"n":30,"a":-0.005296842377337352,"b":-0.005193701588804456},{"n":31,"a":-0.0005937265903358129,"b":0.0003634694731705667},{"n":35,"a":0.0007770885325481615,"b":0.0005748167289352294},{"n":38,"a":0.0010509178473896504,"b":-0.000045071154070572234},{"n":39,"a":0.00048817353035711744,"b":0.00015418928078026836},{"n":48,"a":0.000984784365003719,"b":-0.00026376977450865937},{"n":50,"a":-0.006175741987117522,"b":0.0011271318797576179},{"n":53,"a":-0.0268574890971669,"b":-0.025277947402187712},{"n":65,"a":0.0008976656542442501,"b":0.0004443970733142626},{"n":66,"a":0.0009028265819185512,"b":-0.0002822115559156487},{"n":68,"a":0.0011730682755470008,"b":0.00008468544339761345},{"n":73,"a":0.0019158661673268716,"b":-0.0004157426300817781},{"n":76,"a":0.002235410382868609,"b":-0.003027740766027717},{"n":96,"a":0.0011641204811583372,"b":-0.00012646082385569336},{"n":107,"a":-0.09477349741045246,"b":0.196928960347087},{"n":110,"a":-0.009636391900466917,"b":0.003373064883293271},{"n":113,"a":-0.00006780002848554532,"b":0.002767788950030298},{"n":120,"a":0.00045191861243690847,"b":0.00011733688354313375},{"n":134,"a":-0.354527681860923,"b":-0.3766906478126637},{"n":141,"a":0.001393189816738785,"b":0.00023905583871641114},{"n":152,"a":0.0010180816333163472,"b":-0.001285695246414477},{"n":185,"a":-0.006581037204011087,"b":-0.020021001163745916}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.0014312276927094154,"b":0.002240492688354507},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.0006738387319812872,"b":0.0003909848895904283},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.0000946586449433579,"b":-0.0005426081695293755}],"L3":[{"label":"PETM","t_kyr":56000,"beta":-1.8798688093473028},{"label":"EOT","t_kyr":34000,"beta":1.8726117606990103},{"label":"Mi-1","t_kyr":23000,"beta":-0.9161078719668736},{"label":"MMCT","t_kyr":14000,"beta":0.3800604717521474},{"label":"iNHG","t_kyr":2700,"beta":-0.7402184932465288},{"label":"MPT","t_kyr":1000,"beta":0.38426286683854527}],"denormalization":{"y_mean":-2.091425032821257e-13,"y_std":209.18154000668048,"trend_slope":0.013251639299066168,"trend_intercept":214.15971983891893},"r2":{"l1_only":0.16106750642431011,"l1_l2":0.16107154209439578,"l1_l2_l3":0.7626295084612135,"delta_l2":0.000004035670085666965,"delta_l3":0.6015579663668177}}},"meta":{"script":"/home/dennis/code/3d/scripts/export_climate_formula_browser.py","consumer":"src/script.js — Climate Formula Explorer modal"}},
32
+ CLIMATE_FORMULA_COEFFS: {"config":{"H_kyr":335.317,"eight_H_kyr":2682.536,"L1_integers":[9,12,14,16,18,20,21,22,25,28,30,31,35,38,39,48,50,53,65,66,68,73,76,96,107,110,113,120,134,141,152,185],"L2_periods_kyr":{"405-kyr (fundamental)":404.5,"202-kyr (2nd harmonic)":202.25,"135-kyr (3rd harmonic)":134.83},"L3_transitions_ma":{"PETM":56,"EOT":34,"Mi-1":23,"MMCT":14,"iNHG":2.7,"MPT":1},"description":"Climate formula = intercept + L1 + L2 + L3 (in normalized units). De-normalize: y_raw = y_norm * y_std + y_mean + (trend_slope*t_kyr + trend_intercept)."},"regimes":{"lr04-post-mpt":{"label":"LR04 post-MPT","regime":"post-mpt","window_kyr":[0,1000],"n_samples":1001,"intercept":0.0012111612363188686,"L1":[{"n":9,"a":-0.0995251935331467,"b":0.0735958539001094},{"n":12,"a":0.1926144837989534,"b":-0.0802736374483427},{"n":14,"a":-0.0737669621963814,"b":-0.06751612296920122},{"n":16,"a":-0.02510150250086739,"b":-0.19506765074130583},{"n":18,"a":-0.06791098457240934,"b":0.04648625033661919},{"n":20,"a":-0.28116864673787,"b":-0.07638759281030251},{"n":21,"a":-0.2455952057968112,"b":0.12970817997145723},{"n":22,"a":-0.10129469171679499,"b":0.5195562020959481},{"n":25,"a":-0.18175433283296516,"b":0.4306624297267865},{"n":28,"a":-0.35824765409381143,"b":-0.6629684201652044},{"n":30,"a":-0.08984243767965358,"b":0.003209254704765256},{"n":31,"a":-0.01666645038841532,"b":0.4046950193876767},{"n":35,"a":-0.17980145973884165,"b":-0.13200740318932608},{"n":38,"a":-0.3593507889049426,"b":0.4002206673273417},{"n":39,"a":0.26598816861942776,"b":0.2575516599692471},{"n":48,"a":-0.19891038366180333,"b":-0.0554511942223533},{"n":50,"a":-0.022647425357587896,"b":0.11287891488448919},{"n":53,"a":-0.03154642045353713,"b":-0.045744861495295976},{"n":65,"a":-0.23249742943974538,"b":0.2894729129917759},{"n":66,"a":-0.19057663961367077,"b":-0.20321144307734298},{"n":68,"a":-0.05170080629061563,"b":-0.09394623038330009},{"n":73,"a":0.010571892367894058,"b":-0.06352637508810456},{"n":76,"a":-0.06325441449557727,"b":-0.019280335092855257},{"n":96,"a":0.011644688677859628,"b":0.0173448233994866},{"n":107,"a":-0.027557602263970027,"b":-0.04239264697467825},{"n":110,"a":-0.024897017314587534,"b":-0.051869808046730456},{"n":113,"a":-0.1652806100198844,"b":-0.09167808542003412},{"n":120,"a":0.09548113724866789,"b":0.17261908401201856},{"n":134,"a":0.014907506134757413,"b":0.03886314134667357},{"n":141,"a":0.06387644524968576,"b":-0.09030933699066153},{"n":152,"a":0.010576081970808749,"b":0.027723293634244323},{"n":185,"a":0.008492200395962825,"b":0.04050000466117239}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":-0.06871018523565597,"b":-0.044501924079275224},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.0012570138054152852,"b":0.010739728384415115},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.000713853261693815,"b":0.0003159747725457649}],"L3":[],"denormalization":{"y_mean":1.5012965895430689e-15,"y_std":0.43131092949760913,"trend_slope":-0.00008678094360729054,"trend_intercept":4.192006855420027},"r2":{"l1_only":0.8702417498406256,"l1_l2":0.8735160573771874,"l1_l2_l3":0.8735160573771874,"delta_l2":0.0032743075365617713,"delta_l3":0}},"lr04-inhg-mpt":{"label":"LR04 inhg-MPT","regime":"inhg-mpt","window_kyr":[1000,2700],"n_samples":1701,"intercept":0.008920278353108338,"L1":[{"n":9,"a":-0.07405028449453253,"b":0.15517081844707203},{"n":12,"a":0.01866923229432145,"b":-0.007063096527562734},{"n":14,"a":0.18279697169825898,"b":-0.07454169575921728},{"n":16,"a":0.10129829826713639,"b":0.10810604004092653},{"n":18,"a":0.038640928064159766,"b":0.02982469347024955},{"n":20,"a":-0.14787599025706077,"b":0.07577094969150679},{"n":21,"a":0.09677337243707089,"b":0.016860261470392657},{"n":22,"a":-0.022375864766743706,"b":0.02220905089979807},{"n":25,"a":-0.14076590923751678,"b":0.17555041743810823},{"n":28,"a":-0.21525004484676127,"b":-0.04578568753479185},{"n":30,"a":0.030143602368885667,"b":0.10254869314008506},{"n":31,"a":0.21710408149563598,"b":0.05383194958090321},{"n":35,"a":-0.0023973677459534523,"b":-0.10873258632641115},{"n":38,"a":0.004178455322226226,"b":-0.0011082608383255457},{"n":39,"a":-0.0875435703779072,"b":0.30052864306222427},{"n":48,"a":-0.10168222495799972,"b":0.04399372091035183},{"n":50,"a":-0.22835671100082874,"b":0.13718694296600267},{"n":53,"a":-0.09736101501073234,"b":-0.23337146539777567},{"n":65,"a":-0.07964560065133833,"b":0.6164308335693638},{"n":66,"a":0.25274046687246615,"b":-0.055605267629155186},{"n":68,"a":0.24482211095872197,"b":-0.21321398654701784},{"n":73,"a":0.008763221081432095,"b":-0.11335849212015736},{"n":76,"a":-0.0030493872100670004,"b":-0.16682188754319888},{"n":96,"a":0.11412815645319081,"b":0.014435303541047611},{"n":107,"a":-0.015380281657131366,"b":-0.0321802670584716},{"n":110,"a":0.04422499587380601,"b":-0.01588269092618962},{"n":113,"a":-0.1222035066635331,"b":-0.024574916330827413},{"n":120,"a":-0.018661416285125867,"b":0.13151829723736955},{"n":134,"a":-0.004310837767722002,"b":0.03107644805302884},{"n":141,"a":-0.007930364842267779,"b":-0.10629193080445061},{"n":152,"a":0.05066586999979433,"b":-0.001158007233720376},{"n":185,"a":-0.00797034945844687,"b":0.04741383351709869}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.09051490688867488,"b":0.07173880137358005},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.023909535713882123,"b":0.015217706592979607},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.00042536814705274734,"b":-0.004832147394600916}],"L3":[],"denormalization":{"y_mean":2.117321276827753e-15,"y_std":0.2533430989053228,"trend_slope":-0.00028446235786389366,"trend_intercept":4.264486402612575},"r2":{"l1_only":0.7215739272152626,"l1_l2":0.7288534879845776,"l1_l2_l3":0.7288534879845776,"delta_l2":0.007279560769315019,"delta_l3":0}},"lr04-pre-inhg":{"label":"LR04 pre-iNHG","regime":"pre-inhg","window_kyr":[2700,5320],"n_samples":2621,"intercept":0.004796508528784117,"L1":[{"n":9,"a":0.013779023691656556,"b":0.1887732393800048},{"n":12,"a":0.13129537834504676,"b":-0.03113522369142426},{"n":14,"a":0.1414594119329862,"b":0.11816702203867133},{"n":16,"a":0.1374774207957588,"b":-0.03532494932806938},{"n":18,"a":0.13889366703557265,"b":0.061983476126678046},{"n":20,"a":-0.08498932818178885,"b":0.09540707265299314},{"n":21,"a":-0.10835127103711396,"b":-0.028764326042978194},{"n":22,"a":0.11148882758014007,"b":-0.03865728945312771},{"n":25,"a":0.12735093632704228,"b":0.13982381914614075},{"n":28,"a":-0.05391956035920037,"b":0.09255118436355968},{"n":30,"a":-0.12842322409247706,"b":-0.022095279888407936},{"n":31,"a":0.060333412991577774,"b":0.09177578600913372},{"n":35,"a":-0.012478495685001064,"b":-0.04169256632491078},{"n":38,"a":-0.154256848048024,"b":-0.04574676829170835},{"n":39,"a":-0.1304853989733588,"b":0.07943845651841604},{"n":48,"a":-0.028123303831937296,"b":0.0662641289229987},{"n":50,"a":-0.12169089657630963,"b":0.22345682911110645},{"n":53,"a":-0.022223821871603613,"b":-0.17818151157130788},{"n":65,"a":0.231248153866511,"b":-0.2916791754030967},{"n":66,"a":-0.022864692071038147,"b":0.3181446212683465},{"n":68,"a":0.20471711753615746,"b":0.07437955465758662},{"n":73,"a":0.09271425866017498,"b":-0.07605761544176559},{"n":76,"a":0.05134351093719412,"b":-0.11159934131904131},{"n":96,"a":0.06193809192068687,"b":0.04756849127167064},{"n":107,"a":-0.08211876323001087,"b":0.004502440118732665},{"n":110,"a":0.03785327266780438,"b":-0.04550095466851478},{"n":113,"a":0.03639647062777348,"b":0.048238754955500465},{"n":120,"a":0.0368133955260415,"b":0.06701066470411021},{"n":134,"a":-0.028450773724023336,"b":0.031595793477797764},{"n":141,"a":-0.004500297237105567,"b":0.03908678223977317},{"n":152,"a":0.013099790949827193,"b":0.05640782705980925},{"n":185,"a":-0.02891241356346971,"b":0.02415316881767574}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.25891193485044134,"b":0.17371828100857337},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.016921027562455088,"b":-0.014197476885633338},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.012255018162150574,"b":0.004398149714187857}],"L3":[],"denormalization":{"y_mean":2.2229875746786803e-16,"y_std":0.1419188719967453,"trend_slope":-0.0001616384823512257,"trend_intercept":3.7150997304817532},"r2":{"l1_only":0.3813015022594486,"l1_l2":0.429750475284833,"l1_l2_l3":0.429750475284833,"delta_l2":0.04844897302538442,"delta_l3":0}},"lr04-full":{"label":"LR04 full","regime":"lr04-full","window_kyr":[0,5320],"n_samples":5321,"intercept":-0.0016330720932757827,"L1":[{"n":9,"a":-0.039185151843874236,"b":0.1028027878544019},{"n":12,"a":0.10301948451508858,"b":-0.02016680911380898},{"n":14,"a":0.055966767020889104,"b":0.02548225007193283},{"n":16,"a":0.0825862002141604,"b":-0.011142801627301923},{"n":18,"a":0.08795737198985376,"b":0.08505384386815164},{"n":20,"a":-0.0833847004330675,"b":0.05896022547761226},{"n":21,"a":0.04517410629977709,"b":0.07053289320749276},{"n":22,"a":-0.043187976112302504,"b":0.08310318850042439},{"n":25,"a":-0.06619299571246737,"b":0.2015362213761424},{"n":28,"a":-0.18004986253238145,"b":-0.15638338680106822},{"n":30,"a":0.08281826590512324,"b":0.09228691110994974},{"n":31,"a":0.07842938153386976,"b":0.13312690720033976},{"n":35,"a":-0.05983013686458974,"b":-0.11181828588827666},{"n":38,"a":-0.10003353278939382,"b":0.028430196111982324},{"n":39,"a":-0.09933535960424142,"b":0.12951479543338562},{"n":48,"a":-0.10124135193351344,"b":-0.004184617430671099},{"n":50,"a":-0.09567881414186163,"b":0.12225222459706246},{"n":53,"a":-0.039106538213266734,"b":-0.13283707936046205},{"n":65,"a":-0.11174691701044243,"b":0.25089233080359813},{"n":66,"a":0.020601599246667206,"b":-0.03797795334999951},{"n":68,"a":0.13350544838291886,"b":-0.09215169710518832},{"n":73,"a":0.038199430871435826,"b":-0.0841857203888797},{"n":76,"a":-0.005813074910088282,"b":-0.09082868201567769},{"n":96,"a":0.046438305781698386,"b":0.012844602230491898},{"n":107,"a":-0.04379619771020141,"b":-0.032852194511152386},{"n":110,"a":0.009950870224294472,"b":-0.04720533633465711},{"n":113,"a":-0.07680036454595568,"b":-0.038416915956664834},{"n":120,"a":0.033451248357208155,"b":0.09791337998530963},{"n":134,"a":-0.007268406349392994,"b":0.021288252328934228},{"n":141,"a":0.011560111434022273,"b":-0.054849284582987094},{"n":152,"a":0.020876832203619983,"b":0.016566773014120094},{"n":185,"a":-0.007060987512414488,"b":0.028239558896544135}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.07942892530837417,"b":0.07145000274630177},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":-0.031051802518720632,"b":0.06979253345037166},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.015693036732781572,"b":-0.013993995124926967}],"L3":[{"label":"iNHG","t_kyr":2700,"beta":-0.19070682708954556},{"label":"MPT","t_kyr":1000,"beta":0.08523111265217007}],"denormalization":{"y_mean":8.786640107689267e-16,"y_std":0.26728652336026737,"trend_slope":-0.0002890388734746666,"trend_intercept":4.253595893576046},"r2":{"l1_only":0.23851034743183974,"l1_l2":0.2474557740025657,"l1_l2_l3":0.25525662694102225,"delta_l2":0.008945426570725945,"delta_l3":0.0078008529384565595}},"cenogrid-d18o":{"label":"CENOGRID δ¹⁸O","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":0.00001602686211273741,"L1":[{"n":9,"a":0.00962378075462271,"b":-0.003263475086878552},{"n":12,"a":0.0037269530675528356,"b":0.00787528999140077},{"n":14,"a":-0.0031536915286465507,"b":-0.002869531163041282},{"n":16,"a":-0.00022283423149329956,"b":-0.009746906077462656},{"n":18,"a":-0.0011693799218213778,"b":0.006890942568311449},{"n":20,"a":-0.0013096788048939253,"b":-0.007959970387753229},{"n":21,"a":0.003158870772980469,"b":0.0010743005808000303},{"n":22,"a":-0.0014208778904404391,"b":0.0013811686772555942},{"n":25,"a":-0.006546404540596593,"b":-0.0005082057100293619},{"n":28,"a":-0.009112937776092274,"b":-0.01654567050381012},{"n":30,"a":-0.0018422389136167707,"b":-0.001321814940870012},{"n":31,"a":0.007249316579560508,"b":0.01076606883574445},{"n":35,"a":-0.0003746519931765594,"b":-0.008535583295589575},{"n":38,"a":-0.002337493041692442,"b":0.0003424116815364203},{"n":39,"a":0.003253340413687406,"b":0.007527713085922034},{"n":48,"a":-0.0068470522070167615,"b":-0.008939408900639545},{"n":50,"a":-0.012231227013096086,"b":0.006279631132594548},{"n":53,"a":-0.01176198086471335,"b":-0.004470949479484912},{"n":65,"a":-0.007927658464132941,"b":0.012719422318754251},{"n":66,"a":-0.003620029612143832,"b":-0.00576365201448418},{"n":68,"a":0.008347937807959557,"b":-0.004428610084526836},{"n":73,"a":0.006492516280997703,"b":-0.003017982927162457},{"n":76,"a":0.0011690351630563851,"b":-0.005619440895051139},{"n":96,"a":0.0018567939998770625,"b":0.000299913281031477},{"n":107,"a":-0.0020019996095300254,"b":-0.004533038686529572},{"n":110,"a":0.0005001486931849433,"b":-0.002899913348978863},{"n":113,"a":-0.003686640337390224,"b":-0.003791287533903404},{"n":120,"a":0.0004731956477952011,"b":0.01016796154961575},{"n":134,"a":-0.005869594079637888,"b":0.00260064302771034},{"n":141,"a":-0.0010200380686295632,"b":0.0002626403150328052},{"n":152,"a":-0.002231018168438524,"b":-0.002114242582690146},{"n":185,"a":-0.0004689621628445171,"b":0.0000817723920968429}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.06570759747593674,"b":0.05222383705919761},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.003998270781965799,"b":-0.005580221960438302},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.0005452493435179027,"b":-0.005103620540960949}],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.9406820522647168},{"label":"EOT","t_kyr":34000,"beta":-1.6914958810434142},{"label":"Mi-1","t_kyr":23000,"beta":1.378424883226697},{"label":"MMCT","t_kyr":14000,"beta":-0.5721018868779643},{"label":"iNHG","t_kyr":2700,"beta":-0.9477478837426522},{"label":"MPT","t_kyr":1000,"beta":0.9598033678184575}],"denormalization":{"y_mean":3.1388799311243884e-16,"y_std":0.5138368170014185,"trend_slope":-0.000060475169948230774,"trend_intercept":3.5886100819307556},"r2":{"l1_only":0.001140303262665121,"l1_l2":0.0047003500178600666,"l1_l2_l3":0.6176613009398422,"delta_l2":0.0035600467551949455,"delta_l3":0.6129609509219821}},"cenogrid-d13c":{"label":"CENOGRID δ¹³C","regime":"cenogrid","window_kyr":[0,67000],"n_samples":13401,"intercept":0.00005414279487498172,"L1":[{"n":9,"a":0.005338473828240495,"b":-0.023091206831963005},{"n":12,"a":0.0003828507035659112,"b":0.00011796076309235661},{"n":14,"a":0.0037211222379592585,"b":-0.005440279318535575},{"n":16,"a":0.0015179010500321966,"b":-0.011153694047233856},{"n":18,"a":-0.0060441829402797425,"b":0.0014067013519241927},{"n":20,"a":0.011330299958277485,"b":-0.009365743651940341},{"n":21,"a":-0.006083184388396311,"b":-0.0071716042504788675},{"n":22,"a":0.005891788023228518,"b":-0.011625719098538915},{"n":25,"a":-0.002998708433273448,"b":-0.002425284508822263},{"n":28,"a":-0.004606115559338046,"b":-0.00522506041073265},{"n":30,"a":-0.0031268127627834628,"b":-0.0057408911878803134},{"n":31,"a":-0.0006975599235208692,"b":0.008223546177043826},{"n":35,"a":-0.0043981746116429675,"b":-0.010423318145693632},{"n":38,"a":0.002310842419578572,"b":-0.007315922976005076},{"n":39,"a":0.004005157049221934,"b":-0.0006981311160208023},{"n":48,"a":0.009237202711512037,"b":-0.006070723840607467},{"n":50,"a":0.0029511380883168953,"b":-0.007995750349815112},{"n":53,"a":-0.004356464801210605,"b":-0.002089561337944505},{"n":65,"a":0.0013634229096102686,"b":-0.014002661367543303},{"n":66,"a":0.009497211536255361,"b":-0.004104030174694335},{"n":68,"a":-0.005187392326990199,"b":0.005241392389860411},{"n":73,"a":0.006544317568239195,"b":0.000006970297478533888},{"n":76,"a":-0.005485396820039863,"b":-0.003637938532041029},{"n":96,"a":-0.0012790984070198625,"b":-0.0023466893606536765},{"n":107,"a":-0.0031720827718397576,"b":-0.0033220042224514144},{"n":110,"a":0.0028283855123447726,"b":-0.0017211884146841674},{"n":113,"a":0.0038613350038431975,"b":-0.0014070048283321617},{"n":120,"a":-0.0011869967366585062,"b":-0.0022822648297580253},{"n":134,"a":-0.0032142822976851653,"b":0.0013438701253102342},{"n":141,"a":-0.0023577629000963722,"b":0.004452885549992867},{"n":152,"a":-0.0015718917902917864,"b":-0.000023341513222700912},{"n":185,"a":0.0009140186026623447,"b":0.0004586784887968649}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.12063978416524974,"b":0.029906772026227803},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.003802666960653048,"b":-0.016731338007454265},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.016630805150028714,"b":-0.011290616856278541}],"L3":[{"label":"PETM","t_kyr":56000,"beta":1.2947252119737593},{"label":"EOT","t_kyr":34000,"beta":-0.6511389830637635},{"label":"Mi-1","t_kyr":23000,"beta":-0.7995646857161036},{"label":"MMCT","t_kyr":14000,"beta":0.876145231687899},{"label":"iNHG","t_kyr":2700,"beta":1.326238410732585},{"label":"MPT","t_kyr":1000,"beta":-1.3292417525664886}],"denormalization":{"y_mean":-1.6966918546618317e-16,"y_std":0.5116419176812778,"trend_slope":0.000014091551862757799,"trend_intercept":0.17563680335949733},"r2":{"l1_only":0.001192811757378509,"l1_l2":0.00926748748963091,"l1_l2_l3":0.3513849547286956,"delta_l2":0.008074675732252401,"delta_l3":0.34211746723906467}},"epica-co2":{"label":"EPICA CO₂","regime":"epica-co2","window_kyr":[0,800],"n_samples":801,"intercept":0.02509868349579805,"L1":[{"n":9,"a":-0.13003386753012586,"b":0.08414979295891137},{"n":12,"a":-0.6236388603851609,"b":0.34247247340443243},{"n":14,"a":0.6631771893447128,"b":0.9687812023833793},{"n":16,"a":0.9068443378518338,"b":-0.3428782250083507},{"n":18,"a":-0.07606132538425875,"b":-0.5967175302058826},{"n":20,"a":0.5313227446554606,"b":0.15978812783889615},{"n":21,"a":-0.08258585443639624,"b":-0.2753833244031067},{"n":22,"a":0.39541340215045845,"b":-0.5841266391158294},{"n":25,"a":0.4568654969984005,"b":-0.6424030929602188},{"n":28,"a":0.14653083258036675,"b":0.21899842111633155},{"n":30,"a":-0.3510472972154039,"b":-0.22699235742763407},{"n":31,"a":0.07352733077244034,"b":-0.16702990660583567},{"n":35,"a":0.1334650859445657,"b":0.15082020828780487},{"n":38,"a":0.5198104249913299,"b":-0.7317366066994727},{"n":39,"a":-0.5685379187000535,"b":-0.10275769943020215},{"n":48,"a":0.10843173117562208,"b":0.0715025243352368},{"n":50,"a":-0.1027652959577797,"b":-0.009949537880590142},{"n":53,"a":-0.044570340872306206,"b":0.1042863559859665},{"n":65,"a":-0.14563851542868758,"b":0.049247801743060135},{"n":66,"a":0.46015546838724775,"b":0.2189781625962903},{"n":68,"a":0.16464748468015714,"b":-0.07979723358804339},{"n":73,"a":-0.06989554779284464,"b":0.04969251240079462},{"n":76,"a":-0.05535936251895954,"b":0.01884187757558046},{"n":96,"a":-0.019480164361414882,"b":0.06847314776774518},{"n":107,"a":0.02652405058532153,"b":0.06742222433960775},{"n":110,"a":0.020367387274551244,"b":0.04211384421026669},{"n":113,"a":0.15474869793452292,"b":0.059835282976371695},{"n":120,"a":-0.018576590780219695,"b":-0.05721197831802383},{"n":134,"a":-0.0033278247115,"b":-0.025503113862043878},{"n":141,"a":-0.0039267226298340075,"b":-0.03763392771970874},{"n":152,"a":0.0082486103359519,"b":0.018151792942286034},{"n":185,"a":0.05122046644997526,"b":-0.045923008600907284}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.15072042370599267,"b":0.02394293201461654},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.007223335228200088,"b":0.00029000470241465136},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":0.004616846508728569,"b":-0.0003472516198667081}],"L3":[],"denormalization":{"y_mean":2.980553797944989e-14,"y_std":25.51737494167102,"trend_slope":-0.006455378442643299,"trend_intercept":227.89326737247322},"r2":{"l1_only":0.8336437529715351,"l1_l2":0.8451857942676443,"l1_l2_l3":0.8451857942676443,"delta_l2":0.01154204129610914,"delta_l3":0},"carbon_amplification_ratios":{"9":{"n":9,"period_kyr":298.05955555555556,"lr04_post_mpt_amp":0.12378050678154681,"epica_amp":0.15488703741717694,"ratio":1.2513039528148666,"label":"g₂−g₇ Venus-Uranus ecc / Mercury Axial = 8H/9"},"12":{"n":12,"period_kyr":223.54466666666667,"lr04_post_mpt_amp":0.2086724616194606,"epica_amp":0.7114863478818493,"ratio":3.4095842947371295,"label":"s₅−s₁ Jupiter-Mercury nodal"},"14":{"n":14,"period_kyr":191.6097142857143,"lr04_post_mpt_amp":0.09999995786236443,"epica_amp":1.1740276838978454,"ratio":11.740281786055608,"label":"g₂−g₈ Venus-Neptune ecc"},"16":{"n":16,"period_kyr":167.6585,"lr04_post_mpt_amp":0.19667606309241886,"epica_amp":0.969500969715249,"ratio":4.929430427228334,"label":"Mars Axial = 8H/16"},"18":{"n":18,"period_kyr":149.02977777777778,"lr04_post_mpt_amp":0.08229746834473614,"epica_amp":0.6015456226041533,"ratio":7.3094061664732735,"label":"s₄−s₆ Mars-Saturn nodal"},"20":{"n":20,"period_kyr":134.1268,"lr04_post_mpt_amp":0.2913603820764891,"epica_amp":0.5548297980340198,"ratio":1.9042733060679595,"label":"g₃−g₂ Earth-Venus ecc"},"21":{"n":21,"period_kyr":127.73980952380953,"lr04_post_mpt_amp":0.27774307743287857,"epica_amp":0.28750025862996426,"ratio":1.0351302408228111,"label":"Mars Obliq / Jupiter Axial = 8H/21"},"22":{"n":22,"period_kyr":121.93345454545455,"lr04_post_mpt_amp":0.5293385133412892,"epica_amp":0.7053762748526169,"ratio":1.3325617862190728,"label":"s₂−s₄ Venus-Mars nodal / g₄−g₂ (Round 1 C8: highest L2 ratio at 12.84)"},"25":{"n":25,"period_kyr":107.30144,"lr04_post_mpt_amp":0.46744493352879074,"epica_amp":0.7882942446779952,"ratio":1.6863895362542054,"label":"s₁−s₄ Mercury-Mars nodal (100-kyr centroid)"},"28":{"n":28,"period_kyr":95.80485714285714,"lr04_post_mpt_amp":0.753570506190407,"epica_amp":0.26349875397834727,"ratio":0.3496670209539334,"label":"g₄−g₅ Mars-Jupiter ecc (Berger 95k)"},"30":{"n":30,"period_kyr":89.41786666666667,"lr04_post_mpt_amp":0.08989973817527222,"epica_amp":0.41804274328445756,"ratio":4.65009967514504,"label":"g₃−g₇ Earth-Uranus ecc"},"31":{"n":31,"period_kyr":86.53341935483871,"lr04_post_mpt_amp":0.40503805905833284,"epica_amp":0.18249728236681784,"ratio":0.4505682325041334,"label":"g₄−g₇ Mars-Uranus"},"35":{"n":35,"period_kyr":76.64388571428572,"lr04_post_mpt_amp":0.22305721109394244,"epica_amp":0.20139430079862528,"ratio":0.9028818203676291,"label":"Earth.Axial(104) − Mercury.ICRF(93) + Saturn.Obliq(24) (3-term beat; close to Mars apsidal at 8H/36)"},"38":{"n":38,"period_kyr":70.59305263157894,"lr04_post_mpt_amp":0.5378750524448473,"epica_amp":0.8975752556269172,"ratio":1.6687430501695426,"label":"s₈−s₃ Neptune-Earth nodal"},"39":{"n":39,"period_kyr":68.78297435897436,"lr04_post_mpt_amp":0.37024662510066425,"epica_amp":0.5777495216717852,"ratio":1.560445072293918,"label":"s₅−s₃ Earth nodal"},"48":{"n":48,"period_kyr":55.88616666666667,"lr04_post_mpt_amp":0.2064949773461111,"epica_amp":0.12988476166222698,"ratio":0.6289971956292383,"label":"s₇−s₆ Uranus-Saturn nodal"},"50":{"n":50,"period_kyr":53.65072,"lr04_post_mpt_amp":0.11512842959420262,"epica_amp":0.10324582004772566,"ratio":0.8967882252163082,"label":"g₆−g₅ Saturn-Jupiter ecc"},"53":{"n":53,"period_kyr":50.61388679245283,"lr04_post_mpt_amp":0.055567697420850166,"epica_amp":0.11341146031290357,"ratio":2.0409602264777162,"label":"Mars.AscNode(64) − Uranus.AscNode(11) s-beat (close to Mars Ecc cycle at 8H/52)"},"65":{"n":65,"period_kyr":41.269784615384616,"lr04_post_mpt_amp":0.37128105533683464,"epica_amp":0.15373979040182092,"ratio":0.4140792755028793,"label":"k+s₃ Earth obliquity (Berger 41k)"},"66":{"n":66,"period_kyr":40.64448484848485,"lr04_post_mpt_amp":0.27859351421742606,"epica_amp":0.5096022868676461,"ratio":1.8291965205978595,"label":"obliquity-band arithmetic-mean (Round 2 C10: EPICA CO₂ ratio 15.79)"},"68":{"n":68,"period_kyr":39.44905882352941,"lr04_post_mpt_amp":0.10723277285574526,"epica_amp":0.18296555058209002,"ratio":1.706246567252571,"label":"k+s₄ Berger Mars obliquity sub-peak"},"73":{"n":73,"period_kyr":36.747068493150685,"lr04_post_mpt_amp":0.06440004068378287,"epica_amp":0.08575974224521059,"ratio":1.3316721749650462,"label":"2|s₄| Mars nodal harmonic"},"76":{"n":76,"period_kyr":35.29652631578947,"lr04_post_mpt_amp":0.06612754550466153,"epica_amp":0.058477990467172725,"ratio":0.884321201110518,"label":"g₄−s₃ Mars-Earth beat"},"96":{"n":96,"period_kyr":27.943083333333334,"lr04_post_mpt_amp":0.02089118649487506,"epica_amp":0.07119022944738418,"ratio":3.407668083612593,"label":"k+g₆ Saturn climatic precession sub-peak (Round 1 A1 sideband)"},"107":{"n":107,"period_kyr":25.070429906542056,"lr04_post_mpt_amp":0.05056241647764536,"epica_amp":0.07245192609139588,"ratio":1.4329205591554015,"label":"k+g₇ Uranus climatic precession sub-peak (Round 1 A1)"},"110":{"n":110,"period_kyr":24.38669090909091,"lr04_post_mpt_amp":0.057535540824498514,"epica_amp":0.04678040549800916,"ratio":0.8130697100893534,"label":"k+g₃ Earth secondary precession sideband (Round 1 A1)"},"113":{"n":113,"period_kyr":23.739256637168143,"lr04_post_mpt_amp":0.18900410417456068,"epica_amp":0.16591389514230775,"ratio":0.8778322347385259,"label":"k+g₅ Jupiter climatic precession (Berger 23.7k)"},"120":{"n":120,"period_kyr":22.354466666666667,"lr04_post_mpt_amp":0.19726630664015402,"epica_amp":0.06015230825228382,"ratio":0.30492945945407424,"label":"k+g₂ Venus climatic precession = H/15"},"134":{"n":134,"period_kyr":20.01892537313433,"lr04_post_mpt_amp":0.04162424166864014,"epica_amp":0.02571931635893234,"ratio":0.617892730963778,"label":"k+g₅ Jupiter precession sub-peak (Round 1 A1)"},"141":{"n":141,"period_kyr":19.0250780141844,"lr04_post_mpt_amp":0.11061634872580531,"epica_amp":0.037838230220557524,"ratio":0.3420672500621997,"label":"k+g₃ Earth climatic precession — Berger quintet 19-kyr peak (subthreshold LR04, 3σ in Cheng monsoon; beats with n=113 to form n=28 per Wigley 1976)"},"152":{"n":152,"period_kyr":17.648263157894736,"lr04_post_mpt_amp":0.029672116873991274,"epica_amp":0.019938083144926386,"ratio":0.6719467717654775,"label":"k+g₄ Mars climatic precession sub-peak (Round 1 A1)"},"185":{"n":185,"period_kyr":14.500194594594594,"lr04_post_mpt_amp":0.041380766608657416,"epica_amp":0.06879286956009355,"ratio":1.6624358415269462,"label":"k+g₂ Venus precession sub-peak (Round 1 A1)"}}},"cenco2pip":{"label":"CenCO2PIP CO₂ (deep-time)","regime":"cenco2pip","window_kyr":[0,66000],"n_samples":661,"intercept":0.016379319171493434,"L1":[{"n":9,"a":0.0006135442349535857,"b":0.0004105385698334332},{"n":12,"a":0.0009729852475356464,"b":0.0005557567257649787},{"n":14,"a":0.0004695868449019586,"b":0.00015407085145136278},{"n":16,"a":0.000842228378656555,"b":-0.0009167033431056666},{"n":18,"a":0.0014499143192751932,"b":-0.0008315948258633104},{"n":20,"a":0.00032353217406463664,"b":-0.0002458235013227764},{"n":21,"a":0.0005181933791588079,"b":-0.0038870728442294286},{"n":22,"a":-0.0009990008691799425,"b":-0.0018635121462031428},{"n":25,"a":-0.013842815571713638,"b":-0.01887004259261632},{"n":28,"a":0.02821324316085222,"b":0.0346425697982303},{"n":30,"a":-0.005296842377337352,"b":-0.005193701588804456},{"n":31,"a":-0.0005937265903358129,"b":0.0003634694731705667},{"n":35,"a":0.0007770885325481615,"b":0.0005748167289352294},{"n":38,"a":0.0010509178473896504,"b":-0.000045071154070572234},{"n":39,"a":0.00048817353035711744,"b":0.00015418928078026836},{"n":48,"a":0.000984784365003719,"b":-0.00026376977450865937},{"n":50,"a":-0.006175741987117522,"b":0.0011271318797576179},{"n":53,"a":-0.0268574890971669,"b":-0.025277947402187712},{"n":65,"a":0.0008976656542442501,"b":0.0004443970733142626},{"n":66,"a":0.0009028265819185512,"b":-0.0002822115559156487},{"n":68,"a":0.0011730682755470008,"b":0.00008468544339761345},{"n":73,"a":0.0019158661673268716,"b":-0.0004157426300817781},{"n":76,"a":0.002235410382868609,"b":-0.003027740766027717},{"n":96,"a":0.0011641204811583372,"b":-0.00012646082385569336},{"n":107,"a":-0.09477349741045246,"b":0.196928960347087},{"n":110,"a":-0.009636391900466917,"b":0.003373064883293271},{"n":113,"a":-0.00006780002848554532,"b":0.002767788950030298},{"n":120,"a":0.00045191861243690847,"b":0.00011733688354313375},{"n":134,"a":-0.354527681860923,"b":-0.3766906478126637},{"n":141,"a":0.001393189816738785,"b":0.00023905583871641114},{"n":152,"a":0.0010180816333163472,"b":-0.001285695246414477},{"n":185,"a":-0.006581037204011087,"b":-0.020021001163745916}],"L2":[{"p_kyr":404.5,"label":"405-kyr (fundamental)","a":0.0014312276927094154,"b":0.002240492688354507},{"p_kyr":202.25,"label":"202-kyr (2nd harmonic)","a":0.0006738387319812872,"b":0.0003909848895904283},{"p_kyr":134.83,"label":"135-kyr (3rd harmonic)","a":-0.0000946586449433579,"b":-0.0005426081695293755}],"L3":[{"label":"PETM","t_kyr":56000,"beta":-1.8798688093473028},{"label":"EOT","t_kyr":34000,"beta":1.8726117606990103},{"label":"Mi-1","t_kyr":23000,"beta":-0.9161078719668736},{"label":"MMCT","t_kyr":14000,"beta":0.3800604717521474},{"label":"iNHG","t_kyr":2700,"beta":-0.7402184932465288},{"label":"MPT","t_kyr":1000,"beta":0.38426286683854527}],"denormalization":{"y_mean":-2.091425032821257e-13,"y_std":209.18154000668048,"trend_slope":0.013251639299066168,"trend_intercept":214.15971983891893},"r2":{"l1_only":0.16106750642431011,"l1_l2":0.16107154209439578,"l1_l2_l3":0.7626295084612135,"delta_l2":0.000004035670085666965,"delta_l3":0.6015579663668177}}},"meta":{"script":"export_climate_formula_browser.py","consumer":"src/script.js — Climate Formula Explorer modal"}},
33
33
  DT_RESONATOR: {"display_name":"Core-mantle swing","driver":"Resonator","functional_class":"episode (2-kick IMPULSE-CONSISTENT windowed damped oscillation — sin-only kicks, displacement-continuous; zero before first kick)","kick_epochs_year":[-1600,1600],"kick_coefficients_s":[{"cos":0,"sin":760.3221892468256},{"cos":0,"sin":-76.3493982442574}],"T0_lattice_n":685,"T0_yr":3916.1109489051096,"Q":1.8,"drive_tones":[{"pair":"bond-hallstatt","dn":726,"period_yr":3694.9531680440773,"phi_locked_rad":-0.4616152283022974,"amp_s":186.14,"phase_convention":"cos(2π·dn/8H·y − φ_locked), kick-1-envelope-shared"}],"rms_s":31.269890503801374,"raw_at_j2000_s":-149.82685977847515,"lod_raw_at_j2000_s_per_day":0.0006237191440304154,"deep_time_checks_s":{"900":-245.8439379884609,"2000":-82.32559425279462,"5000":5.334235000224568,"100000":-1.545960510634632e-17,"-100000":0,"-5000":0,"-801":0},"regeneration_rule":"drive-tone menu = Δn difference tones of the ACTIVE flag set (any count); refit this script after any stack change (3rd/5th cycle)","status":"JOINT WORLD SHIPPED (--joint --write): amplitudes from the joint equality-constrained fit (kick2 ~0 — the termination is carried by flag interference in the joint world); phases/epochs/T0/Q remain the Stage-1/3 convention. Default-ON.","impulse_consistent":true},
34
34
  DT_STACK: {"bond":{"lattice_n":1830,"period_yr":1465.8666666666666,"cos_coeff_s":145.55092942423886,"sin_coeff_s":329.34746510072887,"raw_at_j2000_s":152.06408184557264,"amplitude_s":360.0761389269436,"phase_deg":66.15757672735135,"source":"Stage D anchored fit (USNO LOD constraint active)","joint_mode":true},"hallstatt":{"lattice_n":1104,"period_yr":2429.8333333333335,"cos_coeff_s":-73.00792820024905,"sin_coeff_s":32.70844569690342,"raw_at_j2000_s":-61.685166343361075,"amplitude_s":80,"phase_deg":155.86703617290817,"target_amp_source":"CAPPED from anchored quad-fit free amp 100.73 s → 80 s prior","joint_mode":true},"jose5":{"lattice_n":2989,"period_yr":897.469387755102,"cos_coeff_s":-34.5239711109052,"sin_coeff_s":36.16760178299611,"raw_at_j2000_s":31.185593588239136,"amplitude_s":50.00000000000001,"phase_deg":133.66807127984734,"target_amp_source":"CAPPED from anchored quad-fit free amp 86.44 s → 50 s prior","joint_mode":true},"jose4":{"lattice_n":3749,"period_yr":715.5337423312883,"cos_coeff_s":38.542513112148065,"sin_coeff_s":-31.850819188835548,"raw_at_j2000_s":41.35969402774114,"amplitude_s":50,"phase_deg":-39.56969682845315,"target_amp_source":"unconstrained: quad-fit free amp 47.06 s (below 50 s prior — no cap applied)","joint_mode":true}},
35
35
  ELONGATION_CORRECTION: {"venus":{"cosVwE_sinEl_ra":-0.00013078499578943705,"cosVwE_sinEl_dec":0.00023700025209189867,"sinEl_d_ra":0.0007755608738916972,"sinEl_d_dec":-0.0003797976373342036,"sinVwE_sinEl_ra":-0.0006776328282247138,"sinVwE_sinEl_dec":-0.00043481049672109887,"sin2VwE_sinEl_ra":0.0018944674227536075,"sin2VwE_sinEl_dec":0.007226452365794387,"cos2VwE_sinEl_ra":0.0022333742453015813,"cos2VwE_sinEl_dec":0.00643045263681664,"cos4VwE_sinEl_ra":-0.005168878088645803,"cos4VwE_sinEl_dec":-0.001292412216853322,"sin4VwE_sinEl_ra":0.002473729458674539,"sin4VwE_sinEl_dec":0.000937054827431583,"sinVwE_sinEl_d2_ra":0.0002912977464846237,"sinVwE_sinEl_d2_dec":0.00009508378159137789,"cos3VwE_sinEl_ra":-0.0004372175697726782,"cos3VwE_sinEl_dec":0.002048597993702653,"sin3VwE_sinEl_ra":-0.011369485008173839,"sin3VwE_sinEl_dec":-0.007442688270196107,"sin2syn_ra":-0.0010979280775001478,"sin2syn_dec":-0.00036294328226461474,"cos1syn_ra":0.0006738224187823681,"cos1syn_dec":-0.0006544590346891286,"sin3VwE_sinEl_d2_ra":0.002112353789427301,"sin3VwE_sinEl_d2_dec":0.0024447308843828846,"sin2VwE_sinEl_d2_ra":-0.000381924061656027,"sin2VwE_sinEl_d2_dec":-0.001112791195900534,"cos2VwE_sinEl_d2_ra":-0.0009611408402006777,"cos2VwE_sinEl_d2_dec":-0.0016972655933243698,"cosEl_d_ra":0.00019899967515409905,"cosEl_d_dec":-0.00034331917768957944,"cosVwE_cosEl_d_ra":-0.005960071418246849,"cosVwE_cosEl_d_dec":0.0031678195308038003,"sinVwE_cosEl_d_ra":-0.007190793725682356,"sinVwE_cosEl_d_dec":0.0013596615637549907,"cosEl_d2_ra":-0.00020663256097824926,"cosEl_d2_dec":-0.00004027080936022818,"cosVwE_cosEl_d2_ra":0.0005814547197492051,"cosVwE_cosEl_d2_dec":-0.000935906915634443,"sinVwE_cosEl_d2_ra":0.0007813571841350501,"sinVwE_cosEl_d2_dec":-0.00047223215820587456},"mars":{"cosVwE_sinEl_ra":-0.0011140487798611339,"cosVwE_sinEl_dec":-0.0036743796624175667,"sinEl_d_ra":0.0033627186215710245,"sinEl_d_dec":-0.012701815547956385,"sinVwE_sinEl_ra":-0.006356141564681869,"sinVwE_sinEl_dec":-0.00013369961659808483,"sin2VwE_sinEl_ra":0.00031724439612794344,"sin2VwE_sinEl_dec":0.01739168539941939,"cos2VwE_sinEl_ra":0.004143516153439421,"cos2VwE_sinEl_dec":0.00022778444218044325,"cos4VwE_sinEl_ra":0.005428306044246736,"cos4VwE_sinEl_dec":-0.01080111524328561,"sin4VwE_sinEl_ra":-0.0222174954712206,"sin4VwE_sinEl_dec":0.004286393953615477,"sinVwE_sinEl_d2_ra":0.005283420045811403,"sinVwE_sinEl_d2_dec":-0.0019096834272178508,"cos3VwE_sinEl_ra":-0.01713337342795123,"cos3VwE_sinEl_dec":0.002581862227614283,"sin3VwE_sinEl_ra":0.01566231796548501,"sin3VwE_sinEl_dec":-0.0046477676601650916,"sin2syn_ra":0.00256480149974197,"sin2syn_dec":-0.012209611899495584,"cos1syn_ra":-0.001006874061925775,"cos1syn_dec":0.009872831735740904,"sin3VwE_sinEl_d2_ra":-0.037392015803510585,"sin3VwE_sinEl_d2_dec":0.002473538068428684,"sin2VwE_sinEl_d2_ra":0.0038455948792325678,"sin2VwE_sinEl_d2_dec":-0.014778577154897714,"cos2VwE_sinEl_d2_ra":-0.011807978628793191,"cos2VwE_sinEl_d2_dec":0.0012557544306986937,"cosEl_d_ra":0.000284882868911627,"cosEl_d_dec":-0.0021820884562501544,"cosVwE_cosEl_d_ra":-0.0003505964419227473,"cosVwE_cosEl_d_dec":0.0055104246995418575,"sinVwE_cosEl_d_ra":0.0002518986669389568,"sinVwE_cosEl_d_dec":-0.0020101942296837116,"cosEl_d2_ra":0.00006092485835005758,"cosEl_d2_dec":-0.001141320906493464,"cosVwE_cosEl_d2_ra":0.00023028197939182156,"cosVwE_cosEl_d2_dec":-0.002735862075021542,"sinVwE_cosEl_d2_ra":0.00011442353028413846,"sinVwE_cosEl_d2_dec":-0.0005857378114159205}},
@@ -4,6 +4,10 @@
4
4
 
5
5
  export declare const CONSTANTS_HASH: "d36050ef216d137f";
6
6
 
7
+ export declare const MODEL_VERSION: string;
8
+
9
+ export declare const PREPRINT_DOI: string;
10
+
7
11
  export declare const DEFAULT_CONSTANTS: {
8
12
  readonly hash: "d36050ef216d137f";
9
13
  readonly additionalBodies: {
@@ -34,6 +34,12 @@
34
34
  */
35
35
  export const CONSTANTS_HASH = "d36050ef216d137f";
36
36
 
37
+ /** Model version label — single source: public/input/model-version.json (§10 two-axis scheme). */
38
+ export const MODEL_VERSION = "v10.0";
39
+
40
+ /** Canonical preprint DOI — single source: public/input/model-version.json. */
41
+ export const PREPRINT_DOI = "10.21203/rs.3.rs-8758810/v4";
42
+
37
43
  /** @type {Readonly<Record<string, unknown>>} */
38
44
  export const DEFAULT_CONSTANTS = Object.freeze({
39
45
  hash: "d36050ef216d137f",
@@ -19,7 +19,7 @@
19
19
  * outright, because a counterfactual must not be able to move the goalposts it
20
20
  * is judged by. See CLASSIFICATION in the generator.
21
21
  */
22
- export { DEFAULT_CONSTANTS, CONSTANTS_HASH, REFERENCE_DATA } from './generated.js';
22
+ export { DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA } from './generated.js';
23
23
 
24
24
  /**
25
25
  * Fitting-pipeline output, at full double precision (§2j). Kept apart from
package/src/index.js CHANGED
@@ -21,7 +21,9 @@
21
21
  * All three are enforced: `npm run lint` and `npm run check:boundaries`.
22
22
  */
23
23
 
24
- import { DEFAULT_CONSTANTS as GENERATED, CONSTANTS_HASH, REFERENCE_DATA } from './constants/index.js';
24
+ import { DEFAULT_CONSTANTS as GENERATED, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA } from './constants/index.js';
25
+ import { FITTED_COEFFICIENTS as FITTED, COEFFICIENTS_HASH as COEFF_HASH } from './constants/index.js';
26
+ import { assembleModel } from './model.js';
25
27
 
26
28
  /**
27
29
  * Keys `createModel` refuses. Derived from REFERENCE_DATA rather than listed by
@@ -36,11 +38,26 @@ const NEVER_INJECTABLE = Object.keys(REFERENCE_DATA);
36
38
  */
37
39
 
38
40
  /**
39
- * @typedef {Object} Model
40
- * @property {Constants} constants the resolved context, frozen
41
- * @property {string} hash identifies this context; differs for a counterfactual
42
- * @property {() => {axialPrecessionPeriodYears: number, inclinationPrecessionPeriodYears: number, perihelionPrecessionPeriodYears: number}} computeLatticePeriodsYears
43
- * @property {(year: number) => number} eccentricity
41
+ * @typedef {ReturnType<typeof assembleModel>} ModelSurfaces
42
+ */
43
+
44
+ /**
45
+ * @typedef {Object} ModelIdentity
46
+ * @property {string} modelVersion
47
+ * @property {string} constantsHash THIS context's hash — distinct for a counterfactual
48
+ * @property {string} coefficientsHash
49
+ * @property {boolean} counterfactual
50
+ * @property {string} preprintDoi
51
+ */
52
+
53
+ /**
54
+ * @typedef {{
55
+ * constants: Constants,
56
+ * hash: string,
57
+ * computeLatticePeriodsYears: () => {axialPrecessionPeriodYears: number, inclinationPrecessionPeriodYears: number, perihelionPrecessionPeriodYears: number},
58
+ * eccentricity: (year: number) => number,
59
+ * identity: ModelIdentity,
60
+ * } & ModelSurfaces} Model
44
61
  */
45
62
 
46
63
  /**
@@ -52,7 +69,7 @@ const NEVER_INJECTABLE = Object.keys(REFERENCE_DATA);
52
69
  * goalposts it is judged by (§2d).
53
70
  * @type {Constants}
54
71
  */
55
- export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH };
72
+ export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI };
56
73
 
57
74
  /**
58
75
  * Validation targets and presentation data. Single-sourced so nothing keeps a
@@ -163,6 +180,10 @@ export const createModel = (constants = GENERATED) => {
163
180
  // (`{...DEFAULT_CONSTANTS}`); only the identity case is short-circuited.
164
181
  const hash = isGeneratedDefault || isDefault(ctx) ? CONSTANTS_HASH : hashOf(ctx);
165
182
 
183
+ // The §7a assembly: every factory wired from THIS context, so counterfactual
184
+ // constants flow through the entire motion model.
185
+ const surfaces = assembleModel(ctx, FITTED);
186
+
166
187
  return {
167
188
  constants: ctx,
168
189
  hash,
@@ -196,13 +217,27 @@ export const createModel = (constants = GENERATED) => {
196
217
  },
197
218
 
198
219
  /**
220
+ * Earth eccentricity at a year — the Phase-6 promise, fulfilled by the
221
+ * §7a assembly (law-of-cosines on the integrated H/16 phase).
199
222
  * @param {number} year
200
223
  * @returns {number}
201
224
  */
202
- eccentricity: (year) => {
203
- void year; void ctx;
204
- throw new Error('physics: not implemented until Phase 6 — see IP-technical-design.md §6');
205
- },
225
+ eccentricity: (year) => surfaces.earth.eccentricity(year),
226
+
227
+ /**
228
+ * Model identity (§10 two-axis): the hash is THIS context's hash, so a
229
+ * counterfactual assembly is self-identifying.
230
+ */
231
+ identity: Object.freeze({
232
+ modelVersion: MODEL_VERSION,
233
+ constantsHash: hash,
234
+ coefficientsHash: COEFF_HASH,
235
+ counterfactual: hash !== CONSTANTS_HASH,
236
+ preprintDoi: PREPRINT_DOI,
237
+ }),
238
+
239
+ // The assembled surfaces (§7a step 1): epoch, earth, lengths, cardinal, moon.
240
+ ...surfaces,
206
241
  };
207
242
  };
208
243
 
package/src/model.js ADDED
@@ -0,0 +1,463 @@
1
+ /**
2
+ * createModel() — the canonical assembly of the parts library (§7a step 1).
3
+ *
4
+ * The package deliberately ships unassembled factories; every consumer wires
5
+ * them (tools/lib, script.js's generated-constants side, the website's
6
+ * adapter). This module is that wiring, extracted once: constants in,
7
+ * assembled model out. The api surface (Phase 15) builds on it, and the
8
+ * eventual tools/lib adapter collapse swaps onto it instead of keeping a
9
+ * private twin.
10
+ *
11
+ * Counterfactuals are first-class (§2d): the context validation and the
12
+ * counterfactual hashing live in index.js's `createModel`, which composes
13
+ * this assembly with the resolved, frozen context. This module stays pure
14
+ * and browser-safe.
15
+ *
16
+ * Wiring order mirrors the reference adapter (holisticuniverse
17
+ * src/lib/essrt.ts) operation-for-operation where FP association matters,
18
+ * which itself mirrors tools/lib/constants.js §9.
19
+ */
20
+ import { deriveEpochParams } from './layer0/derive-params.js';
21
+ import { createPhaseMachinery } from './phase/index.cjs';
22
+ import { createCardinalModel } from './cardinal/index.cjs';
23
+ import { createDeltaTCycles } from './deltat/cycles.cjs';
24
+ import { createDeepTimeLod } from './deltat/deep-time.cjs';
25
+ import { evalClimateL1OrbitalPermil } from './climate/l1-orbital.cjs';
26
+
27
+ /**
28
+ * RA-day-offset Fourier amplitudes (ms). KNOWN EXCEPTION carried over from
29
+ * the reference adapters: these are fit results that live as literals in the
30
+ * engine too — packaging them into FITTED_COEFFICIENTS is the remaining
31
+ * §7a-step-1b move; until then this is their single packaged home.
32
+ */
33
+ const RA_DAY_OFFSET_MEAN_MS = -14.194;
34
+ const RA_DAY_OFFSET_ECC_MS = -5.64;
35
+ const RA_DAY_OFFSET_OBLIQ_MS = -1.684;
36
+
37
+ /**
38
+ * Assemble the model surfaces from a resolved constants context + fitted
39
+ * coefficients. Internal: `createModel` in index.js composes this with the
40
+ * §2d context validation and counterfactual hashing — call that, not this.
41
+ *
42
+ * @param {Readonly<Record<string, any>>} C the frozen constants context
43
+ * @param {Readonly<Record<string, any>>} F the fitted coefficients
44
+ * @returns the assembled surfaces (epoch, earth, lengths, cardinal, moon) — type inferred so ReturnType stays precise
45
+ */
46
+ export function assembleModel(C, F) {
47
+ // ── Derived constants (constants.js §9 order) ─────────────────────────────
48
+ const H = C.foundational.holisticyearLength;
49
+ const meanSolarYearDays = Math.round(C.foundational.inputmeanlengthsolaryearindays * (H / 8)) / (H / 8);
50
+ const startmodelYear = C.foundational.startmodelYear;
51
+ const startmodelJD = C.foundational.startmodelJD;
52
+ const startModelYearWithCorrection = startmodelYear + C.foundational.correctionDays / meanSolarYearDays;
53
+ const balancedYear = C.earthOrbital.perihelionalignmentYear
54
+ - C.foundational.temperatureGraphMostLikely * (H / 16);
55
+
56
+ const meanSiderealYearDays = C.yearLengthRef.siderealYear;
57
+ const meanSiderealYearSeconds = meanSiderealYearDays * 86400;
58
+ const meanSiderealYearDaysKinematic = (meanSolarYearDays * H) / (H - 13);
59
+ const meanLengthOfDay = meanSiderealYearSeconds / meanSiderealYearDaysKinematic;
60
+ const meanAnomalisticYearDays = (meanSolarYearDays * (H / 16)) / (H / 16 - 1);
61
+ const meanTropicalYearJ2000Seconds = meanSolarYearDays * meanLengthOfDay;
62
+
63
+ const earthtiltMean = C.earth.earthtiltMean;
64
+ const earthInclAmplitude = C.earth.earthInvPlaneInclinationAmplitude;
65
+ const eccentricityBase = C.earth.eccentricityBase;
66
+ const eccentricityAmplitude = C.earth.eccentricityAmplitude;
67
+ const earthRAAngle = 2 * earthInclAmplitude - (earthInclAmplitude * earthInclAmplitude) / earthtiltMean;
68
+ const earthInclMean = C.earthOrbital.earthInclinationJ2000_deg
69
+ - earthInclAmplitude * Math.cos(((C.earthOrbital.earthPerihelionLongitudeJ2000
70
+ - C.earthOrbital.earthInclinationCycleAnchor) * Math.PI) / 180);
71
+ const solsticeObliquityMean = F.SOLSTICE_OBLIQUITY_MEAN_FITTED;
72
+
73
+ const G_CONSTANT = C.physicalConstants.G_CONSTANT;
74
+ const MASS_RATIO_EARTH_MOON = C.physicalConstants.MASS_RATIO_EARTH_MOON;
75
+ const currentAUDistance = C.physicalConstants.currentAUDistance;
76
+ const earthMoiFactorJ2000 = C.physicalConstants.earthMoiFactorJ2000;
77
+ const moonDistanceKm = C.moonReference.moonDistance;
78
+ const moonSiderealMonthInput = C.moonReference.moonSiderealMonthInput;
79
+
80
+ // 8H-lattice moon sidereal month (constants.js §"Moon derived months")
81
+ const totalDaysInH = H * meanSolarYearDays;
82
+ const moonSiderealMonth = totalDaysInH / (Math.round((8 * totalDaysInH) / moonSiderealMonthInput) / 8);
83
+
84
+ // Mass chain: Moon Kepler → GM_EM → Earth/Moon split → Sun (§9 order)
85
+ const moonOrbitalShift = moonDistanceKm * (1 / (MASS_RATIO_EARTH_MOON + 1)) * (moonSiderealMonth / meanSiderealYearDays);
86
+ const moonDistanceCorrected = moonDistanceKm + moonOrbitalShift;
87
+ const GM_EARTH_MOON_SYSTEM = (4 * Math.PI * Math.PI * Math.pow(moonDistanceCorrected, 3))
88
+ / Math.pow(moonSiderealMonth * meanLengthOfDay, 2);
89
+ const GM_EARTH_ALONE = GM_EARTH_MOON_SYSTEM * (MASS_RATIO_EARTH_MOON / (MASS_RATIO_EARTH_MOON + 1));
90
+ const GM_MOON_ALONE = GM_EARTH_MOON_SYSTEM / (MASS_RATIO_EARTH_MOON + 1);
91
+ const GM_SUN_PLUS_EARTH = (4 * Math.PI * Math.PI * Math.pow(currentAUDistance, 3))
92
+ / Math.pow(meanSiderealYearSeconds, 2);
93
+ const GM_SUN = GM_SUN_PLUS_EARTH - GM_EARTH_ALONE;
94
+ const M_SUN = GM_SUN / G_CONSTANT;
95
+
96
+ // ── α(t): climate-driven GIA channel with the R2 lattice pin ──────────────
97
+ const CLIMATE = F.CLIMATE_FORMULA_COEFFS;
98
+ const CLIMATE_REGIME = CLIMATE.regimes['lr04-post-mpt'];
99
+ const alphaClimateScale = C.deepTime.alphaClimateScalePerMille;
100
+
101
+ /** @param {number} year @returns {number} */
102
+ const evalClimateL1 = (year) => evalClimateL1OrbitalPermil(year, {
103
+ l1Terms: CLIMATE_REGIME.L1,
104
+ yStdDenormalization: CLIMATE_REGIME.denormalization.y_std,
105
+ eightHKyr: CLIMATE.config.eight_H_kyr,
106
+ });
107
+
108
+ let latticeAlphaPin = false;
109
+ /** @type {number|null} */
110
+ let alphaL1J2000 = null;
111
+ /** @param {number} tMa @returns {number} */
112
+ const earthMoiFactorAtAge = (tMa) => {
113
+ if (latticeAlphaPin) return earthMoiFactorJ2000;
114
+ if (alphaL1J2000 === null) alphaL1J2000 = evalClimateL1(2000);
115
+ const L1at = evalClimateL1(2000 - tMa * 1e6);
116
+ return earthMoiFactorJ2000 - alphaClimateScale * (L1at - alphaL1J2000);
117
+ };
118
+
119
+ // ── Layer 0 + deep-time core ──────────────────────────────────────────────
120
+ const EPOCH_PARAMS = deriveEpochParams({
121
+ solarLuminosityW: C.physicalConstants.solarLuminosityW,
122
+ solarWindKgPerS: C.physicalConstants.solarWindMassLossKgPerS,
123
+ speedOfLightKmPerS: C.physicalConstants.speedOfLight,
124
+ alpha1PerMa: C.deepTime.alpha1PerMa,
125
+ alpha3PerMa3: C.deepTime.alpha3PerMa3,
126
+ alpha4PerMa4: C.deepTime.alpha4PerMa4,
127
+ holisticYearJ2000: H,
128
+ meanSiderealYearSeconds,
129
+ meanSiderealYearDaysKinematic,
130
+ sunMassKg: M_SUN,
131
+ gmEarthAloneKm3S2: GM_EARTH_ALONE,
132
+ gmMoonAloneKm3S2: GM_MOON_ALONE,
133
+ gravitationalConstantKm3KgS2: G_CONSTANT,
134
+ earthMoiFactorJ2000,
135
+ earthDiameterKm: C.bodyDiametersKm.earth,
136
+ moonDistanceKm,
137
+ moonOrbitalEccentricity: C.moonReference.moonOrbitalEccentricityBase,
138
+ gmEarthMoonSystemKm3S2: GM_EARTH_MOON_SYSTEM,
139
+ });
140
+
141
+ /** Farhat polynomial on the t_Ma axis. @param {number} tMa @returns {number} */
142
+ const moonDistanceMetresAtAge = (tMa) => EPOCH_PARAMS.moonDistanceNowM
143
+ * (1 + EPOCH_PARAMS.alpha1PerMa * tMa
144
+ + EPOCH_PARAMS.alpha3PerMa3 * tMa * tMa * tMa
145
+ + EPOCH_PARAMS.alpha4PerMa4 * tMa * tMa * tMa * tMa);
146
+
147
+ const DT = F.DT_STACK;
148
+ const RES = F.DT_RESONATOR;
149
+ const dtCycles = createDeltaTCycles({
150
+ eightHYears: 8 * H,
151
+ taperFullHalfwidthYears: C.deepTime.dtStackTaperFullHalfwidthYr,
152
+ taperTotalHalfwidthYears: C.deepTime.dtStackTaperTotalHalfwidthYr,
153
+ tropicalYearSecondsJ2000: meanTropicalYearJ2000Seconds,
154
+ cycles: {
155
+ bond: { latticeN: DT.bond.lattice_n, cosCoeffSeconds: DT.bond.cos_coeff_s, sinCoeffSeconds: DT.bond.sin_coeff_s },
156
+ hallstatt: { latticeN: DT.hallstatt.lattice_n, cosCoeffSeconds: DT.hallstatt.cos_coeff_s, sinCoeffSeconds: DT.hallstatt.sin_coeff_s },
157
+ jose5: { latticeN: DT.jose5.lattice_n, cosCoeffSeconds: DT.jose5.cos_coeff_s, sinCoeffSeconds: DT.jose5.sin_coeff_s },
158
+ jose4: { latticeN: DT.jose4.lattice_n, cosCoeffSeconds: DT.jose4.cos_coeff_s, sinCoeffSeconds: DT.jose4.sin_coeff_s },
159
+ },
160
+ resonator: {
161
+ t0LatticeN: RES.T0_lattice_n,
162
+ q: RES.Q,
163
+ kicks: RES.kick_epochs_year.map(/** @param {number} t @param {number} i */ (t, i) => ({
164
+ tYear: t,
165
+ cosSeconds: RES.kick_coefficients_s[i].cos,
166
+ sinSeconds: RES.kick_coefficients_s[i].sin,
167
+ })),
168
+ tones: RES.drive_tones.map(/** @param {{dn: number, phi_locked_rad: number, amp_s: number}} t */ (t) => ({ dn: t.dn, phiLockedRad: t.phi_locked_rad, ampSeconds: t.amp_s })),
169
+ },
170
+ });
171
+
172
+ /** Layer-3/4 cyclic δLOD sum (all shipped channels ON). @param {number} year @returns {number} */
173
+ const dtCycleLodCorrectionSum = (year) =>
174
+ dtCycles.cycleLodSecondsAt('bond', year)
175
+ + dtCycles.cycleLodSecondsAt('hallstatt', year)
176
+ + dtCycles.cycleLodSecondsAt('jose5', year)
177
+ + dtCycles.cycleLodSecondsAt('jose4', year)
178
+ + dtCycles.swingLodSecondsAt(year);
179
+
180
+ const deepLod = createDeepTimeLod({
181
+ constants: {
182
+ lTotalEmKgm2S: EPOCH_PARAMS.totalAngularMomentumKgM2S,
183
+ mMoonAloneKg: EPOCH_PARAMS.moonMassKg,
184
+ mEarthAloneKg: EPOCH_PARAMS.earthMassKg,
185
+ rEarthMetres: EPOCH_PARAMS.earthRadiusM,
186
+ gmEmM3PerS2: EPOCH_PARAMS.gmEarthMoonM3S2,
187
+ eFactorMoon: EPOCH_PARAMS.moonEccentricityFactor,
188
+ aLockMetres: EPOCH_PARAMS.moonLockDistanceM,
189
+ aMoonNowMetres: EPOCH_PARAMS.moonDistanceNowM,
190
+ alpha1PerMa: EPOCH_PARAMS.alpha1PerMa,
191
+ alpha3PerMa3: EPOCH_PARAMS.alpha3PerMa3,
192
+ alpha4PerMa4: EPOCH_PARAMS.alpha4PerMa4,
193
+ holisticYearJ2000: H,
194
+ lodNowH13Seconds: EPOCH_PARAMS.lodNowH13Seconds,
195
+ meanSiderealYearJ2000Seconds: meanSiderealYearSeconds,
196
+ solarMassLossFracPerYear: EPOCH_PARAMS.solarMassLossFracPerYear,
197
+ siderealYearDaysKinematicJ2000: meanSiderealYearDaysKinematic,
198
+ },
199
+ moonDistanceMetresAtAge,
200
+ moiFactorAtAge: earthMoiFactorAtAge,
201
+ siderealYearDaysFourierAt: (year) => evalSiderealYearFourierIAU(year),
202
+ cycleLodSumAt: dtCycleLodCorrectionSum,
203
+ swingLodAt: (year) => dtCycles.swingLodSecondsAt(year),
204
+ swingLodRateAt: (year) => dtCycles.swingLodRateAt(year),
205
+ });
206
+
207
+ // ── Integrated ∫1/H(t)dt phase (R2 α-pin honoured while building) ─────────
208
+ const phaseM = createPhaseMachinery({
209
+ holisticHAtAgeMa: (tMa) => deepLod.hAtAge(tMa),
210
+ tableAnchorYear: startmodelYear,
211
+ driftRefYear: startModelYearWithCorrection,
212
+ hJ2000: H,
213
+ yearMin: -500e6,
214
+ yearMax: 500e6,
215
+ stepYears: 10000,
216
+ });
217
+ let phaseTableBuilt = false;
218
+ const phase = () => {
219
+ if (!phaseTableBuilt) {
220
+ latticeAlphaPin = true;
221
+ try { phaseM.ensureTable(); } finally { latticeAlphaPin = false; }
222
+ phaseTableBuilt = true;
223
+ }
224
+ return phaseM;
225
+ };
226
+ /** @param {number} yearA @param {number} yearB @param {number} divisorN @returns {number} */
227
+ const cyclesBetween = (yearA, yearB, divisorN) => {
228
+ const cyc = phase().cyclesBetween(yearA, yearB, divisorN);
229
+ return cyc === null ? (divisorN * (yearB - yearA)) / H : cyc;
230
+ };
231
+ /** @param {number} anchorYear @param {number} year @param {number} divisorN @returns {number} */
232
+ const phaseRadians = (anchorYear, year, divisorN) => 2 * Math.PI * cyclesBetween(anchorYear, year, divisorN);
233
+
234
+ /** @param {number} year @returns {number} */
235
+ const yearToTMa = (year) => (2000 - year) / 1e6;
236
+
237
+ // ── Earth scalars (integrated-phase display semantics) ────────────────────
238
+ /** @param {number} year @returns {number} */
239
+ const earthPerihelionDeg = (year) => {
240
+ let longitude = 270.0 + 360.0 * cyclesBetween(balancedYear, year, 16);
241
+ for (const [div, sinC, cosC] of F.PERI_HARMONICS_RAW) {
242
+ const ph = phaseRadians(balancedYear, year, div);
243
+ longitude += sinC * Math.sin(ph) + cosC * Math.cos(ph);
244
+ }
245
+ return (((longitude + F.PERI_OFFSET) % 360) + 360) % 360;
246
+ };
247
+ /** @param {number} year @returns {number} */
248
+ const obliquityDeg = (year) => {
249
+ let obliq = solsticeObliquityMean;
250
+ for (const [div, sinC, cosC] of F.SOLSTICE_OBLIQUITY_HARMONICS) {
251
+ const ph = phaseRadians(balancedYear, year, div);
252
+ obliq += sinC * Math.sin(ph) + cosC * Math.cos(ph);
253
+ }
254
+ return obliq;
255
+ };
256
+ /** @param {number} year @returns {number} */
257
+ const eccentricityAt = (year) => {
258
+ const th = phaseRadians(balancedYear, year, 16);
259
+ return Math.sqrt(eccentricityBase * eccentricityBase
260
+ + eccentricityAmplitude * eccentricityAmplitude
261
+ - 2 * eccentricityBase * eccentricityAmplitude * Math.cos(th));
262
+ };
263
+ /** @param {number} year @returns {number} */
264
+ const inclinationDeg = (year) => earthInclMean
265
+ - earthInclAmplitude * Math.cos(phaseRadians(balancedYear, year, 3));
266
+ /** @param {number} year @returns {number} */
267
+ const ascendingNodeDeg = (year) => {
268
+ const period = -H / 5;
269
+ return (((C.earthOrbital.earthAscendingNodeInvPlane + (360.0 * (year - 2000)) / period) % 360) + 360) % 360;
270
+ };
271
+
272
+ // ── Year/day lengths ──────────────────────────────────────────────────────
273
+ /** @param {number} year @param {number} base @param {Array<[number, number, number]>} harmonics @returns {number} */
274
+ const evalYearFourier = (year, base, harmonics) => {
275
+ let result = base;
276
+ const c1 = phase().cyclesBetween(balancedYear, year, 1);
277
+ if (c1 === null) return result;
278
+ for (const [div, sinC, cosC] of harmonics) {
279
+ const ph = div * c1 * 2 * Math.PI;
280
+ result += sinC * Math.sin(ph) + cosC * Math.cos(ph);
281
+ }
282
+ return result;
283
+ };
284
+ /** @param {number} year @returns {number} */
285
+ const evalSiderealYearFourierIAU = (year) => evalYearFourier(year, meanSiderealYearDays, F.SIDEREAL_YEAR_HARMONICS);
286
+ /** @param {number} year @returns {number} */
287
+ const siderealYearDaysBase = (year) => {
288
+ const tMa = yearToTMa(year);
289
+ const lod = deepLod.lodSecondsAtAge(tMa);
290
+ if (lod === null) return meanSiderealYearDays;
291
+ return deepLod.siderealYearSecondsAtAge(tMa) / lod;
292
+ };
293
+ /** @param {number} year @returns {number} */
294
+ const tropicalYearDaysBase = (year) => {
295
+ const days = deepLod.yearInDaysAtAge(yearToTMa(year));
296
+ return days === null ? meanSolarYearDays : days;
297
+ };
298
+ /** @param {number} year @returns {number} */
299
+ const anomalisticYearDaysBase = (year) => {
300
+ const tMa = yearToTMa(year);
301
+ const Ht = deepLod.hAtAge(tMa);
302
+ const tropD = deepLod.yearInDaysAtAge(tMa);
303
+ if (Ht === null || tropD === null) return meanAnomalisticYearDays;
304
+ return (tropD * (Ht / 16)) / (Ht / 16 - 1);
305
+ };
306
+ /** @param {number} year @returns {number} */
307
+ const siderealYearDays = (year) => evalYearFourier(year, siderealYearDaysBase(year), F.SIDEREAL_YEAR_HARMONICS);
308
+ /** @param {number} year @returns {number} */
309
+ const anomalisticYearDays = (year) => evalYearFourier(year, anomalisticYearDaysBase(year), F.ANOMALISTIC_YEAR_HARMONICS);
310
+ /** Kinematic LOD (Layer 0). @param {number} year @returns {number} */
311
+ const dayLengthSeconds = (year) => deepLod.siderealYearSecondsAtAge(yearToTMa(year)) / siderealYearDays(year);
312
+ /** @param {number} year @returns {number} */
313
+ const raDayOffsetMs = (year) => RA_DAY_OFFSET_MEAN_MS
314
+ + RA_DAY_OFFSET_ECC_MS * Math.cos(phaseRadians(balancedYear, year, 16))
315
+ + RA_DAY_OFFSET_OBLIQ_MS * Math.cos(phaseRadians(balancedYear, year, 8));
316
+
317
+ // ── Cardinal-point model ──────────────────────────────────────────────────
318
+ const cardinalM = createCardinalModel({
319
+ isDeepTime: () => true,
320
+ constants: {
321
+ anchors: F.CARDINAL_POINT_ANCHORS_ADJUSTED,
322
+ harmonics: F.CARDINAL_POINT_HARMONICS,
323
+ eccTerms: F.CARDINAL_POINT_ECC_TERMS,
324
+ jointTerms: F.CARDINAL_POINT_JOINT_TERMS,
325
+ derived: F.CARDINAL_POINT_DERIVED,
326
+ tropicalHarmonics: F.TROPICAL_YEAR_HARMONICS,
327
+ balancedYear,
328
+ meanSolarYearDays,
329
+ hJ2000: H,
330
+ eccentricityBase,
331
+ eccentricityAmplitude,
332
+ tiltMeanDeg: earthtiltMean,
333
+ raAngleDeg: earthRAAngle,
334
+ inclAmplitudeDeg: earthInclAmplitude,
335
+ },
336
+ fns: {
337
+ cyclesBetween: (a, b, n) => phase().cyclesBetween(a, b, n),
338
+ analyticTropicalDays: (year) => {
339
+ const tMa = (startmodelYear - year) / 1e6;
340
+ const Ht = deepLod.hAtAge(tMa);
341
+ if (Ht === null) return null;
342
+ return (deepLod.siderealYearSecondsAtAge(tMa) / 86400) * (1 - 13 / Ht);
343
+ },
344
+ meanHAtAgeMa: (tMa) => deepLod.hAtAge(tMa),
345
+ meanYearRealLodDays: (tMa) => deepLod.yearInDaysAtAge(tMa),
346
+ eccentricityAt,
347
+ },
348
+ });
349
+ /** Tropical year: mean of the four cardinal intervals. @param {number} year @returns {number} */
350
+ const tropicalYearDays = (year) => cardinalM.computeTropicalYearLength(year);
351
+ /** @param {number} year @returns {number} */
352
+ const tropicalYearDirectDays = (year) => evalYearFourier(year, tropicalYearDaysBase(year), F.TROPICAL_YEAR_HARMONICS);
353
+
354
+ /** @param {number} year @returns {number} */
355
+ const solarYearSeconds = (year) => tropicalYearDays(year) * dayLengthSeconds(year);
356
+ /** @param {number} year @returns {number} */
357
+ const siderealDaySeconds = (year) => solarYearSeconds(year) / (tropicalYearDays(year) + 1);
358
+ /** @param {number} year @returns {number} */
359
+ const stellarDaySeconds = (year) => {
360
+ const tMa = yearToTMa(year);
361
+ const HtRaw = deepLod.hAtAge(tMa);
362
+ const Ht = HtRaw === null ? H : HtRaw;
363
+ const syS = solarYearSeconds(year);
364
+ const syD = tropicalYearDays(year);
365
+ const sidDay = siderealDaySeconds(year);
366
+ const raProjection = Math.cos((obliquityDeg(year) * Math.PI) / 180);
367
+ return (syS / (syD + 1) / (Ht / 13) / (syD + 1)) * raProjection + sidDay;
368
+ };
369
+ /** @param {number} year @returns {number} */
370
+ const measuredSolarDaySeconds = (year) => dayLengthSeconds(year) + raDayOffsetMs(year) / 1000;
371
+
372
+ // ── Moon at epoch ─────────────────────────────────────────────────────────
373
+ /** Solar-Δa-corrected Kepler month. @param {number} year @returns {number} */
374
+ const moonSiderealMonthDaysAt = (year) => {
375
+ const tMa = yearToTMa(year);
376
+ const lod = deepLod.lodSecondsAtAge(tMa);
377
+ if (lod === null) return NaN;
378
+ const aAppKm = moonDistanceMetresAtAge(tMa) / 1000;
379
+ const sidYrDays = deepLod.siderealYearSecondsAtAge(tMa) / lod;
380
+ const deltaA = aAppKm * (1 / (MASS_RATIO_EARTH_MOON + 1)) * (moonSiderealMonthInput / sidYrDays);
381
+ const aCorrM = (aAppKm + deltaA) * 1000;
382
+ const monthSeconds = 2 * Math.PI * Math.sqrt(Math.pow(aCorrM, 3) / EPOCH_PARAMS.gmEarthMoonM3S2);
383
+ return monthSeconds / lod;
384
+ };
385
+
386
+ // ── ΔT (TT − UT1): raw Simpson + sequential stack adds ────────────────────
387
+ /** @param {number} tMa @returns {number} */
388
+ const meanDeltaTSecondsAtAge = (tMa) => {
389
+ if (tMa === 0) return 0;
390
+ let result = deepLod.deltaTRawSecondsAtAge(tMa);
391
+ const yearY = 2000 - tMa * 1e6;
392
+ result += dtCycles.cycleDeltaTSecondsAt('bond', yearY);
393
+ result += dtCycles.cycleDeltaTSecondsAt('hallstatt', yearY);
394
+ result += dtCycles.cycleDeltaTSecondsAt('jose5', yearY);
395
+ result += dtCycles.cycleDeltaTSecondsAt('jose4', yearY);
396
+ result += dtCycles.swingDeltaTSecondsAt(yearY);
397
+ return result;
398
+ };
399
+ /** @param {number} year @returns {number} */
400
+ const deltaTSeconds = (year) => C.earthOrbital.deltaTStart + meanDeltaTSecondsAtAge(yearToTMa(year));
401
+
402
+ // ── Time axis: exact JD ↔ model-year conversion ───────────────────────────
403
+ // The model's `year` inputs live on the SI axis (the axis the fits were
404
+ // anchored on — tools/lib `_jdToSIyear`): linear in SI 86400-s days from the
405
+ // model start, so the JD↔year map is closed-form and exact to double
406
+ // precision. Callers holding an exact JD (e.g. 2058768.5385006 TT) convert
407
+ // here and NEVER roll their own — a caller-side linear-vs-calendar mix once
408
+ // put the eclipse umbra twin 8 km off (§12h; ≤1 m once unified).
409
+ const siTropicalYearDays = meanTropicalYearJ2000Seconds / 86400;
410
+ /** Model year (SI axis) at a JD(TT). @param {number} jd @returns {number} */
411
+ const yearFromJD = (jd) => startModelYearWithCorrection + (jd - startmodelJD) / siTropicalYearDays;
412
+ /** JD(TT) at a model year (SI axis). @param {number} year @returns {number} */
413
+ const jdFromYear = (year) => startmodelJD + (year - startModelYearWithCorrection) * siTropicalYearDays;
414
+
415
+ // ── The assembled surface ─────────────────────────────────────────────────
416
+ return Object.freeze({
417
+ time: Object.freeze({
418
+ yearFromJD,
419
+ jdFromYear,
420
+ siTropicalYearDays,
421
+ }),
422
+ epoch: Object.freeze({
423
+ yearToTMa,
424
+ hAtYear: /** @param {number} year @returns {number|null} */ (year) => deepLod.hAtAge(yearToTMa(year)),
425
+ lodSecondsAtYear: /** @param {number} year @returns {number|null} */ (year) => deepLod.lodSecondsAtAge(yearToTMa(year)),
426
+ alphaAtYear: /** @param {number} year @returns {number} */ (year) => earthMoiFactorAtAge(yearToTMa(year)),
427
+ moonDistanceKmAtYear: /** @param {number} year @returns {number} */ (year) => moonDistanceMetresAtAge(yearToTMa(year)) / 1000,
428
+ siderealYearSecondsAtYear: /** @param {number} year @returns {number} */ (year) => deepLod.siderealYearSecondsAtAge(yearToTMa(year)),
429
+ deltaTSecondsAtYear: deltaTSeconds,
430
+ cyclesBetween,
431
+ }),
432
+ earth: Object.freeze({
433
+ perihelionLongitudeDeg: earthPerihelionDeg,
434
+ obliquityDeg,
435
+ eccentricity: eccentricityAt,
436
+ inclinationDeg,
437
+ ascendingNodeDeg,
438
+ }),
439
+ lengths: Object.freeze({
440
+ tropicalYearDays,
441
+ tropicalYearDirectDays,
442
+ siderealYearDays,
443
+ anomalisticYearDays,
444
+ dayLengthSeconds,
445
+ siderealDaySeconds,
446
+ stellarDaySeconds,
447
+ measuredSolarDaySeconds,
448
+ raDayOffsetMs,
449
+ }),
450
+ cardinal: Object.freeze({
451
+ jd: /** @param {number} year @param {string} type @returns {number} */ (year, type) => cardinalM.computeSolsticeJD(year, type),
452
+ raDeg: /** @param {number} year @param {string} type @returns {number} */ (year, type) => {
453
+ const ra = cardinalM.computeSolsticeRA(year, type);
454
+ return ((ra % 360) + 360) % 360;
455
+ },
456
+ yearLengthDays: /** @param {number} year @param {string} type @returns {number} */ (year, type) => cardinalM.computeSolsticeYearLength(year, type),
457
+ }),
458
+ moon: Object.freeze({
459
+ distanceKmAtYear: /** @param {number} year @returns {number} */ (year) => moonDistanceMetresAtAge(yearToTMa(year)) / 1000,
460
+ siderealMonthDaysAtYear: moonSiderealMonthDaysAt,
461
+ }),
462
+ });
463
+ }
@@ -113,7 +113,7 @@ function integrateAscendingNode(tilt, currentYear, deps) {
113
113
 
114
114
  const effectFromEpoch = integrateEffect(EPOCH_YEAR, currentYear);
115
115
 
116
- let newOmega = staticOmega + effectFromEpoch;
116
+ const newOmega = staticOmega + effectFromEpoch;
117
117
  return ((newOmega % 360) + 360) % 360;
118
118
  }
119
119
 
@@ -165,7 +165,8 @@ function perihelionLa2004(year) {
165
165
  const i = Math.floor(idx);
166
166
  if (i >= _LA2004.length - 1) return _LA2004[_LA2004.length - 1][3];
167
167
  const frac = idx - i;
168
- let v0 = _LA2004[i][3], v1 = _LA2004[i + 1][3];
168
+ const v0 = _LA2004[i][3];
169
+ let v1 = _LA2004[i + 1][3];
169
170
  // Unwrap: if values jump by more than 180°, adjust
170
171
  if (v1 - v0 > 180) v1 -= 360;
171
172
  else if (v0 - v1 > 180) v1 += 360;