1
/* (C) Mike Henderson <mghenderson@lanl.gov>.
3
* I've converted to glib types, removed unused variables, and piped the whole
4
* thing through indent.
6
* josh buhl <jbuhl@users.sourceforge.net>
13
UTTohhmm(gdouble UT, gint * h, gint * m)
20
*m = (gint) ((UT - (gdouble) (*h)) * 60.0 + 0.5);
23
* If it was 23:60 this should become 24:00
24
* I prefer this designation to 00:00. So dont reset h to 0 when it goes above 24.
34
Interp(gdouble ym, gdouble y0, gdouble yp, gdouble * xe, gdouble * ye,
35
gdouble * z1, gdouble * z2, gint * nz)
38
gdouble a, b, c, d, dx;
41
a = 0.5 * (ym + yp) - y0;
45
*ye = (a * (*xe) + b) * (*xe) + c;
46
d = b * b - 4.0 * a * c;
49
dx = 0.5 * sqrt(d) / fabs(a);
64
static gdouble SinH(CTrans * c, gdouble UT)
67
gdouble TU, TU2, TU3, LambdaMoon, BetaMoon, R, AGE, frac(), jd();
68
gdouble RA_Moon, DEC_Moon, gmst, lmst, Tau, epsilon, Moon();
71
TU = (jd(c->year, c->month, c->day, UT) - 2451545.0) / 36525.0;
73
/* this is more accurate, but expensive. */
76
Moon(TU, &LambdaMoon, &BetaMoon, &R, &AGE);
77
LambdaMoon *= RadPerDeg;
78
BetaMoon *= RadPerDeg;
80
(23.43929167 - 0.013004166 * TU - 1.6666667e-7 * TU2 -
81
5.0277777778e-7 * TU3) * RadPerDeg;
84
(sin(LambdaMoon) * cos(epsilon) -
85
tan(BetaMoon) * sin(epsilon), cos(LambdaMoon)));
87
asin(sin(BetaMoon) * cos(epsilon) +
88
cos(BetaMoon) * sin(epsilon) * sin(LambdaMoon));
91
/* This is less accurate, but computationally less expensive */
92
/* MiniMoon(TU, &RA_Moon, &DEC_Moon); */
93
/* RA_Moon *= 15.0*RadPerDeg; */
94
/* DEC_Moon *= RadPerDeg; */
97
* Compute Greenwich Mean Sidereal Time (gmst)
99
UT = 24.0 * frac(UT / 24.0);
100
/* this is for the ephemeris meridian???
101
gmst = 6.697374558 + 1.0027379093*UT + (8640184.812866+(0.093104-6.2e-6*TU)*TU)*TU/3600.0;
104
UT + 6.697374558 + (8640184.812866 +
106
6.2e-6 * TU) * TU) * TU / 3600.0;
107
lmst = 24.0 * frac((gmst - c->Glon / 15.0) / 24.0);
109
Tau = 15.0 * lmst * RadPerDeg - RA_Moon;
111
return (c->SinGlat * sin(DEC_Moon) +
112
c->CosGlat * cos(DEC_Moon) * cos(Tau));
117
MoonRise(CTrans * c, gdouble * UTRise, gdouble * UTSet)
120
gdouble UT, ym, y0, yp, SinH0;
121
gdouble xe, ye, z1, z2;
122
gint Rise, Set, nz, TimeZone;
124
SinH0 = sin(8.0 / 60.0 * RadPerDeg);
126
/* report rise and set times in LST */
127
TimeZone = c->UT - c->LST;
134
ym = SinH(c, UT - 1.0) - SinH0;
136
while ((UT <= 24.0 + TimeZone)) {
138
y0 = SinH(c, UT) - SinH0;
139
yp = SinH(c, UT + 1.0) - SinH0;
141
Interp(ym, y0, yp, &xe, &ye, &z1, &z2, &nz);
175
*UTRise = hour24(*UTRise);
182
*UTSet = hour24(*UTSet);