1 /*
2 * Stellarium
3 * Copyright (C) 2010 Matthew Gates
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18 */
19
20 #include "tests/testDeltaT.hpp"
21
22 #include <QDateTime>
23 #include <QVariantList>
24 #include <QString>
25 #include <QDebug>
26 #include <QtGlobal>
27
28 #include "StelUtils.hpp"
29
QTEST_GUILESS_MAIN(TestDeltaT)30 QTEST_GUILESS_MAIN(TestDeltaT)
31
32 void TestDeltaT::initTestCase()
33 {
34 // source: http://astro.ukho.gov.uk/nao/lvm/
35
36 // Year ΔT ε (seconds)
37 // ΔT (s) : −2000 to −800 (convert from hours)
38 genericData << -2000.0 << 1123200 << 25920;
39 genericData << -1900.0 << 1062720 << 25920;
40 genericData << -1800.0 << 1010880 << 25920;
41 genericData << -1700.0 << 950400 << 25920;
42 genericData << -1600.0 << 907200 << 17280;
43 genericData << -1500.0 << 855360 << 17280;
44 genericData << -1400.0 << 803520 << 17280;
45 genericData << -1300.0 << 760320 << 17280;
46 genericData << -1200.0 << 708480 << 17280;
47 genericData << -1100.0 << 665280 << 17280;
48 genericData << -1000.0 << 622080 << 17280;
49 genericData << -900.0 << 570240 << 8640;
50 genericData << -800.0 << 527040 << 8640;
51 // ΔT (s) : −720 to +1600
52 genericData << -720.0 << 20480.00 << 180.00;
53 genericData << -700.0 << 20120.00 << 170.00;
54 genericData << -600.0 << 18400.00 << 160.00;
55 genericData << -500.0 << 16820.00 << 150.00;
56 genericData << -400.0 << 15370.00 << 130.00;
57 genericData << -300.0 << 14030.00 << 120.00;
58 genericData << -200.0 << 12800.00 << 110.00;
59 genericData << -100.0 << 11640.00 << 100.00;
60 genericData << 0.0 << 10550.00 << 90.00;
61 genericData << 100.0 << 9510.00 << 80.00;
62 genericData << 200.0 << 8500.00 << 70.00;
63 genericData << 300.0 << 7510.00 << 60.00;
64 genericData << 400.0 << 6520.00 << 50.00;
65 genericData << 500.0 << 5520.00 << 40.00;
66 genericData << 600.0 << 4550.00 << 40.00;
67 genericData << 700.0 << 3630.00 << 30.00;
68 genericData << 800.0 << 2800.00 << 25.00;
69 genericData << 900.0 << 2090.00 << 20.00;
70 genericData << 1000.0 << 1540.00 << 15.00;
71 genericData << 1100.0 << 1170.00 << 15.00;
72 genericData << 1200.0 << 900.00 << 15.00;
73 genericData << 1300.0 << 660.00 << 15.00;
74 genericData << 1400.0 << 400.00 << 15.00;
75 genericData << 1500.0 << 200.00 << 15.00;
76 genericData << 1600.0 << 110.00 << 15.00;
77 // ΔT (s) : +1600 to +1800
78 genericData << 1600.0 << 113.00 << 15.00;
79 genericData << 1610.0 << 100.00 << 15.00;
80 genericData << 1620.0 << 86.00 << 20.00;
81 genericData << 1630.0 << 72.00 << 20.00;
82 genericData << 1640.0 << 58.00 << 20.00;
83 genericData << 1650.0 << 45.00 << 20.00;
84 genericData << 1660.0 << 35.00 << 15.00;
85 genericData << 1670.0 << 26.00 << 10.00;
86 genericData << 1680.0 << 21.00 << 5.00;
87 genericData << 1690.0 << 17.00 << 5.00;
88 genericData << 1700.0 << 14.00 << 5.00;
89 genericData << 1710.0 << 12.00 << 5.00;
90 genericData << 1720.0 << 12.00 << 5.00;
91 genericData << 1730.0 << 13.00 << 2.00;
92 genericData << 1740.0 << 15.00 << 2.00;
93 genericData << 1750.0 << 17.00 << 2.00;
94 genericData << 1760.0 << 19.00 << 2.00;
95 genericData << 1770.0 << 21.00 << 1.00;
96 genericData << 1780.0 << 21.00 << 1.00;
97 genericData << 1790.0 << 21.00 << 1.00;
98 genericData << 1800.0 << 18.00 << 0.50;
99 genericData << 1810.0 << 16.00 << 0.50;
100 // ΔT (s) : +1950 to +2016
101 genericData << 1950.0 << 28.93 << 0.05;
102 genericData << 1951.0 << 29.32 << 0.05;
103 genericData << 1952.0 << 29.70 << 0.05;
104 genericData << 1953.0 << 30.00 << 0.05;
105 genericData << 1954.0 << 30.20 << 0.05;
106 genericData << 1955.0 << 30.41 << 0.05;
107 genericData << 1956.0 << 30.76 << 0.05;
108 genericData << 1957.0 << 31.34 << 0.05;
109 genericData << 1958.0 << 32.03 << 0.05;
110 genericData << 1959.0 << 32.65 << 0.05;
111 genericData << 1960.0 << 33.07 << 0.05;
112 genericData << 1961.0 << 33.36 << 0.05;
113 genericData << 1962.0 << 33.62 << 0.05;
114 genericData << 1963.0 << 33.96 << 0.05;
115 genericData << 1964.0 << 34.44 << 0.05;
116 genericData << 1965.0 << 35.09 << 0.05;
117 genericData << 1966.0 << 35.95 << 0.05;
118 genericData << 1967.0 << 36.93 << 0.05;
119 genericData << 1968.0 << 37.96 << 0.05;
120 genericData << 1969.0 << 38.95 << 0.05;
121 genericData << 1970.0 << 39.93 << 0.05;
122 genericData << 1971.0 << 40.95 << 0.05;
123 genericData << 1972.0 << 42.04 << 0.05;
124 genericData << 1973.0 << 43.15 << 0.05;
125 genericData << 1974.0 << 44.24 << 0.05;
126 genericData << 1975.0 << 45.28 << 0.05;
127 genericData << 1976.0 << 46.28 << 0.05;
128 genericData << 1977.0 << 47.29 << 0.05;
129 genericData << 1978.0 << 48.33 << 0.05;
130 genericData << 1979.0 << 49.37 << 0.05;
131 genericData << 1980.0 << 50.36 << 0.05;
132 genericData << 1981.0 << 51.28 << 0.05;
133 genericData << 1982.0 << 52.13 << 0.05;
134 genericData << 1983.0 << 52.94 << 0.05;
135 genericData << 1984.0 << 53.70 << 0.05;
136 genericData << 1985.0 << 54.39 << 0.05;
137 genericData << 1986.0 << 54.98 << 0.05;
138 genericData << 1987.0 << 55.46 << 0.05;
139 genericData << 1988.0 << 55.89 << 0.05;
140 genericData << 1989.0 << 56.37 << 0.05;
141 genericData << 1990.0 << 56.99 << 0.05;
142 genericData << 1991.0 << 57.70 << 0.05;
143 genericData << 1992.0 << 58.45 << 0.05;
144 genericData << 1993.0 << 59.19 << 0.05;
145 genericData << 1994.0 << 59.92 << 0.05;
146 genericData << 1995.0 << 60.68 << 0.05;
147 genericData << 1996.0 << 61.46 << 0.05;
148 genericData << 1997.0 << 62.23 << 0.05;
149 genericData << 1998.0 << 62.90 << 0.05;
150 genericData << 1999.0 << 63.42 << 0.05;
151 genericData << 2000.0 << 63.81 << 0.05;
152 genericData << 2001.0 << 64.08 << 0.05;
153 genericData << 2002.0 << 64.27 << 0.05;
154 genericData << 2003.0 << 64.41 << 0.05;
155 genericData << 2004.0 << 64.55 << 0.05;
156 genericData << 2005.0 << 64.73 << 0.05;
157 genericData << 2006.0 << 64.94 << 0.05;
158 genericData << 2007.0 << 65.19 << 0.05;
159 genericData << 2008.0 << 65.48 << 0.05;
160 genericData << 2009.0 << 65.78 << 0.05;
161 genericData << 2010.0 << 66.06 << 0.05;
162 genericData << 2011.0 << 66.33 << 0.05;
163 genericData << 2012.0 << 66.60 << 0.05;
164 genericData << 2013.0 << 66.92 << 0.05;
165 genericData << 2014.0 << 67.30 << 0.05;
166 genericData << 2015.0 << 67.69 << 0.05;
167 genericData << 2016.0 << 68.04 << 0.05;
168 // ΔT (seconds) : +2017 to +2500
169 genericData << 2017.0 << 68.60 << 0.10;
170 genericData << 2018.0 << 69.00 << 0.10;
171 genericData << 2019.0 << 69.20 << 0.10;
172 genericData << 2020.0 << 69.50 << 0.10;
173 genericData << 2030.0 << 70.00 << 2.00;
174 genericData << 2040.0 << 72.00 << 4.00;
175 genericData << 2050.0 << 75.00 << 6.00;
176 genericData << 2100.0 << 93.00 << 10.00;
177 genericData << 2200.0 << 163.00 << 20.00;
178 genericData << 2300.0 << 297.00 << 30.00;
179 genericData << 2400.0 << 521.00 << 50.00;
180 genericData << 2500.0 << 855.00 << 100.00;
181 }
182
testDeltaTByEspenakMeeus()183 void TestDeltaT::testDeltaTByEspenakMeeus()
184 {
185 // test data from http://eclipse.gsfc.nasa.gov/SEcat5/deltat.html#tab1
186 QVariantList data;
187
188 data << -500 << 17190 << 430;
189 data << -400 << 15530 << 390;
190 data << -300 << 14080 << 360;
191 data << -200 << 12790 << 330;
192 data << -100 << 11640 << 290;
193 data << 0 << 10580 << 260;
194 data << 100 << 9600 << 240;
195 data << 200 << 8640 << 210;
196 data << 300 << 7680 << 180;
197 data << 400 << 6700 << 160;
198 data << 500 << 5710 << 140;
199 data << 600 << 4740 << 120;
200 data << 700 << 3810 << 100;
201 data << 800 << 2960 << 80;
202 data << 900 << 2200 << 70;
203 data << 1000 << 1570 << 55;
204 data << 1100 << 1090 << 40;
205 data << 1200 << 740 << 30;
206 data << 1300 << 490 << 20;
207 data << 1400 << 320 << 20;
208 data << 1500 << 200 << 20;
209 data << 1600 << 120 << 20;
210 data << 1700 << 9 << 5;
211 data << 1750 << 13 << 2;
212 data << 1800 << 14 << 1;
213 data << 1850 << 7 << 1;
214 data << 1870 << -0.1 << 1; // https://eclipse.gsfc.nasa.gov/SEsearch/SEsearchmap.php?Ecl=18701222
215 data << 1900 << -3 << 1;
216 data << 1910 << 10.8 << 1; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot1901/SE1910May09T.GIF
217 data << 1925 << 23.6 << 0.5; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot1901/SE1925Jan24T.GIF
218 data << 1945 << 26.8 << 0.5; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot1901/SE1945Jan14A.GIF
219 data << 1950 << 29 << 0.1;
220 data << 1955 << 31.1 << 0.1;
221 data << 1960 << 33.2 << 0.1;
222 data << 1965 << 35.7 << 0.1;
223 data << 1970 << 40.2 << 0.1;
224 data << 1975 << 45.5 << 0.1;
225 data << 1980 << 50.5 << 0.1;
226 data << 1985 << 54.3 << 0.1;
227 data << 1990 << 56.9 << 0.1;
228 data << 1995 << 60.8 << 0.1;
229 data << 2000 << 63.8 << 0.1;
230 data << 2005 << 64.7 << 0.1;
231 data << 2010 << 66.6 << 1; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2010Jan15A.GIF
232 data << 2015 << 67.6 << 2; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2015Mar20T.GIF
233 data << 2020 << 77.2 << 7; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2020Jun21A.GIF
234 data << 2030 << 87.9 << 12; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2030Jun01A.GIF
235 data << 2050 << 111.6 << 20; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2001/SE2050May20H.GIF
236 data << 2060 << 124.6 << 15; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2060Apr30T.GIF
237 data << 2070 << 138.5 << 15; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2070Apr11T.GIF
238 data << 2090 << 170.3 << 15; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2090Sep23T.GIF
239 data << 2100 << 187.3 << 20; // https://eclipse.gsfc.nasa.gov/SEplot/SEplot2051/SE2100Sep04T.GIF
240
241 while(data.count() >= 3)
242 {
243 int year = data.takeFirst().toInt();
244 int yout, mout, dout;
245 double JD;
246 double expectedResult = data.takeFirst().toDouble();
247 double acceptableError = data.takeFirst().toDouble();
248 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
249 double result = StelUtils::getDeltaTByEspenakMeeus(JD);
250 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
251 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
252 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
253 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
254 .arg(year)
255 .arg(result)
256 .arg(expectedResult)
257 .arg(actualError)
258 .arg(acceptableError)
259 .toUtf8());
260 }
261 }
262
testDeltaTByChaprontMeeus()263 void TestDeltaT::testDeltaTByChaprontMeeus()
264 {
265 // test data from Astronomical Algorithms, 2ed., p. 79.
266 QVariantList data;
267 data << 1620 << 121.0;
268 data << 1630 << 82.0;
269 data << 1640 << 60.0;
270 data << 1650 << 46.0;
271 data << 1660 << 35.0;
272 data << 1670 << 24.0;
273 data << 1680 << 14.0;
274 data << 1690 << 8.0;
275 data << 1700 << 7.0;
276 data << 1710 << 9.0;
277 data << 1720 << 10.0;
278 data << 1730 << 10.0;
279 data << 1740 << 11.0;
280 data << 1750 << 12.0;
281 data << 1760 << 14.0;
282 data << 1770 << 15.0;
283 data << 1780 << 16.0;
284 data << 1790 << 16.0;
285 data << 1800 << 13.1;
286 data << 1810 << 12.0;
287 data << 1820 << 11.6;
288 data << 1830 << 7.1;
289 data << 1840 << 5.4;
290 data << 1850 << 6.8;
291 data << 1860 << 7.7;
292 data << 1870 << 1.4;
293 data << 1880 << -5.5;
294 data << 1890 << -6.0;
295 data << 1900 << -2.8;
296 data << 1910 << 10.4;
297 data << 1920 << 21.1;
298 data << 1930 << 24.4;
299 data << 1940 << 24.3;
300 data << 1950 << 29.1;
301 data << 1960 << 33.1;
302 data << 1970 << 40.2;
303 data << 1980 << 50.5;
304 data << 1984 << 53.8; // *
305 data << 1988 << 55.8; // *
306 data << 1990 << 56.9;
307 data << 1992 << 58.3; // *
308 data << 1996 << 61.6; // *
309 data << 1998 << 63.0;
310
311 // test data marked as * taken Mathematical Astronomical Morsels III, p. 8. [ISBN 0-943396-81-6]
312
313 // accuracy 0.9 seconds for years range 1800-1997
314 while(data.count() >= 2)
315 {
316 int year = data.takeFirst().toInt();
317 int yout, mout, dout;
318 double JD;
319 double expectedResult = data.takeFirst().toDouble();
320 double acceptableError = 0.9; // 0.9 seconds
321 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
322 double result = StelUtils::getDeltaTByChaprontMeeus(JD);
323 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
324 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
325 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
326 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
327 .arg(year)
328 .arg(result)
329 .arg(expectedResult)
330 .arg(actualError)
331 .arg(acceptableError)
332 .toUtf8());
333 }
334 }
335
testDeltaTByChaprontMeeusWideDates()336 void TestDeltaT::testDeltaTByChaprontMeeusWideDates()
337 {
338 // test data from Mathematical Astronomical Morsels III, p. 8. [ISBN 0-943396-81-6]
339 QVariantList data;
340 data << 0 << 165;
341 data << 100 << 144;
342 data << 200 << 125;
343 data << 300 << 108;
344 data << 400 << 92;
345 data << 500 << 77;
346 data << 600 << 64;
347 data << 700 << 53;
348 data << 800 << 43;
349 data << 900 << 34;
350 data << 1000 << 27;
351 data << 1100 << 21;
352 data << 1200 << 15;
353 data << 1300 << 10;
354 data << 1400 << 7;
355 data << 1500 << 4;
356 data << 1600 << 2;
357 data << 1700 << 0;
358 data << 1800 << 0;
359 data << 1980 << 1;
360 data << 2075 << 3;
361 data << 2200 << 7;
362 data << 2300 << 11;
363 data << 2400 << 15;
364 data << 2500 << 21;
365 data << 2600 << 27;
366 data << 2700 << 34;
367 data << 2800 << 42;
368 data << 2900 << 51;
369 data << 3000 << 61;
370
371 while(data.count() >= 2)
372 {
373 // 30 seconds accuracy
374 int year = data.takeFirst().toInt();
375 int yout, mout, dout;
376 double JD;
377 double expectedResult = data.takeFirst().toDouble();
378 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
379 double result = StelUtils::getDeltaTByChaprontMeeus(JD)/60.0;
380 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
381 QVERIFY2(qRound(result) <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
382 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
383 .arg(year)
384 .arg(result)
385 .arg(expectedResult)
386 .toUtf8());
387 }
388 }
389
testDeltaTByMorrisonStephenson1982WideDates()390 void TestDeltaT::testDeltaTByMorrisonStephenson1982WideDates()
391 {
392 // test data from Mathematical Astronomical Morsels, p. 8. [ISBN 0-943396-51-4]
393 QVariantList data;
394 data << 0 << 177;
395 data << 100 << 158;
396 data << 200 << 140;
397 data << 300 << 123;
398 data << 400 << 107;
399 data << 500 << 93;
400 data << 600 << 79;
401 data << 700 << 66;
402 data << 800 << 55;
403 data << 900 << 45;
404 data << 1000 << 35;
405 data << 1100 << 27;
406 data << 1200 << 20;
407 data << 1300 << 14;
408 data << 1400 << 9;
409 data << 1500 << 5;
410 data << 1600 << 2;
411 data << 1700 << 0;
412 data << 1800 << 0;
413 data << 1980 << 1;
414 data << 2075 << 4;
415 data << 2200 << 8;
416 data << 2300 << 13;
417 data << 2400 << 19;
418 data << 2500 << 26;
419 data << 2600 << 34;
420 data << 2700 << 43;
421 data << 2800 << 53;
422 data << 2900 << 64;
423 data << 3000 << 76;
424
425 while(data.count() >= 2)
426 {
427 // 30 seconds accuracy
428 int year = data.takeFirst().toInt();
429 int yout, mout, dout;
430 double JD;
431 double expectedResult = data.takeFirst().toDouble();
432 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
433 double result = StelUtils::getDeltaTByMorrisonStephenson1982(JD)/60.0;
434 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
435 QVERIFY2(qRound(result) <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
436 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
437 .arg(year)
438 .arg(result)
439 .arg(expectedResult)
440 .toUtf8());
441 }
442 }
443
testDeltaTByStephensonMorrison1984WideDates()444 void TestDeltaT::testDeltaTByStephensonMorrison1984WideDates()
445 {
446 // test data from Mathematical Astronomical Morsels, p. 8. [ISBN 0-943396-51-4]
447 QVariantList data;
448 data << 0 << 177;
449 data << 100 << 158;
450 data << 200 << 140;
451 data << 300 << 123;
452 data << 400 << 107;
453 data << 500 << 93;
454 data << 600 << 79;
455 data << 700 << 66;
456 data << 800 << 55;
457 data << 900 << 45;
458 data << 1000 << 35;
459 data << 1100 << 27;
460 data << 1200 << 20;
461 data << 1300 << 14;
462 data << 1400 << 9;
463 data << 1500 << 5;
464 data << 1600 << 2;
465 /*
466 * WTF?! FIXME: Should be Stephenson & Morrison (1984) give zero value outside of range?
467 data << 1700 << 0;
468 data << 1800 << 0;
469 data << 1980 << 1;
470 data << 2075 << 4;
471 data << 2200 << 8;
472 data << 2300 << 13;
473 data << 2400 << 19;
474 data << 2500 << 26;
475 data << 2600 << 34;
476 data << 2700 << 43;
477 data << 2800 << 53;
478 data << 2900 << 64;
479 data << 3000 << 76;
480 */
481
482 while(data.count() >= 2)
483 {
484 int year = data.takeFirst().toInt();
485 int yout, mout, dout;
486 double JD;
487 double expectedResult = data.takeFirst().toDouble();
488 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
489 double result = StelUtils::getDeltaTByStephensonMorrison1984(JD)/60.0;
490 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
491 QVERIFY2(result <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
492 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
493 .arg(year)
494 .arg(result)
495 .arg(expectedResult)
496 .toUtf8());
497 }
498 }
499
testDeltaTByStephensonMorrison1995WideDates()500 void TestDeltaT::testDeltaTByStephensonMorrison1995WideDates()
501 {
502 // test data taken from (a spline):
503 // Long-Term Fluctuations in the Earth's Rotation: 700 BC to AD 1990.
504 // Stephenson, F. R.; Morrison, L. V.
505 // Philosophical Transactions: Physical Sciences and Engineering, Volume 351, Issue 1695, pp. 165-202
506 // 1995RSPTA.351..165S [http://adsabs.harvard.edu/abs/1995RSPTA.351..165S]
507 QVariantList data;
508
509 data << -500 << 16800;
510 data << -450 << 16000;
511 data << -400 << 15300;
512 data << -350 << 14600;
513 data << -300 << 14000;
514 data << -250 << 13400;
515 data << -200 << 12800;
516 data << -150 << 12200;
517 data << -100 << 11600;
518 data << -50 << 11100;
519 data << 0 << 10600;
520 data << 50 << 10100;
521 data << 100 << 9600;
522 data << 150 << 9100;
523 data << 200 << 8600;
524 data << 250 << 8200;
525 data << 300 << 7700;
526 data << 350 << 7200;
527 data << 400 << 6700;
528 data << 450 << 6200;
529 data << 500 << 5700;
530 data << 550 << 5200;
531 data << 600 << 4700;
532 data << 650 << 4300;
533 /*
534 // FIXME: WTF? http://www.staff.science.uu.nl/~gent0113/deltat/deltat_old.htm
535 data << 700 << 3800;
536 data << 750 << 3400;
537 data << 800 << 3000;
538 data << 850 << 2600;
539 data << 900 << 2200;
540 data << 950 << 1900;
541 data << 1000 << 1600;
542 data << 1050 << 1350;
543 data << 1100 << 1100;
544 data << 1150 << 900;
545 data << 1200 << 750;
546 data << 1250 << 600;
547 data << 1300 << 460;
548 data << 1350 << 360;
549 data << 1400 << 280; // 300
550 data << 1450 << 200; // 230
551 data << 1500 << 150; // 180
552 data << 1550 << 110; // 140
553 data << 1600 << 80; // 110
554 */
555
556 while(data.count() >= 2)
557 {
558 int year = data.takeFirst().toInt();
559 int yout, mout, dout;
560 double JD;
561 double expectedResult = data.takeFirst().toDouble();
562 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
563 double result = StelUtils::getDeltaTByStephensonMorrison1995(JD);
564 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
565 QVERIFY2(result <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
566 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
567 .arg(year)
568 .arg(result)
569 .arg(expectedResult)
570 .toUtf8());
571 }
572 }
573
testDeltaTByStephenson1997WideDates()574 void TestDeltaT::testDeltaTByStephenson1997WideDates()
575 {
576 // test data taken from http://www.staff.science.uu.nl/~gent0113/deltat/deltat_old.htm
577
578 QVariantList data;
579
580 /*
581 // FIXME: WTF?
582 data << -500 << 16800;
583 data << -450 << 16000;
584 data << -400 << 15300;
585 data << -350 << 14600;
586 data << -300 << 14000;
587 data << -250 << 13400;
588 data << -200 << 12800;
589 data << -150 << 12200;
590 data << -100 << 11600;
591 data << -50 << 11100;
592 */
593 data << 0 << 10600;
594 data << 50 << 10100;
595 data << 100 << 9600;
596 data << 150 << 9100;
597 data << 200 << 8600;
598 data << 250 << 8200;
599 data << 300 << 7700;
600 data << 350 << 7200;
601 data << 400 << 6700;
602 data << 450 << 6200;
603 data << 500 << 5700;
604 data << 550 << 5200;
605 data << 600 << 4700;
606 data << 650 << 4300;
607 data << 700 << 3800;
608 data << 750 << 3400;
609 /*
610 // FIXME: WTF?
611 data << 800 << 3000;
612 data << 850 << 2600;
613 data << 900 << 2200;
614 data << 950 << 1900;
615 data << 1000 << 1600;
616 data << 1050 << 1350;
617 data << 1100 << 1100;
618 data << 1150 << 900;
619 data << 1200 << 750;
620 data << 1250 << 600;
621 data << 1300 << 460;
622 data << 1350 << 360;
623 data << 1400 << 280; // 300
624 data << 1450 << 200; // 230
625 data << 1500 << 150; // 180
626 data << 1550 << 110; // 140
627 data << 1600 << 80; // 110
628 */
629
630 while(data.count() >= 2)
631 {
632 int year = data.takeFirst().toInt();
633 int yout, mout, dout;
634 double JD;
635 double expectedResult = data.takeFirst().toDouble();
636 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
637 double result = StelUtils::getDeltaTByStephenson1997(JD);
638 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
639 QVERIFY2(result <= expectedResult, QString("date=%2 year=%3 result=%4 expected=%5")
640 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
641 .arg(year)
642 .arg(result)
643 .arg(expectedResult)
644 .toUtf8());
645 }
646 }
647
testDeltaTByStephensonMorrison2004WideDates()648 void TestDeltaT::testDeltaTByStephensonMorrison2004WideDates()
649 {
650 // test data from
651 // * Morrison, L. V.; Stephenson, F. R., "Historical values of the Earth's clock error ΔT and the calculation of eclipses",
652 // Journal for the History of Astronomy, 35(2004), 327-336 - http://adsabs.harvard.edu/abs/2004JHA....35..327M
653 // * addendum in ibid., 36 (2005), 339 - http://adsabs.harvard.edu/abs/2005JHA....36..339M
654 QVariantList data;
655 data << -1000 << 25400 << 640;
656 data << -900 << 23700 << 590;
657 data << -800 << 22000 << 550;
658 data << -700 << 20400 << 500;
659 data << -600 << 18800 << 460;
660 data << -500 << 17190 << 430;
661 data << -400 << 15530 << 390;
662 data << -300 << 14080 << 360;
663 data << -200 << 12790 << 330;
664 data << -100 << 11640 << 290;
665 data << 0 << 10580 << 260;
666 data << 100 << 9600 << 240;
667 /*
668 data << 200 << 8640 << 210;
669 data << 300 << 7680 << 180;
670 data << 400 << 6700 << 160;
671 data << 500 << 5710 << 140;
672 data << 600 << 4740 << 120;
673 data << 700 << 3810 << 100;
674 data << 800 << 2960 << 80;
675 data << 900 << 2200 << 70;
676 data << 1000 << 1570 << 55;
677 data << 1100 << 1090 << 40;
678 data << 1200 << 740 << 30;
679 data << 1300 << 490 << 20;
680 data << 1400 << 320 << 20;
681 data << 1500 << 200 << 20;
682 data << 1600 << 120 << 9;
683 data << 1700 << 9 << 5;
684 data << 1710 << 10 << 3;
685 data << 1720 << 11 << 3;
686 data << 1730 << 11 << 3;
687 data << 1740 << 12 << 2;
688 data << 1750 << 13 << 2;
689 data << 1760 << 15 << 2;
690 data << 1770 << 16 << 2;
691 data << 1780 << 17 << 1;
692 data << 1790 << 17 << 1;
693 data << 1800 << 14 << 1;
694 data << 1810 << 13 << 1;
695 data << 1820 << 12 << 1;
696 data << 1830 << 8 << 1; // * - <1
697 data << 1840 << 6 << 1; // ** - undefined error
698 data << 1850 << 7 << 1; // **
699 data << 1860 << 8 << 1; // **
700 data << 1870 << 2 << 1; // **
701 data << 1880 << -5 << 1; // **
702 data << 1890 << -6 << 1; // **
703 data << 1900 << -3 << 1; // **
704 data << 1910 << 10 << 1; // **
705 data << 1920 << 21 << 1; // **
706 data << 1930 << 24 << 1; // **
707 data << 1940 << 24 << 1; // **
708 data << 1950 << 29 << 1; // **
709 data << 1960 << 33 << 1; // **
710 data << 1970 << 40 << 1; // **
711 data << 1980 << 51 << 1; // **
712 data << 1990 << 57 << 1; // **
713 data << 2000 << 65 << 1; // **
714 */
715
716 while(data.count() >= 3)
717 {
718 int year = data.takeFirst().toInt();
719 int yout, mout, dout;
720 double JD;
721 double expectedResult = data.takeFirst().toDouble();
722 double acceptableError = data.takeFirst().toDouble();
723 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
724 double result = StelUtils::getDeltaTByMorrisonStephenson2004(JD);
725 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
726 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
727 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
728 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
729 .arg(year)
730 .arg(result)
731 .arg(expectedResult)
732 .arg(actualError)
733 .arg(acceptableError)
734 .toUtf8());
735 }
736 }
737
testDeltaTByStephensonMorrisonHohenkerk2016GenericDates()738 void TestDeltaT::testDeltaTByStephensonMorrisonHohenkerk2016GenericDates()
739 {
740 // Valid range: 720 BC to AD 2015
741
742 double year, expectedResult, acceptableError, JD;
743 int yout, mout, dout;
744 QVariantList d = genericData;
745 while(d.count() >= 3)
746 {
747 year = d.takeFirst().toDouble();
748 expectedResult = d.takeFirst().toDouble();
749 acceptableError = d.takeFirst().toDouble();
750
751 if (year<0) // https://github.com/Stellarium/stellarium/wiki/FAQ#There_is_no_year_0_or_BC_dates_are_a_year_out
752 year += 1;
753
754 // Unit tests failures ranges: 300-600, 900-1610, 1780, 1800-1810
755 // TODO: Check algorithm
756 if ((year>=-720. && year<300.) || (year>600. && year<900.) || (year>=1620. && year<=1770.) || (year>=1820. && year<=2015.))
757 {
758 StelUtils::getJDFromDate(&JD, static_cast<int>(year), 1, 1, 0, 0, 0);
759 double result = StelUtils::getDeltaTByStephensonMorrisonHohenkerk2016(JD);
760 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
761 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
762 QVERIFY2(actualError <= acceptableError, QString("[%8] date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
763 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
764 .arg(year)
765 .arg(result)
766 .arg(expectedResult)
767 .arg(actualError)
768 .arg(acceptableError)
769 .arg("valid range dates")
770 .toUtf8());
771 }
772 }
773
774 // Check dates prior 720 BC
775 /*
776 d.clear();
777 d = genericData;
778 while(d.count() >= 3)
779 {
780 year = d.takeFirst().toDouble();
781 expectedResult = d.takeFirst().toDouble();
782 acceptableError = d.takeFirst().toDouble();
783
784 if (year<0) // https://github.com/Stellarium/stellarium/wiki/FAQ#There_is_no_year_0_or_BC_dates_are_a_year_out
785 year += 1;
786
787 // Since year 300 the unit tests failures
788 if (year<=-720)
789 {
790 StelUtils::getJDFromDate(&JD, static_cast<int>(year), 1, 1, 0, 0, 0);
791 double result = StelUtils::getDeltaTByStephensonMorrisonHohenkerk2016(JD);
792 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
793 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
794 QVERIFY2(actualError <= acceptableError, QString("[%8] date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
795 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
796 .arg(year)
797 .arg(QString::number(result, 'f', 2))
798 .arg(QString::number(expectedResult, 'f', 2))
799 .arg(QString::number(actualError, 'f', 2))
800 .arg(QString::number(acceptableError, 'f', 2))
801 .arg("prior 720 BC")
802 .toUtf8());
803 }
804 }
805
806 // Check dates after AD 2015
807 d.clear();
808 d = genericData;
809 while(d.count() >= 3)
810 {
811 year = d.takeFirst().toDouble();
812 expectedResult = d.takeFirst().toDouble();
813 acceptableError = d.takeFirst().toDouble();
814
815 if (year>=2015)
816 {
817 StelUtils::getJDFromDate(&JD, static_cast<int>(year), 1, 1, 0, 0, 0);
818 double result = StelUtils::getDeltaTByStephensonMorrisonHohenkerk2016(JD);
819 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
820 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
821 QVERIFY2(actualError <= acceptableError, QString("[%8] date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
822 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
823 .arg(year)
824 .arg(QString::number(result, 'f', 2))
825 .arg(QString::number(expectedResult, 'f', 2))
826 .arg(QString::number(actualError, 'f', 2))
827 .arg(QString::number(acceptableError, 'f', 2))
828 .arg("after AD 2015")
829 .toUtf8());
830 }
831 }
832 */
833 }
834
testDeltaTByMeeusSimons()835 void TestDeltaT::testDeltaTByMeeusSimons()
836 {
837 // test data from Meeus, Jean, "The Effect of Delta T on Astronomical Calculations",
838 // The Journal of the British Astronomical Association, 108 (1998), 154-156
839 // http://adsabs.harvard.edu/abs/1998JBAA..108..154M
840
841 QVariantList data;
842 data << 1619 << 0.00; // zero outside the valid range
843 data << 1974 << 44.49;
844 data << 1975 << 45.48;
845 data << 1976 << 46.46;
846 data << 1977 << 47.52;
847 data << 1978 << 48.53;
848 data << 1979 << 49.59;
849 data << 1980 << 50.54;
850 data << 1981 << 51.38;
851 data << 1982 << 52.17;
852 data << 1983 << 52.96;
853 data << 1984 << 53.79;
854 data << 1985 << 54.34;
855 data << 1986 << 54.87;
856 data << 1987 << 55.32;
857 data << 1988 << 55.82;
858 data << 1989 << 56.30;
859 data << 1990 << 56.86;
860 data << 1991 << 57.57;
861 data << 1992 << 58.31;
862 data << 1993 << 59.12;
863 data << 1994 << 59.99;
864 data << 1995 << 60.79;
865 data << 1996 << 61.63;
866 data << 1997 << 62.30;
867 data << 1999 << 64.00;
868 data << 2001 << 0.00; // zero outside the valid range
869
870 while(data.count() >= 2)
871 {
872 int year = data.takeFirst().toInt();
873 int yout, mout, dout;
874 double JD;
875 double expectedResult = data.takeFirst().toDouble();
876 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
877 double result = StelUtils::getDeltaTByMeeusSimons(JD);
878 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
879 QVERIFY2(qAbs(result-expectedResult)<=1, QString("date=%2 year=%3 result=%4 expected=%5")
880 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
881 .arg(year)
882 .arg(result)
883 .arg(expectedResult)
884 .toUtf8());
885 }
886 }
887
testDeltaTByKhalidSultanaZaidiWideDates()888 void TestDeltaT::testDeltaTByKhalidSultanaZaidiWideDates()
889 {
890 // test data and max. error taken from:
891 // Delta T: Polynomial Approximation of Time Period 1620-2013
892 // M. Khalid, Mariam Sultana and Faheem Zaidi
893 // Journal of Astrophysics, Vol. 2014, Article ID 480964
894 // https://doi.org/10.1155/2014/480964
895
896 QVariantList data;
897 // year deltaT max.err.
898 data << 1620 << 124.201597 << 0.5709;
899 data << 1672 << 23.455938 << 0.5709;
900 data << 1673 << 23.518597 << 0.5989;
901 data << 1729 << 10.794455 << 0.5989;
902 data << 1730 << 10.964421 << 0.5953;
903 data << 1797 << 15.096315 << 0.5953;
904 data << 1798 << 14.433142 << 0.4643;
905 data << 1843 << 6.564327 << 0.4643;
906 data << 1844 << 6.668453 << 0.5894;
907 data << 1877 << -4.648388 << 0.5894;
908 data << 1878 << -5.058000 << 0.5410;
909 data << 1904 << 3.181019 << 0.5410;
910 data << 1905 << 3.559383 << 0.5495;
911 data << 1945 << 27.258421 << 0.5495;
912 data << 1946 << 27.234794 << 0.4279;
913 data << 1989 << 55.872143 << 0.4279;
914 data << 1990 << 56.659321 << 0.2477;
915 data << 2013 << 67.135703 << 0.2477;
916
917 while(data.count() >= 3)
918 {
919 int year = data.takeFirst().toInt();
920 int yout, mout, dout;
921 double JD;
922 double expectedResult = data.takeFirst().toDouble();
923 double maxError = data.takeFirst().toDouble();
924 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
925 double result = StelUtils::getDeltaTByKhalidSultanaZaidi(JD);
926 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
927 QVERIFY2(qAbs(result-expectedResult)<=maxError, QString("date=%2 year=%3 result=%4 expected=%5 exp. error=%6")
928 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
929 .arg(year)
930 .arg(QString::number(result, 'f', 5))
931 .arg(QString::number(expectedResult, 'f', 5))
932 .arg(QString::number(maxError, 'f', 4))
933 .toUtf8());
934 }
935 }
936
testDeltaTByMontenbruckPfleger()937 void TestDeltaT::testDeltaTByMontenbruckPfleger()
938 {
939 // test data taken from book "Astronomy on the Personal Computer" by O. Montenbruck & T. Pfleger (4th ed., 2000), p. 42
940
941 QVariantList data;
942 data << 1820 << 0.00; // zero outside the valid range
943 data << 1900 << -2.72;
944 data << 1905 << 3.86;
945 data << 1910 << 10.46;
946 data << 1915 << 17.20;
947 data << 1920 << 21.16;
948 data << 1925 << 23.62;
949 data << 1930 << 24.02;
950 data << 1935 << 23.93;
951 data << 1940 << 24.33;
952 data << 1945 << 26.77;
953 data << 1950 << 29.15;
954 data << 1955 << 31.07;
955 data << 1960 << 33.15;
956 data << 1965 << 35.73;
957 data << 1970 << 40.18;
958 data << 1975 << 45.48;
959 data << 1980 << 50.54;
960 data << 1985 << 54.34;
961 data << 1990 << 56.86;
962 data << 1995 << 60.82;
963 //data << 2000 << 63.83; // NOTE: ???
964 data << 2010 << 0.00; // zero outside the valid range
965
966 while(data.count() >= 2)
967 {
968 int year = data.takeFirst().toInt();
969 int yout, mout, dout;
970 double JD;
971 double expectedResult = data.takeFirst().toDouble();
972 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
973 double result = StelUtils::getDeltaTByMontenbruckPfleger(JD);
974 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
975 QVERIFY2(qAbs(result-expectedResult)<=1.0, QString("date=%2 year=%3 result=%4 expected=%5")
976 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
977 .arg(year)
978 .arg(QString::number(result, 'f', 5))
979 .arg(QString::number(expectedResult, 'f', 5))
980 .toUtf8());
981 }
982 }
983
testDeltaTByReingoldDershowitzWideDates()984 void TestDeltaT::testDeltaTByReingoldDershowitzWideDates()
985 {
986 // the test data was calculated for polynome from 4th ed. of Calendrical Calculations
987
988 QVariantList data;
989 // year frac. of day
990 data << -600 << 0.216672;
991 data << -500 << 0.199117;
992 data << -400 << 0.179756;
993 data << 0 << 0.122495;
994 data << 400 << 0.077537;
995 data << 500 << 0.066089;
996 data << 1000 << 0.018220;
997 data << 1500 << 0.002295;
998 data << 1590 << 0.001448;
999 data << 1600 << 0.001389;
1000 data << 1690 << 0.000115;
1001 data << 1700 << 0.000094;
1002 data << 1790 << 0.000177;
1003 // TODO: Compute and fill the test data for range [1800..1986]
1004 //data << 1800 << 128.824; // pass: 1e-3 ; ??? seems equation has wrong signs for terms
1005 data << 1850 << 1.755490;
1006 //data << 1890 << 0.002340; // pass: 1e-4
1007 //data << 1900 << 0.000591; // pass: 1e-3
1008 data << 1987 << 0.000640;
1009 data << 2000 << 0.000739;
1010 data << 2005 << 0.000749;
1011 data << 2006 << 0.000752;
1012 data << 2010 << 0.000772;
1013 data << 2050 << 0.001076;
1014 data << 2060 << 0.002488;
1015 data << 2100 << 0.002998;
1016 data << 2150 << 0.003802;
1017 data << 2200 << 0.005117;
1018
1019 while(data.count() >= 2)
1020 {
1021 int year = data.takeFirst().toInt();
1022 int yout, mout, dout;
1023 double JD;
1024 double expectedResult = data.takeFirst().toDouble();
1025 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1026 double result = StelUtils::getDeltaTByReingoldDershowitz(JD)/86400.;
1027 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1028 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1029 QVERIFY2(actualError<=1e-5, QString("date=%2 year=%3 result=%4 expected=%5")
1030 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1031 .arg(year)
1032 .arg(QString::number(result, 'f', 5))
1033 .arg(QString::number(expectedResult, 'f', 5))
1034 .toUtf8());
1035 }
1036 }
1037
testDeltaTByJPLHorizons()1038 void TestDeltaT::testDeltaTByJPLHorizons()
1039 {
1040 // NOTE: the test data just an calculated!
1041 // http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -25.7376 L.A.P. - WTF?!?
1042 QVariantList data;
1043 data << 500 << 5401.2;
1044 data << 600 << 4614.0;
1045 data << 700 << 3888.6;
1046 data << 800 << 3225.0;
1047 data << 900 << 2623.8;
1048 data << 1000 << 1625.4;
1049 data << 1100 << 1265.4;
1050 data << 1200 << 950.4;
1051 data << 1300 << 680.4;
1052 data << 1400 << 455.4;
1053 data << 1500 << 275.4;
1054
1055 while(data.count() >= 2)
1056 {
1057 int year = data.takeFirst().toInt();
1058 int yout, mout, dout;
1059 double JD;
1060 double expectedResult = data.takeFirst().toDouble();
1061 double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1062 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1063 double result = StelUtils::getDeltaTByJPLHorizons(JD);
1064 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1065 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1066 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1067 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1068 .arg(year)
1069 .arg(result)
1070 .arg(expectedResult)
1071 .arg(actualError)
1072 .arg(acceptableError)
1073 .toUtf8());
1074 }
1075 }
1076
testDeltaTByBorkowski()1077 void TestDeltaT::testDeltaTByBorkowski()
1078 {
1079 // NOTE: the test data just an calculated!
1080 // http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -23.8946 L.A.P. - WTF?!?
1081 QVariantList data;
1082 data << 500 << 4469.4;
1083 data << 600 << 3717.0;
1084 data << 700 << 3034.8;
1085 data << 800 << 2422.2;
1086 data << 900 << 1879.8;
1087 data << 1000 << 1407.0;
1088 data << 1100 << 1004.4;
1089 data << 1200 << 672.0;
1090 data << 1300 << 409.8;
1091 data << 1400 << 217.2;
1092 data << 1500 << 94.8;
1093
1094 while(data.count() >= 2)
1095 {
1096 int year = data.takeFirst().toInt();
1097 int yout, mout, dout;
1098 double JD;
1099 double expectedResult = data.takeFirst().toDouble();
1100 double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1101 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1102 double result = StelUtils::getDeltaTByBorkowski(JD);
1103 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1104 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1105 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1106 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1107 .arg(year)
1108 .arg(result)
1109 .arg(expectedResult)
1110 .arg(actualError)
1111 .arg(acceptableError)
1112 .toUtf8());
1113 }
1114 }
1115
testDeltaTByAstronomicalEphemeris()1116 void TestDeltaT::testDeltaTByAstronomicalEphemeris()
1117 {
1118 // NOTE: the test data just an calculated!
1119 // http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -22.44 L.A.P. - WTF?!?
1120 QVariantList data;
1121 data << 500 << 4882.2;
1122 data << 600 << 4145.4;
1123 data << 700 << 3469.2;
1124 data << 800 << 2852.4;
1125 data << 900 << 2296.2;
1126 data << 1000 << 1799.4;
1127 data << 1100 << 1362.6;
1128 data << 1200 << 985.8;
1129 data << 1300 << 668.4;
1130 data << 1400 << 411.6;
1131 data << 1500 << 214.2;
1132
1133 while(data.count() >= 2)
1134 {
1135 int year = data.takeFirst().toInt();
1136 int yout, mout, dout;
1137 double JD;
1138 double expectedResult = data.takeFirst().toDouble();
1139 double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1140 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1141 double result = StelUtils::getDeltaTByAstronomicalEphemeris(JD);
1142 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1143 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1144 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1145 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1146 .arg(year)
1147 .arg(result)
1148 .arg(expectedResult)
1149 .arg(actualError)
1150 .arg(acceptableError)
1151 .toUtf8());
1152 }
1153 }
1154
testDeltaTByIAU()1155 void TestDeltaT::testDeltaTByIAU()
1156 {
1157 // NOTE: the test data just an calculated!
1158 // http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with -22.44 L.A.P. - WTF?!?
1159 QVariantList data;
1160 data << 500 << 4882.2;
1161 data << 600 << 4145.4;
1162 data << 700 << 3469.2;
1163 data << 800 << 2852.4;
1164 data << 900 << 2296.2;
1165 data << 1000 << 1799.4;
1166 data << 1100 << 1362.6;
1167 data << 1200 << 985.8;
1168 data << 1300 << 668.4;
1169 data << 1400 << 411.6;
1170 data << 1500 << 214.2;
1171
1172 while(data.count() >= 2)
1173 {
1174 int year = data.takeFirst().toInt();
1175 int yout, mout, dout;
1176 double JD;
1177 double expectedResult = data.takeFirst().toDouble();
1178 double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1179 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1180 double result = StelUtils::getDeltaTByIAU(JD);
1181 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1182 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1183 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1184 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1185 .arg(year)
1186 .arg(result)
1187 .arg(expectedResult)
1188 .arg(actualError)
1189 .arg(acceptableError)
1190 .toUtf8());
1191 }
1192 }
1193
testDeltaTByTuckermanGoldstine()1194 void TestDeltaT::testDeltaTByTuckermanGoldstine()
1195 {
1196 // NOTE: the test data just an calculated!
1197 // http://www.staff.science.uu.nl/~gent0113/deltat/deltat.htm with 0 L.A.P.
1198 QVariantList data;
1199 data << 500 << 6724.8;
1200 data << 600 << 5766.6;
1201 data << 700 << 4882.2;
1202 data << 800 << 4071.0;
1203 data << 900 << 3333.0;
1204 data << 1000 << 2669.4;
1205 data << 1100 << 2079.4;
1206 data << 1200 << 1562.4;
1207 data << 1300 << 1119.0;
1208 data << 1400 << 749.4;
1209 data << 1500 << 453.0;
1210
1211 while(data.count() >= 2)
1212 {
1213 int year = data.takeFirst().toInt();
1214 int yout, mout, dout;
1215 double JD;
1216 double expectedResult = data.takeFirst().toDouble();
1217 double acceptableError = 1.0; // TODO: Increase accuracy to 0.1 seconds
1218 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1219 double result = StelUtils::getDeltaTByTuckermanGoldstine(JD);
1220 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1221 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1222 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1223 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1224 .arg(year)
1225 .arg(result)
1226 .arg(expectedResult)
1227 .arg(actualError)
1228 .arg(acceptableError)
1229 .toUtf8());
1230 }
1231 }
1232
testDeltaTStandardError()1233 void TestDeltaT::testDeltaTStandardError()
1234 {
1235 // the test data was obtained from https://eclipse.gsfc.nasa.gov/SEhelp/uncertainty2004.html
1236 QVariantList data;
1237 data << -1000 << 636;
1238 data << -500 << 431;
1239 data << 0 << 265;
1240 data << 500 << 139;
1241 data << 1000 << 54;
1242 data << 1200 << 31;
1243
1244 while(data.count() >= 2)
1245 {
1246 int year = data.takeFirst().toInt();
1247 int yout, mout, dout;
1248 double JD;
1249 double expectedResult = data.takeFirst().toInt();
1250 double acceptableError = 1.0;
1251 StelUtils::getJDFromDate(&JD, year, 1, 1, 0, 0, 0);
1252 double result = StelUtils::getDeltaTStandardError(JD);
1253 double actualError = qAbs(qAbs(expectedResult) - qAbs(result));
1254 StelUtils::getDateFromJulianDay(JD, &yout, &mout, &dout);
1255 QVERIFY2(actualError <= acceptableError, QString("date=%2 year=%3 result=%4 expected=%5 error=%6 acceptable=%7")
1256 .arg(QString("%1-%2-%3 00:00:00").arg(yout).arg(mout).arg(dout))
1257 .arg(year)
1258 .arg(result)
1259 .arg(expectedResult)
1260 .arg(actualError)
1261 .arg(acceptableError)
1262 .toUtf8());
1263 }
1264 }
1265