@essrt/physics 4.8.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/package.json +42 -39
- package/src/climate/l1-orbital.cjs +76 -5
- package/src/constants/coefficients.d.ts +678 -0
- package/src/constants/coefficients.js +4 -4
- package/src/constants/generated.d.ts +42 -41
- package/src/constants/generated.js +6 -5
- package/src/deltat/deep-time.cjs +69 -2
- package/src/earth/deep-orbital-history.cjs +6 -5
- package/src/earth/precession-composed.cjs +120 -0
- package/src/earth/year-lengths.cjs +12 -1
- package/src/index.js +6 -2
- package/src/layer0/derive-params.js +21 -4
- package/src/layer0/index.js +35 -4
- package/src/model.js +176 -33
- package/src/planets/chain-artifact.js +2 -2
- package/types/cardinal/index.d.cts +80 -0
- package/types/cardinal/one-source-structure.d.cts +35 -0
- package/types/chain-cycles/index.d.cts +33 -0
- package/types/climate/l1-orbital.d.cts +103 -0
- package/types/constants/coefficients.d.ts +678 -0
- package/types/constants/generated.d.ts +754 -0
- package/types/constants/index.d.ts +2 -0
- package/types/deltat/cycles.d.cts +72 -0
- package/types/deltat/deep-time.d.cts +135 -0
- package/types/deltat/historical.d.cts +8 -0
- package/types/deltat/recession-history.d.cts +80 -0
- package/types/earth/deep-orbital-history.d.cts +77 -0
- package/types/earth/precession-composed.d.cts +59 -0
- package/types/earth/sidereal-channel-artifact.d.cts +12 -0
- package/types/earth/sidereal-year-channel.d.cts +38 -0
- package/types/earth/year-lengths.d.cts +67 -0
- package/types/eclipse/besselian.d.cts +101 -0
- package/types/eclipse/finders.d.cts +116 -0
- package/types/eclipse/sun-planetary-completion.d.cts +39 -0
- package/types/index.d.ts +78 -0
- package/types/layer0/derive-params.d.ts +46 -0
- package/types/layer0/index.d.ts +64 -0
- package/types/layer1/index.d.ts +10 -0
- package/types/model.d.ts +184 -0
- package/types/moon/apparent.d.cts +78 -0
- package/types/moon/arguments.d.cts +138 -0
- package/types/moon/deep-ecc-channel.d.cts +25 -0
- package/types/moon/deep-modes-artifact.d.cts +140 -0
- package/types/moon/ecc-channel.d.cts +30 -0
- package/types/moon/month-chain.d.cts +79 -0
- package/types/moon/series-extension.d.cts +11 -0
- package/types/moon/series.d.cts +91 -0
- package/types/phase/index.d.cts +38 -0
- package/types/planets/asc-node-integrator.d.cts +30 -0
- package/types/planets/chain-artifact.d.ts +15 -0
- package/types/planets/ecc-channel.d.cts +20 -0
- package/types/planets/fibonacci-laws.d.cts +90 -0
- package/types/planets/geometry.d.cts +60 -0
- package/types/planets/inv-plane-frame.d.cts +36 -0
- package/types/planets/keplerian-chain.d.cts +173 -0
- package/types/planets/model.d.cts +116 -0
- package/types/planets/orbit-chain.d.cts +12 -0
- package/types/planets/orientation.d.cts +67 -0
- package/types/planets/predict.d.cts +88 -0
- package/types/planets/secular-series.d.cts +73 -0
- package/types/sun/longitude-correction.d.cts +41 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
export type FrameworkSunDeps = {
|
|
2
|
+
/**
|
|
3
|
+
* - L0 anchor (input anchor, 280.46646)
|
|
4
|
+
*/
|
|
5
|
+
sunMeanLongitudeJ2000Deg: number;
|
|
6
|
+
/**
|
|
7
|
+
* - the framework tropical rate (from the year chain)
|
|
8
|
+
*/
|
|
9
|
+
tropicalRateDegPerCy: number;
|
|
10
|
+
/**
|
|
11
|
+
* - the framework e(t) law
|
|
12
|
+
*/
|
|
13
|
+
eccentricityAt: (year: number) => number;
|
|
14
|
+
/**
|
|
15
|
+
* - the framework ϖ(t) law (heliocentric)
|
|
16
|
+
*/
|
|
17
|
+
perihelionLongitudeDegAt: (year: number) => number;
|
|
18
|
+
/**
|
|
19
|
+
* - optional epoch-dependent
|
|
20
|
+
* mean longitude L(t) (e.g. L0 + ∫rate·dt from the f(Y) tropical-year chain);
|
|
21
|
+
* absent = the linear form L0 + rate·T
|
|
22
|
+
*/
|
|
23
|
+
meanLongitudeDegAt?: ((year: number) => number) | undefined;
|
|
24
|
+
};
|
|
25
|
+
export type EclipseFinderDeps = {
|
|
26
|
+
/**
|
|
27
|
+
* - truncated-series ecliptic longitude
|
|
28
|
+
*/
|
|
29
|
+
moonLonDegAt: (jd: number) => number;
|
|
30
|
+
/**
|
|
31
|
+
* - truncated-series ecliptic latitude
|
|
32
|
+
*/
|
|
33
|
+
moonBetaDegAt: (jd: number) => number;
|
|
34
|
+
/**
|
|
35
|
+
* - truncated-series distance
|
|
36
|
+
*/
|
|
37
|
+
moonDistanceKmAt: (jd: number) => number;
|
|
38
|
+
/**
|
|
39
|
+
* - the engine's ΔT convention
|
|
40
|
+
*/
|
|
41
|
+
deltaTSecondsAt: (jd: number) => number;
|
|
42
|
+
/**
|
|
43
|
+
* - live (epoch-mutable)
|
|
44
|
+
*/
|
|
45
|
+
getSynodicMonthDays: () => number;
|
|
46
|
+
/**
|
|
47
|
+
* - live (epoch-mutable)
|
|
48
|
+
*/
|
|
49
|
+
getSunDistanceKm: () => number;
|
|
50
|
+
/**
|
|
51
|
+
* - E4 (the native-Sun landing,
|
|
52
|
+
* plan §12i item 11): when present, sunLonDegAt uses the FRAMEWORK form —
|
|
53
|
+
* linear tropical rate + Kepler EoC (to e³) on the framework e(t)/ϖ(t)
|
|
54
|
+
* laws, TT clock unchanged — instead of the Meeus Ch. 25 polynomials.
|
|
55
|
+
* Absent = the historical Meeus form (every certified number's current
|
|
56
|
+
* basis). The swap is a conscious matched-pair event: the D2 completion's
|
|
57
|
+
* fitted 2lE residue and the certified statistics re-measure with it.
|
|
58
|
+
*/
|
|
59
|
+
frameworkSun?: FrameworkSunDeps | undefined;
|
|
60
|
+
constants: {
|
|
61
|
+
rEarthMetres: number;
|
|
62
|
+
moonDiameterKm: number;
|
|
63
|
+
sunDiameterKm: number;
|
|
64
|
+
j2000JD: number;
|
|
65
|
+
julianCenturyDays: number;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* @typedef {Object} FrameworkSunDeps
|
|
70
|
+
* @property {number} sunMeanLongitudeJ2000Deg - L0 anchor (input anchor, 280.46646)
|
|
71
|
+
* @property {number} tropicalRateDegPerCy - the framework tropical rate (from the year chain)
|
|
72
|
+
* @property {(year: number) => number} eccentricityAt - the framework e(t) law
|
|
73
|
+
* @property {(year: number) => number} perihelionLongitudeDegAt - the framework ϖ(t) law (heliocentric)
|
|
74
|
+
* @property {(year: number) => number} [meanLongitudeDegAt] - optional epoch-dependent
|
|
75
|
+
* mean longitude L(t) (e.g. L0 + ∫rate·dt from the f(Y) tropical-year chain);
|
|
76
|
+
* absent = the linear form L0 + rate·T
|
|
77
|
+
*/
|
|
78
|
+
/**
|
|
79
|
+
* @typedef {Object} EclipseFinderDeps
|
|
80
|
+
* @property {(jd: number) => number} moonLonDegAt - truncated-series ecliptic longitude
|
|
81
|
+
* @property {(jd: number) => number} moonBetaDegAt - truncated-series ecliptic latitude
|
|
82
|
+
* @property {(jd: number) => number} moonDistanceKmAt - truncated-series distance
|
|
83
|
+
* @property {(jd: number) => number} deltaTSecondsAt - the engine's ΔT convention
|
|
84
|
+
* @property {() => number} getSynodicMonthDays - live (epoch-mutable)
|
|
85
|
+
* @property {() => number} getSunDistanceKm - live (epoch-mutable)
|
|
86
|
+
* @property {FrameworkSunDeps} [frameworkSun] - E4 (the native-Sun landing,
|
|
87
|
+
* plan §12i item 11): when present, sunLonDegAt uses the FRAMEWORK form —
|
|
88
|
+
* linear tropical rate + Kepler EoC (to e³) on the framework e(t)/ϖ(t)
|
|
89
|
+
* laws, TT clock unchanged — instead of the Meeus Ch. 25 polynomials.
|
|
90
|
+
* Absent = the historical Meeus form (every certified number's current
|
|
91
|
+
* basis). The swap is a conscious matched-pair event: the D2 completion's
|
|
92
|
+
* fitted 2lE residue and the certified statistics re-measure with it.
|
|
93
|
+
* @property {{ rEarthMetres: number, moonDiameterKm: number,
|
|
94
|
+
* sunDiameterKm: number, j2000JD: number, julianCenturyDays: number }} constants
|
|
95
|
+
*/
|
|
96
|
+
/** @param {EclipseFinderDeps} deps */
|
|
97
|
+
export function createEclipseFinders(deps: EclipseFinderDeps): {
|
|
98
|
+
sunLonDegAt: (jd: number) => number;
|
|
99
|
+
findLunarEclipsesInRange: (jdStart: number, jdEnd: number) => Array<{
|
|
100
|
+
jd: number;
|
|
101
|
+
beta: number;
|
|
102
|
+
moonDistance_km: number;
|
|
103
|
+
type: string;
|
|
104
|
+
magnitudeUmbral: number;
|
|
105
|
+
magnitudePenumbral: number;
|
|
106
|
+
}>;
|
|
107
|
+
findSolarEclipsesInRange: (jdStart: number, jdEnd: number) => Array<{
|
|
108
|
+
jd: number;
|
|
109
|
+
beta: number;
|
|
110
|
+
moonDistance_km: number;
|
|
111
|
+
type: string;
|
|
112
|
+
moonAppR_topo: number;
|
|
113
|
+
sunAppR: number;
|
|
114
|
+
moonSunRatio: number;
|
|
115
|
+
}>;
|
|
116
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{ embWobbleArcsec: number,
|
|
3
|
+
* carrierRatesDegPerCy: { planets: number[], moonElongation: number } }} opts
|
|
4
|
+
* - embWobbleArcsec: the DERIVED Earth-around-EMB wobble amplitude
|
|
5
|
+
* a_M·μ/AU in arcsec (μ = 1/(1+M_E/M_M));
|
|
6
|
+
* - carrierRatesDegPerCy.planets: the six FRAMEWORK mean-longitude
|
|
7
|
+
* rates (deg/Julian-century TT), body order Me,V,E,Ma,J,S — one
|
|
8
|
+
* revolution per the model's own tropical period records;
|
|
9
|
+
* - carrierRatesDegPerCy.moonElongation: the framework Moon
|
|
10
|
+
* mean-elongation rate (deg/cy TT) for the EMB-wobble carrier.
|
|
11
|
+
* All computed from live constants by the model wiring so the
|
|
12
|
+
* carrier↔table matched pair tracks the constants.
|
|
13
|
+
* @returns {{ sunPlanetaryCompletionDeg: (T: number) => number }}
|
|
14
|
+
*/
|
|
15
|
+
export function createSunPlanetaryCompletion({ embWobbleArcsec, carrierRatesDegPerCy }: {
|
|
16
|
+
embWobbleArcsec: number;
|
|
17
|
+
carrierRatesDegPerCy: {
|
|
18
|
+
planets: number[];
|
|
19
|
+
moonElongation: number;
|
|
20
|
+
};
|
|
21
|
+
}): {
|
|
22
|
+
sunPlanetaryCompletionDeg: (T: number) => number;
|
|
23
|
+
};
|
|
24
|
+
/** sha256/16 of JSON.stringify(FITTED_COEFFICIENTS.SUN_LONGITUDE_HARMONICS)
|
|
25
|
+
* at derivation time — the matched-pair fingerprint asserted by test:model.
|
|
26
|
+
* Unchanged from v1/v2: SUN_HARMONICS did not move in the D2 or N3
|
|
27
|
+
* landings. */
|
|
28
|
+
export const PAIRED_SUN_HARMONICS_SHA256: "cbc189cea1c20292";
|
|
29
|
+
/** sha256/16 of JSON.stringify([...planets, moonElongation]) — the seven
|
|
30
|
+
* full-precision carrier rates (deg/cy TT) the TERMS table was extracted
|
|
31
|
+
* under at N3. The model wiring recomputes the rates live from the planet
|
|
32
|
+
* records, so a planet-period / year / month input change moves the
|
|
33
|
+
* carriers automatically while the table stays frozen — a silent few-
|
|
34
|
+
* arcsec stale below the api gate's ≤8″ backstop. test:model recomputes
|
|
35
|
+
* this fingerprint from live constants (identical arithmetic to model.js)
|
|
36
|
+
* and fails on mismatch: re-run the N3 extraction chain
|
|
37
|
+
* (tools/explore/n2-sun-framework-carriers.mjs →
|
|
38
|
+
* n3-carrier-swap-preview.mjs), re-embed TERMS, and update this value. */
|
|
39
|
+
export const PAIRED_CARRIER_RATES_SHA256: "893e055ee12343bd";
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export { createEpochPrimitives } from "./layer0/index.js";
|
|
2
|
+
export { deriveEpochParams } from "./layer0/derive-params.js";
|
|
3
|
+
export { createDerivedViews } from "./layer1/index.js";
|
|
4
|
+
export { createPhaseMachinery } from "./phase/index.cjs";
|
|
5
|
+
export { createCardinalModel } from "./cardinal/index.cjs";
|
|
6
|
+
export { createCardinalStructure } from "./cardinal/one-source-structure.cjs";
|
|
7
|
+
export { createMoonEccChannel } from "./moon/ecc-channel.cjs";
|
|
8
|
+
export { createMoonMonthChain } from "./moon/month-chain.cjs";
|
|
9
|
+
export { createChainCycleIntegrator } from "./chain-cycles/index.cjs";
|
|
10
|
+
export { createMoonArguments } from "./moon/arguments.cjs";
|
|
11
|
+
export { createMoonSeries } from "./moon/series.cjs";
|
|
12
|
+
export { createMoonApparent } from "./moon/apparent.cjs";
|
|
13
|
+
export { derivePlanetGeometry } from "./planets/geometry.cjs";
|
|
14
|
+
export * as planetFibonacciLaws from "./planets/fibonacci-laws.cjs";
|
|
15
|
+
export * as planetOrientation from "./planets/orientation.cjs";
|
|
16
|
+
export { integrateAscendingNode } from "./planets/asc-node-integrator.cjs";
|
|
17
|
+
export * as planetOrbitChain from "./planets/orbit-chain.cjs";
|
|
18
|
+
export { createSecularSeriesOverride } from "./planets/secular-series.cjs";
|
|
19
|
+
export { createDeepEccChannel } from "./moon/deep-ecc-channel.cjs";
|
|
20
|
+
export { createDeepOrbitalHistory } from "./earth/deep-orbital-history.cjs";
|
|
21
|
+
export { createSiderealYearChannel } from "./earth/sidereal-year-channel.cjs";
|
|
22
|
+
export { createPlanetModel } from "./planets/model.cjs";
|
|
23
|
+
export { createDeltaTCycles } from "./deltat/cycles.cjs";
|
|
24
|
+
export { createDeepTimeLod } from "./deltat/deep-time.cjs";
|
|
25
|
+
export { deltaTEspenakMeeusCanonSeconds } from "./deltat/historical.cjs";
|
|
26
|
+
export { createEclipseFinders } from "./eclipse/finders.cjs";
|
|
27
|
+
export { createSunLongitudeCorrection } from "./sun/longitude-correction.cjs";
|
|
28
|
+
export function createModel(constants?: Constants, opts?: {
|
|
29
|
+
laws?: {
|
|
30
|
+
eccentricityAt?: (year: number) => number;
|
|
31
|
+
eccentricityRateAt?: (year: number) => number;
|
|
32
|
+
perihelionLongitudeDegAt?: (year: number) => number;
|
|
33
|
+
};
|
|
34
|
+
secularSeriesArtifact?: any;
|
|
35
|
+
}): Model;
|
|
36
|
+
export type Constants = Record<string, unknown> & {
|
|
37
|
+
hash?: string;
|
|
38
|
+
};
|
|
39
|
+
export type ModelSurfaces = ReturnType<typeof assembleModel>;
|
|
40
|
+
export type ModelIdentity = {
|
|
41
|
+
modelVersion: string;
|
|
42
|
+
/**
|
|
43
|
+
* THIS context's hash — distinct for a counterfactual
|
|
44
|
+
*/
|
|
45
|
+
constantsHash: string;
|
|
46
|
+
coefficientsHash: string;
|
|
47
|
+
counterfactual: boolean;
|
|
48
|
+
preprintDoi: string;
|
|
49
|
+
};
|
|
50
|
+
export type Model = {
|
|
51
|
+
constants: Constants;
|
|
52
|
+
hash: string;
|
|
53
|
+
computeLatticePeriodsYears: () => {
|
|
54
|
+
axialPrecessionPeriodYears: number;
|
|
55
|
+
inclinationPrecessionPeriodYears: number;
|
|
56
|
+
perihelionPrecessionPeriodYears: number;
|
|
57
|
+
};
|
|
58
|
+
eccentricity: (year: number) => number;
|
|
59
|
+
identity: ModelIdentity;
|
|
60
|
+
} & ModelSurfaces;
|
|
61
|
+
import { DEFAULT_CONSTANTS as GENERATED } from './constants/index.js';
|
|
62
|
+
import { CONSTANTS_HASH } from './constants/index.js';
|
|
63
|
+
import { MODEL_VERSION } from './constants/index.js';
|
|
64
|
+
import { PREPRINT_DOI } from './constants/index.js';
|
|
65
|
+
import { REFERENCE_DATA } from './constants/index.js';
|
|
66
|
+
import { assembleModel } from './model.js';
|
|
67
|
+
export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA };
|
|
68
|
+
export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from "./constants/index.js";
|
|
69
|
+
export { eccentricityFromCycles, computeEccentricityIntegrated } from "./planets/ecc-channel.cjs";
|
|
70
|
+
export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, computeApsidalSecularDegPerYr, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from "./planets/keplerian-chain.cjs";
|
|
71
|
+
export { computeEquatorNodeOriginSFrameDeg, convertNodeSFrameToEquatorOriginDeg } from "./planets/inv-plane-frame.cjs";
|
|
72
|
+
export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from "./planets/chain-artifact.js";
|
|
73
|
+
export { DEEP_MODES_ARTIFACT, DEEP_MODES_ARTIFACT_HASH } from "./moon/deep-modes-artifact.cjs";
|
|
74
|
+
export { createYearLengths, ONE_FAMILY_WINDOW_YEARS } from "./earth/year-lengths.cjs";
|
|
75
|
+
export { computeSolarTorqueShare, createComposedPrecession } from "./earth/precession-composed.cjs";
|
|
76
|
+
export { createPredictivePrecession, calcPlanetPerihelionLongDeg } from "./planets/predict.cjs";
|
|
77
|
+
export { createMoonRecessionHistory, createSolarChannelBudget } from "./deltat/recession-history.cjs";
|
|
78
|
+
export { evalClimateL1OrbitalPermil, laggedL1Terms, createAlphaGiaChannel } from "./climate/l1-orbital.cjs";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export function deriveEpochParams(raw: RawEpochConstants): import("./index.js").EpochParams;
|
|
2
|
+
export type RawEpochConstants = {
|
|
3
|
+
/**
|
|
4
|
+
* IAU 2015 nominal (W)
|
|
5
|
+
*/
|
|
6
|
+
solarLuminosityW: number;
|
|
7
|
+
/**
|
|
8
|
+
* Ulysses/ACE/Wind
|
|
9
|
+
*/
|
|
10
|
+
solarWindKgPerS: number;
|
|
11
|
+
/**
|
|
12
|
+
* km/s (fallback 299792458 m/s if falsy)
|
|
13
|
+
*/
|
|
14
|
+
speedOfLightKmPerS: number;
|
|
15
|
+
alpha1PerMa: number;
|
|
16
|
+
alpha3PerMa3: number;
|
|
17
|
+
alpha4PerMa4: number;
|
|
18
|
+
/**
|
|
19
|
+
* H
|
|
20
|
+
*/
|
|
21
|
+
holisticYearJ2000: number;
|
|
22
|
+
meanSiderealYearSeconds: number;
|
|
23
|
+
meanSiderealYearDaysKinematic: number;
|
|
24
|
+
/**
|
|
25
|
+
* M_SUN
|
|
26
|
+
*/
|
|
27
|
+
sunMassKg: number;
|
|
28
|
+
gmEarthAloneKm3S2: number;
|
|
29
|
+
gmMoonAloneKm3S2: number;
|
|
30
|
+
gravitationalConstantKm3KgS2: number;
|
|
31
|
+
earthMoiFactorJ2000: number;
|
|
32
|
+
earthDiameterKm: number;
|
|
33
|
+
moonDistanceKm: number;
|
|
34
|
+
moonOrbitalEccentricity: number;
|
|
35
|
+
gmEarthMoonSystemKm3S2: number;
|
|
36
|
+
/**
|
|
37
|
+
* GM☉ (km³/s²) — the solar precession torque
|
|
38
|
+
*/
|
|
39
|
+
gmSunKm3S2: number;
|
|
40
|
+
/**
|
|
41
|
+
* 1 AU (km)
|
|
42
|
+
*/
|
|
43
|
+
astronomicalUnitKm: number;
|
|
44
|
+
earthOrbitalEccentricityJ2000: number;
|
|
45
|
+
moonEclipticInclinationJ2000Deg: number;
|
|
46
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export function createEpochPrimitives({ params: p, alphaAtAgeMa }: {
|
|
2
|
+
params: EpochParams;
|
|
3
|
+
alphaAtAgeMa: (tMa: number) => number;
|
|
4
|
+
}): EpochPrimitives;
|
|
5
|
+
export type EpochParams = {
|
|
6
|
+
/**
|
|
7
|
+
* year at t_Ma = 0 (2000, NOT startmodelYear)
|
|
8
|
+
*/
|
|
9
|
+
epochYear: number;
|
|
10
|
+
/**
|
|
11
|
+
* Moon recession, LLR-anchored
|
|
12
|
+
*/
|
|
13
|
+
alpha1PerMa: number;
|
|
14
|
+
alpha3PerMa3: number;
|
|
15
|
+
alpha4PerMa4: number;
|
|
16
|
+
/**
|
|
17
|
+
* a_Moon at J2000, metres
|
|
18
|
+
*/
|
|
19
|
+
moonDistanceNowM: number;
|
|
20
|
+
/**
|
|
21
|
+
* tidal-lock asymptote, metres
|
|
22
|
+
*/
|
|
23
|
+
moonLockDistanceM: number;
|
|
24
|
+
/**
|
|
25
|
+
* L_tot of the Earth-Moon system
|
|
26
|
+
*/
|
|
27
|
+
totalAngularMomentumKgM2S: number;
|
|
28
|
+
moonMassKg: number;
|
|
29
|
+
gmEarthMoonM3S2: number;
|
|
30
|
+
/**
|
|
31
|
+
* sqrt(1 - e^2)
|
|
32
|
+
*/
|
|
33
|
+
moonEccentricityFactor: number;
|
|
34
|
+
earthMassKg: number;
|
|
35
|
+
earthRadiusM: number;
|
|
36
|
+
holisticYearJ2000: number;
|
|
37
|
+
lodNowH13Seconds: number;
|
|
38
|
+
siderealYearJ2000Seconds: number;
|
|
39
|
+
solarMassLossFracPerYear: number;
|
|
40
|
+
/**
|
|
41
|
+
* f_S, the solar fraction of the J2000 precession torque
|
|
42
|
+
*/
|
|
43
|
+
precessionSolarShareJ2000: number;
|
|
44
|
+
};
|
|
45
|
+
export type EpochPrimitives = {
|
|
46
|
+
tMa: (year: number) => number;
|
|
47
|
+
moonDistanceMetres: (year: number) => number;
|
|
48
|
+
lodSeconds: (year: number) => number | null;
|
|
49
|
+
/**
|
|
50
|
+
* the UNIT: 13 × the composed lunisolar precession period
|
|
51
|
+
*/
|
|
52
|
+
holisticH: (year: number) => number | null;
|
|
53
|
+
siderealYearSeconds: (year: number) => number;
|
|
54
|
+
tropicalYearSeconds: (year: number) => number;
|
|
55
|
+
anomalisticYearSeconds: (year: number) => number | null;
|
|
56
|
+
/**
|
|
57
|
+
* the frozen era clock's phase convention H₀·LOD/LOD₀ (device tier)
|
|
58
|
+
*/
|
|
59
|
+
eraClockH: (year: number) => number | null;
|
|
60
|
+
/**
|
|
61
|
+
* T_sid·(1 − 13/H_era) — the frozen comb family's base
|
|
62
|
+
*/
|
|
63
|
+
eraClockTropicalYearSeconds: (year: number) => number;
|
|
64
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function createDerivedViews({ primitives: L0 }: {
|
|
2
|
+
primitives: EpochPrimitives;
|
|
3
|
+
}): DerivedViews;
|
|
4
|
+
export type EpochPrimitives = import("../layer0/index.js").EpochPrimitives;
|
|
5
|
+
export type DerivedViews = {
|
|
6
|
+
tropicalYearDays: (year: number) => number | null;
|
|
7
|
+
siderealYearDays: (year: number) => number | null;
|
|
8
|
+
anomalisticYearDays: (year: number) => number | null;
|
|
9
|
+
siderealYearDaysViaLattice: (year: number) => number | null;
|
|
10
|
+
};
|
package/types/model.d.ts
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble the model surfaces from a resolved constants context + fitted
|
|
3
|
+
* coefficients. Internal: `createModel` in index.js composes this with the
|
|
4
|
+
* §2d context validation and counterfactual hashing — call that, not this.
|
|
5
|
+
*
|
|
6
|
+
* @param {Readonly<Record<string, any>>} C the frozen constants context
|
|
7
|
+
* @param {Readonly<Record<string, any>>} F the fitted coefficients
|
|
8
|
+
* @param {{ eccentricityAt?: (year: number) => number, eccentricityRateAt?: (year: number) => number, perihelionLongitudeDegAt?: (year: number) => number }} [laws]
|
|
9
|
+
* RESEARCH OVERRIDES for Earth's orbit laws (doc 109 §7): an alternative e(t),
|
|
10
|
+
* de/dt(t) and ϖ_of-date(t) flow through every consumer (the eclipse Sun, the
|
|
11
|
+
* Moon's E-factor, the cardinal points) exactly as the shipped laws do. Default
|
|
12
|
+
* {} = the shipped laws, bit-identical to before this parameter existed. Not a
|
|
13
|
+
* counterfactual in the §2d sense (no hash change) — callers must say when
|
|
14
|
+
* they used it; the generators refuse to --write under an override.
|
|
15
|
+
* @returns the assembled surfaces (epoch, earth, lengths, cardinal, moon) — type inferred so ReturnType stays precise
|
|
16
|
+
*/
|
|
17
|
+
export function assembleModel(C: Readonly<Record<string, any>>, F: Readonly<Record<string, any>>, laws?: {
|
|
18
|
+
eccentricityAt?: (year: number) => number;
|
|
19
|
+
eccentricityRateAt?: (year: number) => number;
|
|
20
|
+
perihelionLongitudeDegAt?: (year: number) => number;
|
|
21
|
+
}, secularSeriesArtifact?: any): Readonly<{
|
|
22
|
+
time: Readonly<{
|
|
23
|
+
yearFromJD: (jd: number) => number;
|
|
24
|
+
jdFromYear: (year: number) => number;
|
|
25
|
+
siTropicalYearDays: number;
|
|
26
|
+
}>;
|
|
27
|
+
epoch: Readonly<{
|
|
28
|
+
yearToTMa: (year: number) => number;
|
|
29
|
+
hAtYear: (year: number) => number | null;
|
|
30
|
+
lodSecondsAtYear: (year: number) => number | null;
|
|
31
|
+
alphaAtYear: (year: number) => number;
|
|
32
|
+
moonDistanceKmAtYear: (year: number) => number;
|
|
33
|
+
siderealYearSecondsAtYear: (year: number) => number;
|
|
34
|
+
deltaTSecondsAtYear: (year: number) => number;
|
|
35
|
+
cyclesBetween: (yearA: number, yearB: number, divisorN: number) => number;
|
|
36
|
+
axialPrecessionYearsAtYear: (year: number) => number;
|
|
37
|
+
tropicalYearSecondsAtYear: (year: number) => number;
|
|
38
|
+
}>;
|
|
39
|
+
lunisolar: Readonly<{
|
|
40
|
+
/** The mean lunisolar precession period T_p(t), years — the composed torque rate's period. @param {number} year @returns {number} */
|
|
41
|
+
meanPeriodYearsAtYear: (year: number) => number;
|
|
42
|
+
/** The composed rate ψ̇(t) = [ω/ω₀]·p₀·[f_S + (1 − f_S)(a₀/a_M)³], ″/yr. @param {number} year @returns {number} */
|
|
43
|
+
meanRateArcsecPerYrAtYear: (year: number) => number;
|
|
44
|
+
/** The of-date period — the one-family beat inside ±2 Myr, the mean beyond. @param {number} year @returns {number} */
|
|
45
|
+
ofDatePeriodYearsAtYear: (year: number) => number;
|
|
46
|
+
/** f_S, the solar fraction of the J2000 precession torque. */
|
|
47
|
+
solarShareJ2000: number;
|
|
48
|
+
/** (a₀/a_M(t))³ — the lunar torque's growth on the recession history. @param {number} year @returns {number} */
|
|
49
|
+
lunarTorqueFactorAtYear: (year: number) => number;
|
|
50
|
+
/** f_S + (1 − f_S)(a₀/a_M)³ — the torque term the unit divides H_era by. @param {number} year @returns {number} */
|
|
51
|
+
torqueTermAtYear: (year: number) => number;
|
|
52
|
+
/** The hybrid's precession constant α = p₀ / cos ε₀, ″/yr (ε₀ the J2000 obliquity input). */
|
|
53
|
+
torqueConstantJ2000ArcsecPerYr: number;
|
|
54
|
+
/** The apsidal (perihelion vs the stars) period from the engine-D chain's secular tangent, years — inside the published window only (the tangent is an extrapolation beyond the banked series: it turns negative at −5 Myr); null beyond. @param {number} year @returns {number|null} */
|
|
55
|
+
apsidalPeriodYearsAtYear: (year: number) => number | null;
|
|
56
|
+
/** T_aps(t) / T_p(t) — the apsidal period in mean precession periods (4.33 at J2000, a fitted reading; 0.84 … 9.5 across ±26 kyr, measured); null beyond the published window. @param {number} year @returns {number|null} */
|
|
57
|
+
apsidalPerPrecessionAtYear: (year: number) => number | null;
|
|
58
|
+
/** T_peri(t) = 1/(1/T_p + 1/T_aps) — the perihelion-of-date period (equinox precession + inertial perihelion motion, frame arithmetic at every epoch), years; null beyond the published window. @param {number} year @returns {number|null} */
|
|
59
|
+
periOfDatePeriodYearsAtYear: (year: number) => number | null;
|
|
60
|
+
/** T_peri(t) / T_p(t) (0.812 at J2000 — the J2000 reading); null beyond the published window. @param {number} year @returns {number|null} */
|
|
61
|
+
periOfDatePerPrecessionAtYear: (year: number) => number | null;
|
|
62
|
+
/** The published of-date window, years from 2000. */
|
|
63
|
+
publishedWindowYears: 2000000;
|
|
64
|
+
}>;
|
|
65
|
+
earth: Readonly<{
|
|
66
|
+
perihelionLongitudeDeg: (year: number) => number;
|
|
67
|
+
obliquityDeg: (year: number) => number;
|
|
68
|
+
obliquityCombDeg: (year: number) => number;
|
|
69
|
+
eccentricity: (year: number) => number;
|
|
70
|
+
inclinationDeg: (year: number) => number;
|
|
71
|
+
ascendingNodeDeg: (year: number) => number;
|
|
72
|
+
}>;
|
|
73
|
+
lengths: Readonly<{
|
|
74
|
+
tropicalYearDays: (year: number) => number;
|
|
75
|
+
tropicalYearDirectDays: (year: number) => number;
|
|
76
|
+
siderealYearDays: (year: number) => number;
|
|
77
|
+
anomalisticYearDays: (year: number) => number;
|
|
78
|
+
dayLengthSeconds: (year: number) => number;
|
|
79
|
+
siderealDaySeconds: (year: number) => number;
|
|
80
|
+
stellarDaySeconds: (year: number) => number;
|
|
81
|
+
measuredSolarDaySeconds: (year: number) => number;
|
|
82
|
+
raDayOffsetMs: (year: number) => number;
|
|
83
|
+
}>;
|
|
84
|
+
cardinal: Readonly<{
|
|
85
|
+
jd: (year: number, type: string) => number;
|
|
86
|
+
raDeg: (year: number, type: string) => number;
|
|
87
|
+
yearLengthDays: (year: number, type: string) => number;
|
|
88
|
+
}>;
|
|
89
|
+
cardinalStructure: Readonly<{
|
|
90
|
+
yearLengthSeconds: (year: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
91
|
+
eocOffsetSeconds: (year: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
92
|
+
spreadSeconds: (year: number) => {
|
|
93
|
+
VE: number;
|
|
94
|
+
SS: number;
|
|
95
|
+
AE: number;
|
|
96
|
+
WS: number;
|
|
97
|
+
meanSeconds: number;
|
|
98
|
+
};
|
|
99
|
+
anomalisticYearSeconds: (year: number) => number;
|
|
100
|
+
}>;
|
|
101
|
+
yearLengths: Readonly<{
|
|
102
|
+
tropicalYearSecondsAtYear: (year: number) => number;
|
|
103
|
+
siderealYearSecondsAtYear: (year: number) => number;
|
|
104
|
+
anomalisticYearSecondsAtYear: (year: number) => number;
|
|
105
|
+
axialPrecessionYearsAtYear: (y: number) => number;
|
|
106
|
+
perihelionPrecessionYearsAtYear: (y: number) => number;
|
|
107
|
+
inclinationPrecessionYearsAtYear: (y: number) => number;
|
|
108
|
+
cardinal: Readonly<{
|
|
109
|
+
yearLengthSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
110
|
+
eocOffsetSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
111
|
+
spreadSeconds: (y: number) => {
|
|
112
|
+
VE: number;
|
|
113
|
+
SS: number;
|
|
114
|
+
AE: number;
|
|
115
|
+
WS: number;
|
|
116
|
+
meanSeconds: number;
|
|
117
|
+
};
|
|
118
|
+
}>;
|
|
119
|
+
planetaryRelAtYear: (year: number) => number;
|
|
120
|
+
}>;
|
|
121
|
+
moon: Readonly<{
|
|
122
|
+
distanceKmAtYear: (year: number) => number;
|
|
123
|
+
siderealMonthDaysAtYear: (year: number) => number;
|
|
124
|
+
synodicMonthDays: number;
|
|
125
|
+
lonDegAtJD: (jd: number) => number;
|
|
126
|
+
betaDegAtJD: (jd: number) => number;
|
|
127
|
+
distanceKmAtJD: (jd: number) => number;
|
|
128
|
+
}>;
|
|
129
|
+
eclipse: Readonly<{
|
|
130
|
+
sunLonDegAtJD: (jd: number) => number;
|
|
131
|
+
sunLonCompletedDegAtJD: (jd: number) => number;
|
|
132
|
+
findLunarInRange: (jdStart: number, jdEnd: number) => {
|
|
133
|
+
jd: number;
|
|
134
|
+
beta: number;
|
|
135
|
+
moonDistance_km: number;
|
|
136
|
+
type: string;
|
|
137
|
+
magnitudeUmbral: number;
|
|
138
|
+
magnitudePenumbral: number;
|
|
139
|
+
}[];
|
|
140
|
+
findSolarInRange: (jdStart: number, jdEnd: number) => {
|
|
141
|
+
jd: number;
|
|
142
|
+
beta: number;
|
|
143
|
+
moonDistance_km: number;
|
|
144
|
+
type: string;
|
|
145
|
+
moonAppR_topo: number;
|
|
146
|
+
sunAppR: number;
|
|
147
|
+
moonSunRatio: number;
|
|
148
|
+
}[];
|
|
149
|
+
deltaTSecondsAtJD: (jd: number) => number;
|
|
150
|
+
frameworkSunDeps: Readonly<{
|
|
151
|
+
sunMeanLongitudeJ2000Deg: any;
|
|
152
|
+
tropicalRateDegPerCy: number;
|
|
153
|
+
eccentricityAt: (year: number) => number;
|
|
154
|
+
perihelionLongitudeDegAt: (year: number) => number;
|
|
155
|
+
meanLongitudeDegAt: (year: number) => number;
|
|
156
|
+
}>;
|
|
157
|
+
umbraGroundAtJD: (jd: number) => {
|
|
158
|
+
latDeg: number;
|
|
159
|
+
lonDeg: number;
|
|
160
|
+
} | null;
|
|
161
|
+
solarLocalCircumstances: (jdGreatest: number, latDeg: number, lonDeg: number) => {
|
|
162
|
+
kind: "none" | "partial" | "annular" | "total";
|
|
163
|
+
magnitude: number;
|
|
164
|
+
maxJd: number;
|
|
165
|
+
contacts: {
|
|
166
|
+
c1: number | null;
|
|
167
|
+
c2: number | null;
|
|
168
|
+
c3: number | null;
|
|
169
|
+
c4: number | null;
|
|
170
|
+
};
|
|
171
|
+
centralDurationSeconds: number | null;
|
|
172
|
+
};
|
|
173
|
+
}>;
|
|
174
|
+
climate: Readonly<{
|
|
175
|
+
l1OrbitalPermil: (year: number) => number;
|
|
176
|
+
}>;
|
|
177
|
+
planets: Readonly<{
|
|
178
|
+
keys: readonly string[];
|
|
179
|
+
record: (k: string) => Record<string, any> | undefined;
|
|
180
|
+
perihelionLongitudeDeg: (k: string, year: number) => number;
|
|
181
|
+
ascendingNodeInvPlaneDeg: (k: string, year: number) => number;
|
|
182
|
+
invPlaneInclinationDeg: (k: string, year: number) => number;
|
|
183
|
+
}>;
|
|
184
|
+
}>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export type MoonCorrectionTable = {
|
|
2
|
+
raSinD: number;
|
|
3
|
+
raCosD: number;
|
|
4
|
+
raSinMp: number;
|
|
5
|
+
raCosMp: number;
|
|
6
|
+
raSinMs: number;
|
|
7
|
+
raCosMs: number;
|
|
8
|
+
decSinD: number;
|
|
9
|
+
decCosD: number;
|
|
10
|
+
decSinMp: number;
|
|
11
|
+
decCosMp: number;
|
|
12
|
+
decSinMs: number;
|
|
13
|
+
decCosMs: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {{raSinD: number, raCosD: number, raSinMp: number, raCosMp: number,
|
|
17
|
+
* raSinMs: number, raCosMs: number, decSinD: number, decCosD: number,
|
|
18
|
+
* decSinMp: number, decCosMp: number, decSinMs: number, decCosMs: number}} MoonCorrectionTable
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* @param {{
|
|
22
|
+
* constants: {
|
|
23
|
+
* j2000JD: number,
|
|
24
|
+
* julianCenturyDays: number,
|
|
25
|
+
* sunMeanLongitudeJ2000Deg: number,
|
|
26
|
+
* perihelionLongitudeJ2000Deg: number,
|
|
27
|
+
* eccentricityJ2000: number,
|
|
28
|
+
* eccentricityDotJ2000: number,
|
|
29
|
+
* d5RateLDegPerDay: number,
|
|
30
|
+
* d5RatePeriDegPerDay: number,
|
|
31
|
+
* speedOfLight: number,
|
|
32
|
+
* },
|
|
33
|
+
* fns: {
|
|
34
|
+
* computeObliquityEarth: (year: number) => number,
|
|
35
|
+
* getAuDistanceKm: () => number,
|
|
36
|
+
* isFrameworkNative: () => boolean,
|
|
37
|
+
* getCorrectionResidual: () => (MoonCorrectionTable | null),
|
|
38
|
+
* getCorrectionLegacy: () => (MoonCorrectionTable | null),
|
|
39
|
+
* },
|
|
40
|
+
* }} deps — the D5 rates are the engines' J2000-frozen values (the year
|
|
41
|
+
* globals are deep-time-mutable, same pattern as FW_A2_RATE); the AU
|
|
42
|
+
* distance is a GETTER (browser-mutable under deep time).
|
|
43
|
+
*/
|
|
44
|
+
export function createMoonApparent({ constants, fns }: {
|
|
45
|
+
constants: {
|
|
46
|
+
j2000JD: number;
|
|
47
|
+
julianCenturyDays: number;
|
|
48
|
+
sunMeanLongitudeJ2000Deg: number;
|
|
49
|
+
perihelionLongitudeJ2000Deg: number;
|
|
50
|
+
eccentricityJ2000: number;
|
|
51
|
+
eccentricityDotJ2000: number;
|
|
52
|
+
d5RateLDegPerDay: number;
|
|
53
|
+
d5RatePeriDegPerDay: number;
|
|
54
|
+
speedOfLight: number;
|
|
55
|
+
};
|
|
56
|
+
fns: {
|
|
57
|
+
computeObliquityEarth: (year: number) => number;
|
|
58
|
+
getAuDistanceKm: () => number;
|
|
59
|
+
isFrameworkNative: () => boolean;
|
|
60
|
+
getCorrectionResidual: () => (MoonCorrectionTable | null);
|
|
61
|
+
getCorrectionLegacy: () => (MoonCorrectionTable | null);
|
|
62
|
+
};
|
|
63
|
+
}): {
|
|
64
|
+
sunGeoVecEqD5: (jd: number) => [number, number, number];
|
|
65
|
+
moonAberrationRaDec: (jd: number, ra: number, dec: number) => {
|
|
66
|
+
dRA: number;
|
|
67
|
+
dDec: number;
|
|
68
|
+
};
|
|
69
|
+
overrideRaDec: ({ lonDeg, betRad, meeusT, obliquityDeg }: {
|
|
70
|
+
lonDeg: number;
|
|
71
|
+
betRad: number;
|
|
72
|
+
meeusT: (number | undefined);
|
|
73
|
+
obliquityDeg: number;
|
|
74
|
+
}) => {
|
|
75
|
+
raRad: number;
|
|
76
|
+
decRad: number;
|
|
77
|
+
};
|
|
78
|
+
};
|