| 1 | #include "P_.h" | 
|---|
| 2 | #include "astro.h" | 
|---|
| 3 |  | 
|---|
| 4 | static double gmst0 P_((double mjd)); | 
|---|
| 5 |  | 
|---|
| 6 | /* given a modified julian date, mjd, and a universally coordinated time, utc, | 
|---|
| 7 | * return greenwich mean siderial time, *gst. | 
|---|
| 8 | * N.B. mjd must be at the beginning of the day. | 
|---|
| 9 | */ | 
|---|
| 10 | void | 
|---|
| 11 | utc_gst (mjd, utc, gst) | 
|---|
| 12 | double mjd; | 
|---|
| 13 | double utc; | 
|---|
| 14 | double *gst; | 
|---|
| 15 | { | 
|---|
| 16 | static double lastmjd = -18981; | 
|---|
| 17 | static double t0; | 
|---|
| 18 |  | 
|---|
| 19 | if (mjd != lastmjd) { | 
|---|
| 20 | t0 = gmst0(mjd); | 
|---|
| 21 | lastmjd = mjd; | 
|---|
| 22 | } | 
|---|
| 23 | *gst = (1.0/SIDRATE)*utc + t0; | 
|---|
| 24 | range (gst, 24.0); | 
|---|
| 25 | } | 
|---|
| 26 |  | 
|---|
| 27 | /* given a modified julian date, mjd, and a greenwich mean siderial time, gst, | 
|---|
| 28 | * return universally coordinated time, *utc. | 
|---|
| 29 | * N.B. mjd must be at the beginning of the day. | 
|---|
| 30 | */ | 
|---|
| 31 | void | 
|---|
| 32 | gst_utc (mjd, gst, utc) | 
|---|
| 33 | double mjd; | 
|---|
| 34 | double gst; | 
|---|
| 35 | double *utc; | 
|---|
| 36 | { | 
|---|
| 37 | static double lastmjd = -10000; | 
|---|
| 38 | static double t0; | 
|---|
| 39 |  | 
|---|
| 40 | if (mjd != lastmjd) { | 
|---|
| 41 | t0 = gmst0 (mjd); | 
|---|
| 42 | lastmjd = mjd; | 
|---|
| 43 | } | 
|---|
| 44 | *utc = gst - t0; | 
|---|
| 45 | range (utc, 24.0); | 
|---|
| 46 | *utc *= SIDRATE; | 
|---|
| 47 | } | 
|---|
| 48 |  | 
|---|
| 49 | /* gmst0() - return Greenwich Mean Sidereal Time at 0h UT; stern | 
|---|
| 50 | */ | 
|---|
| 51 | static double | 
|---|
| 52 | gmst0 (mjd) | 
|---|
| 53 | double mjd;     /* date at 0h UT in julian days since MJD0 */ | 
|---|
| 54 | { | 
|---|
| 55 | double T, x; | 
|---|
| 56 |  | 
|---|
| 57 | T = ((int)(mjd - 0.5) + 0.5 - J2000)/36525.0; | 
|---|
| 58 | x = 24110.54841 + | 
|---|
| 59 | (8640184.812866 + (0.093104 - 6.2e-6 * T) * T) * T; | 
|---|
| 60 | x /= 3600.0; | 
|---|
| 61 | range(&x, 24.0); | 
|---|
| 62 | return (x); | 
|---|
| 63 | } | 
|---|
| 64 |  | 
|---|
| 65 | #ifdef TEST_GMST | 
|---|
| 66 |  | 
|---|
| 67 | /* original routine by elwood; has a secular drift of 0.08s/cty */ | 
|---|
| 68 | static double | 
|---|
| 69 | tnaught (mjd) | 
|---|
| 70 | double mjd;     /* julian days since 1900 jan 0.5 */ | 
|---|
| 71 | { | 
|---|
| 72 | double dmjd; | 
|---|
| 73 | int m, y; | 
|---|
| 74 | double d; | 
|---|
| 75 | double t, t0; | 
|---|
| 76 |  | 
|---|
| 77 | mjd_cal (mjd, &m, &d, &y); | 
|---|
| 78 | cal_mjd (1, 0., y, &dmjd); | 
|---|
| 79 | t = dmjd/36525; | 
|---|
| 80 | t0 = 6.57098e-2 * (mjd - dmjd) - | 
|---|
| 81 | (24 - (6.6460656 + (5.1262e-2 + (t * 2.581e-5))*t) - | 
|---|
| 82 | (2400 * (t - (((double)y - 1900)/100)))); | 
|---|
| 83 | range(&t0, 24.0); | 
|---|
| 84 | return (t0); | 
|---|
| 85 | } | 
|---|
| 86 |  | 
|---|
| 87 | #include <stdlib.h> | 
|---|
| 88 | main(argc, argv) | 
|---|
| 89 | int argc; | 
|---|
| 90 | char *argv[]; | 
|---|
| 91 | { | 
|---|
| 92 | double mjd, gst; | 
|---|
| 93 | while (scanf("%lf", &mjd) == 1) { | 
|---|
| 94 | mjd -= MJD0; | 
|---|
| 95 | gst = tnaught(mjd); | 
|---|
| 96 | printf("%17.9f %10.7f %10.7f\n", mjd + MJD0, gst, gmst0(mjd)); | 
|---|
| 97 | } | 
|---|
| 98 | } | 
|---|
| 99 | #endif | 
|---|
| 100 |  | 
|---|
| 101 | /* For RCS Only -- Do Not Edit */ | 
|---|
| 102 | static char *rcsid[2] = {(char *)rcsid, "@(#) $RCSfile: utc_gst.c,v $ $Date: 2001-04-10 14:40:47 $ $Revision: 1.1.1.1 $ $Name: not supported by cvs2svn $"}; | 
|---|