1
0
Fork 0
sattools/posmatch.c

176 lines
3.6 KiB
C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "sgdp4h.h"
#include "satutl.h"
#include <getopt.h>
#define LIM 80
// Cross product
xyz_t cross(xyz_t a,xyz_t b)
{
xyz_t c;
c.x=a.y*b.z-a.z*b.y;
c.y=a.z*b.x-a.x*b.z;
c.z=a.x*b.y-a.y*b.x;
return c;
}
// Read a line of maximum length int lim from file FILE into string s
int fgetline(FILE *file,char *s,int lim)
{
int c,i=0;
while (--lim > 0 && (c=fgetc(file)) != EOF && c != '\n')
s[i++] = c;
if (c == '\t')
c=' ';
if (c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
// Compute Julian Day from Date
double date2mjd(int year,int month,double day)
{
int a,b;
double jd;
if (month<3) {
year--;
month+=12;
}
a=floor(year/100.);
b=2.-a+floor(a/4.);
if (year<1582) b=0;
if (year==1582 && month<10) b=0;
if (year==1582 && month==10 && day<=4) b=0;
jd=floor(365.25*(year+4716))+floor(30.6001*(month+1))+day+b-1524.5;
return jd-2400000.5;
}
// DOY to MJD
double doy2mjd(int year,double doy)
{
int month,k=2;
double day;
if (year%4==0 && year%400!=0)
k=1;
month=floor(9.0*(k+doy)/275.0+0.98);
if (doy<32)
month=1;
day=doy-floor(275.0*month/9.0)+k*floor((month+9.0)/12.0)+30.0;
return date2mjd(year,month,day);
}
int main(int argc,char *argv[])
{
int i,arg=0,imode,n=100,satno,satname,satno2,imin,flag,status;
char catalog1[]="20180121_173045_catalog.txt",catalog2[]="jsc_20180122.txt";
FILE *file1,*file2;
orbit_t orb1,orb2;
double mjd0=58140.0,mjd;
xyz_t *r,*v,r0,v0,d,n1,n2;
double dr,dv,dn,drmin,dvmin,mjdmin;
char line0[LIM],line1[LIM],line2[LIM];
// Reroute stderr
freopen("/tmp/stderr.txt","w",stderr);
// Allocate
r=(xyz_t *) malloc(sizeof(xyz_t)*n);
v=(xyz_t *) malloc(sizeof(xyz_t)*n);
// Open file
file1=fopen(catalog1,"r");
file2=fopen(catalog2,"r");
// Loop over classfd catalog
while (read_twoline(file1,0,&orb1)==0) {
// Compute positions
imode=init_sgdp4(&orb1);
for (i=0;i<n;i++)
satpos_xyz(mjd0+2400000.5+(double) i/86400.0,&r[i],&v[i]);
// Loop over ISON catalog
flag=0;
rewind(file2);
while (read_twoline(file2,0,&orb2)==0) {
mjd=doy2mjd(orb2.ep_year,orb2.ep_day);
imode=init_sgdp4(&orb2);
satpos_xyz(mjd+2400000.5,&r0,&v0);
// Find nearest offset
for (i=0;i<n;i++) {
d.x=r[i].x-r0.x;
d.y=r[i].y-r0.y;
d.z=r[i].z-r0.z;
dr=sqrt(d.x*d.x+d.y*d.y+d.z*d.z);
d.x=v[i].x-v0.x;
d.y=v[i].y-v0.y;
d.z=v[i].z-v0.z;
dv=sqrt(d.x*d.x+d.y*d.y+d.z*d.z);
if (flag==0 || dr<drmin) {
drmin=dr;
dvmin=dv;
satno=orb2.satno;
imin=i;
mjdmin=mjd;
flag=1;
}
}
}
// Compute normals
rewind(file2);
read_twoline(file2,satno,&orb2);
mjd=doy2mjd(orb2.ep_year,orb2.ep_day);
imode=init_sgdp4(&orb2);
satpos_xyz(mjd+2400000.5,&r0,&v0);
n1=cross(r[0],v[0]);
n2=cross(r0,v0);
d.x=n1.x-n2.x;
d.y=n1.y-n2.y;
d.z=n1.z-n2.z;
dn=sqrt(d.x*d.x+d.y*d.y+d.z*d.z);
// Find object name
rewind(file2);
while (fgetline(file2,line0,LIM)>0) {
fgetline(file2,line1,LIM);
fgetline(file2,line2,LIM);
sscanf(line1,"1 %d",&satno2);
if (satno==satno2) {
sscanf(line0,"SO %d",&satname);
}
}
// printf("%05d %05d %8.2f km %9.5f km/s %6.0lf s %8.0f km\n",orb1.satno,satno,drmin,dvmin,(mjd0+(double) imin/86400.0-mjd)*86400,dn);
printf("%6d %05d %s | %5d %8.2f km %9.5f km/s %6.0lf s %8.0f km\n",satname,orb1.satno,orb1.desig,satno,drmin,dvmin,(mjd0+(double) imin/86400.0-mjd)*86400,dn);
}
fclose(file1);
fclose(file2);
// Free
free(r);
free(v);
return 0;
}