1 #include "astro.h"
2
3 char* herefile = "/lib/sky/here";
4
5 void
main(int argc,char * argv[])6 main(int argc, char *argv[])
7 {
8 int i, j;
9 double d;
10
11 pi = atan(1.0)*4;
12 pipi = pi*2;
13 radian = pi/180;
14 radsec = radian/3600;
15 converge = 1.0e-14;
16
17 fmtinstall('R', Rconv);
18 fmtinstall('D', Dconv);
19
20 per = PER;
21 deld = PER/NPTS;
22 init();
23 args(argc, argv);
24 init();
25
26 loop:
27 d = day;
28 pdate(d);
29 if(flags['p'] || flags['e']) {
30 print(" ");
31 ptime(d);
32 pstime(d);
33 }
34 print("\n");
35 for(i=0; i<=NPTS+1; i++) {
36 setime(d);
37
38 for(j=0; objlst[j]; j++) {
39 (*objlst[j]->obj)();
40 setobj(&objlst[j]->point[i]);
41 if(flags['p']) {
42 if(flags['m'])
43 if(strcmp(objlst[j]->name, "Comet"))
44 continue;
45 output(objlst[j]->name, &objlst[j]->point[i]);
46 }
47 }
48 if(flags['e']) {
49 d = dist(&eobj1->point[i], &eobj2->point[i]);
50 print("dist %s to %s = %.4f\n", eobj1->name, eobj2->name, d);
51 }
52 // if(flags['p']) {
53 // pdate(d);
54 // print(" ");
55 // ptime(d);
56 // print("\n");
57 // }
58 if(flags['p'] || flags['e'])
59 break;
60 d += deld;
61 }
62 if(!(flags['p'] || flags['e']))
63 search();
64 day += per;
65 nperiods -= 1;
66 if(nperiods > 0)
67 goto loop;
68 exits(0);
69 }
70
71 void
args(int argc,char * argv[])72 args(int argc, char *argv[])
73 {
74 char *p;
75 long t;
76 int f, i;
77 Obj2 *q;
78
79 memset(flags, 0, sizeof(flags));
80 ARGBEGIN {
81 default:
82 fprint(2, "astro [-adeklmopst] [-c nperiod] [-C tperiod]\n");
83 exits(0);
84
85 case 'c':
86 nperiods = 1;
87 p = ARGF();
88 if(p)
89 nperiods = atol(p);
90 flags['c']++;
91 break;
92 case 'C':
93 p = ARGF();
94 if(p)
95 per = atof(p);
96 break;
97 case 'e':
98 eobj1 = nil;
99 eobj2 = nil;
100 p = ARGF();
101 if(p) {
102 for(i=0; q=objlst[i]; i++) {
103 if(strcmp(q->name, p) == 0)
104 eobj1 = q;
105 if(strcmp(q->name1, p) == 0)
106 eobj1 = q;
107 }
108 p = ARGF();
109 if(p) {
110 for(i=0; q=objlst[i]; i++) {
111 if(strcmp(q->name, p) == 0)
112 eobj2 = q;
113 if(strcmp(q->name1, p) == 0)
114 eobj2 = q;
115 }
116 }
117 }
118 if(eobj1 && eobj2) {
119 flags['e']++;
120 break;
121 }
122 fprint(2, "cant recognize eclipse objects\n");
123 exits("eflag");
124
125 case 'a':
126 case 'd':
127 case 'j':
128 case 'k':
129 case 'l':
130 case 'm':
131 case 'o':
132 case 'p':
133 case 's':
134 case 't':
135 flags[ARGC()]++;
136 break;
137 } ARGEND
138 if(*argv){
139 fprint(2, "usage: astro [-dlpsatokm] [-c nday] [-e obj1 obj2]\n");
140 exits("usage");
141 }
142
143 t = time(0);
144 day = t/86400. + 25567.5;
145 if(flags['d'])
146 day = readate();
147 if(flags['j'])
148 print("jday = %.4f\n", day);
149 deltat = day * .001704;
150 if(deltat > 32.184) // assume date is utc1
151 deltat = 32.184; // correct by leap sec
152 if(flags['t'])
153 deltat = readdt();
154
155 if(flags['l']) {
156 fprint(2, "nlat wlong elev\n");
157 readlat(0);
158 } else {
159 f = open(herefile, OREAD);
160 if(f < 0) {
161 fprint(2, "%s?\n", herefile);
162 /* btl mh */
163 nlat = (40 + 41.06/60)*radian;
164 awlong = (74 + 23.98/60)*radian;
165 elev = 150 * 3.28084;
166 } else {
167 readlat(f);
168 close(f);
169 }
170 }
171 }
172
173 double
readate(void)174 readate(void)
175 {
176 int i;
177 Tim t;
178
179 fprint(2, "year mo da hr min\n");
180 rline(0);
181 for(i=0; i<5; i++)
182 t.ifa[i] = atof(skip(i));
183 return convdate(&t);
184 }
185
186 double
readdt(void)187 readdt(void)
188 {
189
190 fprint(2, "ΔT (sec) (%.3f)\n", deltat);
191 rline(0);
192 return atof(skip(0));
193 }
194
195 double
etdate(long year,int mo,double day)196 etdate(long year, int mo, double day)
197 {
198 Tim t;
199
200 t.ifa[0] = year;
201 t.ifa[1] = mo;
202 t.ifa[2] = day;
203 t.ifa[3] = 0;
204 t.ifa[4] = 0;
205 return convdate(&t) + 2415020;
206 }
207
208 void
readlat(int f)209 readlat(int f)
210 {
211
212 rline(f);
213 nlat = atof(skip(0)) * radian;
214 awlong = atof(skip(1)) * radian;
215 elev = atof(skip(2)) * 3.28084;
216 }
217
218 double
fmod(double a,double b)219 fmod(double a, double b)
220 {
221 return a - floor(a/b)*b;
222 }
223