1 #include "astro.h" 2 3 char* herefile = "/lib/sky/here"; 4 5 void 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 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 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 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 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 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 219 fmod(double a, double b) 220 { 221 return a - floor(a/b)*b; 222 } 223