xref: /plan9/sys/src/cmd/astro/comet.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include "astro.h"
23e12c5d1SDavid du Colombier 
37dd7cddfSDavid du Colombier #define	MAXE	(.999)	/* cant do hyperbolas */
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier void
comet(void)63e12c5d1SDavid du Colombier comet(void)
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	double pturbl, pturbb, pturbr;
93e12c5d1SDavid du Colombier 	double lograd;
103e12c5d1SDavid du Colombier 	double dele, enom, vnom, nd, sl;
113e12c5d1SDavid du Colombier 
123e12c5d1SDavid du Colombier 	struct	elem
133e12c5d1SDavid du Colombier 	{
143e12c5d1SDavid du Colombier 		double	t;	/* time of perihelion */
153e12c5d1SDavid du Colombier 		double	q;	/* perihelion distance */
163e12c5d1SDavid du Colombier 		double	e;	/* eccentricity */
173e12c5d1SDavid du Colombier 		double	i;	/* inclination */
183e12c5d1SDavid du Colombier 		double	w;	/* argument of perihelion */
193e12c5d1SDavid du Colombier 		double	o;	/* longitude of ascending node */
203e12c5d1SDavid du Colombier 	} elem;
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier /*	elem = (struct elem)
233e12c5d1SDavid du Colombier 	{
243e12c5d1SDavid du Colombier 		etdate(1990, 5, 19.293),
253e12c5d1SDavid du Colombier 		0.9362731,
263e12c5d1SDavid du Colombier 		0.6940149,
273e12c5d1SDavid du Colombier 		11.41096,
283e12c5d1SDavid du Colombier 		198.77059,
293e12c5d1SDavid du Colombier 		69.27130,
303e12c5d1SDavid du Colombier 	};	/* p/schwassmann-wachmann 3, 1989d */
313e12c5d1SDavid du Colombier /*	elem = (struct elem)
323e12c5d1SDavid du Colombier 	{
333e12c5d1SDavid du Colombier 		etdate(1990, 4, 9.9761),
343e12c5d1SDavid du Colombier 		0.349957,
353e12c5d1SDavid du Colombier 		1.00038,
363e12c5d1SDavid du Colombier 		58.9596,
373e12c5d1SDavid du Colombier 		61.5546,
383e12c5d1SDavid du Colombier 		75.2132,
393e12c5d1SDavid du Colombier 	};	/* austin 3, 1989c */
407dd7cddfSDavid du Colombier /*	elem = (struct elem)
413e12c5d1SDavid du Colombier 	{
423e12c5d1SDavid du Colombier 		etdate(1990, 10, 24.36),
433e12c5d1SDavid du Colombier 		0.9385,
443e12c5d1SDavid du Colombier 		1.00038,
453e12c5d1SDavid du Colombier 		131.62,
463e12c5d1SDavid du Colombier 		242.58,
473e12c5d1SDavid du Colombier 		138.57,
483e12c5d1SDavid du Colombier 	};	/* levy 6 , 1990c */
497dd7cddfSDavid du Colombier /*	elem=(struct elem)
507dd7cddfSDavid du Colombier 	{
517dd7cddfSDavid du Colombier 		etdate(1996, 5, 1.3965),
527dd7cddfSDavid du Colombier 		0.230035,
537dd7cddfSDavid du Colombier 		0.999662,
547dd7cddfSDavid du Colombier 		124.9098,
557dd7cddfSDavid du Colombier 		130.2102,
567dd7cddfSDavid du Colombier 		188.0430,
577dd7cddfSDavid du Colombier 	};	/* C/1996 B2 (Hyakutake) */
5859cc4ca5SDavid du Colombier /*	elem=(struct elem)
597dd7cddfSDavid du Colombier 	{
607dd7cddfSDavid du Colombier 		etdate(1997, 4, 1.13413),
617dd7cddfSDavid du Colombier 		0.9141047,
627dd7cddfSDavid du Colombier 		0.9950989,
637dd7cddfSDavid du Colombier 		89.42932,
647dd7cddfSDavid du Colombier 		130.59066,
657dd7cddfSDavid du Colombier 		282.47069,
667dd7cddfSDavid du Colombier 	};	/*C/1995 O1 (Hale-Bopp) */
67*9a747e4fSDavid du Colombier /*	elem=(struct elem)
6859cc4ca5SDavid du Colombier 	{
6959cc4ca5SDavid du Colombier 		etdate(2000, 7, 26.1754),
7059cc4ca5SDavid du Colombier 		0.765126,
7159cc4ca5SDavid du Colombier 		0.999356,
7259cc4ca5SDavid du Colombier 		149.3904,
7359cc4ca5SDavid du Colombier 		151.0510,
7459cc4ca5SDavid du Colombier 		83.1909,
7559cc4ca5SDavid du Colombier 	};	/*C/1999 S4 (Linear) */
76*9a747e4fSDavid du Colombier 	elem=(struct elem)
77*9a747e4fSDavid du Colombier 	{
78*9a747e4fSDavid du Colombier 		etdate(2002, 3, 18.9784),
79*9a747e4fSDavid du Colombier 		0.5070601,
80*9a747e4fSDavid du Colombier 		0.990111,
81*9a747e4fSDavid du Colombier 		28.12106,
82*9a747e4fSDavid du Colombier 		34.6666,
83*9a747e4fSDavid du Colombier 		93.1206,
84*9a747e4fSDavid du Colombier 	};	/*C/2002 C1 (Ikeya-Zhang) */
853e12c5d1SDavid du Colombier 
863e12c5d1SDavid du Colombier 	ecc = elem.e;
873e12c5d1SDavid du Colombier 	if(ecc > MAXE)
883e12c5d1SDavid du Colombier 		ecc = MAXE;
893e12c5d1SDavid du Colombier 	incl = elem.i * radian;
903e12c5d1SDavid du Colombier 	node = (elem.o + 0.4593) * radian;
913e12c5d1SDavid du Colombier 	argp = (elem.w + elem.o + 0.4066) * radian;
923e12c5d1SDavid du Colombier 	mrad = elem.q / (1-ecc);
933e12c5d1SDavid du Colombier         motion = .01720209895 * sqrt(1/(mrad*mrad*mrad))/radian;
943e12c5d1SDavid du Colombier 	anom = (eday - (elem.t - 2415020)) * motion * radian;
953e12c5d1SDavid du Colombier 	enom = anom + ecc*sin(anom);
963e12c5d1SDavid du Colombier 
973e12c5d1SDavid du Colombier 	do {
983e12c5d1SDavid du Colombier 		dele = (anom - enom + ecc * sin(enom)) /
993e12c5d1SDavid du Colombier 			(1 - ecc*cos(enom));
1003e12c5d1SDavid du Colombier 		enom += dele;
1017dd7cddfSDavid du Colombier 	} while(fabs(dele) > converge);
1023e12c5d1SDavid du Colombier 
1033e12c5d1SDavid du Colombier 	vnom = 2*atan2(
1043e12c5d1SDavid du Colombier 		sqrt((1+ecc)/(1-ecc))*sin(enom/2),
1053e12c5d1SDavid du Colombier 		cos(enom/2));
1063e12c5d1SDavid du Colombier 	rad = mrad*(1-ecc*cos(enom));
1073e12c5d1SDavid du Colombier 	lambda = vnom + argp;
1083e12c5d1SDavid du Colombier 	pturbl = 0;
1093e12c5d1SDavid du Colombier 	lambda += pturbl*radsec;
1103e12c5d1SDavid du Colombier 	pturbb = 0;
1113e12c5d1SDavid du Colombier 	pturbr = 0;
1123e12c5d1SDavid du Colombier 
1133e12c5d1SDavid du Colombier /*
1143e12c5d1SDavid du Colombier  *	reduce to the ecliptic
1153e12c5d1SDavid du Colombier  */
1163e12c5d1SDavid du Colombier 	nd = lambda - node;
1173e12c5d1SDavid du Colombier 	lambda = node + atan2(sin(nd)*cos(incl),cos(nd));
1183e12c5d1SDavid du Colombier 
1193e12c5d1SDavid du Colombier 	sl = sin(incl)*sin(nd) + pturbb*radsec;
1203e12c5d1SDavid du Colombier 	beta = atan2(sl, sqrt(1-sl*sl));
1213e12c5d1SDavid du Colombier 
1223e12c5d1SDavid du Colombier 	lograd = pturbr*2.30258509;
1233e12c5d1SDavid du Colombier 	rad *= 1 + lograd;
1243e12c5d1SDavid du Colombier 
1253e12c5d1SDavid du Colombier 	motion *= radian*mrad*mrad/(rad*rad);
1263e12c5d1SDavid du Colombier 	semi = 0;
1273e12c5d1SDavid du Colombier 
1283e12c5d1SDavid du Colombier 	mag = 5.47 + 6.1/2.303*log(rad);
1293e12c5d1SDavid du Colombier 
1303e12c5d1SDavid du Colombier 	helio();
1313e12c5d1SDavid du Colombier 	geo();
1323e12c5d1SDavid du Colombier }
133