Misc updates
parent
623a0fa5d7
commit
a03d09bd80
5
makefile
5
makefile
|
@ -14,7 +14,7 @@ exec_prefix = $(prefix)
|
||||||
bindir = $(exec_prefix)/bin
|
bindir = $(exec_prefix)/bin
|
||||||
|
|
||||||
all:
|
all:
|
||||||
make rfedit rfplot rffft rfpng rffit rffind
|
make rfedit rfplot rffft rfpng rffit rffind rfdop
|
||||||
|
|
||||||
rffit: rffit.o sgdp4.o satutl.o deep.o ferror.o dsmin.o simplex.o versafit.o
|
rffit: rffit.o sgdp4.o satutl.o deep.o ferror.o dsmin.o simplex.o versafit.o
|
||||||
gfortran -o rffit rffit.o sgdp4.o satutl.o deep.o ferror.o dsmin.o simplex.o versafit.o $(LFLAGS)
|
gfortran -o rffit rffit.o sgdp4.o satutl.o deep.o ferror.o dsmin.o simplex.o versafit.o $(LFLAGS)
|
||||||
|
@ -22,6 +22,9 @@ rffit: rffit.o sgdp4.o satutl.o deep.o ferror.o dsmin.o simplex.o versafit.o
|
||||||
rfpng: rfpng.o rftime.o rfio.o rftrace.o sgdp4.o satutl.o deep.o ferror.o
|
rfpng: rfpng.o rftime.o rfio.o rftrace.o sgdp4.o satutl.o deep.o ferror.o
|
||||||
gfortran -o rfpng rfpng.o rftime.o rfio.o rftrace.o sgdp4.o satutl.o deep.o ferror.o $(LFLAGS)
|
gfortran -o rfpng rfpng.o rftime.o rfio.o rftrace.o sgdp4.o satutl.o deep.o ferror.o $(LFLAGS)
|
||||||
|
|
||||||
|
rfdop: rfdop.o rftrace.o rfio.o rftime.o sgdp4.o satutl.o deep.o ferror.o
|
||||||
|
$(CC) -o rfdop rfdop.o rftrace.o rfio.o rftime.o sgdp4.o satutl.o deep.o ferror.o -lm
|
||||||
|
|
||||||
rfedit: rfedit.o rfio.o rftime.o
|
rfedit: rfedit.o rfio.o rftime.o
|
||||||
$(CC) -o rfedit rfedit.o rfio.o rftime.o -lm
|
$(CC) -o rfedit rfedit.o rfio.o rftime.o -lm
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include "rfio.h"
|
||||||
|
#include "rftime.h"
|
||||||
|
#include "rftrace.h"
|
||||||
|
|
||||||
|
void usage(void)
|
||||||
|
{
|
||||||
|
printf("rfdop m:t:c:l:d:g:s:o:hi:\n\n");
|
||||||
|
printf("m date/time (MJD)\n");
|
||||||
|
printf("t date/time (yyyy-mm-ddThh:mm:ss.sss)\n");
|
||||||
|
printf("i NORAD number\n");
|
||||||
|
printf("c TLE catalog file\n");
|
||||||
|
printf("s site (COSPAR)\n");
|
||||||
|
printf("d time step [default: 10s]\n");
|
||||||
|
printf("l trail length [default: 900s]\n");
|
||||||
|
printf("g enable GRAVES\n");
|
||||||
|
printf("H skip high orbits (<10 revs/day)\n");
|
||||||
|
printf("o output file name\n");
|
||||||
|
printf("h this help\n");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int i, n, satno=0;
|
||||||
|
double mjd0, *mjd, t;
|
||||||
|
float length=900.0, dt=10.0;
|
||||||
|
int site_id;
|
||||||
|
int graves=0,skiphigh=0;
|
||||||
|
char *env,tlefile[256],nfd[64],outfname[256]="out.dat";
|
||||||
|
int arg=0;
|
||||||
|
|
||||||
|
// Get defaults
|
||||||
|
env=getenv("ST_COSPAR");
|
||||||
|
if (env!=NULL) {
|
||||||
|
site_id=atoi(env);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc>1) {
|
||||||
|
while ((arg=getopt(argc,argv,"m:t:c:i:l:d:gs:o:hH"))!=-1) {
|
||||||
|
switch (arg) {
|
||||||
|
case 't':
|
||||||
|
strcpy(nfd,optarg);
|
||||||
|
mjd0=nfd2mjd(nfd);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'm':
|
||||||
|
mjd0=(double) atof(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'c':
|
||||||
|
strcpy(tlefile,optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'i':
|
||||||
|
satno=atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'l':
|
||||||
|
length=atof(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'd':
|
||||||
|
dt=atof(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 's':
|
||||||
|
site_id=atoi(optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'g':
|
||||||
|
graves=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'H':
|
||||||
|
skiphigh=1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'o':
|
||||||
|
strcpy(outfname,optarg);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
usage();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate MJDs
|
||||||
|
n = (int) floor(length/dt);
|
||||||
|
mjd = (double *) malloc(sizeof(double)*n);
|
||||||
|
for (i=0;i<n;i++)
|
||||||
|
mjd[i] = mjd0+(double) i*dt/86400.0;
|
||||||
|
|
||||||
|
// Compute Doppler curves
|
||||||
|
compute_doppler(tlefile,mjd,n,site_id,satno,graves,skiphigh,outfname);
|
||||||
|
|
||||||
|
// Free
|
||||||
|
free(mjd);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
2
rfplot.c
2
rfplot.c
|
@ -56,7 +56,7 @@ int main(int argc,char *argv[])
|
||||||
float width=1500;
|
float width=1500;
|
||||||
float x,y,x0,y0;
|
float x,y,x0,y0;
|
||||||
char c;
|
char c;
|
||||||
char path[128],xlabel[64],ylabel[64],filename[32],tlefile[128];
|
char path[128],xlabel[128],ylabel[64],filename[32],tlefile[128];
|
||||||
int sec,lsec,ssec;
|
int sec,lsec,ssec;
|
||||||
char stime[16];
|
char stime[16];
|
||||||
double fmin,fmax,fcen,f;
|
double fmin,fmax,fcen,f;
|
||||||
|
|
107
rftrace.c
107
rftrace.c
|
@ -635,3 +635,110 @@ struct trace *compute_trace(char *tlefile,double *mjd,int n,int site_id,float fr
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compute trace
|
||||||
|
void compute_doppler(char *tlefile,double *mjd,int n,int site_id,int satno,int graves, int skiphigh, char *outfname)
|
||||||
|
{
|
||||||
|
int i,j,imode,flag,tflag,m,status;
|
||||||
|
struct point *p;
|
||||||
|
struct site s,sg;
|
||||||
|
FILE *file,*outfile;
|
||||||
|
orbit_t orb;
|
||||||
|
xyz_t satpos,satvel;
|
||||||
|
double dx,dy,dz,dvx,dvy,dvz,r,v,rg,vg;
|
||||||
|
double freq0;
|
||||||
|
char line[LIM],text[8];
|
||||||
|
struct trace *t;
|
||||||
|
float fmin,fmax;
|
||||||
|
char *env,freqlist[LIM];
|
||||||
|
double ra,de,azi,alt;
|
||||||
|
double rag,deg,azig,altg;
|
||||||
|
|
||||||
|
// Reloop stderr
|
||||||
|
if (freopen("/tmp/stderr.txt","w",stderr)==NULL)
|
||||||
|
fprintf(stderr,"Failed to redirect stderr\n");
|
||||||
|
|
||||||
|
// Get site
|
||||||
|
s=get_site(site_id);
|
||||||
|
|
||||||
|
// Allocate
|
||||||
|
p=(struct point *) malloc(sizeof(struct point)*n);
|
||||||
|
|
||||||
|
// Get observer position
|
||||||
|
for (i=0;i<n;i++)
|
||||||
|
obspos_xyz(mjd[i],s.lng,s.lat,s.alt,&p[i].obspos,&p[i].obsvel);
|
||||||
|
|
||||||
|
// Compute Graves positions
|
||||||
|
if (graves==1) {
|
||||||
|
sg=get_site(9999);
|
||||||
|
for (i=0;i<n;i++)
|
||||||
|
obspos_xyz(mjd[i],sg.lng,sg.lat,sg.alt,&p[i].grpos,&p[i].grvel);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open output file
|
||||||
|
outfile=fopen(outfname, "w");
|
||||||
|
|
||||||
|
// Print header
|
||||||
|
if (graves==1)
|
||||||
|
fprintf(outfile, "# satno mjd r v azi alt rg vg azig altg\n");
|
||||||
|
else
|
||||||
|
fprintf(outfile, "# satno mjd r v azi alt\n");
|
||||||
|
|
||||||
|
// Loop over TLEs
|
||||||
|
file=fopen(tlefile,"r");
|
||||||
|
while (read_twoline(file,satno,&orb)==0) {
|
||||||
|
// Initialize
|
||||||
|
imode=init_sgdp4(&orb);
|
||||||
|
if (imode==SGDP4_ERROR)
|
||||||
|
printf("Error\n");
|
||||||
|
|
||||||
|
// Skip high satellites
|
||||||
|
if (skiphigh==1 && orb.rev<10.0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Loop over points
|
||||||
|
for (i=0,flag=0,tflag=0;i<n;i++) {
|
||||||
|
// Get satellite position
|
||||||
|
satpos_xyz(mjd[i]+2400000.5,&satpos,&satvel);
|
||||||
|
|
||||||
|
dx=satpos.x-p[i].obspos.x;
|
||||||
|
dy=satpos.y-p[i].obspos.y;
|
||||||
|
dz=satpos.z-p[i].obspos.z;
|
||||||
|
dvx=satvel.x-p[i].obsvel.x;
|
||||||
|
dvy=satvel.y-p[i].obsvel.y;
|
||||||
|
dvz=satvel.z-p[i].obsvel.z;
|
||||||
|
r=sqrt(dx*dx+dy*dy+dz*dz);
|
||||||
|
v=(dvx*dx+dvy*dy+dvz*dz)/r;
|
||||||
|
ra=modulo(atan2(dy,dx)*R2D,360.0);
|
||||||
|
de=asin(dz/r)*R2D;
|
||||||
|
equatorial2horizontal(mjd[i],ra,de,sg.lng,sg.lat,&azi,&alt);
|
||||||
|
|
||||||
|
// Compute Graves velocity/frequency
|
||||||
|
if (graves==1) {
|
||||||
|
dx=satpos.x-p[i].grpos.x;
|
||||||
|
dy=satpos.y-p[i].grpos.y;
|
||||||
|
dz=satpos.z-p[i].grpos.z;
|
||||||
|
dvx=satvel.x-p[i].grvel.x;
|
||||||
|
dvy=satvel.y-p[i].grvel.y;
|
||||||
|
dvz=satvel.z-p[i].grvel.z;
|
||||||
|
rg=sqrt(dx*dx+dy*dy+dz*dz);
|
||||||
|
vg=(dvx*dx+dvy*dy+dvz*dz)/rg;
|
||||||
|
rag=modulo(atan2(dy,dx)*R2D,360.0);
|
||||||
|
deg=asin(dz/rg)*R2D;
|
||||||
|
equatorial2horizontal(mjd[i],rag,deg,sg.lng,sg.lat,&azig,&altg);
|
||||||
|
fprintf(outfile,"%05d %14.8lf %f %f %f %f %f %f %f %f\n",orb.satno,mjd[i],r,v,azi,alt,rg,vg,azig,altg);
|
||||||
|
} else {
|
||||||
|
fprintf(outfile,"%05d %14.8lf %f %f %f %f\n",orb.satno,mjd[i],r,v,azi,alt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(file);
|
||||||
|
fclose(outfile);
|
||||||
|
|
||||||
|
fclose(stderr);
|
||||||
|
|
||||||
|
// Free
|
||||||
|
free(p);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
|
@ -7,3 +7,5 @@ struct trace {
|
||||||
struct trace *compute_trace(char *tlefile,double *mjd,int n,int site_id,float fmin,float fmax,int *nsat,int graves);
|
struct trace *compute_trace(char *tlefile,double *mjd,int n,int site_id,float fmin,float fmax,int *nsat,int graves);
|
||||||
void identify_trace(char *tlefile,struct trace t,int satno);
|
void identify_trace(char *tlefile,struct trace t,int satno);
|
||||||
void identify_trace_graves(char *tlefile,struct trace t,int satno);
|
void identify_trace_graves(char *tlefile,struct trace t,int satno);
|
||||||
|
void compute_doppler(char *tlefile,double *mjd,int n,int site_id,int satno,int graves, int skiphigh,char *outfname);
|
||||||
|
int fgetline(FILE *file,char *s,int lim);
|
||||||
|
|
Loading…
Reference in New Issue