1*3e12c5d1SDavid du Colombier #include "astro.h"
2*3e12c5d1SDavid du Colombier
3*3e12c5d1SDavid du Colombier char* satlst[] =
4*3e12c5d1SDavid du Colombier {
5*3e12c5d1SDavid du Colombier 0,
6*3e12c5d1SDavid du Colombier };
7*3e12c5d1SDavid du Colombier
8*3e12c5d1SDavid du Colombier struct
9*3e12c5d1SDavid du Colombier {
10*3e12c5d1SDavid du Colombier double time;
11*3e12c5d1SDavid du Colombier double tilt;
12*3e12c5d1SDavid du Colombier double pnni;
13*3e12c5d1SDavid du Colombier double psi;
14*3e12c5d1SDavid du Colombier double ppi;
15*3e12c5d1SDavid du Colombier double d1pp;
16*3e12c5d1SDavid du Colombier double peri;
17*3e12c5d1SDavid du Colombier double d1per;
18*3e12c5d1SDavid du Colombier double e0;
19*3e12c5d1SDavid du Colombier double deo;
20*3e12c5d1SDavid du Colombier double rdp;
21*3e12c5d1SDavid du Colombier double st;
22*3e12c5d1SDavid du Colombier double ct;
23*3e12c5d1SDavid du Colombier double rot;
24*3e12c5d1SDavid du Colombier double semi;
25*3e12c5d1SDavid du Colombier } satl;
26*3e12c5d1SDavid du Colombier
27*3e12c5d1SDavid du Colombier void
satels(void)28*3e12c5d1SDavid du Colombier satels(void)
29*3e12c5d1SDavid du Colombier {
30*3e12c5d1SDavid du Colombier double ifa[10], t, t1, t2, tinc;
31*3e12c5d1SDavid du Colombier char **satp;
32*3e12c5d1SDavid du Colombier int flag, f, i, n;
33*3e12c5d1SDavid du Colombier
34*3e12c5d1SDavid du Colombier satp = satlst;
35*3e12c5d1SDavid du Colombier
36*3e12c5d1SDavid du Colombier loop:
37*3e12c5d1SDavid du Colombier if(*satp == 0)
38*3e12c5d1SDavid du Colombier return;
39*3e12c5d1SDavid du Colombier f = open(*satp, 0);
40*3e12c5d1SDavid du Colombier if(f < 0) {
41*3e12c5d1SDavid du Colombier fprint(2, "cannot open %s\n", *satp);
42*3e12c5d1SDavid du Colombier satp += 2;
43*3e12c5d1SDavid du Colombier goto loop;
44*3e12c5d1SDavid du Colombier }
45*3e12c5d1SDavid du Colombier satp++;
46*3e12c5d1SDavid du Colombier rline(f);
47*3e12c5d1SDavid du Colombier tinc = atof(skip(6));
48*3e12c5d1SDavid du Colombier rline(f);
49*3e12c5d1SDavid du Colombier rline(f);
50*3e12c5d1SDavid du Colombier for(i=0; i<9; i++)
51*3e12c5d1SDavid du Colombier ifa[i] = atof(skip(i));
52*3e12c5d1SDavid du Colombier n = ifa[0];
53*3e12c5d1SDavid du Colombier i = ifa[1];
54*3e12c5d1SDavid du Colombier t = dmo[i-1] + ifa[2] - 1.;
55*3e12c5d1SDavid du Colombier if(n%4 == 0 && i > 2)
56*3e12c5d1SDavid du Colombier t += 1.;
57*3e12c5d1SDavid du Colombier for(i=1970; i<n; i++) {
58*3e12c5d1SDavid du Colombier t += 365.;
59*3e12c5d1SDavid du Colombier if(i%4 == 0)
60*3e12c5d1SDavid du Colombier t += 1.;
61*3e12c5d1SDavid du Colombier }
62*3e12c5d1SDavid du Colombier t = (t * 24. + ifa[3]) * 60. + ifa[4];
63*3e12c5d1SDavid du Colombier satl.time = t * 60.;
64*3e12c5d1SDavid du Colombier satl.tilt = ifa[5] * radian;
65*3e12c5d1SDavid du Colombier satl.pnni = ifa[6] * radian;
66*3e12c5d1SDavid du Colombier satl.psi = ifa[7];
67*3e12c5d1SDavid du Colombier satl.ppi = ifa[8] * radian;
68*3e12c5d1SDavid du Colombier rline(f);
69*3e12c5d1SDavid du Colombier for(i=0; i<5; i++)
70*3e12c5d1SDavid du Colombier ifa[i] = atof(skip(i));
71*3e12c5d1SDavid du Colombier satl.d1pp = ifa[0] * radian;
72*3e12c5d1SDavid du Colombier satl.peri = ifa[1];
73*3e12c5d1SDavid du Colombier satl.d1per = ifa[2];
74*3e12c5d1SDavid du Colombier satl.e0 = ifa[3];
75*3e12c5d1SDavid du Colombier satl.deo = 0;
76*3e12c5d1SDavid du Colombier satl.rdp = ifa[4];
77*3e12c5d1SDavid du Colombier
78*3e12c5d1SDavid du Colombier satl.st = sin(satl.tilt);
79*3e12c5d1SDavid du Colombier satl.ct = cos(satl.tilt);
80*3e12c5d1SDavid du Colombier satl.rot = pipi / (1440. + satl.psi);
81*3e12c5d1SDavid du Colombier satl.semi = satl.rdp * (1. + satl.e0);
82*3e12c5d1SDavid du Colombier
83*3e12c5d1SDavid du Colombier n = PER*288.; /* 5 min steps */
84*3e12c5d1SDavid du Colombier t = day;
85*3e12c5d1SDavid du Colombier for(i=0; i<n; i++) {
86*3e12c5d1SDavid du Colombier if(sunel((t-day)/deld) > 0.)
87*3e12c5d1SDavid du Colombier goto out;
88*3e12c5d1SDavid du Colombier satel(t);
89*3e12c5d1SDavid du Colombier if(el > 0) {
90*3e12c5d1SDavid du Colombier t1 = t;
91*3e12c5d1SDavid du Colombier flag = 0;
92*3e12c5d1SDavid du Colombier do {
93*3e12c5d1SDavid du Colombier if(el > 30.)
94*3e12c5d1SDavid du Colombier flag++;
95*3e12c5d1SDavid du Colombier t -= tinc/(24.*3600.);
96*3e12c5d1SDavid du Colombier satel(t);
97*3e12c5d1SDavid du Colombier } while(el > 0.);
98*3e12c5d1SDavid du Colombier t2 = (t - day)/deld;
99*3e12c5d1SDavid du Colombier t = t1;
100*3e12c5d1SDavid du Colombier do {
101*3e12c5d1SDavid du Colombier t += tinc/(24.*3600.);
102*3e12c5d1SDavid du Colombier satel(t);
103*3e12c5d1SDavid du Colombier if(el > 30.)
104*3e12c5d1SDavid du Colombier flag++;
105*3e12c5d1SDavid du Colombier } while(el > 0.);
106*3e12c5d1SDavid du Colombier if(flag)
107*3e12c5d1SDavid du Colombier if((*satp)[0] == '-')
108*3e12c5d1SDavid du Colombier event("%s pass at ", (*satp)+1, "",
109*3e12c5d1SDavid du Colombier t2, SIGNIF+PTIME+DARK); else
110*3e12c5d1SDavid du Colombier event("%s pass at ", *satp, "",
111*3e12c5d1SDavid du Colombier t2, PTIME+DARK);
112*3e12c5d1SDavid du Colombier }
113*3e12c5d1SDavid du Colombier out:
114*3e12c5d1SDavid du Colombier t += 5./(24.*60.);
115*3e12c5d1SDavid du Colombier }
116*3e12c5d1SDavid du Colombier close(f);
117*3e12c5d1SDavid du Colombier satp++;
118*3e12c5d1SDavid du Colombier goto loop;
119*3e12c5d1SDavid du Colombier }
120*3e12c5d1SDavid du Colombier
121*3e12c5d1SDavid du Colombier void
satel(double time)122*3e12c5d1SDavid du Colombier satel(double time)
123*3e12c5d1SDavid du Colombier {
124*3e12c5d1SDavid du Colombier int i;
125*3e12c5d1SDavid du Colombier double amean, an, coc, csl, d, de, enom, eo;
126*3e12c5d1SDavid du Colombier double pp, q, rdp, slong, ssl, t, tp;
127*3e12c5d1SDavid du Colombier
128*3e12c5d1SDavid du Colombier i = 500;
129*3e12c5d1SDavid du Colombier el = -1;
130*3e12c5d1SDavid du Colombier time = (time-25567.5) * 86400;
131*3e12c5d1SDavid du Colombier t = (time - satl.time)/60;
132*3e12c5d1SDavid du Colombier if(t < 0)
133*3e12c5d1SDavid du Colombier return; /* too early for satelites */
134*3e12c5d1SDavid du Colombier an = floor(t/satl.peri);
135*3e12c5d1SDavid du Colombier while(an*satl.peri + an*an*satl.d1per/2. <= t) {
136*3e12c5d1SDavid du Colombier an += 1;
137*3e12c5d1SDavid du Colombier if(--i == 0)
138*3e12c5d1SDavid du Colombier return;
139*3e12c5d1SDavid du Colombier }
140*3e12c5d1SDavid du Colombier while((tp = an*satl.peri + an*an*satl.d1per/2.) > t) {
141*3e12c5d1SDavid du Colombier an -= 1;
142*3e12c5d1SDavid du Colombier if(--i == 0)
143*3e12c5d1SDavid du Colombier return;
144*3e12c5d1SDavid du Colombier }
145*3e12c5d1SDavid du Colombier amean = (t-tp)/(satl.peri+(an+.5)*satl.d1per);
146*3e12c5d1SDavid du Colombier pp = satl.ppi+(an+amean)*satl.d1pp;
147*3e12c5d1SDavid du Colombier amean *= pipi;
148*3e12c5d1SDavid du Colombier eo = satl.e0+satl.deo*an;
149*3e12c5d1SDavid du Colombier rdp = satl.semi/(1+eo);
150*3e12c5d1SDavid du Colombier enom = amean+eo*sin(amean);
151*3e12c5d1SDavid du Colombier do {
152*3e12c5d1SDavid du Colombier de = (amean-enom+eo*sin(enom))/(1.0-eo*cos(enom));
153*3e12c5d1SDavid du Colombier enom += de;
154*3e12c5d1SDavid du Colombier if(--i == 0)
155*3e12c5d1SDavid du Colombier return;
156*3e12c5d1SDavid du Colombier } while(fabs(de) >= 1.0e-6);
157*3e12c5d1SDavid du Colombier q = 3963.35*erad/(rdp*(1-eo*cos(enom))/(1-eo));
158*3e12c5d1SDavid du Colombier d = pp + 2*atan2(sqrt((1+eo)/(1-eo))*sin(enom/2),cos(enom/2));
159*3e12c5d1SDavid du Colombier slong = satl.pnni + t*satl.rot -
160*3e12c5d1SDavid du Colombier atan2(satl.ct*sin(d), cos(d));
161*3e12c5d1SDavid du Colombier ssl = satl.st*sin(d);
162*3e12c5d1SDavid du Colombier csl = pyth(ssl);
163*3e12c5d1SDavid du Colombier if(vis(time, atan2(ssl,csl), slong, q)) {
164*3e12c5d1SDavid du Colombier coc = ssl*sin(glat) + csl*cos(glat)*cos(wlong-slong);
165*3e12c5d1SDavid du Colombier el = atan2(coc-q, pyth(coc));
166*3e12c5d1SDavid du Colombier el /= radian;
167*3e12c5d1SDavid du Colombier }
168*3e12c5d1SDavid du Colombier }
169*3e12c5d1SDavid du Colombier
170*3e12c5d1SDavid du Colombier int
vis(double t,double slat,double slong,double q)171*3e12c5d1SDavid du Colombier vis(double t, double slat, double slong, double q)
172*3e12c5d1SDavid du Colombier {
173*3e12c5d1SDavid du Colombier double t0, t1, t2, d;
174*3e12c5d1SDavid du Colombier
175*3e12c5d1SDavid du Colombier d = t/86400 - .005375 + 3653;
176*3e12c5d1SDavid du Colombier t0 = 6.238030674 + .01720196977*d;
177*3e12c5d1SDavid du Colombier t2 = t0 + .0167253303*sin(t0);
178*3e12c5d1SDavid du Colombier do {
179*3e12c5d1SDavid du Colombier t1 = (t0 - t2 + .0167259152*sin(t2)) /
180*3e12c5d1SDavid du Colombier (1 - .0167259152*cos(t2));
181*3e12c5d1SDavid du Colombier t2 = t2 + t1;
182*3e12c5d1SDavid du Colombier } while(fabs(t1) >= 1.e-4);
183*3e12c5d1SDavid du Colombier t0 = 2*atan2(1.01686816*sin(t2/2), cos(t2/2));
184*3e12c5d1SDavid du Colombier t0 = 4.926234925 + 8.214985538e-7*d + t0;
185*3e12c5d1SDavid du Colombier t1 = 0.91744599 * sin(t0);
186*3e12c5d1SDavid du Colombier t0 = atan2(t1, cos(t0));
187*3e12c5d1SDavid du Colombier if(t0 < -pi/2)
188*3e12c5d1SDavid du Colombier t0 = t0 + pipi;
189*3e12c5d1SDavid du Colombier d = 4.88097876 + 6.30038809*d - t0;
190*3e12c5d1SDavid du Colombier t0 = 0.43366079 * t1;
191*3e12c5d1SDavid du Colombier t1 = pyth(t0);
192*3e12c5d1SDavid du Colombier t2 = t1*cos(slat)*cos(d-slong) - t0*sin(slat);
193*3e12c5d1SDavid du Colombier if(t2 > 0.46949322e-2) {
194*3e12c5d1SDavid du Colombier if(0.46949322e-2*t2 + 0.999988979*pyth(t2) < q)
195*3e12c5d1SDavid du Colombier return 0;
196*3e12c5d1SDavid du Colombier }
197*3e12c5d1SDavid du Colombier t2 = t1*cos(glat)*cos(d-wlong) - t0*sin(glat);
198*3e12c5d1SDavid du Colombier if(t2 < .1)
199*3e12c5d1SDavid du Colombier return 0;
200*3e12c5d1SDavid du Colombier return 1;
201*3e12c5d1SDavid du Colombier }
202