main.c 3.4 KB

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