@essrt/physics 4.8.0 → 4.9.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 +40 -38
- package/src/constants/coefficients.d.ts +772 -0
- package/src/constants/generated.d.ts +38 -38
- package/src/model.js +14 -3
- 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 +32 -0
- package/types/constants/coefficients.d.ts +772 -0
- package/types/constants/generated.d.ts +753 -0
- package/types/constants/index.d.ts +2 -0
- package/types/deltat/cycles.d.cts +72 -0
- package/types/deltat/deep-time.d.cts +122 -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/sidereal-channel-artifact.d.cts +12 -0
- package/types/earth/sidereal-year-channel.d.cts +38 -0
- package/types/earth/year-lengths.d.cts +57 -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 +77 -0
- package/types/layer0/derive-params.d.ts +36 -0
- package/types/layer0/index.d.ts +49 -0
- package/types/layer1/index.d.ts +10 -0
- package/types/model.d.ts +156 -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,77 @@
|
|
|
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 { createYearLengths } from "./earth/year-lengths.cjs";
|
|
23
|
+
export { createPlanetModel } from "./planets/model.cjs";
|
|
24
|
+
export { createDeltaTCycles } from "./deltat/cycles.cjs";
|
|
25
|
+
export { createDeepTimeLod } from "./deltat/deep-time.cjs";
|
|
26
|
+
export { deltaTEspenakMeeusCanonSeconds } from "./deltat/historical.cjs";
|
|
27
|
+
export { evalClimateL1OrbitalPermil } from "./climate/l1-orbital.cjs";
|
|
28
|
+
export { createEclipseFinders } from "./eclipse/finders.cjs";
|
|
29
|
+
export { createSunLongitudeCorrection } from "./sun/longitude-correction.cjs";
|
|
30
|
+
export function createModel(constants?: Constants, opts?: {
|
|
31
|
+
laws?: {
|
|
32
|
+
eccentricityAt?: (year: number) => number;
|
|
33
|
+
eccentricityRateAt?: (year: number) => number;
|
|
34
|
+
perihelionLongitudeDegAt?: (year: number) => number;
|
|
35
|
+
};
|
|
36
|
+
secularSeriesArtifact?: any;
|
|
37
|
+
}): Model;
|
|
38
|
+
export type Constants = Record<string, unknown> & {
|
|
39
|
+
hash?: string;
|
|
40
|
+
};
|
|
41
|
+
export type ModelSurfaces = ReturnType<typeof assembleModel>;
|
|
42
|
+
export type ModelIdentity = {
|
|
43
|
+
modelVersion: string;
|
|
44
|
+
/**
|
|
45
|
+
* THIS context's hash — distinct for a counterfactual
|
|
46
|
+
*/
|
|
47
|
+
constantsHash: string;
|
|
48
|
+
coefficientsHash: string;
|
|
49
|
+
counterfactual: boolean;
|
|
50
|
+
preprintDoi: string;
|
|
51
|
+
};
|
|
52
|
+
export type Model = {
|
|
53
|
+
constants: Constants;
|
|
54
|
+
hash: string;
|
|
55
|
+
computeLatticePeriodsYears: () => {
|
|
56
|
+
axialPrecessionPeriodYears: number;
|
|
57
|
+
inclinationPrecessionPeriodYears: number;
|
|
58
|
+
perihelionPrecessionPeriodYears: number;
|
|
59
|
+
};
|
|
60
|
+
eccentricity: (year: number) => number;
|
|
61
|
+
identity: ModelIdentity;
|
|
62
|
+
} & ModelSurfaces;
|
|
63
|
+
import { DEFAULT_CONSTANTS as GENERATED } from './constants/index.js';
|
|
64
|
+
import { CONSTANTS_HASH } from './constants/index.js';
|
|
65
|
+
import { MODEL_VERSION } from './constants/index.js';
|
|
66
|
+
import { PREPRINT_DOI } from './constants/index.js';
|
|
67
|
+
import { REFERENCE_DATA } from './constants/index.js';
|
|
68
|
+
import { assembleModel } from './model.js';
|
|
69
|
+
export { GENERATED as DEFAULT_CONSTANTS, CONSTANTS_HASH, MODEL_VERSION, PREPRINT_DOI, REFERENCE_DATA };
|
|
70
|
+
export { FITTED_COEFFICIENTS, COEFFICIENTS_HASH } from "./constants/index.js";
|
|
71
|
+
export { eccentricityFromCycles, computeEccentricityIntegrated } from "./planets/ecc-channel.cjs";
|
|
72
|
+
export { buildPlanetChainsFromArtifactData, computePlanetElementsAtYear, computeHeliocentricEclipticFromElements, computePoissonArgRad, computeOsculatingElements, solveKeplerRad, computeApsidalSecularDegPerYr, ANCHOR_EPOCH_YEAR, ANCHOR_EPOCH_JD } from "./planets/keplerian-chain.cjs";
|
|
73
|
+
export { computeEquatorNodeOriginSFrameDeg, convertNodeSFrameToEquatorOriginDeg } from "./planets/inv-plane-frame.cjs";
|
|
74
|
+
export { CHAIN_ARTIFACT, CHAIN_ARTIFACT_HASH } from "./planets/chain-artifact.js";
|
|
75
|
+
export { DEEP_MODES_ARTIFACT, DEEP_MODES_ARTIFACT_HASH } from "./moon/deep-modes-artifact.cjs";
|
|
76
|
+
export { createPredictivePrecession, calcPlanetPerihelionLongDeg } from "./planets/predict.cjs";
|
|
77
|
+
export { createMoonRecessionHistory, createSolarChannelBudget } from "./deltat/recession-history.cjs";
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
};
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
export type EpochPrimitives = {
|
|
42
|
+
tMa: (year: number) => number;
|
|
43
|
+
moonDistanceMetres: (year: number) => number;
|
|
44
|
+
lodSeconds: (year: number) => number | null;
|
|
45
|
+
holisticH: (year: number) => number | null;
|
|
46
|
+
siderealYearSeconds: (year: number) => number;
|
|
47
|
+
tropicalYearSeconds: (year: number) => number;
|
|
48
|
+
anomalisticYearSeconds: (year: number) => number | null;
|
|
49
|
+
};
|
|
@@ -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,156 @@
|
|
|
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
|
+
}>;
|
|
38
|
+
earth: Readonly<{
|
|
39
|
+
perihelionLongitudeDeg: (year: number) => number;
|
|
40
|
+
obliquityDeg: (year: number) => number;
|
|
41
|
+
eccentricity: (year: number) => number;
|
|
42
|
+
inclinationDeg: (year: number) => number;
|
|
43
|
+
ascendingNodeDeg: (year: number) => number;
|
|
44
|
+
}>;
|
|
45
|
+
lengths: Readonly<{
|
|
46
|
+
tropicalYearDays: (year: number) => number;
|
|
47
|
+
tropicalYearDirectDays: (year: number) => number;
|
|
48
|
+
siderealYearDays: (year: number) => number;
|
|
49
|
+
anomalisticYearDays: (year: number) => number;
|
|
50
|
+
dayLengthSeconds: (year: number) => number;
|
|
51
|
+
siderealDaySeconds: (year: number) => number;
|
|
52
|
+
stellarDaySeconds: (year: number) => number;
|
|
53
|
+
measuredSolarDaySeconds: (year: number) => number;
|
|
54
|
+
raDayOffsetMs: (year: number) => number;
|
|
55
|
+
}>;
|
|
56
|
+
cardinal: Readonly<{
|
|
57
|
+
jd: (year: number, type: string) => number;
|
|
58
|
+
raDeg: (year: number, type: string) => number;
|
|
59
|
+
yearLengthDays: (year: number, type: string) => number;
|
|
60
|
+
}>;
|
|
61
|
+
cardinalStructure: Readonly<{
|
|
62
|
+
yearLengthSeconds: (year: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
63
|
+
eocOffsetSeconds: (year: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
64
|
+
spreadSeconds: (year: number) => {
|
|
65
|
+
VE: number;
|
|
66
|
+
SS: number;
|
|
67
|
+
AE: number;
|
|
68
|
+
WS: number;
|
|
69
|
+
meanSeconds: number;
|
|
70
|
+
};
|
|
71
|
+
anomalisticYearSeconds: (year: number) => number;
|
|
72
|
+
}>;
|
|
73
|
+
yearLengths: Readonly<{
|
|
74
|
+
tropicalYearSecondsAtYear: (year: number) => number;
|
|
75
|
+
siderealYearSecondsAtYear: (year: number) => number;
|
|
76
|
+
anomalisticYearSecondsAtYear: (year: number) => number;
|
|
77
|
+
axialPrecessionYearsAtYear: (y: number) => number;
|
|
78
|
+
perihelionPrecessionYearsAtYear: (y: number) => number;
|
|
79
|
+
inclinationPrecessionYearsAtYear: (y: number) => number;
|
|
80
|
+
cardinal: Readonly<{
|
|
81
|
+
yearLengthSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
82
|
+
eocOffsetSeconds: (y: number, type: "VE" | "SS" | "AE" | "WS") => number;
|
|
83
|
+
spreadSeconds: (y: number) => {
|
|
84
|
+
VE: number;
|
|
85
|
+
SS: number;
|
|
86
|
+
AE: number;
|
|
87
|
+
WS: number;
|
|
88
|
+
meanSeconds: number;
|
|
89
|
+
};
|
|
90
|
+
}>;
|
|
91
|
+
planetaryRelAtYear: (year: number) => number;
|
|
92
|
+
}>;
|
|
93
|
+
moon: Readonly<{
|
|
94
|
+
distanceKmAtYear: (year: number) => number;
|
|
95
|
+
siderealMonthDaysAtYear: (year: number) => number;
|
|
96
|
+
synodicMonthDays: number;
|
|
97
|
+
lonDegAtJD: (jd: number) => number;
|
|
98
|
+
betaDegAtJD: (jd: number) => number;
|
|
99
|
+
distanceKmAtJD: (jd: number) => number;
|
|
100
|
+
}>;
|
|
101
|
+
eclipse: Readonly<{
|
|
102
|
+
sunLonDegAtJD: (jd: number) => number;
|
|
103
|
+
sunLonCompletedDegAtJD: (jd: number) => number;
|
|
104
|
+
findLunarInRange: (jdStart: number, jdEnd: number) => {
|
|
105
|
+
jd: number;
|
|
106
|
+
beta: number;
|
|
107
|
+
moonDistance_km: number;
|
|
108
|
+
type: string;
|
|
109
|
+
magnitudeUmbral: number;
|
|
110
|
+
magnitudePenumbral: number;
|
|
111
|
+
}[];
|
|
112
|
+
findSolarInRange: (jdStart: number, jdEnd: number) => {
|
|
113
|
+
jd: number;
|
|
114
|
+
beta: number;
|
|
115
|
+
moonDistance_km: number;
|
|
116
|
+
type: string;
|
|
117
|
+
moonAppR_topo: number;
|
|
118
|
+
sunAppR: number;
|
|
119
|
+
moonSunRatio: number;
|
|
120
|
+
}[];
|
|
121
|
+
deltaTSecondsAtJD: (jd: number) => number;
|
|
122
|
+
frameworkSunDeps: Readonly<{
|
|
123
|
+
sunMeanLongitudeJ2000Deg: any;
|
|
124
|
+
tropicalRateDegPerCy: number;
|
|
125
|
+
eccentricityAt: (year: number) => number;
|
|
126
|
+
perihelionLongitudeDegAt: (year: number) => number;
|
|
127
|
+
meanLongitudeDegAt: (year: number) => number;
|
|
128
|
+
}>;
|
|
129
|
+
umbraGroundAtJD: (jd: number) => {
|
|
130
|
+
latDeg: number;
|
|
131
|
+
lonDeg: number;
|
|
132
|
+
} | null;
|
|
133
|
+
solarLocalCircumstances: (jdGreatest: number, latDeg: number, lonDeg: number) => {
|
|
134
|
+
kind: "none" | "partial" | "annular" | "total";
|
|
135
|
+
magnitude: number;
|
|
136
|
+
maxJd: number;
|
|
137
|
+
contacts: {
|
|
138
|
+
c1: number | null;
|
|
139
|
+
c2: number | null;
|
|
140
|
+
c3: number | null;
|
|
141
|
+
c4: number | null;
|
|
142
|
+
};
|
|
143
|
+
centralDurationSeconds: number | null;
|
|
144
|
+
};
|
|
145
|
+
}>;
|
|
146
|
+
climate: Readonly<{
|
|
147
|
+
l1OrbitalPermil: (year: number) => number;
|
|
148
|
+
}>;
|
|
149
|
+
planets: Readonly<{
|
|
150
|
+
keys: readonly string[];
|
|
151
|
+
record: (k: string) => Record<string, any> | undefined;
|
|
152
|
+
perihelionLongitudeDeg: (k: string, year: number) => number;
|
|
153
|
+
ascendingNodeInvPlaneDeg: (k: string, year: number) => number;
|
|
154
|
+
invPlaneInclinationDeg: (k: string, year: number) => number;
|
|
155
|
+
}>;
|
|
156
|
+
}>;
|
|
@@ -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
|
+
};
|