xref: /plan9/sys/src/cmd/astro/main.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include "astro.h"
23e12c5d1SDavid du Colombier 
33e12c5d1SDavid du Colombier char*	herefile = "/lib/sky/here";
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier void
main(int argc,char * argv[])63e12c5d1SDavid du Colombier main(int argc, char *argv[])
73e12c5d1SDavid du Colombier {
83e12c5d1SDavid du Colombier 	int i, j;
93e12c5d1SDavid du Colombier 	double d;
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier 	pi = atan(1.0)*4;
1259cc4ca5SDavid du Colombier 	pipi = pi*2;
133e12c5d1SDavid du Colombier 	radian = pi/180;
143e12c5d1SDavid du Colombier 	radsec = radian/3600;
157dd7cddfSDavid du Colombier 	converge = 1.0e-14;
163e12c5d1SDavid du Colombier 
173e12c5d1SDavid du Colombier 	fmtinstall('R', Rconv);
183e12c5d1SDavid du Colombier 	fmtinstall('D', Dconv);
193e12c5d1SDavid du Colombier 
207dd7cddfSDavid du Colombier 	per = PER;
213e12c5d1SDavid du Colombier 	deld = PER/NPTS;
22*80ee5cbfSDavid du Colombier 	init();
237dd7cddfSDavid du Colombier 	args(argc, argv);
24*80ee5cbfSDavid du Colombier 	init();
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier loop:
273e12c5d1SDavid du Colombier 	d = day;
283e12c5d1SDavid du Colombier 	pdate(d);
297dd7cddfSDavid du Colombier 	if(flags['p'] || flags['e']) {
303e12c5d1SDavid du Colombier 		print(" ");
313e12c5d1SDavid du Colombier 		ptime(d);
3259cc4ca5SDavid du Colombier 		pstime(d);
333e12c5d1SDavid du Colombier 	}
343e12c5d1SDavid du Colombier 	print("\n");
353e12c5d1SDavid du Colombier 	for(i=0; i<=NPTS+1; i++) {
363e12c5d1SDavid du Colombier 		setime(d);
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier 		for(j=0; objlst[j]; j++) {
393e12c5d1SDavid du Colombier 			(*objlst[j]->obj)();
403e12c5d1SDavid du Colombier 			setobj(&objlst[j]->point[i]);
413e12c5d1SDavid du Colombier 			if(flags['p']) {
423e12c5d1SDavid du Colombier 				if(flags['m'])
433e12c5d1SDavid du Colombier 					if(strcmp(objlst[j]->name, "Comet"))
443e12c5d1SDavid du Colombier 						continue;
453e12c5d1SDavid du Colombier 				output(objlst[j]->name, &objlst[j]->point[i]);
463e12c5d1SDavid du Colombier 			}
473e12c5d1SDavid du Colombier 		}
483e12c5d1SDavid du Colombier 		if(flags['e']) {
497dd7cddfSDavid du Colombier 			d = dist(&eobj1->point[i], &eobj2->point[i]);
507dd7cddfSDavid du Colombier 			print("dist %s to %s = %.4f\n", eobj1->name, eobj2->name, d);
513e12c5d1SDavid du Colombier 		}
527dd7cddfSDavid du Colombier //		if(flags['p']) {
537dd7cddfSDavid du Colombier //			pdate(d);
547dd7cddfSDavid du Colombier //			print(" ");
557dd7cddfSDavid du Colombier //			ptime(d);
567dd7cddfSDavid du Colombier //			print("\n");
577dd7cddfSDavid du Colombier //		}
587dd7cddfSDavid du Colombier 		if(flags['p'] || flags['e'])
593e12c5d1SDavid du Colombier 			break;
603e12c5d1SDavid du Colombier 		d += deld;
613e12c5d1SDavid du Colombier 	}
627dd7cddfSDavid du Colombier 	if(!(flags['p'] || flags['e']))
633e12c5d1SDavid du Colombier 		search();
647dd7cddfSDavid du Colombier 	day += per;
653e12c5d1SDavid du Colombier 	nperiods -= 1;
663e12c5d1SDavid du Colombier 	if(nperiods > 0)
673e12c5d1SDavid du Colombier 		goto loop;
683e12c5d1SDavid du Colombier 	exits(0);
693e12c5d1SDavid du Colombier }
703e12c5d1SDavid du Colombier 
713e12c5d1SDavid du Colombier void
args(int argc,char * argv[])723e12c5d1SDavid du Colombier args(int argc, char *argv[])
733e12c5d1SDavid du Colombier {
743e12c5d1SDavid du Colombier 	char *p;
753e12c5d1SDavid du Colombier 	long t;
767dd7cddfSDavid du Colombier 	int f, i;
777dd7cddfSDavid du Colombier 	Obj2 *q;
783e12c5d1SDavid du Colombier 
793e12c5d1SDavid du Colombier 	memset(flags, 0, sizeof(flags));
803e12c5d1SDavid du Colombier 	ARGBEGIN {
813e12c5d1SDavid du Colombier 	default:
827dd7cddfSDavid du Colombier 		fprint(2, "astro [-adeklmopst] [-c nperiod] [-C tperiod]\n");
837dd7cddfSDavid du Colombier 		exits(0);
843e12c5d1SDavid du Colombier 
853e12c5d1SDavid du Colombier 	case 'c':
863e12c5d1SDavid du Colombier 		nperiods = 1;
873e12c5d1SDavid du Colombier 		p = ARGF();
883e12c5d1SDavid du Colombier 		if(p)
893e12c5d1SDavid du Colombier 			nperiods = atol(p);
907dd7cddfSDavid du Colombier 		flags['c']++;
913e12c5d1SDavid du Colombier 		break;
927dd7cddfSDavid du Colombier 	case 'C':
937dd7cddfSDavid du Colombier 		p = ARGF();
947dd7cddfSDavid du Colombier 		if(p)
957dd7cddfSDavid du Colombier 			per = atof(p);
967dd7cddfSDavid du Colombier 		break;
973e12c5d1SDavid du Colombier 	case 'e':
987dd7cddfSDavid du Colombier 		eobj1 = nil;
997dd7cddfSDavid du Colombier 		eobj2 = nil;
1007dd7cddfSDavid du Colombier 		p = ARGF();
1017dd7cddfSDavid du Colombier 		if(p) {
1027dd7cddfSDavid du Colombier 			for(i=0; q=objlst[i]; i++) {
1037dd7cddfSDavid du Colombier 				if(strcmp(q->name, p) == 0)
1047dd7cddfSDavid du Colombier 					eobj1 = q;
1057dd7cddfSDavid du Colombier 				if(strcmp(q->name1, p) == 0)
1067dd7cddfSDavid du Colombier 					eobj1 = q;
1077dd7cddfSDavid du Colombier 			}
1087dd7cddfSDavid du Colombier 			p = ARGF();
1097dd7cddfSDavid du Colombier 			if(p) {
1107dd7cddfSDavid du Colombier 				for(i=0; q=objlst[i]; i++) {
1117dd7cddfSDavid du Colombier 					if(strcmp(q->name, p) == 0)
1127dd7cddfSDavid du Colombier 						eobj2 = q;
1137dd7cddfSDavid du Colombier 					if(strcmp(q->name1, p) == 0)
1147dd7cddfSDavid du Colombier 						eobj2 = q;
1157dd7cddfSDavid du Colombier 				}
1167dd7cddfSDavid du Colombier 			}
1177dd7cddfSDavid du Colombier 		}
1187dd7cddfSDavid du Colombier 		if(eobj1 && eobj2) {
1197dd7cddfSDavid du Colombier 			flags['e']++;
1207dd7cddfSDavid du Colombier 			break;
1217dd7cddfSDavid du Colombier 		}
1227dd7cddfSDavid du Colombier 		fprint(2, "cant recognize eclipse objects\n");
1237dd7cddfSDavid du Colombier 		exits("eflag");
1247dd7cddfSDavid du Colombier 
1257dd7cddfSDavid du Colombier 	case 'a':
1267dd7cddfSDavid du Colombier 	case 'd':
127*80ee5cbfSDavid du Colombier 	case 'j':
1287dd7cddfSDavid du Colombier 	case 'k':
1297dd7cddfSDavid du Colombier 	case 'l':
1307dd7cddfSDavid du Colombier 	case 'm':
1317dd7cddfSDavid du Colombier 	case 'o':
1323e12c5d1SDavid du Colombier 	case 'p':
1333e12c5d1SDavid du Colombier 	case 's':
1343e12c5d1SDavid du Colombier 	case 't':
1353e12c5d1SDavid du Colombier 		flags[ARGC()]++;
1363e12c5d1SDavid du Colombier 		break;
1373e12c5d1SDavid du Colombier 	} ARGEND
138219b2ee8SDavid du Colombier 	if(*argv){
1397dd7cddfSDavid du Colombier 		fprint(2, "usage: astro [-dlpsatokm] [-c nday] [-e obj1 obj2]\n");
140219b2ee8SDavid du Colombier 		exits("usage");
141219b2ee8SDavid du Colombier 	}
1423e12c5d1SDavid du Colombier 
1433e12c5d1SDavid du Colombier 	t = time(0);
1443e12c5d1SDavid du Colombier 	day = t/86400. + 25567.5;
1453e12c5d1SDavid du Colombier 	if(flags['d'])
1463e12c5d1SDavid du Colombier 		day = readate();
147*80ee5cbfSDavid du Colombier 	if(flags['j'])
148*80ee5cbfSDavid du Colombier 		print("jday = %.4f\n", day);
1493e12c5d1SDavid du Colombier 	deltat = day * .001704;
15059cc4ca5SDavid du Colombier 	if(deltat > 32.184)		// assume date is utc1
15159cc4ca5SDavid du Colombier 		deltat = 32.184;	// correct by leap sec
1523e12c5d1SDavid du Colombier 	if(flags['t'])
1533e12c5d1SDavid du Colombier 		deltat = readdt();
1543e12c5d1SDavid du Colombier 
1553e12c5d1SDavid du Colombier 	if(flags['l']) {
15659cc4ca5SDavid du Colombier 		fprint(2, "nlat wlong elev\n");
1573e12c5d1SDavid du Colombier 		readlat(0);
1583e12c5d1SDavid du Colombier 	} else {
1593e12c5d1SDavid du Colombier 		f = open(herefile, OREAD);
1603e12c5d1SDavid du Colombier 		if(f < 0) {
1613e12c5d1SDavid du Colombier 			fprint(2, "%s?\n", herefile);
1623e12c5d1SDavid du Colombier 			/* btl mh */
1633e12c5d1SDavid du Colombier 			nlat = (40 + 41.06/60)*radian;
1643e12c5d1SDavid du Colombier 			awlong = (74 + 23.98/60)*radian;
1653e12c5d1SDavid du Colombier 			elev = 150 * 3.28084;
1663e12c5d1SDavid du Colombier 		} else {
1673e12c5d1SDavid du Colombier 			readlat(f);
1683e12c5d1SDavid du Colombier 			close(f);
1693e12c5d1SDavid du Colombier 		}
1703e12c5d1SDavid du Colombier 	}
1713e12c5d1SDavid du Colombier }
1723e12c5d1SDavid du Colombier 
1733e12c5d1SDavid du Colombier double
readate(void)1743e12c5d1SDavid du Colombier readate(void)
1753e12c5d1SDavid du Colombier {
1763e12c5d1SDavid du Colombier 	int i;
1773e12c5d1SDavid du Colombier 	Tim t;
1783e12c5d1SDavid du Colombier 
17959cc4ca5SDavid du Colombier 	fprint(2, "year mo da hr min\n");
1803e12c5d1SDavid du Colombier 	rline(0);
1813e12c5d1SDavid du Colombier 	for(i=0; i<5; i++)
1823e12c5d1SDavid du Colombier 		t.ifa[i] = atof(skip(i));
1833e12c5d1SDavid du Colombier 	return convdate(&t);
1843e12c5d1SDavid du Colombier }
1853e12c5d1SDavid du Colombier 
1863e12c5d1SDavid du Colombier double
readdt(void)1873e12c5d1SDavid du Colombier readdt(void)
1883e12c5d1SDavid du Colombier {
1893e12c5d1SDavid du Colombier 
19059cc4ca5SDavid du Colombier 	fprint(2, "ΔT (sec) (%.3f)\n", deltat);
1913e12c5d1SDavid du Colombier 	rline(0);
1923e12c5d1SDavid du Colombier 	return atof(skip(0));
1933e12c5d1SDavid du Colombier }
1943e12c5d1SDavid du Colombier 
1953e12c5d1SDavid du Colombier double
etdate(long year,int mo,double day)1963e12c5d1SDavid du Colombier etdate(long year, int mo, double day)
1973e12c5d1SDavid du Colombier {
1983e12c5d1SDavid du Colombier 	Tim t;
1993e12c5d1SDavid du Colombier 
2003e12c5d1SDavid du Colombier 	t.ifa[0] = year;
2013e12c5d1SDavid du Colombier 	t.ifa[1] = mo;
2023e12c5d1SDavid du Colombier 	t.ifa[2] = day;
2033e12c5d1SDavid du Colombier 	t.ifa[3] = 0;
2043e12c5d1SDavid du Colombier 	t.ifa[4] = 0;
2053e12c5d1SDavid du Colombier 	return convdate(&t) + 2415020;
2063e12c5d1SDavid du Colombier }
2073e12c5d1SDavid du Colombier 
2083e12c5d1SDavid du Colombier void
readlat(int f)2093e12c5d1SDavid du Colombier readlat(int f)
2103e12c5d1SDavid du Colombier {
2113e12c5d1SDavid du Colombier 
2123e12c5d1SDavid du Colombier 	rline(f);
2133e12c5d1SDavid du Colombier 	nlat = atof(skip(0)) * radian;
2143e12c5d1SDavid du Colombier 	awlong = atof(skip(1)) * radian;
2153e12c5d1SDavid du Colombier 	elev = atof(skip(2)) * 3.28084;
2163e12c5d1SDavid du Colombier }
2173e12c5d1SDavid du Colombier 
2183e12c5d1SDavid du Colombier double
fmod(double a,double b)2193e12c5d1SDavid du Colombier fmod(double a, double b)
2203e12c5d1SDavid du Colombier {
2213e12c5d1SDavid du Colombier 	return a - floor(a/b)*b;
2223e12c5d1SDavid du Colombier }
223