[1457] | 1 | /* DeltaT = Ephemeris Time - Universal Time
|
---|
| 2 | *
|
---|
[4017] | 3 | * Adapted 2011/4/14 from Stephen Moshier <moshier@world.std.com>,
|
---|
| 4 | * cosmetic changes only.
|
---|
[1457] | 5 | *
|
---|
[4017] | 6 | * Compile as follows to create stand-alone test program:
|
---|
| 7 | * cc -DTEST_MAIN deltat.c libastro.a
|
---|
[1457] | 8 | *
|
---|
[4017] | 9 | * Tabulated values of deltaT, in hundredths of a second, are
|
---|
| 10 | * from The Astronomical Almanac and current IERS reports.
|
---|
| 11 | * A table of values for the pre-telescopic period was taken from
|
---|
| 12 | * Morrison and Stephenson (2004). The overall tabulated range is
|
---|
| 13 | * -1000.0 through 2011.0. Values at intermediate times are interpolated
|
---|
| 14 | * from the tables.
|
---|
[1457] | 15 | *
|
---|
[4017] | 16 | * For dates earlier and later than the tabulated range, the program
|
---|
| 17 | * calculates a polynomial extrapolation formula.
|
---|
[1457] | 18 | *
|
---|
[4017] | 19 | * Updated deltaT predictions can be obtained from this network archive,
|
---|
| 20 | * http://maia.usno.navy.mil
|
---|
| 21 | * then appended to the dt[] table and update TABEND.
|
---|
[1457] | 22 | *
|
---|
[4017] | 23 | * Input is XEphem's MJD, output is ET-UT in seconds.
|
---|
[1457] | 24 | *
|
---|
| 25 | *
|
---|
[4017] | 26 | * References:
|
---|
[1457] | 27 | *
|
---|
[4017] | 28 | * Morrison, L. V., and F. R. Stephenson, Historical values of the Earth's
|
---|
| 29 | * clock error deltat T and the calculation of eclipses. Journal for the
|
---|
| 30 | * History of Astronomy 35, 327-336 (2004)
|
---|
[1457] | 31 | *
|
---|
| 32 | * Stephenson, F. R., and L. V. Morrison, "Long-term changes
|
---|
| 33 | * in the rotation of the Earth: 700 B.C. to A.D. 1980,"
|
---|
| 34 | * Philosophical Transactions of the Royal Society of London
|
---|
| 35 | * Series A 313, 47-70 (1984)
|
---|
| 36 | *
|
---|
| 37 | * Chapront-Touze, Michelle, and Jean Chapront, _Lunar Tables
|
---|
| 38 | * and Programs from 4000 B.C. to A.D. 8000_, Willmann-Bell 1991
|
---|
| 39 | *
|
---|
| 40 | * Stephenson, F. R., and M. A. Houlden, _Atlas of Historical
|
---|
| 41 | * Eclipse Maps_, Cambridge U. Press (1986)
|
---|
| 42 | *
|
---|
[4017] | 43 | */
|
---|
[1457] | 44 |
|
---|
[2551] | 45 | #include <math.h>
|
---|
| 46 |
|
---|
[1457] | 47 | #include "astro.h"
|
---|
| 48 |
|
---|
[4017] | 49 | #define TABSTART 1620
|
---|
| 50 | #define TABEND 2011
|
---|
| 51 | #define TABSIZ (TABEND - TABSTART + 1)
|
---|
[1457] | 52 |
|
---|
[4017] | 53 | /* Morrison and Stephenson (2004)
|
---|
| 54 | * This table covers -1000 through 1700 in 100-year steps.
|
---|
| 55 | * Values are in whole seconds.
|
---|
| 56 | * Estimated standard error at -1000 is 640 seconds; at 1600, 20 seconds.
|
---|
| 57 | * The first value in the table has been adjusted 28 sec for
|
---|
| 58 | * continuity with their long-term quadratic extrapolation formula.
|
---|
| 59 | * The last value in this table agrees with the AA table at 1700,
|
---|
| 60 | * so there is no discontinuity at either endpoint.
|
---|
[1457] | 61 | */
|
---|
[4017] | 62 | #define MS_SIZ 28
|
---|
| 63 | short m_s[MS_SIZ] = {
|
---|
| 64 | /* -1000 to -100 */
|
---|
| 65 | 25428, 23700, 22000, 21000, 19040, 17190, 15530, 14080, 12790, 11640,
|
---|
| 66 |
|
---|
| 67 | /* 0 to 900 */
|
---|
| 68 | 10580, 9600, 8640, 7680, 6700, 5710, 4740, 3810, 2960, 2200,
|
---|
| 69 |
|
---|
| 70 | /* 1000 to 1700 */
|
---|
| 71 | 1570, 1090, 740, 490, 320, 200, 120, 9,
|
---|
| 72 | };
|
---|
| 73 |
|
---|
| 74 |
|
---|
| 75 | /* Entries prior to 1955 in the following table are from
|
---|
| 76 | * the 1984 Astronomical Almanac and assume ndot = -26.0.
|
---|
| 77 | * For dates prior to 1700, the above table is used instead of this one.
|
---|
| 78 | */
|
---|
| 79 | short dt[TABSIZ] = {
|
---|
[1457] | 80 | /* 1620.0 thru 1659.0 */
|
---|
| 81 | 12400, 11900, 11500, 11000, 10600, 10200, 9800, 9500, 9100, 8800,
|
---|
| 82 | 8500, 8200, 7900, 7700, 7400, 7200, 7000, 6700, 6500, 6300,
|
---|
| 83 | 6200, 6000, 5800, 5700, 5500, 5400, 5300, 5100, 5000, 4900,
|
---|
| 84 | 4800, 4700, 4600, 4500, 4400, 4300, 4200, 4100, 4000, 3800,
|
---|
[4017] | 85 |
|
---|
[1457] | 86 | /* 1660.0 thru 1699.0 */
|
---|
| 87 | 3700, 3600, 3500, 3400, 3300, 3200, 3100, 3000, 2800, 2700,
|
---|
| 88 | 2600, 2500, 2400, 2300, 2200, 2100, 2000, 1900, 1800, 1700,
|
---|
| 89 | 1600, 1500, 1400, 1400, 1300, 1200, 1200, 1100, 1100, 1000,
|
---|
| 90 | 1000, 1000, 900, 900, 900, 900, 900, 900, 900, 900,
|
---|
[4017] | 91 |
|
---|
[1457] | 92 | /* 1700.0 thru 1739.0 */
|
---|
| 93 | 900, 900, 900, 900, 900, 900, 900, 900, 1000, 1000,
|
---|
| 94 | 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1100, 1100, 1100,
|
---|
| 95 | 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100, 1100,
|
---|
| 96 | 1100, 1100, 1100, 1100, 1200, 1200, 1200, 1200, 1200, 1200,
|
---|
[4017] | 97 |
|
---|
[1457] | 98 | /* 1740.0 thru 1779.0 */
|
---|
| 99 | 1200, 1200, 1200, 1200, 1300, 1300, 1300, 1300, 1300, 1300,
|
---|
| 100 | 1300, 1400, 1400, 1400, 1400, 1400, 1400, 1400, 1500, 1500,
|
---|
| 101 | 1500, 1500, 1500, 1500, 1500, 1600, 1600, 1600, 1600, 1600,
|
---|
| 102 | 1600, 1600, 1600, 1600, 1600, 1700, 1700, 1700, 1700, 1700,
|
---|
[4017] | 103 |
|
---|
[1457] | 104 | /* 1780.0 thru 1799.0 */
|
---|
| 105 | 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700,
|
---|
| 106 | 1700, 1700, 1600, 1600, 1600, 1600, 1500, 1500, 1400, 1400,
|
---|
[4017] | 107 |
|
---|
[1457] | 108 | /* 1800.0 thru 1819.0 */
|
---|
| 109 | 1370, 1340, 1310, 1290, 1270, 1260, 1250, 1250, 1250, 1250,
|
---|
| 110 | 1250, 1250, 1250, 1250, 1250, 1250, 1250, 1240, 1230, 1220,
|
---|
[4017] | 111 |
|
---|
[1457] | 112 | /* 1820.0 thru 1859.0 */
|
---|
| 113 | 1200, 1170, 1140, 1110, 1060, 1020, 960, 910, 860, 800,
|
---|
| 114 | 750, 700, 660, 630, 600, 580, 570, 560, 560, 560,
|
---|
| 115 | 570, 580, 590, 610, 620, 630, 650, 660, 680, 690,
|
---|
| 116 | 710, 720, 730, 740, 750, 760, 770, 770, 780, 780,
|
---|
[4017] | 117 |
|
---|
[1457] | 118 | /* 1860.0 thru 1899.0 */
|
---|
| 119 | 788, 782, 754, 697, 640, 602, 541, 410, 292, 182,
|
---|
| 120 | 161, 10, -102, -128, -269, -324, -364, -454, -471, -511,
|
---|
| 121 | -540, -542, -520, -546, -546, -579, -563, -564, -580, -566,
|
---|
| 122 | -587, -601, -619, -664, -644, -647, -609, -576, -466, -374,
|
---|
[4017] | 123 |
|
---|
[1457] | 124 | /* 1900.0 thru 1939.0 */
|
---|
| 125 | -272, -154, -2, 124, 264, 386, 537, 614, 775, 913,
|
---|
| 126 | 1046, 1153, 1336, 1465, 1601, 1720, 1824, 1906, 2025, 2095,
|
---|
| 127 | 2116, 2225, 2241, 2303, 2349, 2362, 2386, 2449, 2434, 2408,
|
---|
| 128 | 2402, 2400, 2387, 2395, 2386, 2393, 2373, 2392, 2396, 2402,
|
---|
[4017] | 129 |
|
---|
[1457] | 130 | /* 1940.0 thru 1979.0 */
|
---|
[4017] | 131 | 2433, 2483, 2530, 2570, 2624, 2677, 2728, 2778, 2825, 2871,
|
---|
| 132 | 2915, 2957, 2997, 3036, 3072, 3107, 3135, 3168, 3218, 3268,
|
---|
| 133 | 3315, 3359, 3400, 3447, 3503, 3573, 3654, 3743, 3829, 3920,
|
---|
| 134 | 4018, 4117, 4223, 4337, 4449, 4548, 4646, 4752, 4853, 4959,
|
---|
[1457] | 135 |
|
---|
[4017] | 136 | /* 1980.0 thru 2011.0 */
|
---|
| 137 | 5054, 5138, 5217, 5296, 5379, 5434, 5487, 5532, 5582, 5630,
|
---|
| 138 | 5686, 5757, 5831, 5912, 5998, 6078, 6163, 6230, 6297, 6347,
|
---|
| 139 | 6383, 6409, 6430, 6447, 6457, 6469, 6485, 6515, 6546, 6578,
|
---|
| 140 | 6607, 6632,
|
---|
| 141 | };
|
---|
[1457] | 142 |
|
---|
[3654] | 143 |
|
---|
[4017] | 144 | /* Given MJD return DeltaT = ET - UT1 in seconds. Describes the irregularities
|
---|
[1457] | 145 | * of the Earth rotation rate in the ET time scale.
|
---|
| 146 | */
|
---|
[4017] | 147 | double
|
---|
| 148 | deltat(double mj)
|
---|
[1457] | 149 | {
|
---|
[4017] | 150 | static double ans, lastmj;
|
---|
| 151 | double Y, p, B;
|
---|
[1457] | 152 | int d[6];
|
---|
| 153 | int i, iy, k;
|
---|
| 154 |
|
---|
[4017] | 155 | if (mj == lastmj)
|
---|
| 156 | return (ans);
|
---|
[2551] | 157 | lastmj = mj;
|
---|
[1457] | 158 |
|
---|
[4017] | 159 | mjd_year (mj, &Y);
|
---|
[1457] | 160 |
|
---|
[4017] | 161 | if( Y > TABEND ) {
|
---|
| 162 | /* Extrapolate future values beyond the lookup table. */
|
---|
| 163 | if (Y > (TABEND + 100.0)) {
|
---|
| 164 | /* Morrison & Stephenson (2004) long-term curve fit. */
|
---|
| 165 | B = 0.01 * (Y - 1820.0);
|
---|
| 166 | ans = 32.0 * B * B - 20.0;
|
---|
| 167 |
|
---|
| 168 | } else {
|
---|
| 169 |
|
---|
| 170 | double a, b, c, d, m0, m1;
|
---|
| 171 |
|
---|
| 172 | /* Cubic interpolation between last tabulated value
|
---|
| 173 | * and long-term curve evaluated at 100 years later.
|
---|
| 174 | */
|
---|
| 175 |
|
---|
| 176 | /* Last tabulated delta T value. */
|
---|
| 177 | a = 0.01 * dt[TABSIZ-1];
|
---|
| 178 | /* Approximate slope in past 10 years. */
|
---|
| 179 | b = 0.001 * (dt[TABSIZ-1] - dt[TABSIZ - 11]);
|
---|
| 180 |
|
---|
| 181 | /* Long-term curve 100 years hence. */
|
---|
| 182 | B = 0.01 * (TABEND + 100.0 - 1820.0);
|
---|
| 183 | m0 = 32.0 * B*B - 20.0;
|
---|
| 184 | /* Its slope. */
|
---|
| 185 | m1 = 0.64 * B;
|
---|
| 186 |
|
---|
| 187 | /* Solve for remaining coefficients of an interpolation polynomial
|
---|
| 188 | * that agrees in value and slope at both ends of the 100-year
|
---|
| 189 | * interval.
|
---|
| 190 | */
|
---|
| 191 | d = 2.0e-6 * (50.0 * (m1 + b) - m0 + a);
|
---|
| 192 | c = 1.0e-4 * (m0 - a - 100.0 * b - 1.0e6 * d);
|
---|
| 193 |
|
---|
| 194 | /* Note, the polynomial coefficients do not depend on Y.
|
---|
| 195 | * A given tabulation and long-term formula
|
---|
| 196 | * determine the polynomial.
|
---|
| 197 | * Thus, for the IERS table ending at 2011.0, the coefficients are
|
---|
| 198 | * a = 66.32
|
---|
| 199 | * b = 0.223
|
---|
| 200 | * c = 0.03231376
|
---|
| 201 | * d = -0.0001607784
|
---|
| 202 | */
|
---|
| 203 |
|
---|
| 204 | /* Compute polynomial value at desired time. */
|
---|
| 205 | p = Y - TABEND;
|
---|
| 206 | ans = a + p * (b + p * (c + p * d));
|
---|
| 207 | }
|
---|
| 208 |
|
---|
| 209 | return (ans);
|
---|
[1457] | 210 | }
|
---|
| 211 |
|
---|
[4017] | 212 |
|
---|
| 213 | /* Use Morrison and Stephenson (2004) prior to the year 1700. */
|
---|
| 214 | if( Y < 1700.0 ) {
|
---|
| 215 | if (Y <= -1000.0) {
|
---|
| 216 | /* Morrison and Stephenson long-term fit. */
|
---|
| 217 | B = 0.01 * (Y - 1820.0);
|
---|
| 218 | ans = 32.0 * B * B - 20.0;
|
---|
| 219 |
|
---|
| 220 | } else {
|
---|
| 221 |
|
---|
| 222 | /* Morrison and Stephenson recommend linear interpolation
|
---|
| 223 | * between tabulations.
|
---|
[1457] | 224 | */
|
---|
[4017] | 225 | iy = Y;
|
---|
| 226 | iy = (iy + 1000) / 100; /* Integer index into the table. */
|
---|
| 227 | B = -1000 + 100 * iy; /* Starting year of tabulated interval. */
|
---|
| 228 | p = m_s[iy];
|
---|
| 229 | ans = p + 0.01 * (Y - B) * (m_s[iy + 1] - p);
|
---|
[1457] | 230 | }
|
---|
[4017] | 231 |
|
---|
| 232 | return (ans);
|
---|
[1457] | 233 | }
|
---|
| 234 |
|
---|
[4017] | 235 | /* Besselian interpolation between tabulated values
|
---|
| 236 | * in the telescopic era.
|
---|
[1457] | 237 | * See AA page K11.
|
---|
| 238 | */
|
---|
| 239 |
|
---|
[4017] | 240 | /* Index into the table. */
|
---|
[1457] | 241 | p = floor(Y);
|
---|
[4017] | 242 | iy = (int) (p - TABSTART);
|
---|
| 243 | /* Zeroth order estimate is value at start of year */
|
---|
[1457] | 244 | ans = dt[iy];
|
---|
| 245 | k = iy + 1;
|
---|
| 246 | if( k >= TABSIZ )
|
---|
| 247 | goto done; /* No data, can't go on. */
|
---|
| 248 |
|
---|
[4017] | 249 | /* The fraction of tabulation interval */
|
---|
[1457] | 250 | p = Y - p;
|
---|
| 251 |
|
---|
[4017] | 252 | /* First order interpolated value */
|
---|
[1457] | 253 | ans += p*(dt[k] - dt[iy]);
|
---|
| 254 | if( (iy-1 < 0) || (iy+2 >= TABSIZ) )
|
---|
| 255 | goto done; /* can't do second differences */
|
---|
| 256 |
|
---|
[4017] | 257 | /* Make table of first differences */
|
---|
[1457] | 258 | k = iy - 2;
|
---|
[4017] | 259 | for (i=0; i<5; i++) {
|
---|
[1457] | 260 | if( (k < 0) || (k+1 >= TABSIZ) )
|
---|
| 261 | d[i] = 0;
|
---|
[4017] | 262 | else
|
---|
| 263 | d[i] = dt[k+1] - dt[k];
|
---|
| 264 | k += 1;
|
---|
[1457] | 265 | }
|
---|
| 266 |
|
---|
[4017] | 267 | /* Compute second differences */
|
---|
[1457] | 268 | for( i=0; i<4; i++ )
|
---|
| 269 | d[i] = d[i+1] - d[i];
|
---|
| 270 | B = 0.25*p*(p-1.0);
|
---|
| 271 | ans += B*(d[1] + d[2]);
|
---|
[4017] | 272 | if (iy+2 >= TABSIZ)
|
---|
[1457] | 273 | goto done;
|
---|
| 274 |
|
---|
[4017] | 275 | /* Compute third differences */
|
---|
[1457] | 276 | for( i=0; i<3; i++ )
|
---|
| 277 | d[i] = d[i+1] - d[i];
|
---|
| 278 | B = 2.0*B/3.0;
|
---|
| 279 | ans += (p-0.5)*B*d[1];
|
---|
[4017] | 280 | if ((iy-2 < 0) || (iy+3 > TABSIZ) )
|
---|
[1457] | 281 | goto done;
|
---|
| 282 |
|
---|
[4017] | 283 | /* Compute fourth differences */
|
---|
[1457] | 284 | for( i=0; i<2; i++ )
|
---|
| 285 | d[i] = d[i+1] - d[i];
|
---|
| 286 | B = 0.125*B*(p+1.0)*(p-2.0);
|
---|
| 287 | ans += B*(d[0] + d[1]);
|
---|
| 288 |
|
---|
[4017] | 289 | done:
|
---|
| 290 |
|
---|
| 291 | ans *= 0.01;
|
---|
| 292 |
|
---|
| 293 | #if 0 /* ndot = -26.0 assumed; no correction. */
|
---|
| 294 |
|
---|
[1457] | 295 | /* Astronomical Almanac table is corrected by adding the expression
|
---|
| 296 | * -0.000091 (ndot + 26)(year-1955)^2 seconds
|
---|
| 297 | * to entries prior to 1955 (AA page K8), where ndot is the secular
|
---|
| 298 | * tidal term in the mean motion of the Moon.
|
---|
| 299 | *
|
---|
| 300 | * Entries after 1955 are referred to atomic time standards and
|
---|
| 301 | * are not affected by errors in Lunar or planetary theory.
|
---|
| 302 | */
|
---|
[4017] | 303 | if( Y < 1955.0 )
|
---|
| 304 | {
|
---|
| 305 | B = (Y - 1955.0);
|
---|
| 306 | #if 1
|
---|
| 307 | ans += -0.000091 * (-25.8 + 26.0) * B * B;
|
---|
| 308 | #else
|
---|
| 309 | ans += -0.000091 * (-23.8946 + 26.0) * B * B;
|
---|
| 310 | #endif
|
---|
| 311 | }
|
---|
| 312 |
|
---|
| 313 | #endif /* 0 */
|
---|
| 314 |
|
---|
[1457] | 315 | return( ans );
|
---|
| 316 | }
|
---|
| 317 |
|
---|
| 318 |
|
---|
[4017] | 319 | #ifdef TEST_MAIN
|
---|
| 320 |
|
---|
| 321 | /* Exercise program.
|
---|
| 322 | */
|
---|
| 323 | #include <stdio.h>
|
---|
| 324 | #include <stdlib.h>
|
---|
| 325 |
|
---|
| 326 | int main(int ac, char *av[])
|
---|
[1457] | 327 | {
|
---|
[4017] | 328 | double ans, mj, y = atof(av[1]);
|
---|
| 329 | year_mjd (y, &mj);
|
---|
| 330 | ans = deltat(mj);
|
---|
| 331 | printf( "%.4lf\n", ans );
|
---|
| 332 | return (0);
|
---|
[1457] | 333 | }
|
---|
| 334 | #endif
|
---|