This is search.c in view mode; [Download] [Up]
/****************************************/
/* search.c */
/* */
/* search through a list of satellites */
/* in within a two line element file */
/* and generate orbits and output for */
/* matching entries */
/****************************************/
/***** description
*
* $Id: search.c,v 1.3 1993/05/18 16:46:33 craig Exp $
*
*/
/***** modification history
*
* $Log: search.c,v $
* Revision 1.3 1993/05/18 16:46:33 craig
* added some printing statements for outputting information
* to the sunplot file.
*
* Revision 1.2 1993/05/12 19:00:01 craig
* Added the decision making stuff from rsat.c. Changed how the
* rates are updated using a second call to do_orbit and satreduce
* at a future time.
*
* Revision 1.1 1993/05/06 18:35:12 craig
* Initial revision
*
*/
/***** include files *****/
#include <string.h>
#include <math.h>
#include "satellite.h"
#include "satproto.h"
#include "aaproto.h"
/***** global variables *****/
FILE *elefile;
FILE *plotfile;
struct star fstar;
struct ELEMENT element;
/* from cnstinit.c */
extern FILE *outfile;
extern double JD;
extern double UT;
extern struct PCONSTANTS pcnsts;
extern struct MCONSTANTS mcnsts;
/**********/
/* search */
/**********/
/* jdstart is the starting time */
/* jdstop is the ending time */
/* jddelta is the interval time in minutes */
/* satname is the satellite name */
/* horiz is the minimum altitude of the satellite */
/* sdist is the max distance between satellite and sun or area */
/* opflag is a option flag for satreduce (controls printout) */
int search (double jdstart, double jdstop, double jddelta,
char *satname, double horiz, double sdist, int opflag)
{
/***** Local variables *****/
int iept, iflag;
char whois[6];
double delo, del1, temp;
double a1, xnodp, ao;
double sdelt, x, N, D, srate, jdtime;
double delra = 0, deldec = 0;
double salt, saz, sra, sdec; /* search area position */
double oalt, oaz, ora, odec; /* object position */
double nalt, naz, nra, ndec; /* object position in future */
double sdiam;
/* sort through the element files */
rewind (elefile);
while (rdelement () == 0)
{
/* check the name of the satellite with that just read */
if (strlen (satname) != 0 && strstr (satname, element.name) == NULL)
{
continue;
}
/***** INPUT CHECK FOR PERIOD VS EPHEMERIS SELECTED *****/
/***** PERIOD GE 225 MINUTES IS DEEP SPACE *****/
a1 = pow (pcnsts.xke / element.xno, mcnsts.tothrd);
temp = pcnsts.ck2 * 1.5 *
(cos (element.xincl) * cos (element.xincl) * 3. - 1.) /
pow (1. - element.eo * element.eo, 1.5);
del1 = temp / (a1 * a1);
ao = a1 * (1. - del1 * (mcnsts.tothrd * .5 + del1 *
(del1 * 134. / 81. + 1.)));
delo = temp / (ao * ao);
xnodp = element.xno / (delo + 1.);
if (mcnsts.twopi / xnodp / pcnsts.xmnpda >= .15625)
{
iept = 3;
}
else
{
iept = 2;
}
iflag = 1;
/***** do the ephemeris *****/
jdtime = jdstart;
/* initial plotfile information */
if (opflag == 1)
{
JD = jdstart;
update (outfile);
dosun (&salt, &saz, &sra, &sdec, &sdiam);
sdiam *= mcnsts.ra2de;
fprintf (plotfile, "SUNDATA %f %f %s\n", JD, sdiam, element.name);
}
while (jdtime <= jdstop)
{
/* update the time */
JD = jdtime;
do_orbit (iflag, iept);
satreduce (&oalt, &oaz, &ora, &odec);
if (oalt > horiz)
{
switch (opflag)
{
case -1:
case 0:
salt = horiz;
sdelt = 0.;
break;
case 1:
case 2:
dosun (&salt, &saz, &sra, &sdec, &sdiam);
break;
case 3:
case 4:
rstar (&fstar, &salt, &saz, &sra, &sdec);
break;
}
if (salt < horiz)
{
jdtime += jddelta / pcnsts.xmnpda;
continue;
}
if (opflag > 0)
{
/* calculate the distance between the satellite
and the sun or search coordinate */
delra = (ora - sra);
if (delra > mcnsts.pi)
{
delra -= mcnsts.twopi;
}
else if (delra < -mcnsts.pi)
{
delra += mcnsts.twopi;
}
sdelt = delra * delra;
deldec = (odec - sdec);
sdelt += deldec * deldec;
sdelt = sqrt (sdelt);
sdelt *= mcnsts.ra2de;
delra *= mcnsts.ra2de;
deldec *= mcnsts.ra2de;
}
/* find the rate at which ra and dec are changing */
/* using the position at time + jddelta */
JD = jdtime + jddelta / pcnsts.xmnpda;
do_orbit (iflag, iept);
satreduce (&nalt, &naz, &nra, &ndec);
JD = jdtime;
update (outfile);
x = mcnsts.ra2de / jddelta;
N = nra - ora;
if (N > mcnsts.pi)
{
N -= mcnsts.twopi;
}
else if (N < -mcnsts.pi)
{
N += mcnsts.twopi;
}
N = x * N;
D = x * (ndec - odec);
srate = N * N + D * D;
srate = sqrt (srate);
/* print out */
if (sdelt < sdist)
{
switch (opflag)
{
case 0:
fprintf (outfile, "\n");
jtocal (outfile, UT);
fprintf (outfile, "\t%s Position: \n", element.name);
fprintf (outfile,
"\t\tAltitude %.3f deg Azimuth %.3f deg\n",
oalt, oaz);
fprintf (outfile, "\t\tR.A.");
hms (outfile, ora);
fprintf (outfile, " Dec.");
dms (outfile, odec);
fprintf (outfile, "\n");
fprintf (outfile,
"\t\tdRA/dt %.2f deg/min, dDec/dt %.2f deg/min\n",
N, D );
fprintf (outfile, "\n");
break;
case 1:
case 3:
fprintf (outfile, "\n");
jtocal (outfile, UT);
fprintf (outfile, "\t%s Position: \n", element.name);
fprintf (outfile,
"\t\tAltitude %.3f deg Azimuth %.3f deg\n",
oalt, oaz);
fprintf (outfile, "\t\tR.A.");
hms (outfile, ora);
fprintf (outfile, " Dec.");
dms (outfile, odec);
fprintf (outfile, "\n");
fprintf (outfile,
"\t\tdRA/dt %.2f deg/min, dDec/dt %.2f deg/min\n",
N, D );
if (opflag == 1)
{
strcpy (whois, "Solar");
fprintf (plotfile, "%f %f %f\n", JD, delra,
deldec);
}
else
{
strcpy (whois, "Area");
}
fprintf (outfile, "\tSatellite - %s distance %f\n",
whois, sdelt);
fprintf (outfile, "\t%s Position: \n", whois);
fprintf (outfile,
"\t\tAltitude %.3f deg Azimuth %.3f deg\n",
salt, saz);
fprintf (outfile, "\t\tR.A.");
hms (outfile, sra);
fprintf (outfile, " Dec.");
dms (outfile, sdec);
fprintf (outfile, "\n");
break;
case -1:
case 2:
case 4:
fprintf (outfile, "%f %f %s\n",
jdtime, srate, element.name);
break;
}
}
}
jdtime += jddelta / pcnsts.xmnpda;
}
}
return (0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.