@essrt/physics 22.1.0 → 23.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +2 -1
  2. package/package.json +9 -3
  3. package/src/constants/coefficients.d.ts +11 -11
  4. package/src/constants/coefficients.js +4 -4
  5. package/src/constants/generated.d.ts +4 -16
  6. package/src/constants/generated.js +8 -32
  7. package/src/constants/units.cjs +20 -0
  8. package/src/deltat/deep-time-chain.js +457 -0
  9. package/src/deltat/deep-time.cjs +68 -25
  10. package/src/deltat/moon-distance-artifact.cjs +23 -0
  11. package/src/deltat/moon-distance-history.cjs +115 -0
  12. package/src/earth/deep-orbital-history.cjs +69 -19
  13. package/src/earth/mass-chain.cjs +95 -0
  14. package/src/earth/mean-obliquity-history.cjs +94 -0
  15. package/src/earth/precession-composed.cjs +49 -3
  16. package/src/index.js +23 -1
  17. package/src/layer0/derive-params.js +1 -5
  18. package/src/layer0/index.js +30 -17
  19. package/src/math/angles.cjs +38 -0
  20. package/src/model.js +100 -266
  21. package/src/moon/arguments.cjs +5 -31
  22. package/src/moon/month-chain.cjs +12 -19
  23. package/src/planets/chain-artifact.js +2 -2
  24. package/src/time/calendar.cjs +165 -0
  25. package/types/constants/coefficients.d.ts +11 -11
  26. package/types/constants/generated.d.ts +4 -16
  27. package/types/constants/units.d.cts +8 -0
  28. package/types/deltat/deep-time-chain.d.ts +266 -0
  29. package/types/deltat/deep-time.d.cts +42 -12
  30. package/types/deltat/moon-distance-artifact.d.cts +22 -0
  31. package/types/deltat/moon-distance-history.d.cts +36 -0
  32. package/types/earth/deep-orbital-history.d.cts +5 -3
  33. package/types/earth/mass-chain.d.cts +78 -0
  34. package/types/earth/mean-obliquity-history.d.cts +32 -0
  35. package/types/earth/precession-composed.d.cts +11 -1
  36. package/types/index.d.ts +8 -1
  37. package/types/layer0/derive-params.d.ts +3 -2
  38. package/types/layer0/index.d.ts +9 -6
  39. package/types/math/angles.d.cts +18 -0
  40. package/types/model.d.ts +21 -3
  41. package/types/moon/arguments.d.cts +2 -6
  42. package/types/moon/month-chain.d.cts +7 -13
  43. package/types/time/calendar.d.cts +78 -0
  44. package/src/deltat/recession-history.cjs +0 -169
  45. package/types/deltat/recession-history.d.cts +0 -80
@@ -2,7 +2,7 @@
2
2
  // The fitted coefficients' shapes for TypeScript consumers (§2g); values live
3
3
  // in coefficients.js, emitted VERBATIM from the fit artifacts under data/.
4
4
 
5
- export declare const COEFFICIENTS_HASH: "91e2d041c7b6e038";
5
+ export declare const COEFFICIENTS_HASH: "ff77fbc9baa370e4";
6
6
 
