home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume11 / ephem4.12 / part04 < prev    next >
Text File  |  1990-03-10  |  57KB  |  1,809 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v11i005: ephem, 4 of 7
  3. From: ecd@cs.umn.edu@ncs-med.UUCP (Elwood C. Downey)
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 11, Issue 5
  7. Submitted-by: ecd@cs.umn.edu@ncs-med.UUCP (Elwood C. Downey)
  8. Archive-name: ephem4.12/part04
  9.  
  10. # This is the first line of a "shell archive" file.
  11. # This means it contains several files that can be extracted into
  12. # the current directory when run with the sh shell, as follows:
  13. #    sh < this_file_name
  14. # This is file 4.
  15. echo x plot.c
  16. sed -e 's/^X//' << 'EOFxEOF' > plot.c
  17. X/* code to support the plotting capabilities.
  18. X * idea is to let the operator name a plot file and mark some fields for
  19. X * logging. then after each screen update, the logged fields are written to
  20. X * the plot file. later, the file may be plotted (very simplistically by 
  21. X * ephem, for now anyway, or by some other program entirely.).
  22. X * 
  23. X * format of the plot file is one line per coordinate: label,x,y
  24. X * if z was specified, it is a fourth field.
  25. X * x,y,z are plotted using %g format.
  26. X */
  27. X
  28. X#include <stdio.h>
  29. X#include <math.h>
  30. X#include "screen.h"
  31. X
  32. Xextern char *strcpy();
  33. Xextern errno;
  34. Xextern char *sys_errlist[];
  35. X#define    errsys    (sys_errlist[errno])
  36. X
  37. X#define    TRACE(x)    {FILE *fp = fopen("trace","a"); fprintf x; fclose(fp);}
  38. X
  39. X#define    MAXPLTLINES    10    /* max number of labeled lines we can track.
  40. X                 * note we can't store more than NFLOGS fields
  41. X                 * anyway (see flog.c).
  42. X                 */
  43. X#define    FNLEN        (14+1)    /* longest filename; plus 1 for \0 */
  44. X
  45. Xstatic char plt_filename[FNLEN] = "ephem.plt";    /* default plot file name */
  46. Xstatic FILE *plt_fp;        /* the plot file; == 0 means don't plot */
  47. X
  48. X/* store the label and rcfpack()s for each line to track. */
  49. Xtypedef struct {
  50. X    char pl_label;
  51. X    int pl_rcpx, pl_rcpy, pl_rcpz;
  52. X} PltLine;
  53. Xstatic PltLine pltlines[MAXPLTLINES];
  54. Xstatic int npltlines;        /* number of pltlines[] in actual use */
  55. X
  56. Xstatic int plt_in_polar;    /*if true plot in polar coords, else cartesian*/
  57. Xstatic int pltsrchfld;        /* set when the Search field is to be plotted */
  58. X
  59. X/* picked the Plot label:
  60. X * if on, just turn it off.
  61. X * if off, turn on, define fields or select name of file to plot and do it.
  62. X * TODO: more flexibility, more relevance.
  63. X */
  64. Xplot_setup()
  65. X{
  66. X    if (plt_fp)
  67. X        plt_turn_off();
  68. X    else {
  69. X        static char *chcs[4] = {
  70. X        "Select fields", "Display a plot file", (char *)0,
  71. X        "Begin plotting"
  72. X        };
  73. X        int ff = 0;
  74. X    ask:
  75. X        chcs[2] = plt_in_polar ? "Polar coords" : "Cartesian coords";
  76. X        switch (popup(chcs, ff, npltlines > 0 ? 4 : 3)) {
  77. X        case 0: plt_select_fields(); break;
  78. X        case 1: plt_file(); break;
  79. X        case 2: plt_in_polar ^= 1; ff = 2; goto ask;
  80. X        case 3: plt_turn_on(); break;
  81. X        }
  82. X    }
  83. X}
  84. X
  85. X/* write the active plotfields to the current plot file, if one is open. */
  86. Xplot()
  87. X{
  88. X    if (plt_fp) {
  89. X        PltLine *plp;
  90. X        double x, y, z;
  91. X        if (!srch_ison() && pltsrchfld) {
  92. X        /* if searching is not on but we are plotting the search
  93. X         * funtion we must evaluate and log it ourselves here and now.
  94. X         * plt_turn_on() insured there is a good function to eval.
  95. X         * N.B. if searching IS on, we rely on main() having called
  96. X         * srch_eval() BEFORE plot() so it is already evaluated.
  97. X         */
  98. X        double e;
  99. X        char errmsg[128];
  100. X        if (execute_expr (&e, errmsg) < 0) {
  101. X            f_msg (errmsg);
  102. X            plt_turn_off();
  103. X            return;
  104. X        } else
  105. X            flog_log (R_SRCH, C_SRCH, e);
  106. X        }
  107. X        /* plot in order of original selection */
  108. X        for (plp = pltlines; plp < &pltlines[npltlines]; plp++) {
  109. X        if (flog_get (plp->pl_rcpx, &x) == 0 
  110. X            && flog_get (plp->pl_rcpy, &y) == 0) {
  111. X            fprintf (plt_fp, "%c,%.12g,%.12g", plp->pl_label, x, y);
  112. X            if (flog_get (plp->pl_rcpz, &z) == 0)
  113. X            fprintf (plt_fp, ",%.12g", z);
  114. X            fprintf (plt_fp, "\n");
  115. X        }
  116. X        }
  117. X    }
  118. X}
  119. X
  120. Xplot_prstate (force)
  121. Xint force;
  122. X{
  123. X    static last;
  124. X    int this = plt_fp != 0;
  125. X
  126. X    if (force || this != last) {
  127. X        f_string (R_PLOT, C_PLOTV, this ? " on" : "off");
  128. X        last = this;
  129. X    }
  130. X}
  131. X
  132. Xplot_ison()
  133. X{
  134. X    return (plt_fp != 0);
  135. X}
  136. X
  137. Xstatic
  138. Xplt_reset()
  139. X{
  140. X    PltLine *plp;
  141. X
  142. X    for (plp = &pltlines[npltlines]; --plp >= pltlines; ) {
  143. X        (void) flog_delete (plp->pl_rcpx);
  144. X        (void) flog_delete (plp->pl_rcpy);
  145. X        (void) flog_delete (plp->pl_rcpz);
  146. X        plp->pl_rcpx = plp->pl_rcpy = plp->pl_rcpz = 0;
  147. X    }
  148. X    npltlines = 0;
  149. X    pltsrchfld = 0;
  150. X}
  151. X
  152. X/* let operator select the fields he wants to plot.
  153. X * register them with flog and keep rcfpack() in pltlines[] array.
  154. X * as a special case, set pltsrchfld if Search field is selected.
  155. X */
  156. Xstatic
  157. Xplt_select_fields()
  158. X{
  159. X    static char hlp[] = "move and RETURN to select a field, or q to quit";
  160. X    static char sry[] = "Sorry; can not log any more fields.";
  161. X    int r = R_UT, c = C_UTV; /* TODO: start where main was? */
  162. X    int sf = rcfpack (R_SRCH, C_SRCH, 0);
  163. X    char buf[64];
  164. X    int rcp;
  165. X    int i;
  166. X
  167. X    plt_reset();
  168. X    for (i = 0; i < MAXPLTLINES; i++) {
  169. X        sprintf (buf, "select x field for line %d", i+1);
  170. X        rcp = sel_fld (r, c, alt_menumask()|F_PLT, buf, hlp);
  171. X        if (!rcp)
  172. X        break;
  173. X        if (flog_add (rcp) < 0) {
  174. X        f_msg (sry);
  175. X        break;
  176. X        }
  177. X        pltlines[i].pl_rcpx = rcp;
  178. X        if (rcp == sf)
  179. X        pltsrchfld = 1;
  180. X
  181. X        sprintf (buf, "select y field for line %d", i+1);
  182. X        r = unpackr (rcp); c = unpackc (rcp);
  183. X        rcp = sel_fld (r, c, alt_menumask()|F_PLT, buf, hlp);
  184. X        if (!rcp) {
  185. X        (void) flog_delete (pltlines[i].pl_rcpx);
  186. X        break;
  187. X        }
  188. X        if (flog_add (rcp) < 0) {
  189. X        (void) flog_delete (pltlines[i].pl_rcpx);
  190. X        f_msg (sry);
  191. X        break;
  192. X        }
  193. X        pltlines[i].pl_rcpy = rcp;
  194. X        if (rcp == sf)
  195. X        pltsrchfld = 1;
  196. X
  197. X        sprintf (buf, "select z field for line %d", i+1);
  198. X        r = unpackr (rcp); c = unpackc (rcp);
  199. X        rcp = sel_fld (r, c, alt_menumask()|F_PLT, buf, hlp);
  200. X        if (rcp) {
  201. X        if (flog_add (rcp) < 0) {
  202. X            (void) flog_delete (pltlines[i].pl_rcpx);
  203. X            (void) flog_delete (pltlines[i].pl_rcpy);
  204. X            f_msg (sry);
  205. X            break;
  206. X        }
  207. X        pltlines[i].pl_rcpz = rcp;
  208. X        if (rcp == sf)
  209. X            pltsrchfld = 1;
  210. X        r = unpackr (rcp); c = unpackc (rcp);
  211. X        }
  212. X
  213. X        do {
  214. X        sprintf (buf, "enter a one-character label for line %d: ", i+1);
  215. X        f_prompt (buf);
  216. X        } while (read_line (buf, 1) != 1);
  217. X        pltlines[i].pl_label = *buf;
  218. X    }
  219. X    npltlines = i;
  220. X}
  221. X
  222. Xstatic
  223. Xplt_turn_off ()
  224. X{
  225. X    fclose (plt_fp);
  226. X    plt_fp = 0;
  227. X    plot_prstate(0);
  228. X}
  229. X
  230. X/* turn on plotting.
  231. X * establish a file to use (and thereby set plt_fp, the plotting_is_on flag).
  232. X * also check that there is a srch function if it is being plotted.
  233. X */
  234. Xstatic
  235. Xplt_turn_on ()
  236. X{
  237. X    int sf = rcfpack(R_SRCH, C_SRCH, 0);
  238. X    char fn[FNLEN], fnq[64];
  239. X    char *optype;
  240. X    int n;
  241. X    PltLine *plp;
  242. X
  243. X    /* insure there is a valid srch function if we are to plot it */
  244. X    for (plp = &pltlines[npltlines]; --plp >= pltlines; )
  245. X        if ((plp->pl_rcpx == sf || plp->pl_rcpy == sf || plp->pl_rcpz == sf)
  246. X            && !prog_isgood()) {
  247. X        f_msg ("Plotting search function but it is not defined.");
  248. X        return;
  249. X        }
  250. X
  251. X    /* prompt for file name, giving current as default */
  252. X    sprintf (fnq, "file to write <%s>: ", plt_filename);
  253. X    f_prompt (fnq);
  254. X    n = read_line (fn, sizeof(fn)-1);
  255. X
  256. X    /* leave plotting off if type END.
  257. X     * reuse same fn if just type \n
  258. X     */
  259. X    if (n < 0)
  260. X        return;
  261. X    if (n > 0)
  262. X        strcpy (plt_filename, fn);
  263. X
  264. X    /* give option to append if file already exists */
  265. X    optype = "w";
  266. X    if (access (plt_filename, 2) == 0) {
  267. X        while (1) {
  268. X        f_prompt ("files exists; append or overwrite (a/o)?: ");
  269. X        n = read_char();
  270. X        if (n == 'a') {
  271. X            optype = "a";
  272. X            break;
  273. X        }
  274. X        if (n == 'o')
  275. X            break;
  276. X        }
  277. X    }
  278. X
  279. X    /* plotting is on if file opens ok */
  280. X    plt_fp = fopen (plt_filename, optype);
  281. X    if (!plt_fp) {
  282. X        char buf[NC];
  283. X        sprintf (buf, "can not open %s: %s", plt_filename, errsys);
  284. X        f_prompt (buf);
  285. X        (void)read_char();
  286. X    }
  287. X    plot_prstate (0);
  288. X}
  289. X
  290. X/* ask operator for a file to plot. if it's ok, do it.
  291. X */
  292. Xstatic
  293. Xplt_file ()
  294. X{
  295. X    char fn[FNLEN], fnq[64];
  296. X    FILE *pfp;
  297. X    int n;
  298. X
  299. X    /* prompt for file name, giving current as default */
  300. X    sprintf (fnq, "file to read <%s>: ", plt_filename);
  301. X    f_prompt (fnq);
  302. X    n = read_line (fn, sizeof(fn)-1);
  303. X
  304. X    /* forget it if type END.
  305. X     * reuse same fn if just type \n
  306. X     */
  307. X    if (n < 0)
  308. X        return;
  309. X    if (n > 0)
  310. X        strcpy (plt_filename, fn);
  311. X
  312. X    /* do the plot if file opens ok */
  313. X    pfp = fopen (plt_filename, "r");
  314. X    if (pfp) {
  315. X        if (plt_in_polar)
  316. X        plot_polar (pfp);
  317. X        else
  318. X        plot_cartesian (pfp);
  319. X        fclose (pfp);
  320. X    } else {
  321. X        char buf[NC];
  322. X        sprintf (buf, "can not open %s: %s", plt_filename, errsys);
  323. X        f_prompt (buf);
  324. X        (void)read_char();
  325. X    }
  326. X}
  327. X
  328. X/* plot the given file on the screen in cartesian coords.
  329. X * TODO: add z tags somehow
  330. X * N.B. do whatever you like but redraw the screen when done.
  331. X */
  332. Xstatic
  333. Xplot_cartesian (pfp)
  334. XFILE *pfp;
  335. X{
  336. X    static char fmt[] = "%c,%lf,%lf";
  337. X    double x, y;    /* N.B. be sure these match what scanf's %lf wants*/
  338. X    double minx, maxx, miny, maxy;
  339. X    char buf[128];
  340. X    int npts = 0;
  341. X    char c;
  342. X
  343. X    /* find ranges and number of points */
  344. X    while (fgets (buf, sizeof(buf), pfp)) {
  345. X        sscanf (buf, fmt, &c, &x, &y);
  346. X        if (npts++ == 0) {
  347. X        maxx = minx = x;
  348. X        maxy = miny = y;
  349. X        } else {
  350. X        if (x > maxx) maxx = x;
  351. X        else if (x < minx) minx = x;
  352. X        if (y > maxy) maxy = y;
  353. X        else if (y < miny) miny = y;
  354. X        }
  355. X    }
  356. X
  357. X#define    SMALL    (1e-10)
  358. X    if (npts < 2 || fabs(minx-maxx) < SMALL || fabs(miny-maxy) < SMALL)
  359. X        f_prompt ("At least two different points required to plot.");
  360. X    else {
  361. X        /* read file again, this time plotting */
  362. X        rewind (pfp);
  363. X        c_erase();
  364. X        while (fgets (buf, sizeof(buf), pfp)) {
  365. X        int row, col;
  366. X        sscanf (buf, fmt, &c, &x, &y);
  367. X        row = NR-(int)((NR-1)*(y-miny)/(maxy-miny)+0.5);
  368. X        col =  1+(int)((NC-1)*(x-minx)/(maxx-minx)+0.5);
  369. X        if (row == NR && col == NC)
  370. X            col--;    /* avoid lower right scrolling corner */
  371. X        f_char (row, col, c);
  372. X        }
  373. X
  374. X        /* label axes */
  375. X        f_double (1, 1, "%.2g", maxy);
  376. X        f_double (NR-1, 1, "%.2g", miny);
  377. X        f_double (NR, 1, "%.2g", minx);
  378. X        f_double (NR, NC-10, "%.2g", maxx);
  379. X    }
  380. X
  381. X    /* hit any key to resume... */
  382. X    (void) read_char();
  383. X    redraw_screen (2);    /* full redraw */
  384. X}
  385. X
  386. X/* plot the given file on the screen in polar coords.
  387. X * first numberic field in plot file is r, second is theta in degrees.
  388. X * TODO: add z tags somehow
  389. X * N.B. do whatever you like but redraw the screen when done.
  390. X */
  391. Xstatic
  392. Xplot_polar (pfp)
  393. XFILE *pfp;
  394. X{
  395. X    static char fmt[] = "%c,%lf,%lf";
  396. X    double r, th;    /* N.B. be sure these match what scanf's %lf wants*/
  397. X    double maxr;
  398. X    char buf[128];
  399. X    int npts = 0;
  400. X    char c;
  401. X
  402. X    /* find ranges and number of points */
  403. X    while (fgets (buf, sizeof(buf), pfp)) {
  404. X        sscanf (buf, fmt, &c, &r, &th);
  405. X        if (npts++ == 0)
  406. X        maxr = r;
  407. X        else
  408. X        if (r > maxr)
  409. X            maxr = r;
  410. X    }
  411. X
  412. X    if (npts < 2)
  413. X        f_prompt ("At least two points required to plot.");
  414. X    else {
  415. X        /* read file again, this time plotting */
  416. X        rewind (pfp);
  417. X        c_erase();
  418. X        while (fgets (buf, sizeof(buf), pfp)) {
  419. X        int row, col;
  420. X        double x, y;
  421. X        sscanf (buf, fmt, &c, &r, &th);
  422. X        x = r * cos(th/57.2958);    /* degs to rads */
  423. X        y = r * sin(th/57.2958);
  424. X        row = NR-(int)((NR-1)*(y+maxr)/(2.0*maxr)+0.5);
  425. X        col =  1+(int)((NC-1)*(x+maxr)/(2.0*maxr)/ASPECT+0.5);
  426. X        if (row == NR && col == NC)
  427. X            col--;    /* avoid lower right scrolling corner */
  428. X        f_char (row, col, c);
  429. X        }
  430. X
  431. X        /* label radius */
  432. X        f_double (NR/2, NC-10, "%.4g", maxr);
  433. X    }
  434. X
  435. X    /* hit any key to resume... */
  436. X    (void) read_char();
  437. X    redraw_screen (2);    /* full redraw */
  438. X}
  439. EOFxEOF
  440. len=`wc -c < plot.c`
  441. if expr $len != 10712 > /dev/null
  442. then echo Length of plot.c is $len but it should be 10712.
  443. fi
  444. echo x popup.c
  445. sed -e 's/^X//' << 'EOFxEOF' > popup.c
  446. X/* put up a one-line menu consisting of the given fields and let op move
  447. X * between them with the same methods as sel_fld().
  448. X * return index of which he picked, or -1 if hit END.
  449. X */
  450. X
  451. X#include <stdio.h>
  452. X#include "screen.h"
  453. X
  454. X#define    FLDGAP    2    /* inter-field gap */
  455. X#define    MAXFLDS    32    /* max number of fields we can handle */
  456. X
  457. Xstatic char pup[] = "Select: ";
  458. X
  459. X/* put up an array of strings on prompt line and let op pick one.
  460. X * start with field fn.
  461. X * N.B. we do not do much error/bounds checking.
  462. X */
  463. Xpopup (fields, fn, nfields)
  464. Xchar *fields[];
  465. Xint fn;
  466. Xint nfields;
  467. X{
  468. X    int fcols[MAXFLDS];    /* column to use for each field */
  469. X    int i;
  470. X
  471. X    if (nfields > MAXFLDS)
  472. X        return (-1);
  473. X
  474. X    again:
  475. X    /* erase the prompt line; we are going to take it over */
  476. X    c_pos (R_PROMPT, C_PROMPT);
  477. X    c_eol();
  478. X
  479. X    /* compute starting column for each field */
  480. X    fcols[0] = sizeof(pup);
  481. X    for (i = 1; i < nfields; i++)
  482. X        fcols[i] = fcols[i-1] + strlen (fields[i-1]) + FLDGAP;
  483. X
  484. X    /* draw each field, with comma after all but last */
  485. X    c_pos (R_PROMPT, 1);
  486. X    fputs (pup, stdout);
  487. X    for (i = 0; i < nfields; i++) {
  488. X        c_pos (R_PROMPT, fcols[i]);
  489. X        printf (i < nfields-1 ? "%s," : "%s", fields[i]);
  490. X    }
  491. X
  492. X    /* let op choose one now; begin at fn.
  493. X     */
  494. X    i = fn;
  495. X    while (1) {
  496. X        c_pos (R_PROMPT, fcols[i]);
  497. X        switch (read_char()) {
  498. X        case END: return (-1);
  499. X        case REDRAW: redraw_screen(2); goto again;
  500. X        case VERSION: version(); goto again;
  501. X        case '\r': return (i);
  502. X        case 'h':
  503. X        if (--i < 0)
  504. X            i = nfields - 1;
  505. X        break;
  506. X        case 'l':
  507. X        if (++i >= nfields)
  508. X            i = 0;
  509. X        break;
  510. X        }
  511. X    }
  512. X}
  513. EOFxEOF
  514. len=`wc -c < popup.c`
  515. if expr $len != 1578 > /dev/null
  516. then echo Length of popup.c is $len but it should be 1578.
  517. fi
  518. echo x precess.c
  519. sed -e 's/^X//' << 'EOFxEOF' > precess.c
  520. X#include <stdio.h>
  521. X#include <math.h>
  522. X#include "astro.h"
  523. X
  524. X/* corrects ra and dec, both in radians, for precession from epoch 1 to epoch 2.
  525. X * the epochs are given by their modified JDs, mjd1 and mjd2, respectively.
  526. X * N.B. ra and dec are modifed IN PLACE.
  527. X */
  528. Xprecess (mjd1, mjd2, ra, dec)
  529. Xdouble mjd1, mjd2;    /* initial and final epoch modified JDs */
  530. Xdouble *ra, *dec;    /* ra/dec for mjd1 in, for mjd2 out */
  531. X{
  532. X    static double lastmjd1, lastmjd2;
  533. X    static double m, n, nyrs;
  534. X    double dra, ddec;    /* ra and dec corrections */
  535. X
  536. X    if (mjd1 != lastmjd1 || mjd2 != lastmjd2) {
  537. X        double t1, t2; /* Julian centuries of 36525 days since Jan .5 1900*/
  538. X        double m1, n1; /* "constants" for t1 */
  539. X        double m2, n2; /* "constants" for t2 */
  540. X        t1 = mjd1/36525.;
  541. X        t2 = mjd2/36525.;
  542. X        m1 = 3.07234+(1.86e-3*t1);
  543. X        n1 = 20.0468-(8.5e-3*t1);
  544. X        m2 = 3.07234+(1.86e-3*t2);
  545. X        n2 = 20.0468-(8.5e-3*t2);
  546. X        m = (m1+m2)/2;    /* average m for the two epochs */
  547. X        n = (n1+n2)/2;    /* average n for the two epochs */
  548. X        nyrs = (mjd2-mjd1)/365.2425;
  549. X        lastmjd1 = mjd1;
  550. X        lastmjd2 = mjd2;
  551. X    }
  552. X
  553. X    dra = (m+(n*sin(*ra)*tan(*dec)/15))*7.272205e-5*nyrs;
  554. X    ddec = n*cos(*ra)*4.848137e-6*nyrs;
  555. X    *ra += dra;
  556. X    *dec += ddec;
  557. X    /* added by ECD */
  558. X    if (*dec > PI/2) {
  559. X        *dec = PI - *dec;
  560. X        *ra += PI;
  561. X    } else if (*dec < -PI/2) {
  562. X        *dec = -PI - *dec;
  563. X        *ra += PI;
  564. X    }
  565. X    range (ra, 2*PI);
  566. X}
  567. EOFxEOF
  568. len=`wc -c < precess.c`
  569. if expr $len != 1385 > /dev/null
  570. then echo Length of precess.c is $len but it should be 1385.
  571. fi
  572. echo x reduce.c
  573. sed -e 's/^X//' << 'EOFxEOF' > reduce.c
  574. X#include <math.h>
  575. X#include "astro.h"
  576. X
  577. X/* convert those orbital elements that change from epoch mjd0 to epoch mjd.
  578. X */
  579. Xreduce_elements (mjd0, mjd, inc0, ap0, om0, inc, ap, om)
  580. Xdouble mjd0;    /* initial epoch */
  581. Xdouble mjd;    /* desired epoch */
  582. Xdouble inc0;    /* initial inclination, rads */
  583. Xdouble ap0;    /* initial argument of perihelion, as an mjd */
  584. Xdouble om0;    /* initial , rads */
  585. Xdouble *inc;    /* desired inclination, rads */
  586. Xdouble *ap;    /* desired epoch of perihelion, as an mjd */
  587. Xdouble *om;    /* desired , rads */
  588. X{
  589. X    double t0, t1;
  590. X    double tt, tt2, t02, tt3;
  591. X    double eta, th, th0;
  592. X    double a, b;
  593. X    double dap;
  594. X    double cinc, sinc;
  595. X    double ot, sot, cot, ot1;
  596. X    double seta, ceta;
  597. X
  598. X    t0 = mjd0/365250.0;
  599. X    t1 = mjd/365250.0;
  600. X
  601. X    tt = t1-t0;
  602. X    tt2 = tt*tt;
  603. X        t02 = t0*t0;
  604. X    tt3 = tt*tt2;
  605. X        eta = (471.07-6.75*t0+.57*t02)*tt+(.57*t0-3.37)*tt2+.05*tt3;
  606. X        th0 = 32869.0*t0+56*t02-(8694+55*t0)*tt+3*tt2;
  607. X        eta = degrad(eta/3600.0);
  608. X        th0 = degrad((th0/3600.0)+173.950833);
  609. X        th = (50256.41+222.29*t0+.26*t02)*tt+(111.15+.26*t0)*tt2+.1*tt3;
  610. X        th = th0+degrad(th/3600.0);
  611. X    cinc = cos(inc0);
  612. X        sinc = sin(inc0);
  613. X    ot = om0-th0;
  614. X    sot = sin(ot);
  615. X        cot = cos(ot);
  616. X    seta = sin(eta);
  617. X        ceta = cos(eta);
  618. X    a = sinc*sot;
  619. X        b = ceta*sinc*cot-seta*cinc;
  620. X    ot1 = atan(a/b);
  621. X        if (b<0) ot1 += PI;
  622. X        b = sinc*ceta-cinc*seta*cot;
  623. X        a = -1*seta*sot;
  624. X    dap = atan(a/b);
  625. X        if (b<0) dap += PI;
  626. X
  627. X        *ap = ap0+dap;
  628. X    range (ap, 2*PI);
  629. X        *om = ot1+th;
  630. X    range (om, 2*PI);
  631. X
  632. X        if (inc0<.175)
  633. X        *inc = asin(a/sin(dap));
  634. X    else
  635. X        *inc = 1.570796327-asin((cinc*ceta)+(sinc*seta*cot));
  636. X}
  637. EOFxEOF
  638. len=`wc -c < reduce.c`
  639. if expr $len != 1647 > /dev/null
  640. then echo Length of reduce.c is $len but it should be 1647.
  641. fi
  642. echo x refract.c
  643. sed -e 's/^X//' << 'EOFxEOF' > refract.c
  644. X#include <stdio.h>
  645. X#include <math.h>
  646. X#include "astro.h"
  647. X
  648. X/* correct the true altitude, ta, for refraction to the apparent altitude, aa,
  649. X * each in radians, given the local atmospheric pressure, pr, in mbars, and
  650. X * the temperature, tr, in degrees C.
  651. X */
  652. Xrefract (pr, tr, ta, aa)
  653. Xdouble pr, tr;
  654. Xdouble ta;
  655. Xdouble *aa;
  656. X{
  657. X    double r;    /* refraction correction*/
  658. X
  659. X        if (ta >= degrad(15.)) {
  660. X        /* model for altitudes at least 15 degrees above horizon */
  661. X            r = 7.888888e-5*pr/((273+tr)*tan(ta));
  662. X    } else if (ta > degrad(-5.)) {
  663. X        /* hairier model for altitudes at least -5 and below 15 degrees */
  664. X        double a, b, tadeg = raddeg(ta);
  665. X        a = ((2e-5*tadeg+1.96e-2)*tadeg+1.594e-1)*pr;
  666. X        b = (273+tr)*((8.45e-2*tadeg+5.05e-1)*tadeg+1);
  667. X        r = degrad(a/b);
  668. X    } else {
  669. X        /* do nothing if more than 5 degrees below horizon.
  670. X         */
  671. X        r = 0;
  672. X    }
  673. X
  674. X    *aa  =  ta + r;
  675. X}
  676. X
  677. X/* correct the apparent altitude, aa, for refraction to the true altitude, ta,
  678. X * each in radians, given the local atmospheric pressure, pr, in mbars, and
  679. X * the temperature, tr, in degrees C.
  680. X */
  681. Xunrefract (pr, tr, aa, ta)
  682. Xdouble pr, tr;
  683. Xdouble aa;
  684. Xdouble *ta;
  685. X{
  686. X    double err;
  687. X    double appar;
  688. X    double true;
  689. X
  690. X    /* iterative solution: search for the true that refracts to the
  691. X     *   given apparent.
  692. X     * since refract() is discontinuous at -5 degrees, there is a range
  693. X     *   of apparent altitudes between about -4.5 and -5 degrees that are
  694. X     *   not invertable (the graph of ap vs. true has a vertical step at
  695. X     *   true = -5). thus, the iteration just oscillates if it gets into
  696. X     *   this region. if this happens the iteration is forced to abort.
  697. X     *   of course, this makes unrefract() discontinuous too.
  698. X     */
  699. X    true = aa;
  700. X    do {
  701. X        refract (pr, tr, true, &appar);
  702. X        err = appar - aa;
  703. X        true -= err;
  704. X    } while (fabs(err) >= 1e-6 && true > degrad(-5));
  705. X
  706. X    *ta = true;
  707. X}
  708. EOFxEOF
  709. len=`wc -c < refract.c`
  710. if expr $len != 1857 > /dev/null
  711. then echo Length of refract.c is $len but it should be 1857.
  712. fi
  713. echo x riset.c
  714. sed -e 's/^X//' << 'EOFxEOF' > riset.c
  715. X#include <stdio.h>
  716. X#include <math.h>
  717. X#include "astro.h"
  718. X
  719. X/* given the true geocentric ra and dec of an object, in radians, the observer's
  720. X *   latitude in radians, and a horizon displacement correction, dis, in radians
  721. X *   find the local sidereal times and azimuths of rising and setting, lstr/s
  722. X *   and azr/s, in radians, respectively.
  723. X * dis is the vertical displacement from the true position of the horizon. it
  724. X *   is positive if the apparent position is higher than the true position.
  725. X *   said another way, it is positive if the shift causes the object to spend
  726. X *   longer above the horizon. for example, atmospheric refraction is typically
  727. X *   assumed to produce a vertical shift of 34 arc minutes at the horizon; dis
  728. X *   would then take on the value +9.89e-3 (radians). On the other hand, if
  729. X *   your horizon has hills such that your apparent horizon is, say, 1 degree
  730. X *   above sea level, you would allow for this by setting dis to -1.75e-2
  731. X *   (radians).
  732. X * status: 0: normal; 1: never rises; -1: circumpolar; 2: trouble.
  733. X */
  734. Xriset (ra, dec, lat, dis, lstr, lsts, azr, azs, status)
  735. Xdouble ra, dec;
  736. Xdouble lat, dis;
  737. Xdouble *lstr, *lsts;
  738. Xdouble *azr, *azs;
  739. Xint *status;
  740. X{
  741. X    static double lastlat = 0, slat = 0, clat = 1.0;
  742. X    double dec1, sdec, cdec, tdec;
  743. X    double psi, spsi, cpsi;
  744. X    double h, dh, ch;    /* hr angle, delta and cos */
  745. X
  746. X    /* avoid needless sin/cos since latitude doesn't change often */
  747. X        if (lat != lastlat) {
  748. X        clat = cos(lat);
  749. X        slat = sin(lat);
  750. X        lastlat = lat;
  751. X    }
  752. X
  753. X    /* can't cope with objects very near the celestial pole nor if we 
  754. X     * are located very near the earth's poles.
  755. X     */
  756. X    cdec = cos(dec);
  757. X        if (fabs(cdec*clat) < 1e-10) {
  758. X        /* trouble */
  759. X        *status = 2;
  760. X        return;
  761. X    }
  762. X
  763. X        cpsi = slat/cdec;
  764. X        if (cpsi>1.0) cpsi = 1.0;
  765. X        else if (cpsi<-1.0) cpsi = -1.0;
  766. X        psi = acos(cpsi);
  767. X    spsi = sin(psi);
  768. X
  769. X        dh = dis*spsi;
  770. X    dec1 = dec + (dis*cpsi);
  771. X        sdec = sin(dec1);
  772. X    tdec = tan(dec1);
  773. X
  774. X        ch = (-1*slat*tdec)/clat;
  775. X
  776. X        if (ch < -1) {
  777. X        /* circumpolar */
  778. X        *status = -1;
  779. X        return;
  780. X    }
  781. X        if (ch > 1) {
  782. X        /* never rises */
  783. X        *status = 1;
  784. X        return;
  785. X    }
  786. X
  787. X        *status = 0;
  788. X    h = acos(ch)+dh;
  789. X
  790. X        *lstr = 24+radhr(ra-h);
  791. X    *lsts = radhr(ra+h);
  792. X    range (lstr, 24.0);
  793. X    range (lsts, 24.0);
  794. X
  795. X    *azr = acos(sdec/clat);
  796. X    range (azr, 2*PI);
  797. X        *azs = 2*PI - *azr;
  798. X}
  799. EOFxEOF
  800. len=`wc -c < riset.c`
  801. if expr $len != 2388 > /dev/null
  802. then echo Length of riset.c is $len but it should be 2388.
  803. fi
  804. echo x riset_c.c
  805. sed -e 's/^X//' << 'EOFxEOF' > riset_c.c
  806. X/* find rise and set circumstances, ie, riset_cir() and related functions. */
  807. X
  808. X#include <stdio.h>
  809. X#include <math.h>
  810. X#include "astro.h"
  811. X#include "circum.h"
  812. X#include "screen.h"    /* just for SUN and MOON */
  813. X
  814. X#define    TRACE(x)    {FILE *fp = fopen("trace","a"); fprintf x; fclose(fp);}
  815. X
  816. X#define    STDREF    degrad(34./60.)    /* nominal horizon refraction amount */
  817. X#define    TWIREF    degrad(18.)    /* twilight horizon displacement */
  818. X
  819. X/* find where and when a body, p, will rise and set and
  820. X *   its transit circumstances. all times are local, angles rads e of n.
  821. X * return 0 if just returned same stuff as previous call, else 1 if new.
  822. X * status is set from the RS_* #defines in circum.h.
  823. X * also used to find astro twilight by calling with dis of 18 degrees.
  824. X */
  825. Xriset_cir (p, np, hzn, ltr, lts, ltt, azr, azs, altt, status)
  826. Xint p;        /* one of the body defines in astro.h or screen.h */
  827. XNow *np;
  828. Xint hzn;    /* STDHZN or ADPHZN or TWILIGHT */
  829. Xdouble *ltr, *lts; /* local rise and set times */
  830. Xdouble *ltt;    /* local transit time */
  831. Xdouble *azr, *azs; /* local rise and set azimuths, rads e of n */
  832. Xdouble *altt;    /* local altitude at transit */
  833. Xint *status;    /* one or more of the RS_* defines */
  834. X{
  835. X    typedef struct {
  836. X        Now l_now;
  837. X        double l_ltr, l_lts, l_ltt, l_azr, l_azs, l_altt;
  838. X        int l_hzn;
  839. X        int l_status;
  840. X    } Last;
  841. X    /* must be in same order as the astro.h/screen.h #define's */
  842. X    static Last last[NOBJ];
  843. X    Last *lp;
  844. X    int new;
  845. X
  846. X    lp = last + p;
  847. X    if (same_cir (np, &lp->l_now) && same_lday (np, &lp->l_now)
  848. X                        && lp->l_hzn == hzn) {
  849. X        *ltr = lp->l_ltr;
  850. X        *lts = lp->l_lts;
  851. X        *ltt = lp->l_ltt;
  852. X        *azr = lp->l_azr;
  853. X        *azs = lp->l_azs;
  854. X        *altt = lp->l_altt;
  855. X        *status = lp->l_status;
  856. X        new = 0;
  857. X    } else {
  858. X        *status = 0;
  859. X        iterative_riset (p, np, hzn, ltr, lts, ltt, azr, azs, altt, status);
  860. X        lp->l_ltr = *ltr;
  861. X        lp->l_lts = *lts;
  862. X        lp->l_ltt = *ltt;
  863. X        lp->l_azr = *azr;
  864. X        lp->l_azs = *azs;
  865. X        lp->l_altt = *altt;
  866. X        lp->l_status = *status;
  867. X        lp->l_hzn = hzn;
  868. X        lp->l_now = *np;
  869. X        new = 1;
  870. X    }
  871. X    return (new);
  872. X}
  873. X
  874. Xstatic
  875. Xiterative_riset (p, np, hzn, ltr, lts, ltt, azr, azs, altt, status)
  876. Xint p;
  877. XNow *np;
  878. Xint hzn;
  879. Xdouble *ltr, *lts, *ltt;    /* local times of rise, set and transit */
  880. Xdouble *azr, *azs, *altt;/* local azimuths of rise, set and transit altitude */
  881. Xint *status;
  882. X{
  883. X#define    MAXPASSES    6
  884. X    double lstr, lsts, lstt; /* local sidereal times of rising/setting */
  885. X    double mjd0;        /* mjd estimates of rise/set event */
  886. X    double lnoon;        /* mjd of local noon */
  887. X    double x;        /* discarded tmp value */
  888. X    Now n;            /* just used to call now_lst() */
  889. X    double lst;        /* lst at local noon */
  890. X    double diff, lastdiff;    /* iterative improvement to mjd0 */
  891. X    int pass;
  892. X    int rss;
  893. X
  894. X    /* first approximation is to find rise/set times of a fixed object
  895. X     * in its position at local noon.
  896. X     */
  897. X    lnoon = mjd_day(mjd - tz/24.0) + (12.0 + tz)/24.0; /*mjd of local noon*/
  898. X    n.n_mjd = lnoon;
  899. X    n.n_lng = lng;
  900. X    now_lst (&n, &lst);    /* lst at local noon */
  901. X    mjd0 = lnoon;
  902. X    stationary_riset (p,mjd0,np,hzn,&lstr,&lsts,&lstt,&x,&x,&x,&rss);
  903. X    chkrss:
  904. X    switch (rss) {
  905. X    case  0:  break;
  906. X    case  1: *status = RS_NEVERUP; return;
  907. X    case -1: *status = RS_CIRCUMPOLAR; goto transit;
  908. X    default: *status = RS_ERROR; return;
  909. X    }
  910. X
  911. X    /* find a better approximation to the rising circumstances based on
  912. X     * more passes, each using a "fixed" object at the location at
  913. X     * previous approximation of the rise time.
  914. X     */
  915. X    lastdiff = 1000.0;
  916. X    for (pass = 1; pass < MAXPASSES; pass++) {
  917. X        diff = (lstr - lst)*SIDRATE; /* next guess at rise time wrt noon */
  918. X        if (diff > 12.0)
  919. X        diff -= 24.0*SIDRATE;    /* not tomorrow, today */
  920. X        else if (diff < -12.0)
  921. X        diff += 24.0*SIDRATE;    /* not yesterday, today */
  922. X        mjd0 = lnoon + diff/24.0;    /* next guess at mjd of rise */
  923. X        stationary_riset (p,mjd0,np,hzn,&lstr,&x,&x,azr,&x,&x,&rss);
  924. X        if (rss != 0) goto chkrss;
  925. X        if (fabs (diff - lastdiff) < 0.25/60.0)
  926. X        break;             /* converged to better than 15 secs */
  927. X        lastdiff = diff;
  928. X    }
  929. X    if (pass == MAXPASSES)
  930. X        *status |= RS_NORISE;    /* didn't converge - no rise today */
  931. X    else {
  932. X        *ltr = 12.0 + diff;
  933. X        if (p != MOON &&
  934. X            (*ltr <= 24.0*(1.0-SIDRATE) || *ltr >= 24.0*SIDRATE))
  935. X        *status |= RS_2RISES;
  936. X    }
  937. X
  938. X    /* find a better approximation to the setting circumstances based on
  939. X     * more passes, each using a "fixed" object at the location at
  940. X     * previous approximation of the set time.
  941. X     */
  942. X    lastdiff = 1000.0;
  943. X    for (pass = 1; pass < MAXPASSES; pass++) {
  944. X        diff = (lsts - lst)*SIDRATE; /* next guess at set time wrt noon */
  945. X        if (diff > 12.0)
  946. X        diff -= 24.0*SIDRATE;    /* not tomorrow, today */
  947. X        else if (diff < -12.0)
  948. X        diff += 24.0*SIDRATE;    /* not yesterday, today */
  949. X        mjd0 = lnoon + diff/24.0;    /* next guess at mjd of set */
  950. X        stationary_riset (p,mjd0,np,hzn,&x,&lsts,&x,&x,azs,&x,&rss);
  951. X        if (rss != 0) goto chkrss;
  952. X        if (fabs (diff - lastdiff) < 0.25/60.0)
  953. X        break;             /* converged to better than 15 secs */
  954. X        lastdiff = diff;
  955. X    }
  956. X    if (pass == MAXPASSES)
  957. X        *status |= RS_NOSET;    /* didn't converge - no set today */
  958. X    else {
  959. X        *lts = 12.0 + diff;
  960. X        if (p != MOON &&
  961. X            (*lts <= 24.0*(1.0-SIDRATE) || *lts >= 24.0*SIDRATE))
  962. X        *status |= RS_2SETS;
  963. X    }
  964. X
  965. X    transit:
  966. X    /* find a better approximation to the transit circumstances based on
  967. X     * more passes, each using a "fixed" object at the location at
  968. X     * previous approximation of the transit time.
  969. X     */
  970. X    lastdiff = 1000.0;
  971. X    for (pass = 1; pass < MAXPASSES; pass++) {
  972. X        diff = (lstt - lst)*SIDRATE; /*next guess at transit time wrt noon*/
  973. X        if (diff > 12.0)
  974. X        diff -= 24.0*SIDRATE;    /* not tomorrow, today */
  975. X        else if (diff < -12.0)
  976. X        diff += 24.0*SIDRATE;    /* not yesterday, today */
  977. X        mjd0 = lnoon + diff/24.0;    /* next guess at mjd of set */
  978. X        stationary_riset (p,mjd0,np,hzn,&x,&x,&lstt,&x,&x,altt,&rss);
  979. X        if (fabs (diff - lastdiff) < 0.25/60.0)
  980. X        break;             /* converged to better than 15 secs */
  981. X        lastdiff = diff;
  982. X    }
  983. X    if (pass == MAXPASSES)
  984. X        *status |= RS_NOTRANS;    /* didn't converge - no transit today */
  985. X    else {
  986. X        *ltt = 12.0 + diff;
  987. X        if (p != MOON &&
  988. X            (*ltt <= 24.0*(1.0-SIDRATE) || *ltt >= 24.0*SIDRATE))
  989. X        *status |= RS_2TRANS;
  990. X    }
  991. X}
  992. X
  993. Xstatic
  994. Xstationary_riset (p, mjd0, np, hzn, lstr, lsts, lstt, azr, azs, altt, status)
  995. Xint p;
  996. Xdouble mjd0;
  997. XNow *np;
  998. Xint hzn;
  999. Xdouble *lstr, *lsts, *lstt;
  1000. Xdouble *azr, *azs, *altt;
  1001. Xint *status;
  1002. X{
  1003. X    extern void bye();
  1004. X    double dis;
  1005. X    Now n;
  1006. X    Sky s;
  1007. X
  1008. X    switch (hzn) {
  1009. X    case STDHZN:
  1010. X        /* nominal atmospheric refraction.
  1011. X         * then add nominal moon or sun semi-diameter, as appropriate.
  1012. X         */
  1013. X        dis = STDREF;
  1014. X        break;
  1015. X    case TWILIGHT:
  1016. X        if (p != SUN) {
  1017. X        f_msg ("Non-sun twilight bug!");
  1018. X        bye();
  1019. X        }
  1020. X        dis = TWIREF;
  1021. X        break;
  1022. X    default:
  1023. X        /* horizon displacement is refraction plus object's semi-diameter */
  1024. X        unrefract (pressure, temp, 0.0, &dis);
  1025. X        dis = -dis;
  1026. X        n = *np;
  1027. X        n.n_mjd = mjd0;
  1028. X        (void) body_cir (p, 0.0, &n, &s);
  1029. X        dis += degrad(s.s_size/3600./2.0);
  1030. X    }
  1031. X
  1032. X    switch (p) {
  1033. X    case SUN:
  1034. X        if (hzn == STDHZN)
  1035. X        dis += degrad (32./60./2.);
  1036. X        fixedsunriset (mjd0,np,dis,lstr,lsts,lstt,azr,azs,altt,status);
  1037. X        break;
  1038. X    case MOON:
  1039. X        if (hzn == STDHZN)
  1040. X        dis += degrad (32./60./2.);
  1041. X        fixedmoonriset (mjd0,np,dis,lstr,lsts,lstt,azr,azs,altt,status);
  1042. X        break;
  1043. X    default:
  1044. X        if (hzn == STDHZN) {
  1045. X        /* assume planets have negligible diameters.
  1046. X         * also, need to set s if hzn was STDHZN.
  1047. X         */
  1048. X        n = *np;
  1049. X        n.n_mjd = mjd0;
  1050. X        (void) body_cir (p, 0.0, &n, &s);
  1051. X        }
  1052. X        riset (s.s_ra, s.s_dec, lat, dis, lstr, lsts, azr, azs, status);
  1053. X        transit (s.s_ra, s.s_dec, np, lstt, altt);
  1054. X    }
  1055. X}
  1056. X
  1057. X/* find the local rise/set sidereal times and azimuths of an object fixed
  1058. X * at the ra/dec of the sun on the given mjd time as seen from lat.
  1059. X * times are for the upper limb. dis should account for refraction and
  1060. X *   sun's semi-diameter; we add corrections for nutation and aberration.
  1061. X */
  1062. Xstatic
  1063. Xfixedsunriset (mjd0, np, dis, lstr, lsts, lstt, azr, azs, altt, status)
  1064. Xdouble mjd0;
  1065. XNow *np;
  1066. Xdouble dis;
  1067. Xdouble *lstr, *lsts, *lstt;
  1068. Xdouble *azr, *azs, *altt;
  1069. Xint *status;
  1070. X{
  1071. X    double lsn, rsn;
  1072. X    double deps, dpsi;
  1073. X    double r, d;
  1074. X
  1075. X    /* find ecliptic position of sun at mjd */
  1076. X    sunpos (mjd0, &lsn, &rsn);
  1077. X
  1078. X    /* allow for nutation and 20.4" light travel time */
  1079. X    nutation (mjd0, &deps, &dpsi);
  1080. X        lsn += dpsi;
  1081. X        lsn -= degrad(20.4/3600.0);
  1082. X
  1083. X    /* convert ecliptic to equatorial coords */
  1084. X    ecl_eq (mjd0, 0.0, lsn, &r, &d);
  1085. X
  1086. X    /* find circumstances for given horizon displacement */
  1087. X    riset (r, d, lat, dis, lstr, lsts, azr, azs, status);
  1088. X    transit (r, d, np, lstt, altt);
  1089. X}
  1090. X
  1091. X/* find the local sidereal rise/set times and azimuths of an object fixed
  1092. X * at the ra/dec of the moon on the given mjd time as seen from lat.
  1093. X * times are for the upper limb. dis should account for refraction and moon's
  1094. X *    semi-diameter; we add corrections for parallax, and nutation.
  1095. X * accuracy is to nearest minute.
  1096. X */
  1097. Xstatic
  1098. Xfixedmoonriset (mjd0, np, dis, lstr, lsts, lstt, azr, azs, altt, status)
  1099. Xdouble mjd0;
  1100. XNow *np;
  1101. Xdouble dis;
  1102. Xdouble *lstr, *lsts, *lstt;
  1103. Xdouble *azr, *azs, *altt;
  1104. Xint *status;
  1105. X{
  1106. X    double lam, bet, hp;
  1107. X    double deps, dpsi;
  1108. X    double r, d;
  1109. X    double ha;
  1110. X
  1111. X    /* find geocentric ecliptic location and equatorial horizontal parallax
  1112. X     * of moon at mjd.
  1113. X     */
  1114. X    moon (mjd0, &lam, &bet, &hp);
  1115. X
  1116. X    /* allow for nutation */
  1117. X    nutation (mjd0, &deps, &dpsi);
  1118. X        lam += dpsi;
  1119. X
  1120. X    /* convert ecliptic to equatorial coords */
  1121. X    ecl_eq (mjd0, bet, lam, &r, &d);
  1122. X
  1123. X    /* find local sidereal times of rise/set times/azimuths for given
  1124. X     * equatorial coords, allowing for
  1125. X     * .27249*sin(hp)   parallax (hp is radius of earth from moon;
  1126. X     *                  .27249 is radius of moon from earth where
  1127. X     *                  the ratio is the dia_moon/dia_earth).
  1128. X     * hp               nominal angular earth radius. subtract because
  1129. X     *                  tangential line-of-sight makes moon appear lower
  1130. X     *                  as move out from center of earth.
  1131. X     */
  1132. X    dis += .27249*sin(hp) - hp;
  1133. X    riset (r, d, lat, dis, lstr, lsts, azr, azs, status);
  1134. X
  1135. X    /* account for parallax on the meridian (0 hour-angle).
  1136. X     * TODO: is this really right? other stuff too? better way?? help!
  1137. X     */
  1138. X    ta_par (0.0, d, lat, height, hp, &ha, &d);
  1139. X    transit (r+ha, d, np, lstt, altt);
  1140. X}
  1141. X
  1142. X/* find when and how hi object at (r,d) is when it transits. */
  1143. Xstatic
  1144. Xtransit (r, d, np, lstt, altt)
  1145. Xdouble r, d;    /* ra and dec, rads */
  1146. XNow *np;    /* for refraction info */
  1147. Xdouble *lstt;    /* local sidereal time of transit */
  1148. Xdouble *altt;    /* local, refracted, altitude at time of transit */
  1149. X{
  1150. X    *lstt = radhr(r);
  1151. X    *altt = PI/2 - lat + d;
  1152. X    if (*altt > PI/2)
  1153. X        *altt = PI - *altt;
  1154. X    refract (pressure, temp, *altt, altt);
  1155. X}
  1156. EOFxEOF
  1157. len=`wc -c < riset_c.c`
  1158. if expr $len != 10652 > /dev/null
  1159. then echo Length of riset_c.c is $len but it should be 10652.
  1160. fi
  1161. echo x sel_fld.c
  1162. sed -e 's/^X//' << 'EOFxEOF' > sel_fld.c
  1163. X#include <stdio.h>
  1164. X#include "screen.h"
  1165. X
  1166. X/* table of the fields, with flags indicating which menu(s) they are on and
  1167. X * whether pickable for changing or plotting.
  1168. X * N.B. type must be long enough to hold 16 bits.
  1169. X */
  1170. Xstatic int fields[] = {
  1171. X    rcfpack (R_ALTM,    C_ALTM,        F_MMNU|F_CHG),
  1172. X    rcfpack (R_DAWN,    C_DAWN,        F_MMNU|F_CHG),
  1173. X    rcfpack (R_DAWN,    C_DAWNV,    F_MMNU|F_PLT),
  1174. X    rcfpack (R_DUSK,    C_DUSK,        F_MMNU|F_CHG),
  1175. X    rcfpack (R_DUSK,    C_DUSKV,    F_MMNU|F_PLT),
  1176. X    rcfpack (R_EPOCH,    C_EPOCHV,    F_MMNU|F_CHG),
  1177. X    rcfpack (R_HEIGHT,    C_HEIGHTV,    F_MMNU|F_CHG|F_PLT),
  1178. X    rcfpack (R_JD,    C_JDV,        F_MMNU|F_CHG|F_PLT),
  1179. X    rcfpack (R_JUPITER,    C_ALT,        F_MNU1|F_PLT),
  1180. X    rcfpack (R_JUPITER,    C_AZ,        F_MNU1|F_PLT),
  1181. X    rcfpack (R_JUPITER,    C_DEC,        F_MNU1|F_PLT),
  1182. X    rcfpack (R_JUPITER,    C_EDIST,    F_MNU1|F_PLT),
  1183. X    rcfpack (R_JUPITER,    C_ELONG,    F_MNU1|F_PLT),
  1184. X    rcfpack (R_JUPITER,    C_HLAT,        F_MNU1|F_PLT),
  1185. X    rcfpack (R_JUPITER,    C_HLONG,    F_MNU1|F_PLT),
  1186. X    rcfpack (R_JUPITER,    C_MAG,        F_MNU1|F_PLT),
  1187. X    rcfpack (R_JUPITER,    C_MARS,        F_MNU3|F_PLT),
  1188. X    rcfpack (R_JUPITER,    C_MERCURY,    F_MNU3|F_PLT),
  1189. X    rcfpack (R_JUPITER,    C_MOON,        F_MNU3|F_PLT),
  1190. X    rcfpack (R_JUPITER,    C_NEPTUNE,    F_MNU3|F_PLT),
  1191. X    rcfpack (R_JUPITER,    C_OBJ,        F_MMNU|F_CHG),
  1192. X    rcfpack (R_JUPITER,    C_OBJX,        F_MNU3|F_PLT),
  1193. X    rcfpack (R_JUPITER,    C_PHASE,    F_MNU1|F_PLT),
  1194. X    rcfpack (R_JUPITER,    C_PLUTO,    F_MNU3|F_PLT),
  1195. X    rcfpack (R_JUPITER,    C_RA,        F_MNU1|F_PLT),
  1196. X    rcfpack (R_JUPITER,    C_RISEAZ,    F_MNU2|F_PLT),
  1197. X    rcfpack (R_JUPITER,    C_RISETM,    F_MNU2|F_PLT),
  1198. X    rcfpack (R_JUPITER,    C_SATURN,    F_MNU3|F_PLT),
  1199. X    rcfpack (R_JUPITER,    C_SDIST,    F_MNU1|F_PLT),
  1200. X    rcfpack (R_JUPITER,    C_SETAZ,    F_MNU2|F_PLT),
  1201. X    rcfpack (R_JUPITER,    C_SETTM,    F_MNU2|F_PLT),
  1202. X    rcfpack (R_JUPITER,    C_SIZE,        F_MNU1|F_PLT),
  1203. X    rcfpack (R_JUPITER,    C_SUN,        F_MNU3|F_PLT),
  1204. X    rcfpack (R_JUPITER,    C_TRANSALT,    F_MNU2|F_PLT),
  1205. X    rcfpack (R_JUPITER,    C_TRANSTM,    F_MNU2|F_PLT),
  1206. X    rcfpack (R_JUPITER,    C_TUP,        F_MNU2|F_PLT),
  1207. X    rcfpack (R_JUPITER,    C_URANUS,    F_MNU3|F_PLT),
  1208. X    rcfpack (R_JUPITER,    C_VENUS,    F_MNU3|F_PLT),
  1209. X    rcfpack (R_LAT,    C_LATV,        F_MMNU|F_CHG|F_PLT),
  1210. X    rcfpack (R_LD,    C_LD,        F_MMNU|F_PLT|F_CHG),
  1211. X    rcfpack (R_LON,    C_LON,        F_MMNU|F_CHG),
  1212. X    rcfpack (R_LON,    C_LONV,        F_MMNU|F_PLT),
  1213. X    rcfpack (R_LONG,    C_LONGV,    F_MMNU|F_CHG|F_PLT),
  1214. X    rcfpack (R_LST,    C_LSTV,        F_MMNU|F_CHG|F_PLT),
  1215. X    rcfpack (R_LT,    C_LT,        F_MMNU|F_CHG|F_PLT),
  1216. X    rcfpack (R_MARS,    C_ALT,        F_MNU1|F_PLT),
  1217. X    rcfpack (R_MARS,    C_AZ,        F_MNU1|F_PLT),
  1218. X    rcfpack (R_MARS,    C_DEC,        F_MNU1|F_PLT),
  1219. X    rcfpack (R_MARS,    C_EDIST,    F_MNU1|F_PLT),
  1220. X    rcfpack (R_MARS,    C_ELONG,    F_MNU1|F_PLT),
  1221. X    rcfpack (R_MARS,    C_HLAT,        F_MNU1|F_PLT),
  1222. X    rcfpack (R_MARS,    C_HLONG,    F_MNU1|F_PLT),
  1223. X    rcfpack (R_MARS,    C_JUPITER,    F_MNU3|F_PLT),
  1224. X    rcfpack (R_MARS,    C_MAG,        F_MNU1|F_PLT),
  1225. X    rcfpack (R_MARS,    C_MERCURY,    F_MNU3|F_PLT),
  1226. X    rcfpack (R_MARS,    C_MOON,        F_MNU3|F_PLT),
  1227. X    rcfpack (R_MARS,    C_NEPTUNE,    F_MNU3|F_PLT),
  1228. X    rcfpack (R_MARS,    C_OBJ,        F_MMNU|F_CHG),
  1229. X    rcfpack (R_MARS,    C_OBJX,        F_MNU3|F_PLT),
  1230. X    rcfpack (R_MARS,    C_PHASE,    F_MNU1|F_PLT),
  1231. X    rcfpack (R_MARS,    C_PLUTO,    F_MNU3|F_PLT),
  1232. X    rcfpack (R_MARS,    C_RA,        F_MNU1|F_PLT),
  1233. X    rcfpack (R_MARS,    C_RISEAZ,    F_MNU2|F_PLT),
  1234. X    rcfpack (R_MARS,    C_RISETM,    F_MNU2|F_PLT),
  1235. X    rcfpack (R_MARS,    C_SATURN,    F_MNU3|F_PLT),
  1236. X    rcfpack (R_MARS,    C_SDIST,    F_MNU1|F_PLT),
  1237. X    rcfpack (R_MARS,    C_SETAZ,    F_MNU2|F_PLT),
  1238. X    rcfpack (R_MARS,    C_SETTM,    F_MNU2|F_PLT),
  1239. X    rcfpack (R_MARS,    C_SIZE,        F_MNU1|F_PLT),
  1240. X    rcfpack (R_MARS,    C_SUN,        F_MNU3|F_PLT),
  1241. X    rcfpack (R_MARS,    C_TRANSALT,    F_MNU2|F_PLT),
  1242. X    rcfpack (R_MARS,    C_TRANSTM,    F_MNU2|F_PLT),
  1243. X    rcfpack (R_MARS,    C_TUP,        F_MNU2|F_PLT),
  1244. X    rcfpack (R_MARS,    C_URANUS,    F_MNU3|F_PLT),
  1245. X    rcfpack (R_MARS,    C_VENUS,    F_MNU3|F_PLT),
  1246. X    rcfpack (R_MERCURY,    C_ALT,        F_MNU1|F_PLT),
  1247. X    rcfpack (R_MERCURY,    C_AZ,        F_MNU1|F_PLT),
  1248. X    rcfpack (R_MERCURY,    C_DEC,        F_MNU1|F_PLT),
  1249. X    rcfpack (R_MERCURY,    C_EDIST,    F_MNU1|F_PLT),
  1250. X    rcfpack (R_MERCURY,    C_ELONG,    F_MNU1|F_PLT),
  1251. X    rcfpack (R_MERCURY,    C_HLAT,        F_MNU1|F_PLT),
  1252. X    rcfpack (R_MERCURY,    C_HLONG,    F_MNU1|F_PLT),
  1253. X    rcfpack (R_MERCURY,    C_JUPITER,    F_MNU3|F_PLT),
  1254. X    rcfpack (R_MERCURY,    C_MAG,        F_MNU1|F_PLT),
  1255. X    rcfpack (R_MERCURY,    C_MARS,        F_MNU3|F_PLT),
  1256. X    rcfpack (R_MERCURY,    C_MOON,        F_MNU3|F_PLT),
  1257. X    rcfpack (R_MERCURY,    C_NEPTUNE,    F_MNU3|F_PLT),
  1258. X    rcfpack (R_MERCURY,    C_OBJ,        F_MMNU|F_CHG),
  1259. X    rcfpack (R_MERCURY,    C_OBJX,        F_MNU3|F_PLT),
  1260. X    rcfpack (R_MERCURY,    C_PHASE,    F_MNU1|F_PLT),
  1261. X    rcfpack (R_MERCURY,    C_PLUTO,    F_MNU3|F_PLT),
  1262. X    rcfpack (R_MERCURY,    C_RA,        F_MNU1|F_PLT),
  1263. X    rcfpack (R_MERCURY,    C_RISEAZ,    F_MNU2|F_PLT),
  1264. X    rcfpack (R_MERCURY,    C_RISETM,    F_MNU2|F_PLT),
  1265. X    rcfpack (R_MERCURY,    C_SATURN,    F_MNU3|F_PLT),
  1266. X    rcfpack (R_MERCURY,    C_SDIST,    F_MNU1|F_PLT),
  1267. X    rcfpack (R_MERCURY,    C_SETAZ,    F_MNU2|F_PLT),
  1268. X    rcfpack (R_MERCURY,    C_SETTM,    F_MNU2|F_PLT),
  1269. X    rcfpack (R_MERCURY,    C_SIZE,        F_MNU1|F_PLT),
  1270. X    rcfpack (R_MERCURY,    C_SUN,        F_MNU3|F_PLT),
  1271. X    rcfpack (R_MERCURY,    C_TRANSALT,    F_MNU2|F_PLT),
  1272. X    rcfpack (R_MERCURY,    C_TRANSTM,    F_MNU2|F_PLT),
  1273. X    rcfpack (R_MERCURY,    C_TUP,        F_MNU2|F_PLT),
  1274. X    rcfpack (R_MERCURY,    C_URANUS,    F_MNU3|F_PLT),
  1275. X    rcfpack (R_MERCURY,    C_VENUS,    F_MNU3|F_PLT),
  1276. X    rcfpack (R_MOON,    C_ALT,        F_MNU1|F_PLT),
  1277. X    rcfpack (R_MOON,    C_AZ,        F_MNU1|F_PLT),
  1278. X    rcfpack (R_MOON,    C_DEC,        F_MNU1|F_PLT),
  1279. X    rcfpack (R_MOON,    C_EDIST,    F_MNU1|F_PLT),
  1280. X    rcfpack (R_MOON,    C_ELONG,    F_MNU1|F_PLT),
  1281. X    rcfpack (R_MOON,    C_JUPITER,    F_MNU3|F_PLT),
  1282. X    rcfpack (R_MOON,    C_MAG,        F_MNU1|F_PLT),
  1283. X    rcfpack (R_MOON,    C_MARS,        F_MNU3|F_PLT),
  1284. X    rcfpack (R_MOON,    C_MERCURY,    F_MNU3|F_PLT),
  1285. X    rcfpack (R_MOON,    C_NEPTUNE,    F_MNU3|F_PLT),
  1286. X    rcfpack (R_MOON,    C_OBJ,        F_MMNU|F_CHG),
  1287. X    rcfpack (R_MOON,    C_OBJX,        F_MNU3|F_PLT),
  1288. X    rcfpack (R_MOON,    C_PHASE,    F_MNU1|F_PLT),
  1289. X    rcfpack (R_MOON,    C_PLUTO,    F_MNU3|F_PLT),
  1290. X    rcfpack (R_MOON,    C_RA,        F_MNU1|F_PLT),
  1291. X    rcfpack (R_MOON,    C_RISEAZ,    F_MNU2|F_PLT),
  1292. X    rcfpack (R_MOON,    C_RISETM,    F_MNU2|F_PLT),
  1293. X    rcfpack (R_MOON,    C_SATURN,    F_MNU3|F_PLT),
  1294. X    rcfpack (R_MOON,    C_SDIST,    F_MNU1|F_PLT),
  1295. X    rcfpack (R_MOON,    C_SETAZ,    F_MNU2|F_PLT),
  1296. X    rcfpack (R_MOON,    C_SETTM,    F_MNU2|F_PLT),
  1297. X    rcfpack (R_MOON,    C_SIZE,        F_MNU1|F_PLT),
  1298. X    rcfpack (R_MOON,    C_SUN,        F_MNU3|F_PLT),
  1299. X    rcfpack (R_MOON,    C_TRANSALT,    F_MNU2|F_PLT),
  1300. X    rcfpack (R_MOON,    C_TRANSTM,    F_MNU2|F_PLT),
  1301. X    rcfpack (R_MOON,    C_TUP,        F_MNU2|F_PLT),
  1302. X    rcfpack (R_MOON,    C_URANUS,    F_MNU3|F_PLT),
  1303. X    rcfpack (R_MOON,    C_VENUS,    F_MNU3|F_PLT),
  1304. X    rcfpack (R_NEPTUNE,    C_ALT,        F_MNU1|F_PLT),
  1305. X    rcfpack (R_NEPTUNE,    C_AZ,        F_MNU1|F_PLT),
  1306. X    rcfpack (R_NEPTUNE,    C_DEC,        F_MNU1|F_PLT),
  1307. X    rcfpack (R_NEPTUNE,    C_EDIST,    F_MNU1|F_PLT),
  1308. X    rcfpack (R_NEPTUNE,    C_ELONG,    F_MNU1|F_PLT),
  1309. X    rcfpack (R_NEPTUNE,    C_HLAT,        F_MNU1|F_PLT),
  1310. X    rcfpack (R_NEPTUNE,    C_HLONG,    F_MNU1|F_PLT),
  1311. X    rcfpack (R_NEPTUNE,    C_JUPITER,    F_MNU3|F_PLT),
  1312. X    rcfpack (R_NEPTUNE,    C_MAG,        F_MNU1|F_PLT),
  1313. X    rcfpack (R_NEPTUNE,    C_MARS,        F_MNU3|F_PLT),
  1314. X    rcfpack (R_NEPTUNE,    C_MERCURY,    F_MNU3|F_PLT),
  1315. X    rcfpack (R_NEPTUNE,    C_MOON,        F_MNU3|F_PLT),
  1316. X    rcfpack (R_NEPTUNE,    C_OBJ,        F_MMNU|F_CHG),
  1317. X    rcfpack (R_NEPTUNE,    C_OBJX,        F_MNU3|F_PLT),
  1318. X    rcfpack (R_NEPTUNE,    C_PHASE,    F_MNU1|F_PLT),
  1319. X    rcfpack (R_NEPTUNE,    C_PLUTO,    F_MNU3|F_PLT),
  1320. X    rcfpack (R_NEPTUNE,    C_RA,        F_MNU1|F_PLT),
  1321. X    rcfpack (R_NEPTUNE,    C_RISEAZ,    F_MNU2|F_PLT),
  1322. X    rcfpack (R_NEPTUNE,    C_RISETM,    F_MNU2|F_PLT),
  1323. X    rcfpack (R_NEPTUNE,    C_SATURN,    F_MNU3|F_PLT),
  1324. X    rcfpack (R_NEPTUNE,    C_SDIST,    F_MNU1|F_PLT),
  1325. X    rcfpack (R_NEPTUNE,    C_SETAZ,    F_MNU2|F_PLT),
  1326. X    rcfpack (R_NEPTUNE,    C_SETTM,    F_MNU2|F_PLT),
  1327. X    rcfpack (R_NEPTUNE,    C_SIZE,        F_MNU1|F_PLT),
  1328. X    rcfpack (R_NEPTUNE,    C_SUN,        F_MNU3|F_PLT),
  1329. X    rcfpack (R_NEPTUNE,    C_TRANSALT,    F_MNU2|F_PLT),
  1330. X    rcfpack (R_NEPTUNE,    C_TRANSTM,    F_MNU2|F_PLT),
  1331. X    rcfpack (R_NEPTUNE,    C_TUP,        F_MNU2|F_PLT),
  1332. X    rcfpack (R_NEPTUNE,    C_URANUS,    F_MNU3|F_PLT),
  1333. X    rcfpack (R_NEPTUNE,    C_VENUS,    F_MNU3|F_PLT),
  1334. X    rcfpack (R_NSTEP,    C_NSTEPV,    F_MMNU|F_CHG),
  1335. X    rcfpack (R_OBJX,    C_ALT,        F_MNU1|F_PLT),
  1336. X    rcfpack (R_OBJX,    C_AZ,        F_MNU1|F_PLT),
  1337. X    rcfpack (R_OBJX,    C_DEC,        F_MNU1|F_PLT),
  1338. X    rcfpack (R_OBJX,    C_EDIST,    F_MNU1|F_PLT),
  1339. X    rcfpack (R_OBJX,    C_ELONG,    F_MNU1|F_PLT),
  1340. X    rcfpack (R_OBJX,    C_HLAT,        F_MNU1|F_PLT),
  1341. X    rcfpack (R_OBJX,    C_HLONG,    F_MNU1|F_PLT),
  1342. X    rcfpack (R_OBJX,    C_JUPITER,    F_MNU3|F_PLT),
  1343. X    rcfpack (R_OBJX,    C_MAG,        F_MNU1|F_PLT),
  1344. X    rcfpack (R_OBJX,    C_MARS,        F_MNU3|F_PLT),
  1345. X    rcfpack (R_OBJX,    C_MERCURY,    F_MNU3|F_PLT),
  1346. X    rcfpack (R_OBJX,    C_MOON,        F_MNU3|F_PLT),
  1347. X    rcfpack (R_OBJX,    C_NEPTUNE,    F_MNU3|F_PLT),
  1348. X    rcfpack (R_OBJX,    C_OBJ,        F_MMNU|F_CHG),
  1349. X    rcfpack (R_OBJX,    C_PHASE,    F_MNU1|F_PLT),
  1350. X    rcfpack (R_OBJX,    C_PLUTO,    F_MNU3|F_PLT),
  1351. X    rcfpack (R_OBJX,    C_RA,        F_MNU1|F_PLT),
  1352. X    rcfpack (R_OBJX,    C_RISEAZ,    F_MNU2|F_PLT),
  1353. X    rcfpack (R_OBJX,    C_RISETM,    F_MNU2|F_PLT),
  1354. X    rcfpack (R_OBJX,    C_SATURN,    F_MNU3|F_PLT),
  1355. X    rcfpack (R_OBJX,    C_SDIST,    F_MNU1|F_PLT),
  1356. X    rcfpack (R_OBJX,    C_SETAZ,    F_MNU2|F_PLT),
  1357. X    rcfpack (R_OBJX,    C_SETTM,    F_MNU2|F_PLT),
  1358. X    rcfpack (R_OBJX,    C_SUN,        F_MNU3|F_PLT),
  1359. X    rcfpack (R_OBJX,    C_TRANSALT,    F_MNU2|F_PLT),
  1360. X    rcfpack (R_OBJX,    C_TRANSTM,    F_MNU2|F_PLT),
  1361. X    rcfpack (R_OBJX,    C_TUP,        F_MNU2|F_PLT),
  1362. X    rcfpack (R_OBJX,    C_URANUS,    F_MNU3|F_PLT),
  1363. X    rcfpack (R_OBJX,    C_VENUS,    F_MNU3|F_PLT),
  1364. X    rcfpack (R_PLOT,    C_PLOT,        F_MMNU|F_CHG),
  1365. X    rcfpack (R_PLUTO,    C_ALT,        F_MNU1|F_PLT),
  1366. X    rcfpack (R_PLUTO,    C_AZ,        F_MNU1|F_PLT),
  1367. X    rcfpack (R_PLUTO,    C_DEC,        F_MNU1|F_PLT),
  1368. X    rcfpack (R_PLUTO,    C_EDIST,    F_MNU1|F_PLT),
  1369. X    rcfpack (R_PLUTO,    C_ELONG,    F_MNU1|F_PLT),
  1370. X    rcfpack (R_PLUTO,    C_HLAT,        F_MNU1|F_PLT),
  1371. X    rcfpack (R_PLUTO,    C_HLONG,    F_MNU1|F_PLT),
  1372. X    rcfpack (R_PLUTO,    C_JUPITER,    F_MNU3|F_PLT),
  1373. X    rcfpack (R_PLUTO,    C_MAG,        F_MNU1|F_PLT),
  1374. X    rcfpack (R_PLUTO,    C_MARS,        F_MNU3|F_PLT),
  1375. X    rcfpack (R_PLUTO,    C_MERCURY,    F_MNU3|F_PLT),
  1376. X    rcfpack (R_PLUTO,    C_MOON,        F_MNU3|F_PLT),
  1377. X    rcfpack (R_PLUTO,    C_NEPTUNE,    F_MNU3|F_PLT),
  1378. X    rcfpack (R_PLUTO,    C_OBJ,        F_MMNU|F_CHG),
  1379. X    rcfpack (R_PLUTO,    C_OBJX,        F_MNU3|F_PLT),
  1380. X    rcfpack (R_PLUTO,    C_PHASE,    F_MNU1|F_PLT),
  1381. X    rcfpack (R_PLUTO,    C_RA,        F_MNU1|F_PLT),
  1382. X    rcfpack (R_PLUTO,    C_RISEAZ,    F_MNU2|F_PLT),
  1383. X    rcfpack (R_PLUTO,    C_RISETM,    F_MNU2|F_PLT),
  1384. X    rcfpack (R_PLUTO,    C_SATURN,    F_MNU3|F_PLT),
  1385. X    rcfpack (R_PLUTO,    C_SDIST,    F_MNU1|F_PLT),
  1386. X    rcfpack (R_PLUTO,    C_SETAZ,    F_MNU2|F_PLT),
  1387. X    rcfpack (R_PLUTO,    C_SETTM,    F_MNU2|F_PLT),
  1388. X    rcfpack (R_PLUTO,    C_SIZE,        F_MNU1|F_PLT),
  1389. X    rcfpack (R_PLUTO,    C_SUN,        F_MNU3|F_PLT),
  1390. X    rcfpack (R_PLUTO,    C_TRANSALT,    F_MNU2|F_PLT),
  1391. X    rcfpack (R_PLUTO,    C_TRANSTM,    F_MNU2|F_PLT),
  1392. X    rcfpack (R_PLUTO,    C_TUP,        F_MNU2|F_PLT),
  1393. X    rcfpack (R_PLUTO,    C_URANUS,    F_MNU3|F_PLT),
  1394. X    rcfpack (R_PLUTO,    C_VENUS,    F_MNU3|F_PLT),
  1395. X    rcfpack (R_PRES,    C_PRESV,    F_MMNU|F_CHG|F_PLT),
  1396. X    rcfpack (R_SATURN,    C_ALT,        F_MNU1|F_PLT),
  1397. X    rcfpack (R_SATURN,    C_AZ,        F_MNU1|F_PLT),
  1398. X    rcfpack (R_SATURN,    C_DEC,        F_MNU1|F_PLT),
  1399. X    rcfpack (R_SATURN,    C_EDIST,    F_MNU1|F_PLT),
  1400. X    rcfpack (R_SATURN,    C_ELONG,    F_MNU1|F_PLT),
  1401. X    rcfpack (R_SATURN,    C_HLAT,        F_MNU1|F_PLT),
  1402. X    rcfpack (R_SATURN,    C_HLONG,    F_MNU1|F_PLT),
  1403. X    rcfpack (R_SATURN,    C_JUPITER,    F_MNU3|F_PLT),
  1404. X    rcfpack (R_SATURN,    C_MAG,        F_MNU1|F_PLT),
  1405. X    rcfpack (R_SATURN,    C_MARS,        F_MNU3|F_PLT),
  1406. X    rcfpack (R_SATURN,    C_MERCURY,    F_MNU3|F_PLT),
  1407. X    rcfpack (R_SATURN,    C_MOON,        F_MNU3|F_PLT),
  1408. X    rcfpack (R_SATURN,    C_NEPTUNE,    F_MNU3|F_PLT),
  1409. X    rcfpack (R_SATURN,    C_OBJ,        F_MMNU|F_CHG),
  1410. X    rcfpack (R_SATURN,    C_OBJX,        F_MNU3|F_PLT),
  1411. X    rcfpack (R_SATURN,    C_PHASE,    F_MNU1|F_PLT),
  1412. X    rcfpack (R_SATURN,    C_PLUTO,    F_MNU3|F_PLT),
  1413. X    rcfpack (R_SATURN,    C_RA,        F_MNU1|F_PLT),
  1414. X    rcfpack (R_SATURN,    C_RISEAZ,    F_MNU2|F_PLT),
  1415. X    rcfpack (R_SATURN,    C_RISETM,    F_MNU2|F_PLT),
  1416. X    rcfpack (R_SATURN,    C_SDIST,    F_MNU1|F_PLT),
  1417. X    rcfpack (R_SATURN,    C_SETAZ,    F_MNU2|F_PLT),
  1418. X    rcfpack (R_SATURN,    C_SETTM,    F_MNU2|F_PLT),
  1419. X    rcfpack (R_SATURN,    C_SIZE,        F_MNU1|F_PLT),
  1420. X    rcfpack (R_SATURN,    C_SUN,        F_MNU3|F_PLT),
  1421. X    rcfpack (R_SATURN,    C_TRANSALT,    F_MNU2|F_PLT),
  1422. X    rcfpack (R_SATURN,    C_TRANSTM,    F_MNU2|F_PLT),
  1423. X    rcfpack (R_SATURN,    C_TUP,        F_MNU2|F_PLT),
  1424. X    rcfpack (R_SATURN,    C_URANUS,    F_MNU3|F_PLT),
  1425. X    rcfpack (R_SATURN,    C_VENUS,    F_MNU3|F_PLT),
  1426. X    rcfpack (R_SRCH,    C_SRCH,        F_MMNU|F_CHG|F_PLT),
  1427. X    rcfpack (R_STPSZ,    C_STPSZV,    F_MMNU|F_CHG),
  1428. X    rcfpack (R_SUN,    C_ALT,        F_MNU1|F_PLT),
  1429. X    rcfpack (R_SUN,    C_AZ,        F_MNU1|F_PLT),
  1430. X    rcfpack (R_SUN,    C_DEC,        F_MNU1|F_PLT),
  1431. X    rcfpack (R_SUN,    C_EDIST,    F_MNU1|F_PLT),
  1432. X    rcfpack (R_SUN,    C_HLONG,    F_MNU1|F_PLT),
  1433. X    rcfpack (R_SUN,    C_JUPITER,    F_MNU3|F_PLT),
  1434. X    rcfpack (R_SUN,    C_MAG,        F_MNU1|F_PLT),
  1435. X    rcfpack (R_SUN,    C_MARS,        F_MNU3|F_PLT),
  1436. X    rcfpack (R_SUN,    C_MERCURY,    F_MNU3|F_PLT),
  1437. X    rcfpack (R_SUN,    C_MOON,        F_MNU3|F_PLT),
  1438. X    rcfpack (R_SUN,    C_NEPTUNE,    F_MNU3|F_PLT),
  1439. X    rcfpack (R_SUN,    C_OBJ,        F_MMNU|F_CHG),
  1440. X    rcfpack (R_SUN,    C_OBJX,        F_MNU3|F_PLT),
  1441. X    rcfpack (R_SUN,    C_PLUTO,    F_MNU3|F_PLT),
  1442. X    rcfpack (R_SUN,    C_RA,        F_MNU1|F_PLT),
  1443. X    rcfpack (R_SUN,    C_RISEAZ,    F_MNU2|F_PLT),
  1444. X    rcfpack (R_SUN,    C_RISETM,    F_MNU2|F_PLT),
  1445. X    rcfpack (R_SUN,    C_SATURN,    F_MNU3|F_PLT),
  1446. X    rcfpack (R_SUN,    C_SETAZ,    F_MNU2|F_PLT),
  1447. X    rcfpack (R_SUN,    C_SETTM,    F_MNU2|F_PLT),
  1448. X    rcfpack (R_SUN,    C_SIZE,        F_MNU1|F_PLT),
  1449. X    rcfpack (R_SUN,    C_TRANSALT,    F_MNU2|F_PLT),
  1450. X    rcfpack (R_SUN,    C_TRANSTM,    F_MNU2|F_PLT),
  1451. X    rcfpack (R_SUN,    C_TUP,        F_MNU2|F_PLT),
  1452. X    rcfpack (R_SUN,    C_URANUS,    F_MNU3|F_PLT),
  1453. X    rcfpack (R_SUN,    C_VENUS,    F_MNU3|F_PLT),
  1454. X    rcfpack (R_TEMP,    C_TEMPV,    F_MMNU|F_CHG|F_PLT),
  1455. X    rcfpack (R_TZN,    C_TZN,        F_MMNU|F_CHG),
  1456. X    rcfpack (R_TZONE,    C_TZONEV,    F_MMNU|F_CHG),
  1457. X    rcfpack (R_UD,    C_UD,        F_MMNU|F_PLT|F_CHG),
  1458. X    rcfpack (R_URANUS,    C_ALT,        F_MNU1|F_PLT),
  1459. X    rcfpack (R_URANUS,    C_AZ,        F_MNU1|F_PLT),
  1460. X    rcfpack (R_URANUS,    C_DEC,        F_MNU1|F_PLT),
  1461. X    rcfpack (R_URANUS,    C_EDIST,    F_MNU1|F_PLT),
  1462. X    rcfpack (R_URANUS,    C_ELONG,    F_MNU1|F_PLT),
  1463. X    rcfpack (R_URANUS,    C_HLAT,        F_MNU1|F_PLT),
  1464. X    rcfpack (R_URANUS,    C_HLONG,    F_MNU1|F_PLT),
  1465. X    rcfpack (R_URANUS,    C_JUPITER,    F_MNU3|F_PLT),
  1466. X    rcfpack (R_URANUS,    C_MAG,        F_MNU1|F_PLT),
  1467. X    rcfpack (R_URANUS,    C_MARS,        F_MNU3|F_PLT),
  1468. X    rcfpack (R_URANUS,    C_MERCURY,    F_MNU3|F_PLT),
  1469. X    rcfpack (R_URANUS,    C_MOON,        F_MNU3|F_PLT),
  1470. X    rcfpack (R_URANUS,    C_NEPTUNE,    F_MNU3|F_PLT),
  1471. X    rcfpack (R_URANUS,    C_OBJ,        F_MMNU|F_CHG),
  1472. X    rcfpack (R_URANUS,    C_OBJX,        F_MNU3|F_PLT),
  1473. X    rcfpack (R_URANUS,    C_PHASE,    F_MNU1|F_PLT),
  1474. X    rcfpack (R_URANUS,    C_PLUTO,    F_MNU3|F_PLT),
  1475. X    rcfpack (R_URANUS,    C_RA,        F_MNU1|F_PLT),
  1476. X    rcfpack (R_URANUS,    C_RISEAZ,    F_MNU2|F_PLT),
  1477. X    rcfpack (R_URANUS,    C_RISETM,    F_MNU2|F_PLT),
  1478. X    rcfpack (R_URANUS,    C_SATURN,    F_MNU3|F_PLT),
  1479. X    rcfpack (R_URANUS,    C_SDIST,    F_MNU1|F_PLT),
  1480. X    rcfpack (R_URANUS,    C_SETAZ,    F_MNU2|F_PLT),
  1481. X    rcfpack (R_URANUS,    C_SETTM,    F_MNU2|F_PLT),
  1482. X    rcfpack (R_URANUS,    C_SIZE,        F_MNU1|F_PLT),
  1483. X    rcfpack (R_URANUS,    C_SUN,        F_MNU3|F_PLT),
  1484. X    rcfpack (R_URANUS,    C_TRANSALT,    F_MNU2|F_PLT),
  1485. X    rcfpack (R_URANUS,    C_TRANSTM,    F_MNU2|F_PLT),
  1486. X    rcfpack (R_URANUS,    C_TUP,        F_MNU2|F_PLT),
  1487. X    rcfpack (R_URANUS,    C_VENUS,    F_MNU3|F_PLT),
  1488. X    rcfpack (R_UT,    C_UTV,        F_MMNU|F_PLT|F_CHG),
  1489. X    rcfpack (R_VENUS,    C_ALT,        F_MNU1|F_PLT),
  1490. X    rcfpack (R_VENUS,    C_AZ,        F_MNU1|F_PLT),
  1491. X    rcfpack (R_VENUS,    C_DEC,        F_MNU1|F_PLT),
  1492. X    rcfpack (R_VENUS,    C_EDIST,    F_MNU1|F_PLT),
  1493. X    rcfpack (R_VENUS,    C_ELONG,    F_MNU1|F_PLT),
  1494. X    rcfpack (R_VENUS,    C_HLAT,        F_MNU1|F_PLT),
  1495. X    rcfpack (R_VENUS,    C_HLONG,    F_MNU1|F_PLT),
  1496. X    rcfpack (R_VENUS,    C_JUPITER,    F_MNU3|F_PLT),
  1497. X    rcfpack (R_VENUS,    C_MAG,        F_MNU1|F_PLT),
  1498. X    rcfpack (R_VENUS,    C_MARS,        F_MNU3|F_PLT),
  1499. X    rcfpack (R_VENUS,    C_MERCURY,    F_MNU3|F_PLT),
  1500. X    rcfpack (R_VENUS,    C_MOON,        F_MNU3|F_PLT),
  1501. X    rcfpack (R_VENUS,    C_NEPTUNE,    F_MNU3|F_PLT),
  1502. X    rcfpack (R_VENUS,    C_OBJ,        F_MMNU|F_CHG),
  1503. X    rcfpack (R_VENUS,    C_OBJX,        F_MNU3|F_PLT),
  1504. X    rcfpack (R_VENUS,    C_PHASE,    F_MNU1|F_PLT),
  1505. X    rcfpack (R_VENUS,    C_PLUTO,    F_MNU3|F_PLT),
  1506. X    rcfpack (R_VENUS,    C_RA,        F_MNU1|F_PLT),
  1507. X    rcfpack (R_VENUS,    C_RISEAZ,    F_MNU2|F_PLT),
  1508. X    rcfpack (R_VENUS,    C_RISETM,    F_MNU2|F_PLT),
  1509. X    rcfpack (R_VENUS,    C_SATURN,    F_MNU3|F_PLT),
  1510. X    rcfpack (R_VENUS,    C_SDIST,    F_MNU1|F_PLT),
  1511. X    rcfpack (R_VENUS,    C_SETAZ,    F_MNU2|F_PLT),
  1512. X    rcfpack (R_VENUS,    C_SETTM,    F_MNU2|F_PLT),
  1513. X    rcfpack (R_VENUS,    C_SIZE,        F_MNU1|F_PLT),
  1514. X    rcfpack (R_VENUS,    C_SUN,        F_MNU3|F_PLT),
  1515. X    rcfpack (R_VENUS,    C_TRANSALT,    F_MNU2|F_PLT),
  1516. X    rcfpack (R_VENUS,    C_TRANSTM,    F_MNU2|F_PLT),
  1517. X    rcfpack (R_VENUS,    C_TUP,        F_MNU2|F_PLT),
  1518. X    rcfpack (R_VENUS,    C_URANUS,    F_MNU3|F_PLT),
  1519. X    rcfpack (R_WATCH,    C_WATCH,    F_MMNU|F_CHG),
  1520. X};
  1521. X#define    NFIELDS (sizeof(fields)/sizeof(fields[0]))
  1522. X
  1523. X/* let op select a field by moving around and hitting RETURN, or until see END.
  1524. X * also allow moving directly to a planet row using its name.
  1525. X * only allow fields with the given flag mask.
  1526. X * return the rcfpack()'d field, or 0 if typed END.
  1527. X * N.B. we might also exit() entirely by calling bye() if op types QUIT.
  1528. X */
  1529. Xsel_fld (r, c, flag, prmpt, help)
  1530. Xint r, c;    /* inial row, col */
  1531. Xint flag;
  1532. Xchar *prmpt, *help;
  1533. X{
  1534. X    extern void bye();
  1535. X    char *lastp;
  1536. X    int ch;
  1537. X
  1538. X    lastp = 0;
  1539. X    while (1) {
  1540. X        if (lastp != prmpt) {
  1541. X        lastp = prmpt;
  1542. X        f_prompt (lastp);
  1543. X        }
  1544. X        c_pos (r, c);
  1545. X        switch (ch = read_char()) {
  1546. X        case REDRAW:
  1547. X        redraw_screen(2);    /* redraw all from scratch */
  1548. X        lastp = 0;
  1549. X        break;
  1550. X        case VERSION:
  1551. X        version();
  1552. X        lastp = 0;
  1553. X        break;
  1554. X        case HELP:
  1555. X        f_msg (help);
  1556. X        lastp = 0;
  1557. X        break;
  1558. X        case QUIT:
  1559. X        f_prompt ("Exit ephem? (y) ");
  1560. X        if (read_char() == 'y')
  1561. X            bye();    /* never returns */
  1562. X        lastp = 0;
  1563. X        break;
  1564. X        case END:
  1565. X        return (0);
  1566. X        case '\r':
  1567. X        return (rcfpack (r, c, 0));
  1568. X        default:
  1569. X        move_cur (ch, flag, &r, &c);
  1570. X        break;
  1571. X        }
  1572. X    }
  1573. X}
  1574. X
  1575. X/* move cursor to next field in given direction: hjkl, or directly to a
  1576. X * field, and set *rp and *cp.
  1577. X * limit eligible fields to those with given flag mask.
  1578. X */
  1579. Xstatic
  1580. Xmove_cur (dirchar, flag, rp, cp)
  1581. Xchar dirchar;
  1582. Xint flag;
  1583. Xint *rp, *cp;
  1584. X{
  1585. X    int curr = *rp, curc = *cp;
  1586. X    int f, newf, *fp;
  1587. X    int d, newd;
  1588. X
  1589. X    wrapped:
  1590. X    newf = 0;
  1591. X    newd = 1000;
  1592. X
  1593. X    switch (dirchar) {
  1594. X    case 'h': /* left */
  1595. X        /* go to next field to the left, or wrap.  */
  1596. X        for (fp = fields+NFIELDS; --fp >= fields; ) {
  1597. X        f = *fp;
  1598. X        if (tstpackf(f,flag) && unpackr(f) == curr) {
  1599. X            d = curc - unpackc(f);
  1600. X            if (d > 0 && d < newd) {
  1601. X            newf = f;
  1602. X            newd = d;
  1603. X            }
  1604. X        }
  1605. X        }
  1606. X        if (!newf) {
  1607. X        curc = NC;
  1608. X        goto wrapped;
  1609. X        }
  1610. X        break;
  1611. X
  1612. X    case 'j': /* down */
  1613. X        /* go to closest field on next row down with anything on it,
  1614. X         * or wrap.
  1615. X         */
  1616. X        for (fp = fields+NFIELDS; --fp >= fields; ) {
  1617. X        f = *fp;
  1618. X        if (tstpackf(f,flag)) {
  1619. X            d = unpackr(f) - curr;
  1620. X            if (d > 0 && d < newd) {
  1621. X            newf = f;
  1622. X            newd = d;
  1623. X            }
  1624. X        }
  1625. X        }
  1626. X        if (newf) {
  1627. X        /* now find the field closest to current col on that row */
  1628. X        newf = nearestfld (unpackr(newf), curc, flag);
  1629. X        } else {
  1630. X        curr = 0;
  1631. X        goto wrapped;
  1632. X        }
  1633. X        break;
  1634. X
  1635. X    case 'k': /* up */
  1636. X        /* go to closest field on next row up with anything on it, 
  1637. X         * or wrap.
  1638. X         */
  1639. X        for (fp = fields+NFIELDS; --fp >= fields; ) {
  1640. X        f = *fp;
  1641. X        if (tstpackf(f,flag)) {
  1642. X            d = curr - unpackr(f);
  1643. X            if (d > 0 && d < newd) {
  1644. X            newf = f;
  1645. X            newd = d;
  1646. X            }
  1647. X        }
  1648. X        }
  1649. X        if (newf) {
  1650. X        /* now find the field closest to current col on that row */
  1651. X        newf = nearestfld (unpackr(newf), curc, flag);
  1652. X        } else {
  1653. X        curr = NR+1;
  1654. X        goto wrapped;
  1655. X        }
  1656. X        break;
  1657. X
  1658. X    case 'l': /* right */
  1659. X        /* go to next field to the right, or wrap.  */
  1660. X        for (fp = fields+NFIELDS; --fp >= fields; ) {
  1661. X        f = *fp;
  1662. X        if (tstpackf(f,flag) && unpackr(f) == curr) {
  1663. X            d = unpackc(f) - curc;
  1664. X            if (d > 0 && d < newd) {
  1665. X            newf = f;
  1666. X            newd = d;
  1667. X            }
  1668. X        }
  1669. X        }
  1670. X        if (!newf) {
  1671. X        curc = 0;
  1672. X        goto wrapped;
  1673. X        }
  1674. X        break;
  1675. X
  1676. X    /* handy shorthands directly to a given spot.
  1677. X     * calling nearestfld() automatically allows for which menu
  1678. X     *   is up now and what is pickable.
  1679. X     * N.B. using nearestfld() can be too aggressive. it will try
  1680. X     *   other fields entirely if one you intend is not eligible.
  1681. X     */
  1682. X    case 'S': newf = nearestfld (R_SUN, 1, flag); break;
  1683. X    case 'M': newf = nearestfld (R_MOON, 1, flag); break;
  1684. X    case 'e': newf = nearestfld (R_MERCURY, 1, flag); break;
  1685. X    case 'v': newf = nearestfld (R_VENUS, 1, flag); break;
  1686. X    case 'm': newf = nearestfld (R_MARS, 1, flag); break;
  1687. X    case cntrl('j'): newf = nearestfld (R_JUPITER, 1, flag); break;
  1688. X    case 's': newf = nearestfld (R_SATURN, 1, flag); break;
  1689. X    case 'u': newf = nearestfld (R_URANUS, 1, flag); break;
  1690. X    case 'n': newf = nearestfld (R_NEPTUNE, 1, flag); break;
  1691. X    case 'p': newf = nearestfld (R_PLUTO, 1, flag); break;
  1692. X    case 'x': newf = nearestfld (R_OBJX, 1, flag); break;
  1693. X    case 'd': newf = nearestfld (R_UD, C_UD, flag); break;
  1694. X    case 'o': newf = nearestfld (R_EPOCH, C_EPOCHV, flag); break;
  1695. X    case 'z': newf = nearestfld (R_STPSZ, C_STPSZV, flag); break;
  1696. X    }
  1697. X
  1698. X    if (newf > 0) {
  1699. X        *rp = unpackr(newf);
  1700. X        *cp = unpackc(newf);
  1701. X    }
  1702. X}
  1703. X
  1704. X/* return the nearest field with given flag mask, either way, on this row,
  1705. X * else -1 if none.
  1706. X */
  1707. Xstatic int
  1708. Xnearestfld (r, c, flag)
  1709. Xint r, c, flag;
  1710. X{
  1711. X    int nf, f, *fp;
  1712. X    int d, d0;
  1713. X
  1714. X    nf = 0;
  1715. X    d0 = 1000;
  1716. X
  1717. X    for (fp = fields+NFIELDS; --fp >= fields; ) {
  1718. X        f = *fp;
  1719. X        if (tstpackf(f,flag) && unpackr(f) == r) {
  1720. X        d = abs(c - unpackc(f));
  1721. X        if (d < d0) {
  1722. X            nf = f;
  1723. X            d0 = d;
  1724. X        }
  1725. X        }
  1726. X    }
  1727. X    return (nf ? nf : -1);
  1728. X}
  1729. EOFxEOF
  1730. len=`wc -c < sel_fld.c`
  1731. if expr $len != 21267 > /dev/null
  1732. then echo Length of sel_fld.c is $len but it should be 21267.
  1733. fi
  1734. echo x sex_dec.c
  1735. sed -e 's/^X//' << 'EOFxEOF' > sex_dec.c
  1736. X/* given hours (or degrees), hd, minutes, m, and seconds, s, 
  1737. X * return decimal hours (or degrees), *d.
  1738. X * in the case of hours (angles) < 0, only the first non-zero element should
  1739. X *   be negative.
  1740. X */
  1741. Xsex_dec (hd, m, s, d)
  1742. Xint hd, m, s;
  1743. Xdouble *d;
  1744. X{
  1745. X    int sign = 1;
  1746. X
  1747. X    if (hd < 0) {
  1748. X        sign = -1;
  1749. X        hd = -hd;
  1750. X    } else if (m < 0) {
  1751. X        sign = -1;
  1752. X        m = -m;
  1753. X    } else if (s < 0) {
  1754. X        sign = -1;
  1755. X        s = -s;
  1756. X    }
  1757. X
  1758. X    *d = (((double)s/60.0 + (double)m)/60.0 + (double)hd) * sign;
  1759. X}
  1760. X
  1761. X/* given decimal hours (or degrees), d.
  1762. X * return nearest hours (or degrees), *hd, minutes, *m, and seconds, *s, 
  1763. X * each always non-negative; *isneg is set to 1 if d is < 0, else to 0.
  1764. X */
  1765. Xdec_sex (d, hd, m, s, isneg)
  1766. Xdouble d;
  1767. Xint *hd, *m, *s, *isneg;
  1768. X{
  1769. X    double min;
  1770. X
  1771. X    if (d < 0) {
  1772. X        *isneg = 1;
  1773. X        d = -d;
  1774. X    } else
  1775. X        *isneg = 0;
  1776. X
  1777. X    *hd = (int)d;
  1778. X    min = (d - *hd)*60.;
  1779. X    *m = (int)min;
  1780. X    *s = (int)((min - *m)*60. + 0.5);
  1781. X
  1782. X    if (*s == 60) {
  1783. X        if ((*m += 1) == 60) {
  1784. X        *hd += 1;
  1785. X        *m = 0;
  1786. X        }
  1787. X        *s = 0;
  1788. X    }
  1789. X    /* no  negative 0's */
  1790. X    if (*hd == 0 && *m == 0 && *s == 0)
  1791. X        *isneg = 0;
  1792. X}
  1793. X
  1794. X/* insure 0 <= *v < r.
  1795. X */
  1796. Xrange (v, r)
  1797. Xdouble *v, r;
  1798. X{
  1799. X    while (*v <  0) *v += r;
  1800. X    while (*v >= r) *v -= r;
  1801. X}
  1802. EOFxEOF
  1803. len=`wc -c < sex_dec.c`
  1804. if expr $len != 1194 > /dev/null
  1805. then echo Length of sex_dec.c is $len but it should be 1194.
  1806. fi
  1807.  
  1808.  
  1809.