| #include "astro.h" |
| |
| #define MAXE (.999) /* cant do hyperbolas */ |
| |
| struct elem |
| { |
| double t; /* time of perihelion */ |
| double q; /* perihelion distance */ |
| double e; /* eccentricity */ |
| double i; /* inclination */ |
| double w; /* argument of perihelion */ |
| double o; /* longitude of ascending node */ |
| }; |
| |
| struct elem |
| mkelem(double t, double q, double e, double i, double w, double o) |
| { |
| struct elem el; |
| |
| el.t = t; |
| el.q = q; |
| el.e = e; |
| el.i = i; |
| el.w = w; |
| el.o = o; |
| return el; |
| } |
| |
| void |
| comet(void) |
| { |
| double pturbl, pturbb, pturbr; |
| double lograd; |
| double dele, enom, vnom, nd, sl; |
| struct elem elem; |
| |
| /* elem = (struct elem) |
| { |
| etdate(1990, 5, 19.293), |
| 0.9362731, |
| 0.6940149, |
| 11.41096, |
| 198.77059, |
| 69.27130, |
| }; /* p/schwassmann-wachmann 3, 1989d */ |
| /* elem = (struct elem) |
| { |
| etdate(1990, 4, 9.9761), |
| 0.349957, |
| 1.00038, |
| 58.9596, |
| 61.5546, |
| 75.2132, |
| }; /* austin 3, 1989c */ |
| /* elem = (struct elem) |
| { |
| etdate(1990, 10, 24.36), |
| 0.9385, |
| 1.00038, |
| 131.62, |
| 242.58, |
| 138.57, |
| }; /* levy 6 , 1990c */ |
| /* elem=(struct elem) |
| { |
| etdate(1996, 5, 1.3965), |
| 0.230035, |
| 0.999662, |
| 124.9098, |
| 130.2102, |
| 188.0430, |
| }; /* C/1996 B2 (Hyakutake) */ |
| /* elem=(struct elem) |
| { |
| etdate(1997, 4, 1.13413), |
| 0.9141047, |
| 0.9950989, |
| 89.42932, |
| 130.59066, |
| 282.47069, |
| }; /*C/1995 O1 (Hale-Bopp) */ |
| /* elem=(struct elem) |
| { |
| etdate(2000, 7, 26.1754), |
| 0.765126, |
| 0.999356, |
| 149.3904, |
| 151.0510, |
| 83.1909, |
| }; /*C/1999 S4 (Linear) */ |
| elem = mkelem( |
| etdate(2002, 3, 18.9784), |
| 0.5070601, |
| 0.990111, |
| 28.12106, |
| 34.6666, |
| 93.1206 |
| ); /*C/2002 C1 (Ikeya-Zhang) */ |
| |
| ecc = elem.e; |
| if(ecc > MAXE) |
| ecc = MAXE; |
| incl = elem.i * radian; |
| node = (elem.o + 0.4593) * radian; |
| argp = (elem.w + elem.o + 0.4066) * radian; |
| mrad = elem.q / (1-ecc); |
| motion = .01720209895 * sqrt(1/(mrad*mrad*mrad))/radian; |
| anom = (eday - (elem.t - 2415020)) * motion * radian; |
| enom = anom + ecc*sin(anom); |
| |
| do { |
| dele = (anom - enom + ecc * sin(enom)) / |
| (1 - ecc*cos(enom)); |
| enom += dele; |
| } while(fabs(dele) > converge); |
| |
| vnom = 2*atan2( |
| sqrt((1+ecc)/(1-ecc))*sin(enom/2), |
| cos(enom/2)); |
| rad = mrad*(1-ecc*cos(enom)); |
| lambda = vnom + argp; |
| pturbl = 0; |
| lambda += pturbl*radsec; |
| pturbb = 0; |
| pturbr = 0; |
| |
| /* |
| * reduce to the ecliptic |
| */ |
| nd = lambda - node; |
| lambda = node + atan2(sin(nd)*cos(incl),cos(nd)); |
| |
| sl = sin(incl)*sin(nd) + pturbb*radsec; |
| beta = atan2(sl, sqrt(1-sl*sl)); |
| |
| lograd = pturbr*2.30258509; |
| rad *= 1 + lograd; |
| |
| motion *= radian*mrad*mrad/(rad*rad); |
| semi = 0; |
| |
| mag = 5.47 + 6.1/2.303*log(rad); |
| |
| helio(); |
| geo(); |
| } |