231 lines · 3.8 KB · C
RawDownload
/*  * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #include "astro.h" char*	herefile = "/lib/sky/here"; voidmain(int argc, char *argv[]){	int i, j;	double d; 	pi = atan(1.0)*4;	pipi = pi*2;	radian = pi/180;	radsec = radian/3600;	converge = 1.0e-14; 	fmtinstall('R', Rconv);	fmtinstall('D', Dconv); 	per = PER;	deld = PER/NPTS;	init();	args(argc, argv);	init(); loop:	d = day;	pdate(d);	if(flags['p'] || flags['e']) {		print(" ");		ptime(d);		pstime(d);	}	print("\n");	for(i=0; i<=NPTS+1; i++) {		setime(d); 		for(j=0; objlst[j]; j++) {			(*objlst[j]->obj)();			setobj(&objlst[j]->point[i]);			if(flags['p']) {				if(flags['m'])					if(strcmp(objlst[j]->name, "Comet"))						continue;				output(objlst[j]->name, &objlst[j]->point[i]);			}		}		if(flags['e']) {			d = dist(&eobj1->point[i], &eobj2->point[i]);			print("dist %s to %s = %.4f\n", eobj1->name, eobj2->name, d);		}//		if(flags['p']) {//			pdate(d);//			print(" ");//			ptime(d);//			print("\n");//		}		if(flags['p'] || flags['e'])			break;		d += deld;	}	if(!(flags['p'] || flags['e']))		search();	day += per;	nperiods -= 1;	if(nperiods > 0)		goto loop;	exits(0);} voidargs(int argc, char *argv[]){	char *p;	long t;	int f, i;	Obj2 *q; 	memset(flags, 0, sizeof(flags));	ARGBEGIN {	default:		fprint(2, "astro [-adeklmopst] [-c nperiod] [-C tperiod]\n");		exits(0); 	case 'c':		nperiods = 1;		p = ARGF();		if(p)			nperiods = atol(p);		flags['c']++;		break;	case 'C':		p = ARGF();		if(p)			per = atof(p);		break;	case 'e':		eobj1 = nil;		eobj2 = nil;		p = ARGF();		if(p) {			for(i=0; q=objlst[i]; i++) {				if(strcmp(q->name, p) == 0)					eobj1 = q;				if(strcmp(q->name1, p) == 0)					eobj1 = q;			}			p = ARGF();			if(p) {				for(i=0; q=objlst[i]; i++) {					if(strcmp(q->name, p) == 0)						eobj2 = q;					if(strcmp(q->name1, p) == 0)						eobj2 = q;				}			}		}		if(eobj1 && eobj2) {			flags['e']++;			break;		}		fprint(2, "cant recognize eclipse objects\n");		exits("eflag"); 	case 'a':	case 'd':	case 'j':	case 'k':	case 'l':	case 'm':	case 'o':	case 'p':	case 's':	case 't':		flags[ARGC()]++;		break;	} ARGEND	if(*argv){		fprint(2, "usage: astro [-dlpsatokm] [-c nday] [-e obj1 obj2]\n");		exits("usage");	} 	t = time(0);	day = t/86400. + 25567.5;	if(flags['d'])		day = readate();	if(flags['j'])		print("jday = %.4f\n", day);	deltat = day * .001704;	if(deltat > 32.184)		// assume date is utc1		deltat = 32.184;	// correct by leap sec	if(flags['t'])		deltat = readdt(); 	if(flags['l']) {		fprint(2, "nlat wlong elev\n");		readlat(0);	} else {		f = open(herefile, OREAD);		if(f < 0) {			fprint(2, "%s?\n", herefile);			/* btl mh */			nlat = (40 + 41.06/60)*radian;			awlong = (74 + 23.98/60)*radian;			elev = 150 * 3.28084;		} else {			readlat(f);			close(f);		}	}} doublereadate(void){	int i;	Tim t; 	fprint(2, "year mo da hr min\n");	rline(0);	for(i=0; i<5; i++)		t.ifa[i] = atof(skip(i));	return convdate(&t);} doublereaddt(void){ 	fprint(2, "ΔT (sec) (%.3f)\n", deltat);	rline(0);	return atof(skip(0));} doubleetdate(long year, int mo, double day){	Tim t; 	t.ifa[0] = year;	t.ifa[1] = mo;	t.ifa[2] = day;	t.ifa[3] = 0;	t.ifa[4] = 0;	return convdate(&t) + 2415020;} voidreadlat(int f){ 	rline(f);	nlat = atof(skip(0)) * radian;	awlong = atof(skip(1)) * radian;	elev = atof(skip(2)) * 3.28084;} doublefmod(double a, double b){	return a - floor(a/b)*b;}