UNPKG

9.57 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); /**
8 * @copyright 2013 Sonia Keys
9 * @copyright 2016 commenthol
10 * @license MIT
11 * @module deltat
12 */
13/**
14 * DeltaT: Chapter 10, Dynamical Time and Universal Time.
15 *
16 * This package uses no functions from the Chapter. Polynoms are from
17 * <http://eclipse.gsfc.nasa.gov/SEcat5/deltatpoly.html>, data sets are from
18 * <http://maia.usno.navy.mil/ser7/>
19 *
20 * Functions in this package compute ΔT for various ranges of dates.
21 *
22 * ΔT = TD - UT1
23 *
24 * TD = "Dynamical Time", which is related to:
25 * ET "Ephermis Time", an older term.
26 * TDB "Barycentric Dynamical Time", very close to TD.
27 * TDT "Terrestrial Dynamical Time", a more correct term.
28 * TT "Terrestrial Time", a newer and more correct term.
29 *
30 * UT = "Universal Time", which is related (if ambiguously) to GMT "Greenwich
31 * Mean Time".
32 *
33 * Terrestrial Time is effectively equal to International Atomic Time (TAI)
34 * plus 32.184 seconds exactly: TT = TAI + 32.184
35 * The epoch designated "J2000.0" is specified as Julian date 2451545.0 TT,
36 * or 2000 January 1, 12h TT. This epoch can also be expressed as
37 * 2000 January 1, 11:59:27.816 TAI or 2000 January 1, 11:58:55.816 UTC.
38 */
39
40exports.deltaT = deltaT;
41
42var _base = require('./base');
43
44var _base2 = _interopRequireDefault(_base);
45
46var _interpolation = require('./interpolation');
47
48var _interpolation2 = _interopRequireDefault(_interpolation);
49
50var _deltat = require('../data/deltat');
51
52var _deltat2 = _interopRequireDefault(_deltat);
53
54var _julian = require('./julian');
55
56function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
57
58/**
59 * deltaT returns the difference ΔT = TD - UT between Dynamical Time TD and
60 * Univeral Time (GMT+12) in seconds
61 *
62 * Polynoms are from <http://eclipse.gsfc.nasa.gov/SEcat5/deltatpoly.html>
63 * and <http://www.staff.science.uu.nl/~gent0113/deltat/deltat_old.htm>
64 *
65 * @param {Number} dyear - decimal year
66 * @returns {Number} ΔT in seconds.
67 */
68function deltaT(dyear) {
69 var ΔT = void 0;
70 if (dyear < -500) {
71 ΔT = _base2.default.horner((dyear - 1820) * 0.01, -20, 0, 32);
72 } else if (dyear < 500) {
73 ΔT = _base2.default.horner(dyear * 0.01, 10583.6, -1014.41, 33.78311, -5.952053, -0.1798452, 0.022174192, 0.0090316521);
74 } else if (dyear < 1600) {
75 ΔT = _base2.default.horner((dyear - 1000) * 0.01, 1574.2, -556.01, 71.23472, 0.319781, -0.8503463, -0.005050998, 0.0083572073);
76 } else if (dyear < _deltat2.default.historic.first) {
77 ΔT = _base2.default.horner(dyear - 1600, 120, -0.9808, -0.01532, 1 / 7129);
78 } else if (dyear < _deltat2.default.data.first) {
79 ΔT = interpolate(dyear, _deltat2.default.historic);
80 } else if (dyear < _deltat2.default.data.last - 0.25) {
81 // -0.25 ~= do not consider last 3 months in dataset
82 ΔT = interpolateData(dyear, _deltat2.default.data);
83 } else if (dyear < _deltat2.default.prediction.last) {
84 ΔT = interpolate(dyear, _deltat2.default.prediction);
85 } else if (dyear < 2050) {
86 ΔT = _base2.default.horner((dyear - 2000) / 100, 62.92, 32.217, 55.89);
87 } else if (dyear < 2150) {
88 ΔT = _base2.default.horner((dyear - 1820) / 100, -205.72, 56.28, 32);
89 } else {
90 var u = (dyear - 1820) / 100;
91 ΔT = -20 + 32 * u * u;
92 }
93 return ΔT;
94}
95
96/**
97 * interpolation of dataset
98 * @private
99 * @param {Number} dyear - julian year
100 * @returns {Number} ΔT in seconds.
101 */
102function interpolate(dyear, data) {
103 var d3 = _interpolation2.default.len3ForInterpolateX(dyear, data.first, data.last, data.table);
104 return d3.interpolateX(dyear);
105}
106
107/**
108 * interpolation of dataset from finals2000A with is one entry per month
109 * linear interpolation over whole dataset is inaccurate as points per month
110 * are not equidistant. Therefore points are approximated using 2nd diff. interpolation
111 * from current month using the following two points
112 *
113 * @private
114 * @param {Number} dyear - julian year
115 * @returns {Number} ΔT in seconds.
116 */
117function interpolateData(dyear, data) {
118 var _data$firstYM = _slicedToArray(data.firstYM, 2),
119 fyear = _data$firstYM[0],
120 fmonth = _data$firstYM[1];
121
122 var _monthOfYear = monthOfYear(dyear),
123 year = _monthOfYear.year,
124 month = _monthOfYear.month,
125 first = _monthOfYear.first,
126 last = _monthOfYear.last;
127
128 var pos = 12 * (year - fyear) + (month - fmonth);
129 var table = data.table.slice(pos, pos + 3);
130 var d3 = new _interpolation2.default.Len3(first, last, table);
131 return d3.interpolateX(dyear);
132}
133
134/**
135* Get month of Year from fraction. Fraction differs at leap years.
136* @private
137* @param {Number} dyear - decimal year
138* @return {Object} `{year: Number, month: Number, first: Number, last}`
139*/
140function monthOfYear(dyear) {
141 if (!monthOfYear.data) {
142 // memoize yearly fractions per month
143 monthOfYear.data = { 0: [], 1: [] };
144 for (var m = 0; m <= 12; m++) {
145 monthOfYear.data[0][m] = new _julian.Calendar(1999, m, 1).toYear() - 1999; // non leap year
146 monthOfYear.data[1][m] = new _julian.Calendar(2000, m, 1).toYear() - 2000; // leap year
147 }
148 }
149 var year = dyear | 0;
150 var f = dyear - year;
151 var d = (0, _julian.LeapYearGregorian)(year) ? 1 : 0;
152 var data = monthOfYear.data[d];
153
154 var month = 12; // TODO loop could be improved
155 while (month > 0 && data[month] > f) {
156 month--;
157 }
158 var first = year + data[month];
159 var last = month < 11 ? year + data[month + 2] : year + 1 + data[(month + 2) % 12];
160 return { year: year, month: month, first: first, last: last };
161}
162
163exports.default = {
164 deltaT: deltaT
165};
\No newline at end of file