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

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

/****************************************************************/
/* kfiles.c							*/
/*								*/
/* Disc file input routines to read initialization parameters	*/
/* parameters or file containing orbital elements.		*/
/****************************************************************/

/***** description
 *
 *	$Id: kfiles.c,v 1.7 1993/05/12 19:07:25 craig Exp $
 *
 */

/***** modification history
 *
 *	$Log: kfiles.c,v $
 * Revision 1.7  1993/05/12  19:07:25  craig
 * kinit now searches for a .site.ini file in the current directory or
 * the home directory.
 *
 * The printing of the site information is now optional using prtflg.
 *
 * The call to fincat in the getstar routine now includes a dummy
 * second char string to fit the prototype for fincat.
 *
 * Revision 1.6  1993/04/30  18:10:49  craig
 * Minor cosmetic changes.
 *
 * Revision 1.5  1993/04/22  21:04:36  craig
 * Added filename and flag option to kinit.  Kinit will now try to
 * open the file filename and print Moshier's banner if flag == 1.
 *
 * Revision 1.4  1993/04/22  19:45:09  craig
 * Minor changes.
 *
 * Revision 1.3  1993/04/21  21:22:42  craig
 * Changed the path of the satellite.h include.
 * Changed ecnsts to pcnsts.
 *
 * Revision 1.2  1993/04/21  15:17:42  craig
 * First working version.  Ran through indent and converted to ansi.
 * Added hooks for working with the satellite programs.
 *
 *
 */

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

#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "aaproto.h"
#include "satellite.h"

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

/* from cnstinit.c */

extern int jdflag;
extern int prtflg;

extern struct orbit earth;
extern struct MCONSTANTS mcnsts;
extern struct PCONSTANTS pcnsts;

/* from deltat.c */

extern double dtgiven;

/* The following items will be read in automatically from the disc file
 * named aa.ini, if one is provided.  The file contains one ASCII
 * string number per line so is easily edited.
 *
 * Terrestrial geocentric latitude and longitude of observer
 * in degrees East of Greenwich, North of equator
 * (kfiles.c converts from geodetic latitude input.)
 */

double tlong = -71.13;			/* Cambridge, Massachusetts */
double tlat = 42.38;			/* geocentric */
double glat = 42.17;			/* geodetic */

/* Parameters for calculation of azimuth and elevation */

double attemp = 20.0;			/* atmospheric temperature,
					   degrees Centigrade */
double atpress = 1013.0;		/* atmospheric pressure, millibars */

/* Distance from observer to center of earth, in earth radii */

double trho = 0.9985;

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

static int linenum = 1;

static char starnam[80] = {'s', 't', 'a', 'r', '.', 'c', 'a', 't', '\0'};
static char orbnam[80] = {'o', 'r', 'b', 'i', 't', '.', 'c', 'a', 't', '\0'};

static double flat = 298.257222;
static double aearth = 6378137.;
static double height = 0.0;

/************************************************/
/* kinit					*/
/*						*/
/* Read initialization file aa.ini and 		*/
/* adjust topocentric coordinates of observer.	*/
/************************************************/

