blob: 43ce4cc452ca607c4add0fddf2a2d6d6f5504b98 [file] [log] [blame]
#include "astro.h"
char* herefile;
int
main(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;
startab = unsharp("#9/sky/estartab");
herefile = unsharp("#9/sky/here");
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);
return 0; /* gcc */
}
void
args(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);
}
}
}
double
readate(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);
}
double
readdt(void)
{
fprint(2, "ΔT (sec) (%.3f)\n", deltat);
rline(0);
return atof(skip(0));
}
double
etdate(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;
}
void
readlat(int f)
{
rline(f);
nlat = atof(skip(0)) * radian;
awlong = atof(skip(1)) * radian;
elev = atof(skip(2)) * 3.28084;
}
double
fmod(double a, double b)
{
return a - floor(a/b)*b;
}