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 $"};
|
---|