int    kinit (void)
{
    char   s[84];
    char  *homedir, home[160];
    FILE  *f;
    double a, b, fl, co, si, u;

    /*
    if (prtflg)
    {
	printf ("\n\tSteve Moshier's Ephemeris Program v5.1\n\n");
	printf ("Planetary perturbations are from Meeus.\n");
	printf ("Extended Chapront Lunar theory.\n");
    }
    */


    f = fopen ("./.site.ini", "r");	/* primary site file */

    if (f == NULL)
    {
	homedir = getenv ("HOME");
	strcpy (home, homedir);
	strcat (home, "/.site.ini");
	f = fopen (home, "r");		/* alternate site file */

	if (f == NULL)
	{
	    return (-1);
	}
    }

    fgets (s, 80, f);
    sscanf (s, "%lf", &tlong);
    fgets (s, 80, f);
    sscanf (s, "%lf", &glat);
    fgets (s, 80, f);
    sscanf (s, "%lf", &height);
    u = glat * mcnsts.de2ra;

    /* Reduction from geodetic latitude to geocentric latitude AA page K5 */

    co = cos (u);
    si = sin (u);
    fl = 1.0 - 1.0 / flat;
    fl = fl * fl;
    si = si * si;
    u = 1.0 / sqrt (co * co + fl * si);
    a = aearth * u + height;
    b = aearth * fl * u + height;
    trho = sqrt (a * a * co * co + b * b * si);
    tlat = mcnsts.ra2de * acos (a * co / trho);

    if (glat < 0.0)
    {
	tlat = -tlat;
    }

    trho /= aearth;

    /* Reduction from geodetic latitude to geocentric latitude AA page K5 */

    /* tlat = glat - 0.19242861 * sin(2.0*u) + 0.00032314 * sin(4.0*u) -
       0.00000072 * sin(6.0*u);
    
    trho = 0.998327073 + 0.001676438 * cos(2.0*u) - 0.000003519 *
       cos(4.0*u) + 0.000000008 * cos(6.0*u); trho += height/6378160.; */

    fgets (s, 80, f);
    sscanf (s, "%lf", &attemp);
    fgets (s, 80, f);
    sscanf (s, "%lf", &atpress);
    fgets (s, 80, f);
    sscanf (s, "%d", &jdflag);
    fgets (s, 80, f);
    sscanf (s, "%lf", &dtgiven);

    if (prtflg)
    {
	printf ("\nSite parameters:\n\n");
	printf ("Terrestrial east longitude %.4f deg\n", tlong);
	printf ("geocentric latitude %.4f deg\n", tlat);
	printf ("Earth radius %.5f\n", trho);
	printf ("temperature %.1f C\n", attemp);
	printf ("pressure %.0f mb\n", atpress);

	switch (jdflag)
	{
	  case 0:
	    printf ("TDT and UT assumed equal.\n");
	    break;
	  case 1:
	    printf ("Input time is TDT.\n");
	    break;
	  case 2:
	    printf ("Input time is UT.\n");
	    break;
	  default:
	    printf ("Illegal jdflag\n");
	    exit (0);
	}

	if (dtgiven != 0.0)
	{
	    printf ("Using deltaT = %.2fs.\n", dtgiven);
	}

	printf ("\n");
    }

    fclose (f);

    return (0);
}

/***********************************************************/
/* getorbit						   */
/*							   */
/* Program to read in a file containing orbital parameters */
/***********************************************************/

int    getorbit (struct orbit * el)
{
    int    i;
    FILE  *f;
    char   s1[100], s2[100], *u, *v;


    getstring ("Name of orbit catalogue file: ", orbnam, 80);

    f = fincat (orbnam, 2, s1, s2);

    if (f == 0)
    {
	return (-1);			/* failure flag */
    }

    printf ("%s\n", s1);
    printf ("%s\n", s2);

    /* Read in ASCII floating point numbers */

    sscanf (s1, "%lf %lf %lf %lf %lf %lf",
	&el->epoch, &el->i, &el->W, &el->w, &el->a, &el->dm);

    sscanf (s2, "%lf %lf %lf %lf %lf %15s", &el->ecc, &el->M,
	&el->equinox, &el->mag, &el->sdiam, &el->obname[0]);

    el->obname[15] = '\0';

    /* Clear out the rest of the data structure */

    el->oelmnt = 0;
    el->celmnt = 0;
    el->L = 0.0;
    el->r = 0.0;
    el->plat = 0.0;

    if (strcmp (&el->obname[0], "Earth"))
    {
	return (0);
    }
    else
    {
	u = (char *) &earth;
	v = (char *) el;

	for (i = 0; i < sizeof (struct orbit); i++)
	{
	    *u++ = *v++;
	}

	printf ("Read in earth orbit\n");

	return (1);
    }
}

/***********/
/* getstar */
/***********/

