django-vue3-admin-web/node_modules/astronomia/lib/deltat.cjs
2025-10-20 21:21:14 +08:00

165 lines
5.0 KiB
JavaScript

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var base = require('./base.cjs');
var interpolation = require('./interpolation.cjs');
var deltat$1 = require('./data/deltat.cjs');
/**
* @copyright 2013 Sonia Keys
* @copyright 2016 commenthol
* @license MIT
* @module deltat
*/
// avoids ciclic import { LeapYearGregorian } from './julian.js'
function LeapYearGregorian (y) {
return (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0
}
/**
* deltaT returns the difference ΔT = TD - UT between Dynamical Time TD and
* Univeral Time (GMT+12) in seconds
*
* Polynoms are from <http://eclipse.gsfc.nasa.gov/SEcat5/deltatpoly.html>
* and <http://www.staff.science.uu.nl/~gent0113/deltat/deltat_old.htm>
*
* @param {Number} dyear - decimal year
* @returns {Number} ΔT in seconds.
*/
function deltaT (dyear) {
let ΔT;
if (dyear < -500) {
ΔT = base["default"].horner((dyear - 1820) * 0.01, -20, 0, 32);
} else if (dyear < 500) {
ΔT = base["default"].horner(dyear * 0.01,
10583.6, -1014.41, 33.78311, -5.952053, -0.1798452, 0.022174192, 0.0090316521
);
} else if (dyear < 1600) {
ΔT = base["default"].horner((dyear - 1000) * 0.01,
1574.2, -556.01, 71.23472, 0.319781, -0.8503463, -0.005050998, 0.0083572073
);
} else if (dyear < deltat$1["default"].historic.first) {
ΔT = base["default"].horner((dyear - 1600), 120, -0.9808, -0.01532, 1 / 7129);
} else if (dyear < deltat$1["default"].data.first) {
ΔT = interpolate(dyear, deltat$1["default"].historic);
} else if (dyear < deltat$1["default"].data.last - 0.25) { // -0.25 ~= do not consider last 3 months in dataset
ΔT = interpolateData(dyear, deltat$1["default"].data);
} else if (dyear < deltat$1["default"].prediction.last) {
ΔT = interpolate(dyear, deltat$1["default"].prediction);
} else if (dyear < 2050) {
ΔT = base["default"].horner((dyear - 2000) / 100, 62.92, 32.217, 55.89);
} else if (dyear < 2150) {
ΔT = base["default"].horner((dyear - 1820) / 100, -205.72, 56.28, 32);
} else {
const u = (dyear - 1820) / 100;
ΔT = -20 + 32 * u * u;
}
return ΔT
}
/**
* interpolation of dataset
* @private
* @param {Number} dyear - julian year
* @returns {Number} ΔT in seconds.
*/
function interpolate (dyear, data) {
const d3 = interpolation["default"].len3ForInterpolateX(dyear,
data.first, data.last, data.table
);
return d3.interpolateX(dyear)
}
/**
* interpolation of dataset from finals2000A with is one entry per month
* linear interpolation over whole dataset is inaccurate as points per month
* are not equidistant. Therefore points are approximated using 2nd diff. interpolation
* from current month using the following two points
*
* @private
* @param {Number} dyear - julian year
* @returns {Number} ΔT in seconds.
*/
function interpolateData (dyear, data) {
const [fyear, fmonth] = data.firstYM;
const { year, month, first, last } = monthOfYear(dyear);
const pos = 12 * (year - fyear) + (month - fmonth);
const table = data.table.slice(pos, pos + 3);
const d3 = new interpolation["default"].Len3(first, last, table);
return d3.interpolateX(dyear)
}
/**
* Get month of Year from fraction. Fraction differs at leap years.
* @private
* @param {Number} dyear - decimal year
* @return {Object} `{year: Number, month: Number, first: Number, last}`
*/
function monthOfYear (dyear) {
// if (!monthOfYear.data) { // memoize yearly fractions per month
// monthOfYear.data = { 0: [], 1: [] }
// for (let m = 0; m <= 12; m++) {
// monthOfYear.data[0][m] = new Calendar(1999, m, 1).toYear() - 1999 // non leap year
// monthOfYear.data[1][m] = new Calendar(2000, m, 1).toYear() - 2000 // leap year
// }
// }
// console.log(monthOfYear)
const year = dyear | 0;
const f = dyear - year;
const d = LeapYearGregorian(year) ? 1 : 0;
const data = monthOfYear.data[d];
let month = 12; // TODO loop could be improved
while (month > 0 && data[month] > f) {
month--;
}
const first = year + data[month];
const last = month < 11 ? year + data[month + 2] : year + 1 + data[(month + 2) % 12];
return { year, month, first, last }
}
/**
monthOfYear.data[0][m] = new Calendar(1999, m, 1).toYear() - 1999 // non leap year
monthOfYear.data[1][m] = new Calendar(2000, m, 1).toYear() - 2000 // leap year
*/
monthOfYear.data = [
[ // non leap year
0,
0,
0.08493150684921602,
0.16164383561635987,
0.24657534246580326,
0.3287671232876619,
0.4136986301368779,
0.4958904109589639,
0.5808219178081799,
0.6657534246576233,
0.747945205479482,
0.832876712328698,
0.915068493150784
],
[ // leap year
0,
0,
0.08743169398917416,
0.1639344262296163,
0.24863387978143692,
0.3306010928961314,
0.4153005464481794,
0.49726775956287383,
0.5819672131146945,
0.6666666666667425,
0.7486338797814369,
0.8333333333332575,
0.9153005464481794
]
];
var deltat = {
deltaT
};
exports["default"] = deltat;
exports.deltaT = deltaT;