ftp.nice.ch/pub/next/science/astronomy/usat-NeXT.N.bs.tar.gz#/usat/almanacAA/aa.c

This is aa.c in view mode; [Download] [Up]

/************************************************************************/
/* aa.c --- driver for astronomical almanac programs			*/
/*									*/
/* This program calculates orbits of planetary bodies and reduces	*/
/* the coordinates of planets or stars to geocentric and topocentric	*/
/* place.  An effort has been made to use rigorous methods throughout.	*/
/*									*/
/* References to AA page numbers are to The Astronomical Almanac, 1986	*/
/* published by the U.S. Government Printing Office.			*/
/*									*/
/* The program uses as a default the orbital perturbations given in	*/
/* Jean Meeus, "Astronomical Formulae for Calculators", 3rd ed.,	*/
/* Willmann-Bell, Inc., 1985.						*/
/*									*/
/* Warning! Your atan2() function may not work the same as the one	*/
/* assumed by this program.						*/
/* atan2(x,y) computes atan(y/x), result between 0 and 2pi.		*/
/*									*/
/* S. L. Moshier, November, 1987					*/
/************************************************************************/

/***** description
 *
 *	$Id: aa.c,v 1.9 1993/05/18 16:44:15 craig Exp $
 *
 */

/***** modification history
 *
 *	$Log: aa.c,v $
 * Revision 1.9  1993/05/18  16:44:15  craig
 * modified call of dosun to add a semi-diameter input variable.
 *
 * Revision 1.8  1993/05/12  19:11:58  craig
 * changed the usage of the kinit routine to reflect modifications
 * with that routine.   The same for the rstar routine.
 *
 * Revision 1.7  1993/04/30  18:08:11  craig
 * Put in the option to send the output to somewhere different
 * than stdout.  Also some cosmetic changes in the output
 * and looping through the program.
 *
 * Revision 1.6  1993/04/29  16:05:26  craig
 * Changed the call to dosun as dosun now returns the alt, az
 * ra, and dec of the sun.
 *
 * Revision 1.5  1993/04/22  21:06:33  craig
 * Changed the call to kinit to a call with a filename and a flag
 * to reflect the change in kinit.
 *
 * Revision 1.4  1993/04/22  19:06:13  craig
 * Moved global variable declarations to cnstinit.c
 *
 * Revision 1.3  1993/04/21  20:24:03  craig
 * Removed the satellite.h include and the ecnsts and
 * mcnsts global structures.
 *
 * Revision 1.2  1993/04/21  14:57:10  craig
 * Ran through indent.  Converted to ansi.  Incorporated stuff for
 * use with the satellite program.
 *
 *
 */

/***** include files *****/

#include <string.h>
#include "aaproto.h"

/***** global variables *****/

/* from cnstinit.c */

extern int objnum;
extern int prtflg;

extern FILE *outfile;

extern double JD;
extern double TDT;
extern double rearth[3];
extern double eapolar[3];
extern double obpolar[3];

extern struct orbit mars;
extern struct orbit earth;
extern struct orbit pluto;
extern struct orbit venus;
extern struct orbit saturn;
extern struct orbit uranus;
extern struct orbit jupiter;
extern struct orbit mercury;
extern struct orbit neptune;

/***** local global variables *****/

/* Space for star description read from a disc file.  */

static struct star fstar;

/* Space for orbit read from a disc file. Entering 99 for the planet
   number yields a prompt for a file name containg ASCII strings
   specifying the elements. */

static struct orbit forbit;

/* coordinates of object */

static double robject[3] = {0.0};

/* Tabulation parameters */

static double djd = 1.0;
static int ntab = 1;


/********/
/* Main */
/********/

void   main (void)
{
    int    i;

    char   fname[40];

    double oalt, oaz, ora, odec, sdiam;

    struct orbit *elobject;		/* pointer to orbital elements of
					   object */
    cnstinit ();
    if (kinit () == -1)
    {
	fprintf (stderr, "Unable to find a ./.site.ini or a ");
	fprintf (stderr, "~/.site.ini site initialization file.\n");
	exit (-1);
    }

    outfile = stdout;

    printf ("Output file name: ( stdout ) ? ");

    if (strlen (gets (fname)))
    {
	/* open the output file */

	outfile = fopen (fname, "w");

	if (outfile == NULL)
	{
	    fprintf (stderr, "Error in opening output file: %s\n",
		fname);

	    exit (-1);
	}
    }

    printf ("\n");

    prtflg = 1;

loop:

    getint ("Planet number 0-9, 88 to read star, 99 to read orbit, -1 to exit",
	&objnum);
    
    if (objnum == -1)
    {
    	if (strlen (fname))
    	{
	    /* close the output file */

            fclose (outfile);
    	}

	exit (0);
    }

    printf ("\nEnter starting date of tabulation\n");
    JD = getdate ();			/* date */
    JD += gethms ();			/* time of day */
    update (stdout);			/* find UT and ET */
    fprintf (stdout,"Julian day %.7f\n", JD);

    getdouble ("\nEnter interval between tabulations in days", &djd);
    getint ("Number of tabulations to display", &ntab);

    if (ntab <= 0)
    {
	ntab = 1;
    }

    switch (objnum)
    {
      case 0:

	elobject = 0;
	fprintf (outfile, "\n                   The Sun\n");
	break;

      case 1:

	elobject = &mercury;
	break;

      case 2:

	elobject = &venus;
	break;

      case 3:

	elobject = 0;
	fprintf (outfile, "\n                   The Moon\n");
	break;

      case 4:

	elobject = &mars;
	break;

      case 5:

	elobject = &jupiter;
	break;

      case 6:

	elobject = &saturn;
	break;

      case 7:

	elobject = &uranus;
	break;

      case 8:

	elobject = &neptune;
	break;

      case 9:

	elobject = &pluto;
	break;

      case 88:

morstar:

        elobject = (struct orbit *) & fstar;
	i = getstar (&fstar);

	if (i == 1)
	{
	    goto loop;
	}

	if (i == 0)
	{
	    break;
	}

	goto operr;

      case 99:

	elobject = &forbit;
	i = getorbit (elobject);

	if (i == 1)
	{
	    goto loop;
	}

	if (i == 0)
	{
	    break;
	}

      default:

operr:

	printf ("Operator error.\n");

	goto loop;
    }

    if (elobject == (struct orbit *) & fstar)
    {
	showcname (&elobject->obname[0]);
    }
    else if (elobject)
    {
	fprintf (outfile, "\n                  %s\n", &elobject->obname[0]);
    }

    for (i = 0; i < ntab; i++)
    {
	/* print Julian date */

	fprintf (outfile, "\nJD %.2f,  ", JD);
	update (outfile);

	/* Always calculate heliocentric position of the earth */

	kepler (TDT, &earth, rearth, eapolar);

	switch (objnum)
	{
	  case 0:

	    dosun (&oalt, &oaz, &ora, &odec, &sdiam);
	    break;

	  case 3:

	    domoon ();
	    break;

	  case 88:

	    rstar (&fstar, &oalt, &oaz, &ora, &odec);
	    goto morstar;

	  default:

	    /* calculate heliocentric position of the object */

	    kepler (TDT, elobject, robject, obpolar);

	    /* apply correction factors and print apparent place */

	    reduce (elobject, robject, rearth);
	    break;
	}

	fprintf (outfile, "\n");

	if (outfile != stdout)
	{
	    printf ("\n");
	}

	JD += djd;
    }
    goto loop;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.