int    getstar (struct star * el)
{
    int    i;
    int    sign;
    char  *p;
    char   s1[100], s2[100];
    FILE  *f;
    double rh, rm, rs, dd, dm, ds, x, z;

    getstring ("Name of star catalogue file: ", starnam, 80);
    f = fincat (starnam, 1, s1, s2);

    if (f == 0)
    {
	return (-1);			/* failure flag */
    }

    printf ("%s\n", s1);

    /* Read in the ASCII string data and name of the object */

    sscanf (s1, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %s",
	&el->epoch, &rh, &rm, &rs, &dd, &dm, &ds,
	&el->mura, &el->mudec, &el->v, &el->px, &x, &el->obname[0]);

    x = el->epoch;

    if (x == 2000.0)
    {
	x = pcnsts.J2000;
    }
    else if (x == 1950.0)
    {
	x = pcnsts.B1950;
    }
    else if (x == 1900.0)
    {
	x = pcnsts.J1900;
    }
    else
    {
	x = pcnsts.J2000 + (pcnsts.dapcen / 100.) * (x - 2000.0);
    }

    el->epoch = x;

    /* read the right ascension */

    el->ra = 2.0 * mcnsts.pi * (3600.0 * rh + 60.0 * rm + rs) /
	pcnsts.secpda;


    /* read the declination */

    sign = 1;

    if ((dd < 0.0) || (dm < 0.0) || (ds < 0.0))
    {
	sign = -1;
    }

    z = (3600.0 * fabs (dd) + 60.0 * fabs (dm) + fabs (ds)) / mcnsts.ra2sec;

    if (dd == 0.0)
    {
	/* Scan the text for possible minus sign in front of declination 0 */

	p = s1;

	/* skip over 4 fields */

	for (i = 0; i < 4; i++)
	{
	    while (*p++ == ' ');

	    while (*p++ != ' ');
	}

	while (*p++ == ' ');

	--p;

	if (*p == '-')
	{
	    sign = -1;
	}
    }

    if (sign < 0)
    {
	z = -z;
    }

    el->dec = z;

/*
    printf ("%.2lf\n", el->epoch);
    printf ("%.0lf %.0lf %.3lf\n", rh, rm, rs);
    printf ("%.8lf\n", el->ra);
    printf ("%.0lf %.0lf %.3lf\n", dd, dm, ds);
    printf ("%.8lf\n", el->dec);
    printf ("d %.3lf mua %.3lf mud %.3lf v %.3lf\n",
	el->px, el->mura, el->mudec, el->v);
*/

    el->mura *= 15.0 / mcnsts.ra2sec;	/* s/century -> "/century ->
					   rad/century */
    el->mudec /= mcnsts.ra2sec;
    z = el->px;

    if (z < 1.0)
    {
	if (z <= 0.0)
	{
	    el->px = 0.0;
	}
	else
	{
	    el->px = mcnsts.sec2ra * z;	/* assume px in arc seconds */
	}
    }
    else
    {
	el->px = 1.0 / (mcnsts.ra2sec * z);	/* parsecs -> radians */
    }
    return (0);
}

/****************************************/
/* fincat				*/
/*					*/
/* Open catalogue and find line number	*/
/****************************************/

FILE  *fincat (char *name, int n, char *str1, char *str2)
{
    int    i;
    FILE  *f;

    f = fopen (name, "r");

    if (f == 0)
    {
	printf ("Can't find file %s\n", name);
	return (0);			/* failure flag */
    }

    getint ("Line number", &linenum);

    if (linenum <= 0)
    {
	goto failure;
    }

    for (i = 0; i < linenum; i++)
    {
	fgets (str1, 98, f);

	if (*str1 == '-')
	{
	    goto endf;
	}

	if (n > 1)
	{
	    fgets (str2, 98, f);

	    if (*str2 == '-')
	    {
		goto endf;
	    }
	}
    }

    fclose (f);

    return (f);

endf:

    printf ("End of file reached.\n");

failure:

    fclose (f);

    return (0);
}

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