7
7
  export declare const FITTED_COEFFICIENTS: {
8
8
  readonly BALANCE_PRESETS: Array<Array<number | string>>;
@@ -275,70 +275,70 @@ export declare const FITTED_COEFFICIENTS: {
275
275
  "ratio": number;
276
276
  "label": string;
277
277
  };
278
- "27.2691": {
278
+ "27.2689": {
279
279
  "period_kyr": number;
280
280
  "lr04_post_mpt_amp": number;
281
281
  "epica_amp": number;
282
282
  "ratio": number;
283
283
  "label": string;
284
284
  };
285
- "28.8426": {
285
+ "28.8424": {
286
286
  "period_kyr": number;
287
287
  "lr04_post_mpt_amp": number;
288
288
  "epica_amp": number;
289
289
  "ratio": number;
290
290
  "label": string;
291
291
  };
292
- "29.0050": {
292
+ "29.0048": {
293
293
  "period_kyr": number;
294
294
  "lr04_post_mpt_amp": number;
295
295
  "epica_amp": number;
296
296
  "ratio": number;
297
297
  "label": string;
298
298
  };
299
- "29.6174": {
299
+ "29.6172": {
300
300
  "period_kyr": number;
301
301
  "lr04_post_mpt_amp": number;
302
302
  "epica_amp": number;
303
303
  "ratio": number;
304
304
  "label": string;
305
305
  };
306
- "29.8094": {
306
+ "29.8092": {
307
307
  "period_kyr": number;
308
308
  "lr04_post_mpt_amp": number;
309
309
  "epica_amp": number;
310
310
  "ratio": number;
311
311
  "label": string;
312
312
  };
313
- "39.5564": {
313
+ "39.5560": {
314
314
  "period_kyr": number;
315
315
  "lr04_post_mpt_amp": number;
316
316
  "epica_amp": number;
317
317
  "ratio": number;
318
318
  "label": string;
319
319
  };
320
- "40.2297": {
320
+ "40.2293": {
321
321
  "period_kyr": number;
322
322
  "lr04_post_mpt_amp": number;
323
323
  "epica_amp": number;
324
324
  "ratio": number;
325
325
  "label": string;
326
326
  };
327
- "40.9244": {
327
+ "40.9239": {
328
328
  "period_kyr": number;
329
329
  "lr04_post_mpt_amp": number;
330
330
  "epica_amp": number;
331
331
  "ratio": number;
332
332
  "label": string;
333
333
  };
334
- "41.6450": {
334
+ "41.6446": {
335
335
  "period_kyr": number;
336
336
  "lr04_post_mpt_amp": number;
337
337
  "epica_amp": number;
338
338
  "ratio": number;
339
339
  "label": string;
340
340
  };
341
- "53.6182": {
341
+ "53.6175": {
342
342
  "period_kyr": number;
343
343
  "lr04_post_mpt_amp": number;
344
344
  "epica_amp": number;
@@ -2,14 +2,14 @@
2
2
  // Gives the TypeScript website full type safety at the boundary (§2g) while
3
3
  // packages/physics stays JavaScript.
4
4
 
5
- export declare const CONSTANTS_HASH: "f4f43386df2781b8";
5
+ export declare const CONSTANTS_HASH: "896558c2d878571d";
6
6
 
7
7
  export declare const MODEL_VERSION: string;
8
8
 
9
9
  export declare const PREPRINT_DOI: string;
10
10
 
11
11
  export declare const DEFAULT_CONSTANTS: {
12
- readonly hash: "f4f43386df2781b8";
12
+ readonly hash: "896558c2d878571d";
13
13
  readonly additionalBodiesReference: {
14
14
  "pluto": {
15
15
  "solarYearInput": number;
@@ -83,24 +83,11 @@ export declare const DEFAULT_CONSTANTS: {
83
83
  };
84
84
  readonly deepTime: {
85
85
  "alpha1PerMa": number;
86
- "alpha3PerMa3": number;
87
- "alpha4PerMa4": number;
88
86
  "alphaGiaRateJ2000PerYr": number;
89
87
  "alphaGiaRelaxationKyr": number;
90
88
  "j2RateJ2000PerYr": number;
91
89
  "dtStackTaperFullHalfwidthYr": number;
92
90
  "dtStackTaperTotalHalfwidthYr": number;
93
- "recessionRegime": {
94
- "jointMa": number;
95
- "knotAgesMa": number[];
96
- "knotDistancesKm": number[];
97
- "genesisMa": number;
98
- "rocheLimitKm": number;
99
- "solarOceanLeakBeta0": number;
100
- "thermalPumpStartMa": number;
101
- "thermalPumpEndMa": number;
102
- "thermalPumpFactor": number;
103
- };
104
91
  };
105
92
  readonly earthOrbital: {
106
93
  "j2000EpochYear": number;
@@ -207,6 +194,8 @@ export declare const DEFAULT_CONSTANTS: {
207
194
  "earthJ2": number;
208
195
  "earthEquatorialRadiusKm": number;
209
196
  "earthParallaxRadiusKm": number;
197
+ "earthMeanRadiusKm": number;
198
+ "solarConstantWm2": number;
210
199
  "solarParallaxArcsec": number;
211
200
  "arcsecDisplacementKm": number;
212
201
  };
@@ -566,7 +555,6 @@ export declare const REFERENCE_DATA: {
566
555
  "wellsRecessionCmYr": number;
567
556
  "modernLLRRecessionCmYr": number;
568
557
  "tidalLockApproachGyr": number;
569
- "essrtFormulaHorizonGyr": number;
570
558
  "iceAlbedoShareLongPct": number;
571
559
  "testAObliquityLagPercentile": number;
572
560
  "testAObliquityPeakMatch": string;
@@ -0,0 +1,8 @@
1
+ /** The SI day, seconds. */
2
+ export const SECONDS_PER_DAY: 86400;
3
+ /** The Julian year, days (IAU). */
4
+ export const DAYS_PER_JULIAN_YEAR: 365.25;
5
+ /** The Julian century, days. */
6
+ export const JULIAN_CENTURY_DAYS: 36525;
7
+ /** The Julian year, SI seconds. */
8
+ export const SECONDS_PER_JULIAN_YEAR: number;
@@ -0,0 +1,266 @@
1
+ /**
2
+ * The ΔT stack's switches. `resonator` gates the swing's δLOD terms; the
3
+ * swing's ΔT term is gated by `resonatorDeltaT` when given (the Node twin
4
+ * gates it on BOTH env vars, DT_CORRECTIONS and DT_RESONATOR), else by
5
+ * `resonator`. The four cycles' δLOD terms follow their flags only when
6
+ * `cycleLodFollowsFlags` is true (the browser's research toggles switch a
7
+ * cycle's ΔT and δLOD together); the Node twin sums them unconditionally.
8
+ * Their ΔT terms always follow their flags. Identical with every flag ON.
9
+ * @typedef {{bond: boolean, hallstatt: boolean, jose5: boolean, jose4: boolean, resonator: boolean, resonatorDeltaT?: boolean, cycleLodFollowsFlags?: boolean}} DeltaTFlags
10
+ */
11
+ /**
12
+ * @param {{
13
+ * constants: any,
14
+ * fitted: any,
15
+ * deepModes: any,
16
+ * moonDistanceArtifact: any,
17
+ * ageAnchorYear?: number,
18
+ * flagsAt?: () => DeltaTFlags,
19
+ * planetAuRatios?: Record<string, number>,
20
+ * stellarDayRaProjection?: number,
21
+ * }} deps — `constants` the generated DEFAULT_CONSTANTS, `fitted` the
22
+ * generated FITTED_COEFFICIENTS, `deepModes` the DEEP_MODES_ARTIFACT,
23
+ * `moonDistanceArtifact` the MOON_DISTANCE_ARTIFACT — the cited distance
24
+ * AND mean-obliquity columns, plan 12 option A / §8 (a) (injected so a
25
+ * counterfactual context can replace any of them); `ageAnchorYear` the
26
+ * scene epoch (default constants.timeReference.sceneEpochYear);
27
+ * `flagsAt` the ΔT stack's switches (default all ON); `planetAuRatios`
28
+ * the planets' J2000 semi-major axes in AU (for the per-planet family);
29
+ * `stellarDayRaProjection` cos ε₀-class factor for the projected stellar day.
30
+ */
31
+ export function createDeepTimeChain(deps: {
32
+ constants: any;
33
+ fitted: any;
34
+ deepModes: any;
35
+ moonDistanceArtifact: any;
36
+ ageAnchorYear?: number;
37
+ flagsAt?: () => DeltaTFlags;
38
+ planetAuRatios?: Record<string, number>;
39
+ stellarDayRaProjection?: number;
40
+ }): Readonly<{
41
+ meanSolarYearDays: number;
42
+ meanSiderealYearDays: any;
43
+ meanSiderealYearSeconds: number;
44
+ meanLengthOfDay: any;
45
+ meanTropicalYearJ2000Seconds: number;
46
+ siTropicalYearDays: number;
47
+ axialPrecessionJ2000Years: number;
48
+ axialPrecessionJ2000Days: number;
49
+ G_CONSTANT: any;
50
+ MASS_RATIO_EARTH_MOON: any;
51
+ currentAUDistance: any;
52
+ earthMoiFactorJ2000: any;
53
+ moonDistanceKm: any;
54
+ moonSiderealMonthInput: any;
55
+ moonOrbitalShift: number;
56
+ moonDistanceCorrected: number;
57
+ GM_EARTH_MOON_SYSTEM: number;
58
+ GM_EARTH_ALONE: number;
59
+ GM_MOON_ALONE: number;
60
+ GM_SUN_PLUS_EARTH: number;
61
+ GM_SUN: number;
62
+ M_SUN: number;
63
+ moonApsidalJ2000Seconds: number;
64
+ moonNodalJ2000Seconds: number;
65
+ moonSiderealMonthJ2000Seconds: number;
66
+ moonPeriods: {
67
+ moonApsidalPrecessionDaysEarth: number;
68
+ moonNodalPrecessionDaysEarth: number;
69
+ moonApsidalJ2000Seconds: number;
70
+ moonNodalJ2000Seconds: number;
71
+ moonSiderealMonthJ2000Seconds: number;
72
+ moonAnomalisticMonthDays: number;
73
+ moonNodalMonthDays: number;
74
+ moonSynodicMonthDays: number;
75
+ moonTropicalMonthDays: number;
76
+ moonFullMoonCycleEarthDays: number;
77
+ moonFullMoonCycleICRFDays: number;
78
+ moonApsidalMeetsNodalDays: number;
79
+ moonLunarLevelingCycleDays: number;
80
+ moonDraconicYearICRFDays: number;
81
+ moonDraconicYearEarthDays: number;
82
+ };
83
+ certifiedAxialPrecessionJ2000Years: () => number;
84
+ precessionRateJ2000ArcsecPerYr: () => number;
85
+ EPOCH_PARAMS: import("../layer0/index.js").EpochParams;
86
+ ageAnchorYear: any;
87
+ alphaGia: {
88
+ alphaAt: (year: number) => number;
89
+ j2RatioAt: (year: number) => number;
90
+ laggedL1PermilAt: (year: number) => number;
91
+ kPerPermille: number;
92
+ relaxationKyr: number;
93
+ laggedL1Terms: Array<{
94
+ period_kyr: number;
95
+ a: number;
96
+ b: number;
97
+ }>;
98
+ };
99
+ earthMoiFactorAtAge: (tMa: number) => number;
100
+ withLatticeAlpha: (build: () => void) => void;
101
+ j2RatioAtYear: (year: number) => number;
102
+ iEarthAtAge: (tMa: number) => number;
103
+ recession: {
104
+ distanceMetresAtAge: (tMa: number) => number | null;
105
+ slopeMetresPerMaAtAge: (tMa: number) => number | null;
106
+ ratioAtAge: (tMa: number) => number | null;
107
+ spanMa: number;
108
+ };
109
+ meanObliquity: {
110
+ meanObliquityDegAtAge: (tMa: number) => number | null;
111
+ cosRatioAtAge: (tMa: number) => number | null;
112
+ meanObliquityJ2000Deg: number;
113
+ spanMa: number;
114
+ };
115
+ dtCycles: {
116
+ taperAt: (year: number) => number;
117
+ taperDerivativeAt: (year: number) => number;
118
+ cycleDeltaTSecondsAt: (cycleKey: string, year: number) => number;
119
+ cycleLodSecondsAt: (cycleKey: string, year: number) => number;
120
+ swingDeltaTSecondsAt: (year: number) => number;
121
+ swingLodSecondsAt: (year: number) => number;
122
+ swingLodRateAt: (year: number) => number;
123
+ };
124
+ s3ArcsecPerYr: number;
125
+ deepLod: {
126
+ lodSecondsAtAge: (t_Ma: number) => number | null;
127
+ lodSecondsAtAgeWithAlpha: (t_Ma: number, alpha: number) => number | null;
128
+ lodHoursAtAge: (t_Ma: number) => number | null;
129
+ lunisolarPrecessionRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
130
+ lunisolarPrecessionPeriodYearsAtAge: (t_Ma: number) => number | null;
131
+ lunisolarTorqueRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
132
+ lunisolarTorquePeriodYearsAtAge: (t_Ma: number) => number | null;
133
+ precessionObliquityFactorAtAge: (t_Ma: number) => number | null;
134
+ lunarTorqueFactorAtAge: (tMa: number) => (number | null);
135
+ precessionTorqueTermAtAge: (tMa: number) => (number | null);
136
+ siderealYearSecondsAtAge: (t_Ma: number) => number;
137
+ tropicalYearSecondsAtAge: (t_Ma: number) => number;
138
+ tropicalYearDaysAtAge: (t_Ma: number) => number | null;
139
+ tropicalYearSecondsFromLod: (t_Ma: number, LOD_s: number | null) => number;
140
+ eclipticLodCorrectionSecondsAtAge: (t_Ma: number) => number | null;
141
+ yearInDaysAtAge: (t_Ma: number) => number | null;
142
+ deltaTRawSecondsAtAge: (t_Ma: number) => number;
143
+ lodSecondsWithCorrectionsAtAge: (t_Ma: number) => number | null;
144
+ dLodDtDecompositionAtAge: (t_Ma: number) => {
145
+ tidal: number | null;
146
+ gia: number | null;
147
+ stack: number | null;
148
+ resonator: number | null;
149
+ net_L2: number | null;
150
+ net_L3: number | null;
151
+ net_L4: number | null;
152
+ };
153
+ };
154
+ l0: import("../layer0/index.js").EpochPrimitives;
155
+ deepEcc: {
156
+ eccAt: (tYr: number) => number;
157
+ eccRateAt: (tYr: number) => number;
158
+ modulation: (tMa: number, s: number) => number;
159
+ channelIntegral: (T: number, s: number) => number;
160
+ eFactorAt: (tYr: number) => number;
161
+ e0: number;
162
+ g0: number;
163
+ };
164
+ eCompModulation: (tMa: number, s: number) => number;
165
+ moonChain: {
166
+ distanceMetresAtAge: (tMa: number) => number | null;
167
+ distanceKmAtAge: (tMa: number) => number | null;
168
+ solarDeltaAKmAtAge: (tMa: number, aApparentKm: number) => number | null;
169
+ distanceCorrectedKmAtAge: (tMa: number) => number | null;
170
+ siderealMonthSecondsAtAge: (tMa: number) => number | null;
171
+ synodicMonthSecondsAtAge: (tMa: number) => number | null;
172
+ tropicalMonthSecondsAtAge: (tMa: number) => number | null;
173
+ perigeePrecessionSecondsAtAge: (tMa: number) => number | null;
174
+ nodePrecessionSecondsAtAge: (tMa: number) => number | null;
175
+ anomalisticMonthSecondsAtAge: (tMa: number) => number | null;
176
+ nodalMonthSecondsAtAge: (tMa: number) => number | null;
177
+ apsidalMeetsNodalSecondsAtAge: (tMa: number) => number | null;
178
+ lunarLevelingSecondsAtAge: (tMa: number) => number | null;
179
+ };
180
+ meanMoonDistanceMetresAtAge: (tMa: number) => number | null;
181
+ meanMoonDistanceAtAge: (tMa: number) => number | null;
182
+ meanLodSecondsAtAge: (tMa: number) => number | null;
183
+ meanLodHoursAtAge: (t_Ma: number) => number | null;
184
+ meanLunisolarPrecessionRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
185
+ meanLunisolarPrecessionPeriodYearsAtAge: (tMa: number) => number | null;
186
+ meanLunisolarTorqueRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
187
+ meanLunisolarTorquePeriodYearsAtAge: (t_Ma: number) => number | null;
188
+ precessionObliquityFactorAtAge: (t_Ma: number) => number | null;
189
+ meanObliquityCitedDegAtAge: (tMa: number) => number | null;
190
+ meanAuAtAge: (tMa: number) => number;
191
+ meanSiderealYearSecondsAtAge: (tMa: number) => number;
192
+ meanTropicalYearSecondsAtAge: (t_Ma: number) => number;
193
+ meanTropicalYearDaysAtAge: (t_Ma: number) => number | null;
194
+ meanYearInDaysAtAge: (t_Ma: number) => number | null;
195
+ meanDeltaTSecondsAtAge: (tMa: number) => number;
196
+ bondCycleDeltaTCorrection: (year: number) => number;
197
+ hallstattCycleDeltaTCorrection: (year: number) => number;
198
+ jose5CycleDeltaTCorrection: (year: number) => number;
199
+ jose4CycleDeltaTCorrection: (year: number) => number;
200
+ bondCycleLodCorrection: (year: number) => number;
201
+ hallstattCycleLodCorrection: (year: number) => number;
202
+ jose5CycleLodCorrection: (year: number) => number;
203
+ jose4CycleLodCorrection: (year: number) => number;
204
+ dtCycleLodCorrectionSum: (year: number) => number;
205
+ resonatorSwingDeltaTCorrection: (year: number) => number;
206
+ resonatorSwingLodCorrection: (year: number) => number;
207
+ resonatorSwingLodRate: (year: number) => number;
208
+ meanLodSecondsWithCorrectionsAtAge: (t_Ma: number) => number | null;
209
+ dLodDtDecompositionAtAge: (t_Ma: number) => {
210
+ tidal: number | null;
211
+ gia: number | null;
212
+ stack: number | null;
213
+ resonator: number | null;
214
+ net_L2: number | null;
215
+ net_L3: number | null;
216
+ net_L4: number | null;
217
+ };
218
+ h5Correction: (year: number) => number;
219
+ computeLodKinematicSecondsAtEpoch: (year: number) => number;
220
+ computeLodRealSecondsAtEpoch: (year: number) => number;
221
+ meanSolarDeltaAAtAge: (tMa: number, aApparentKm: number) => number | null;
222
+ meanMoonDistanceCorrectedAtAge: (tMa: number) => number | null;
223
+ meanMoonSiderealMonthAtAge: (tMa: number) => number | null;
224
+ meanSynodicMonthAtAge: (tMa: number) => number | null;
225
+ meanTropicalMonthAtAge: (tMa: number) => number | null;
226
+ meanLunarPerigeePrecessionAtAge: (tMa: number) => number | null;
227
+ meanLunarNodePrecessionAtAge: (tMa: number) => number | null;
228
+ meanAnomalisticMonthAtAge: (tMa: number) => number | null;
229
+ meanNodalMonthAtAge: (tMa: number) => number | null;
230
+ meanApsidalMeetsNodalAtAge: (tMa: number) => number | null;
231
+ meanLunarLevelingCycleAtAge: (tMa: number) => number | null;
232
+ meanStellarDayAtAge: (tMa: number) => number | null;
233
+ meanStellarDayProjectedAtAge: (tMa: number) => number | null;
234
+ meanSiderealDayAtAge: (tMa: number) => number | null;
235
+ meanPlanetSemiMajorAxisAtAge: (planetName: string, tMa: number) => number | null;
236
+ /** @param {number} tMa @param {number} periodJ2000Seconds @returns {number} */
237
+ meanPlanetOrbitalPeriodAtAge: (tMa: number, periodJ2000Seconds: number) => number;
238
+ /** @param {number} tMa @param {number} periodJ2000Seconds @returns {number} */
239
+ meanEarthPlanetSynodicPeriodAtAge: (tMa: number, periodJ2000Seconds: number) => number;
240
+ }>;
241
+ /**
242
+ * Moon-channel eccentricity sensitivities (perigee/node), the [g/g₀]^s
243
+ * exponents of the factored deep-time law — Meeus-effective (S_N moved
244
+ * 1.0 → 1.018 with the v4 frame-attribution batch). ONE home since B2 (they
245
+ * were literals in model.js, tools/lib/deep-time.js and script.js `_FW_MOON`).
246
+ */
247
+ export const MOON_ECC_SENSITIVITY_PERIGEE: 2.407;
248
+ export const MOON_ECC_SENSITIVITY_NODE: 1.018;
249
+ /**
250
+ * The ΔT stack's switches. `resonator` gates the swing's δLOD terms; the
251
+ * swing's ΔT term is gated by `resonatorDeltaT` when given (the Node twin
252
+ * gates it on BOTH env vars, DT_CORRECTIONS and DT_RESONATOR), else by
253
+ * `resonator`. The four cycles' δLOD terms follow their flags only when
254
+ * `cycleLodFollowsFlags` is true (the browser's research toggles switch a
255
+ * cycle's ΔT and δLOD together); the Node twin sums them unconditionally.
256
+ * Their ΔT terms always follow their flags. Identical with every flag ON.
257
+ */
258
+ export type DeltaTFlags = {
259
+ bond: boolean;
260
+ hallstatt: boolean;
261
+ jose5: boolean;
262
+ jose4: boolean;
263
+ resonator: boolean;
264
+ resonatorDeltaT?: boolean;
265
+ cycleLodFollowsFlags?: boolean;
266
+ };
@@ -22,9 +22,10 @@ export type DeepTimeLodConstants = {
22
22
  * - Farhat polynomial anchor
23
23
  */
24
24
  aMoonNowMetres: number;
25
+ /**
26
+ * - the LLR recession rate (the J2000 slope of the cited history)
27
+ */
25
28
  alpha1PerMa: number;
26
- alpha3PerMa3: number;
27
- alpha4PerMa4: number;
28
29
  /**
29
30
  * - ω₀, the J2000 day length (the SI day since plan 09; identifier kept)
30
31
  */
@@ -39,7 +40,10 @@ export type DeepTimeLodConstants = {
39
40
  };
40
41
  export type DeepTimeLodDeps = {
41
42
  constants: DeepTimeLodConstants;
42
- moonDistanceMetresAtAge: (tMa: number) => number;
43
+ /**
44
+ * - null beyond the cited history's span
45
+ */
46
+ moonDistanceMetresAtAge: (tMa: number) => number | null;
43
47
  /**
44
48
  * - GIA α(t)
45
49
  */
@@ -77,11 +81,26 @@ export type DeepTimeLodDeps = {
77
81
  nodalPeriodYearsFn: () => number;
78
82
  /**
79
83
  * - OPTIONAL time-dependent
80
- * Earth-Moon angular momentum (the Driver-1½ solar channels,
81
- * recession-history.cjs). Absent → the J2000 constant, which the budget
82
- * module equals exactly for t ≤ jointMa — the pure-twin convention.
84
+ * Earth-Moon angular momentum. Absent → the J2000 constant: conservation
85
+ * (plan 12 option A — the Driver-1½ solar-channel budget is deleted;
86
+ * measured: conservation on the cited history reproduces Farhat's own LOD
87
+ * to 0.01 h at 100 Ma, 0.14 h at 2.46 Ga).
83
88
  */
84
89
  lEmAtAgeKgm2S?: ((tMa: number) => number) | undefined;
90
+ /**
91
+ * -
92
+ * OPTIONAL analytic slope of the distance history (metres per Ma, positive
93
+ * into the past means a growing a... sign as da/dt_Ma); absent → a central
94
+ * difference on moonDistanceMetresAtAge (the LOD-rate decomposition's tidal term).
95
+ */
96
+ moonDistanceSlopeMetresPerMaAtAge?: ((tMa: number) => number | null) | undefined;
97
+ /**
98
+ * -
99
+ * OPTIONAL cos ε̄(t)/cos ε̄(0) of the cited mean obliquity (earth/mean-
100
+ * obliquity-history) — the factor the precession RATE of date carries on the
101
+ * constant (plan 12 §8 option (a)); absent → 1, the constant alone, bit-identical.
102
+ */
103
+ meanObliquityCosRatioAtAge?: ((tMa: number) => number | null) | undefined;
85
104
  };
86
105
  /**
87
106
  * @typedef {Object} DeepTimeLodConstants
@@ -93,8 +112,7 @@ export type DeepTimeLodDeps = {
93
112
  * @property {number} eFactorMoon - √(1−e²) factor of the lunar orbit
94
113
  * @property {number} aLockMetres - tidal-lock distance (LOD denominator → 0)
95
114
  * @property {number} aMoonNowMetres - Farhat polynomial anchor
96
- * @property {number} alpha1PerMa @property {number} alpha3PerMa3
97
- * @property {number} alpha4PerMa4
115
+ * @property {number} alpha1PerMa - the LLR recession rate (the J2000 slope of the cited history)
98
116
  * @property {number} lodNowH13Seconds - ω₀, the J2000 day length (the SI day since plan 09; identifier kept)
99
117
  * @property {number} meanSiderealYearJ2000Seconds
100
118
  * @property {number} solarMassLossFracPerYear
@@ -104,7 +122,7 @@ export type DeepTimeLodDeps = {
104
122
  /**
105
123
  * @typedef {Object} DeepTimeLodDeps
106
124
  * @property {DeepTimeLodConstants} constants
107
- * @property {(tMa: number) => number} moonDistanceMetresAtAge
125
+ * @property {(tMa: number) => number|null} moonDistanceMetresAtAge - null beyond the cited history's span
108
126
  * @property {(tMa: number) => number} moiFactorAtAge - GIA α(t)
109
127
  * @property {(year: number) => number} cycleLodSumAt - gated δLOD sum (incl. swing)
110
128
  * @property {(year: number) => number} swingLodAt - gated swing δLOD alone
@@ -123,9 +141,18 @@ export type DeepTimeLodDeps = {
123
141
  * formerly the spin unit's H/5, 67,063 yr, 2.5 % off and scaling with the
124
142
  * spin at deep time). Lazy, like the precession anchor.
125
143
  * @property {(tMa: number) => number} [lEmAtAgeKgm2S] - OPTIONAL time-dependent
126
- * Earth-Moon angular momentum (the Driver-1½ solar channels,
127
- * recession-history.cjs). Absent → the J2000 constant, which the budget
128
- * module equals exactly for t ≤ jointMa — the pure-twin convention.
144
+ * Earth-Moon angular momentum. Absent → the J2000 constant: conservation
145
+ * (plan 12 option A — the Driver-1½ solar-channel budget is deleted;
146
+ * measured: conservation on the cited history reproduces Farhat's own LOD
147
+ * to 0.01 h at 100 Ma, 0.14 h at 2.46 Ga).
148
+ * @property {(tMa: number) => number|null} [moonDistanceSlopeMetresPerMaAtAge] -
149
+ * OPTIONAL analytic slope of the distance history (metres per Ma, positive
150
+ * into the past means a growing a... sign as da/dt_Ma); absent → a central
151
+ * difference on moonDistanceMetresAtAge (the LOD-rate decomposition's tidal term).
152
+ * @property {(tMa: number) => number|null} [meanObliquityCosRatioAtAge] -
153
+ * OPTIONAL cos ε̄(t)/cos ε̄(0) of the cited mean obliquity (earth/mean-
154
+ * obliquity-history) — the factor the precession RATE of date carries on the
155
+ * constant (plan 12 §8 option (a)); absent → 1, the constant alone, bit-identical.
129
156
  */
130
157
  /** @param {DeepTimeLodDeps} deps */
131
158
  export function createDeepTimeLod(deps: DeepTimeLodDeps): {
@@ -134,6 +161,9 @@ export function createDeepTimeLod(deps: DeepTimeLodDeps): {
134
161
  lodHoursAtAge: (t_Ma: number) => number | null;
135
162
  lunisolarPrecessionRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
136
163
  lunisolarPrecessionPeriodYearsAtAge: (t_Ma: number) => number | null;
164
+ lunisolarTorqueRateArcsecPerYrAtAge: (t_Ma: number) => number | null;
165
+ lunisolarTorquePeriodYearsAtAge: (t_Ma: number) => number | null;
166
+ precessionObliquityFactorAtAge: (t_Ma: number) => number | null;
137
167
  lunarTorqueFactorAtAge: (tMa: number) => (number | null);
138
168
  precessionTorqueTermAtAge: (tMa: number) => (number | null);
139
169
  siderealYearSecondsAtAge: (t_Ma: number) => number;
@@ -0,0 +1,22 @@
1
+ export const MOON_DISTANCE_ARTIFACT: Readonly<{
2
+ source: {
3
+ citation: string;
4
+ doi: string;
5
+ distributor: string;
6
+ fileSha256: {
7
+ data: string;
8
+ readme: string;
9
+ };
10
+ };
11
+ earthRadiusKm: 6378.1366;
12
+ ageStepMa: 1;
13
+ spanMa: 4429;
14
+ ageMa: number[];
15
+ aEarthRadii: number[];
16
+ aMinEarthRadii: number[];
17
+ aMaxEarthRadii: number[];
18
+ obliquityDeg: number[];
19
+ obliquityMinDeg: number[];
20
+ obliquityMaxDeg: number[];
21
+ }>;
22
+ export const MOON_DISTANCE_ARTIFACT_HASH: "850cd0b266d46a71";
@@ -0,0 +1,36 @@
1
+ export type MoonDistanceTable = {
2
+ /**
3
+ * - ascending, 0 first, uniform 1-Myr step
4
+ */
5
+ ageMa: ReadonlyArray<number>;
6
+ /**
7
+ * - the distance column (any consistent unit; only ratios are read)
8
+ */
9
+ aEarthRadii: ReadonlyArray<number>;
10
+ };
11
+ /**
12
+ * @typedef {Object} MoonDistanceTable
13
+ * @property {ReadonlyArray<number>} ageMa - ascending, 0 first, uniform 1-Myr step
14
+ * @property {ReadonlyArray<number>} aEarthRadii - the distance column (any consistent unit; only ratios are read)
15
+ */
16
+ /**
17
+ * @param {{ table: MoonDistanceTable, aMoonNowMetres: number, alpha1PerMa: number }} deps
18
+ * aMoonNowMetres — the model's J2000 anchor (the observed mean distance);
19
+ * alpha1PerMa — the LLR rate as a fraction of a₀ per Ma (negative into the past: a shrinks).
20
+ * @returns {{
21
+ * distanceMetresAtAge: (tMa: number) => number|null,
22
+ * slopeMetresPerMaAtAge: (tMa: number) => number|null,
23
+ * ratioAtAge: (tMa: number) => number|null,
24
+ * spanMa: number,
25
+ * }}
26
+ */
27
+ export function createMoonDistanceHistory(deps: {
28
+ table: MoonDistanceTable;
29
+ aMoonNowMetres: number;
30
+ alpha1PerMa: number;
31
+ }): {
32
+ distanceMetresAtAge: (tMa: number) => number | null;
33
+ slopeMetresPerMaAtAge: (tMa: number) => number | null;
34
+ ratioAtAge: (tMa: number) => number | null;
35
+ spanMa: number;
36
+ };
@@ -25,9 +25,11 @@
25
25
  * measured at the 500-yr artifact cadence: 0.16″/0.18″ rms vs IAU-2006
26
26
  * over 1900–2100/1600–2400 vs the era tier's 0.31″/0.63″, and 0.0396°
27
27
  * vs La2004 over −200 kyr vs the deep tier's 0.069° — the C-1 verdict,
28
- * plan 02) and zetaModes serves only as the TAIL beyond the span (the
29
- * seam at the span edge is the extraction residual, far outside every
30
- * certified window). solarTorqueShareJ2000 and
28
+ * plan 02) and zetaModes serves only as the TAIL beyond the span, joined
29
+ * to the series at each edge so n̂ is continuous there (plan 12 §8.3 — the
30
+ * J2000-point anchor left a 1.6° step at −10 Myr that kicked the hybrid's
31
+ * mean obliquity +0.9° for the whole tail; far outside every certified window).
32
+ * solarTorqueShareJ2000 and
31
33
  * dynamicalEllipticityRatioAtYearFn: THE PRECESSION OF DATE — the two
32
34
  * factors on the precession constant (see alphaAtGeneral below); absent,
33
35
  * the constant is the secular law alone, bit-identical.