home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume19 / xephem / part21 / utc_gst.c < prev   
Encoding:
C/C++ Source or Header  |  1993-05-15  |  1.6 KB  |  80 lines

  1. #include "astro.h"
  2.  
  3. #if defined(__STDC__) || defined(__cplusplus)
  4. #define P_(s) s
  5. #else
  6. #define P_(s) ()
  7. #endif
  8.  
  9. extern void cal_mjd P_((int mn, double dy, int yr, double *Mjd));
  10. extern void mjd_cal P_((double Mjd, int *mn, double *dy, int *yr));
  11. extern void range P_((double *v, double r));
  12.  
  13. void utc_gst P_((double mjd, double utc, double *gst));
  14. void gst_utc P_((double mjd, double gst, double *utc));
  15. static double tnaught P_((double mjd));
  16.  
  17. #undef P_
  18.  
  19.  
  20.  
  21. /* given a modified julian date, mjd, and a universally coordinated time, utc,
  22.  * return greenwich mean siderial time, *gst.
  23.  */
  24. void
  25. utc_gst (mjd, utc, gst)
  26. double mjd;
  27. double utc;
  28. double *gst;
  29. {
  30.     static double lastmjd = -10000;
  31.     static double t0;
  32.  
  33.     if (mjd != lastmjd) {
  34.         t0 = tnaught (mjd);
  35.         lastmjd = mjd;
  36.     }
  37.     *gst = (1.0/SIDRATE)*utc + t0;
  38.     range (gst, 24.0);
  39. }
  40.  
  41. /* given a modified julian date, mjd, and a greenwich mean siderial time, gst,
  42.  * return universally coordinated time, *utc.
  43.  */
  44. void
  45. gst_utc (mjd, gst, utc)
  46. double mjd;
  47. double gst;
  48. double *utc;
  49. {
  50.     static double lastmjd = -10000;
  51.     static double t0;
  52.  
  53.     if (mjd != lastmjd) {
  54.         t0 = tnaught (mjd);
  55.         range (&t0, 24.0);
  56.         lastmjd = mjd;
  57.     }
  58.     *utc = gst - t0;
  59.     range (utc, 24.0);
  60.     *utc *= SIDRATE;
  61. }
  62.  
  63. static double
  64. tnaught (mjd)
  65. double mjd;    /* julian days since 1900 jan 0.5 */
  66. {
  67.     double dmjd;
  68.     int m, y;
  69.     double d;
  70.     double t, t0;
  71.  
  72.     mjd_cal (mjd, &m, &d, &y);
  73.     cal_mjd (1, 0., y, &dmjd);
  74.     t = dmjd/36525;
  75.     t0 = 6.57098e-2 * (mjd - dmjd) - 
  76.          (24 - (6.6460656 + (5.1262e-2 + (t * 2.581e-5))*t) -
  77.            (2400 * (t - (((double)y - 1900)/100))));
  78.     return (t0);
  79. }
  80.