1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _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 |
|
40 | exports.deltaT = deltaT;
|
41 |
|
42 | var _base = require('./base');
|
43 |
|
44 | var _base2 = _interopRequireDefault(_base);
|
45 |
|
46 | var _interpolation = require('./interpolation');
|
47 |
|
48 | var _interpolation2 = _interopRequireDefault(_interpolation);
|
49 |
|
50 | var _deltat = require('../data/deltat');
|
51 |
|
52 | var _deltat2 = _interopRequireDefault(_deltat);
|
53 |
|
54 | var _julian = require('./julian');
|
55 |
|
56 | function _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 | */
|
68 | function 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 | */
|
102 | function 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 | */
|
117 | function 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 | */
|
140 | function 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 |
|
163 | exports.default = {
|
164 | deltaT: deltaT
|
165 | }; |
\ | No newline at end of file |