propdelay.c revision 1.1 1 1.1 kardel /* $NetBSD: propdelay.c,v 1.1 2009/12/13 16:53:41 kardel Exp $ */
2 1.1 kardel
3 1.1 kardel /* propdelay.c,v 3.1 1993/07/06 01:05:24 jbj Exp
4 1.1 kardel * propdelay - compute propagation delays
5 1.1 kardel *
6 1.1 kardel * cc -o propdelay propdelay.c -lm
7 1.1 kardel *
8 1.1 kardel * "Time and Frequency Users' Manual", NBS Technical Note 695 (1977).
9 1.1 kardel */
10 1.1 kardel
11 1.1 kardel /*
12 1.1 kardel * This can be used to get a rough idea of the HF propagation delay
13 1.1 kardel * between two points (usually between you and the radio station).
14 1.1 kardel * The usage is
15 1.1 kardel *
16 1.1 kardel * propdelay latitudeA longitudeA latitudeB longitudeB
17 1.1 kardel *
18 1.1 kardel * where points A and B are the locations in question. You obviously
19 1.1 kardel * need to know the latitude and longitude of each of the places.
20 1.1 kardel * The program expects the latitude to be preceded by an 'n' or 's'
21 1.1 kardel * and the longitude to be preceded by an 'e' or 'w'. It understands
22 1.1 kardel * either decimal degrees or degrees:minutes:seconds. Thus to compute
23 1.1 kardel * the delay between the WWVH (21:59:26N, 159:46:00W) and WWV (40:40:49N,
24 1.1 kardel * 105:02:27W) you could use:
25 1.1 kardel *
26 1.1 kardel * propdelay n21:59:26 w159:46 n40:40:49 w105:02:27
27 1.1 kardel *
28 1.1 kardel * By default it prints out a summer (F2 average virtual height 350 km) and
29 1.1 kardel * winter (F2 average virtual height 250 km) number. The results will be
30 1.1 kardel * quite approximate but are about as good as you can do with HF time anyway.
31 1.1 kardel * You might pick a number between the values to use, or use the summer
32 1.1 kardel * value in the summer and switch to the winter value when the static
33 1.1 kardel * above 10 MHz starts to drop off in the fall. You can also use the
34 1.1 kardel * -h switch if you want to specify your own virtual height.
35 1.1 kardel *
36 1.1 kardel * You can also do a
37 1.1 kardel *
38 1.1 kardel * propdelay -W n45:17:47 w75:45:22
39 1.1 kardel *
40 1.1 kardel * to find the propagation delays to WWV and WWVH (from CHU in this
41 1.1 kardel * case), a
42 1.1 kardel *
43 1.1 kardel * propdelay -C n40:40:49 w105:02:27
44 1.1 kardel *
45 1.1 kardel * to find the delays to CHU, and a
46 1.1 kardel *
47 1.1 kardel * propdelay -G n52:03:17 w98:34:18
48 1.1 kardel *
49 1.1 kardel * to find delays to GOES via each of the three satellites.
50 1.1 kardel */
51 1.1 kardel
52 1.1 kardel #include <stdio.h>
53 1.1 kardel #include <string.h>
54 1.1 kardel
55 1.1 kardel #include "ntp_stdlib.h"
56 1.1 kardel
57 1.1 kardel extern double sin (double);
58 1.1 kardel extern double cos (double);
59 1.1 kardel extern double acos (double);
60 1.1 kardel extern double tan (double);
61 1.1 kardel extern double atan (double);
62 1.1 kardel extern double sqrt (double);
63 1.1 kardel
64 1.1 kardel #define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0)
65 1.1 kardel
66 1.1 kardel /*
67 1.1 kardel * Program constants
68 1.1 kardel */
69 1.1 kardel #define EARTHRADIUS (6370.0) /* raduis of earth (km) */
70 1.1 kardel #define LIGHTSPEED (299800.0) /* speed of light, km/s */
71 1.1 kardel #define PI (3.1415926536)
72 1.1 kardel #define RADPERDEG (PI/180.0) /* radians per degree */
73 1.1 kardel #define MILE (1.609344) /* km in a mile */
74 1.1 kardel
75 1.1 kardel #define SUMMERHEIGHT (350.0) /* summer height in km */
76 1.1 kardel #define WINTERHEIGHT (250.0) /* winter height in km */
77 1.1 kardel
78 1.1 kardel #define SATHEIGHT (6.6110 * 6378.0) /* geosync satellite height in km
79 1.1 kardel from centre of earth */
80 1.1 kardel
81 1.1 kardel #define WWVLAT "n40:40:49"
82 1.1 kardel #define WWVLONG "w105:02:27"
83 1.1 kardel
84 1.1 kardel #define WWVHLAT "n21:59:26"
85 1.1 kardel #define WWVHLONG "w159:46:00"
86 1.1 kardel
87 1.1 kardel #define CHULAT "n45:17:47"
88 1.1 kardel #define CHULONG "w75:45:22"
89 1.1 kardel
90 1.1 kardel #define GOES_UP_LAT "n37:52:00"
91 1.1 kardel #define GOES_UP_LONG "w75:27:00"
92 1.1 kardel #define GOES_EAST_LONG "w75:00:00"
93 1.1 kardel #define GOES_STBY_LONG "w105:00:00"
94 1.1 kardel #define GOES_WEST_LONG "w135:00:00"
95 1.1 kardel #define GOES_SAT_LAT "n00:00:00"
96 1.1 kardel
97 1.1 kardel char *wwvlat = WWVLAT;
98 1.1 kardel char *wwvlong = WWVLONG;
99 1.1 kardel
100 1.1 kardel char *wwvhlat = WWVHLAT;
101 1.1 kardel char *wwvhlong = WWVHLONG;
102 1.1 kardel
103 1.1 kardel char *chulat = CHULAT;
104 1.1 kardel char *chulong = CHULONG;
105 1.1 kardel
106 1.1 kardel char *goes_up_lat = GOES_UP_LAT;
107 1.1 kardel char *goes_up_long = GOES_UP_LONG;
108 1.1 kardel char *goes_east_long = GOES_EAST_LONG;
109 1.1 kardel char *goes_stby_long = GOES_STBY_LONG;
110 1.1 kardel char *goes_west_long = GOES_WEST_LONG;
111 1.1 kardel char *goes_sat_lat = GOES_SAT_LAT;
112 1.1 kardel
113 1.1 kardel int hflag = 0;
114 1.1 kardel int Wflag = 0;
115 1.1 kardel int Cflag = 0;
116 1.1 kardel int Gflag = 0;
117 1.1 kardel int height;
118 1.1 kardel
119 1.1 kardel char *progname;
120 1.1 kardel volatile int debug;
121 1.1 kardel
122 1.1 kardel static void doit (double, double, double, double, double, char *);
123 1.1 kardel static double latlong (char *, int);
124 1.1 kardel static double greatcircle (double, double, double, double);
125 1.1 kardel static double waveangle (double, double, int);
126 1.1 kardel static double propdelay (double, double, int);
127 1.1 kardel static int finddelay (double, double, double, double, double, double *);
128 1.1 kardel static void satdoit (double, double, double, double, double, double, char *);
129 1.1 kardel static void satfinddelay (double, double, double, double, double *);
130 1.1 kardel static double satpropdelay (double);
131 1.1 kardel
132 1.1 kardel /*
133 1.1 kardel * main - parse arguments and handle options
134 1.1 kardel */
135 1.1 kardel int
136 1.1 kardel main(
137 1.1 kardel int argc,
138 1.1 kardel char *argv[]
139 1.1 kardel )
140 1.1 kardel {
141 1.1 kardel int c;
142 1.1 kardel int errflg = 0;
143 1.1 kardel double lat1, long1;
144 1.1 kardel double lat2, long2;
145 1.1 kardel double lat3, long3;
146 1.1 kardel
147 1.1 kardel progname = argv[0];
148 1.1 kardel while ((c = ntp_getopt(argc, argv, "dh:CWG")) != EOF)
149 1.1 kardel switch (c) {
150 1.1 kardel case 'd':
151 1.1 kardel ++debug;
152 1.1 kardel break;
153 1.1 kardel case 'h':
154 1.1 kardel hflag++;
155 1.1 kardel height = atof(ntp_optarg);
156 1.1 kardel if (height <= 0.0) {
157 1.1 kardel (void) fprintf(stderr, "height %s unlikely\n",
158 1.1 kardel ntp_optarg);
159 1.1 kardel errflg++;
160 1.1 kardel }
161 1.1 kardel break;
162 1.1 kardel case 'C':
163 1.1 kardel Cflag++;
164 1.1 kardel break;
165 1.1 kardel case 'W':
166 1.1 kardel Wflag++;
167 1.1 kardel break;
168 1.1 kardel case 'G':
169 1.1 kardel Gflag++;
170 1.1 kardel break;
171 1.1 kardel default:
172 1.1 kardel errflg++;
173 1.1 kardel break;
174 1.1 kardel }
175 1.1 kardel if (errflg || (!(Cflag || Wflag || Gflag) && ntp_optind+4 != argc) ||
176 1.1 kardel ((Cflag || Wflag || Gflag) && ntp_optind+2 != argc)) {
177 1.1 kardel (void) fprintf(stderr,
178 1.1 kardel "usage: %s [-d] [-h height] lat1 long1 lat2 long2\n",
179 1.1 kardel progname);
180 1.1 kardel (void) fprintf(stderr," - or -\n");
181 1.1 kardel (void) fprintf(stderr,
182 1.1 kardel "usage: %s -CWG [-d] lat long\n",
183 1.1 kardel progname);
184 1.1 kardel exit(2);
185 1.1 kardel }
186 1.1 kardel
187 1.1 kardel
188 1.1 kardel if (!(Cflag || Wflag || Gflag)) {
189 1.1 kardel lat1 = latlong(argv[ntp_optind], 1);
190 1.1 kardel long1 = latlong(argv[ntp_optind + 1], 0);
191 1.1 kardel lat2 = latlong(argv[ntp_optind + 2], 1);
192 1.1 kardel long2 = latlong(argv[ntp_optind + 3], 0);
193 1.1 kardel if (hflag) {
194 1.1 kardel doit(lat1, long1, lat2, long2, height, "");
195 1.1 kardel } else {
196 1.1 kardel doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT,
197 1.1 kardel "summer propagation, ");
198 1.1 kardel doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT,
199 1.1 kardel "winter propagation, ");
200 1.1 kardel }
201 1.1 kardel } else if (Wflag) {
202 1.1 kardel /*
203 1.1 kardel * Compute delay from WWV
204 1.1 kardel */
205 1.1 kardel lat1 = latlong(argv[ntp_optind], 1);
206 1.1 kardel long1 = latlong(argv[ntp_optind + 1], 0);
207 1.1 kardel lat2 = latlong(wwvlat, 1);
208 1.1 kardel long2 = latlong(wwvlong, 0);
209 1.1 kardel if (hflag) {
210 1.1 kardel doit(lat1, long1, lat2, long2, height, "WWV ");
211 1.1 kardel } else {
212 1.1 kardel doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT,
213 1.1 kardel "WWV summer propagation, ");
214 1.1 kardel doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT,
215 1.1 kardel "WWV winter propagation, ");
216 1.1 kardel }
217 1.1 kardel
218 1.1 kardel /*
219 1.1 kardel * Compute delay from WWVH
220 1.1 kardel */
221 1.1 kardel lat2 = latlong(wwvhlat, 1);
222 1.1 kardel long2 = latlong(wwvhlong, 0);
223 1.1 kardel if (hflag) {
224 1.1 kardel doit(lat1, long1, lat2, long2, height, "WWVH ");
225 1.1 kardel } else {
226 1.1 kardel doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT,
227 1.1 kardel "WWVH summer propagation, ");
228 1.1 kardel doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT,
229 1.1 kardel "WWVH winter propagation, ");
230 1.1 kardel }
231 1.1 kardel } else if (Cflag) {
232 1.1 kardel lat1 = latlong(argv[ntp_optind], 1);
233 1.1 kardel long1 = latlong(argv[ntp_optind + 1], 0);
234 1.1 kardel lat2 = latlong(chulat, 1);
235 1.1 kardel long2 = latlong(chulong, 0);
236 1.1 kardel if (hflag) {
237 1.1 kardel doit(lat1, long1, lat2, long2, height, "CHU ");
238 1.1 kardel } else {
239 1.1 kardel doit(lat1, long1, lat2, long2, (double)SUMMERHEIGHT,
240 1.1 kardel "CHU summer propagation, ");
241 1.1 kardel doit(lat1, long1, lat2, long2, (double)WINTERHEIGHT,
242 1.1 kardel "CHU winter propagation, ");
243 1.1 kardel }
244 1.1 kardel } else if (Gflag) {
245 1.1 kardel lat1 = latlong(goes_up_lat, 1);
246 1.1 kardel long1 = latlong(goes_up_long, 0);
247 1.1 kardel lat3 = latlong(argv[ntp_optind], 1);
248 1.1 kardel long3 = latlong(argv[ntp_optind + 1], 0);
249 1.1 kardel
250 1.1 kardel lat2 = latlong(goes_sat_lat, 1);
251 1.1 kardel
252 1.1 kardel long2 = latlong(goes_west_long, 0);
253 1.1 kardel satdoit(lat1, long1, lat2, long2, lat3, long3,
254 1.1 kardel "GOES Delay via WEST");
255 1.1 kardel
256 1.1 kardel long2 = latlong(goes_stby_long, 0);
257 1.1 kardel satdoit(lat1, long1, lat2, long2, lat3, long3,
258 1.1 kardel "GOES Delay via STBY");
259 1.1 kardel
260 1.1 kardel long2 = latlong(goes_east_long, 0);
261 1.1 kardel satdoit(lat1, long1, lat2, long2, lat3, long3,
262 1.1 kardel "GOES Delay via EAST");
263 1.1 kardel
264 1.1 kardel }
265 1.1 kardel exit(0);
266 1.1 kardel }
267 1.1 kardel
268 1.1 kardel
269 1.1 kardel /*
270 1.1 kardel * doit - compute a delay and print it
271 1.1 kardel */
272 1.1 kardel static void
273 1.1 kardel doit(
274 1.1 kardel double lat1,
275 1.1 kardel double long1,
276 1.1 kardel double lat2,
277 1.1 kardel double long2,
278 1.1 kardel double h,
279 1.1 kardel char *str
280 1.1 kardel )
281 1.1 kardel {
282 1.1 kardel int hops;
283 1.1 kardel double delay;
284 1.1 kardel
285 1.1 kardel hops = finddelay(lat1, long1, lat2, long2, h, &delay);
286 1.1 kardel printf("%sheight %g km, hops %d, delay %g seconds\n",
287 1.1 kardel str, h, hops, delay);
288 1.1 kardel }
289 1.1 kardel
290 1.1 kardel
291 1.1 kardel /*
292 1.1 kardel * latlong - decode a latitude/longitude value
293 1.1 kardel */
294 1.1 kardel static double
295 1.1 kardel latlong(
296 1.1 kardel char *str,
297 1.1 kardel int islat
298 1.1 kardel )
299 1.1 kardel {
300 1.1 kardel register char *cp;
301 1.1 kardel register char *bp;
302 1.1 kardel double arg;
303 1.1 kardel double divby;
304 1.1 kardel int isneg;
305 1.1 kardel char buf[32];
306 1.1 kardel char *colon;
307 1.1 kardel
308 1.1 kardel if (islat) {
309 1.1 kardel /*
310 1.1 kardel * Must be north or south
311 1.1 kardel */
312 1.1 kardel if (*str == 'N' || *str == 'n')
313 1.1 kardel isneg = 0;
314 1.1 kardel else if (*str == 'S' || *str == 's')
315 1.1 kardel isneg = 1;
316 1.1 kardel else
317 1.1 kardel isneg = -1;
318 1.1 kardel } else {
319 1.1 kardel /*
320 1.1 kardel * East is positive, west is negative
321 1.1 kardel */
322 1.1 kardel if (*str == 'E' || *str == 'e')
323 1.1 kardel isneg = 0;
324 1.1 kardel else if (*str == 'W' || *str == 'w')
325 1.1 kardel isneg = 1;
326 1.1 kardel else
327 1.1 kardel isneg = -1;
328 1.1 kardel }
329 1.1 kardel
330 1.1 kardel if (isneg >= 0)
331 1.1 kardel str++;
332 1.1 kardel
333 1.1 kardel colon = strchr(str, ':');
334 1.1 kardel if (colon != NULL) {
335 1.1 kardel /*
336 1.1 kardel * in hhh:mm:ss form
337 1.1 kardel */
338 1.1 kardel cp = str;
339 1.1 kardel bp = buf;
340 1.1 kardel while (cp < colon)
341 1.1 kardel *bp++ = *cp++;
342 1.1 kardel *bp = '\0';
343 1.1 kardel cp++;
344 1.1 kardel arg = atof(buf);
345 1.1 kardel divby = 60.0;
346 1.1 kardel colon = strchr(cp, ':');
347 1.1 kardel if (colon != NULL) {
348 1.1 kardel bp = buf;
349 1.1 kardel while (cp < colon)
350 1.1 kardel *bp++ = *cp++;
351 1.1 kardel *bp = '\0';
352 1.1 kardel cp++;
353 1.1 kardel arg += atof(buf) / divby;
354 1.1 kardel divby = 3600.0;
355 1.1 kardel }
356 1.1 kardel if (*cp != '\0')
357 1.1 kardel arg += atof(cp) / divby;
358 1.1 kardel } else {
359 1.1 kardel arg = atof(str);
360 1.1 kardel }
361 1.1 kardel
362 1.1 kardel if (isneg == 1)
363 1.1 kardel arg = -arg;
364 1.1 kardel
365 1.1 kardel if (debug > 2)
366 1.1 kardel (void) printf("latitude/longitude %s = %g\n", str, arg);
367 1.1 kardel
368 1.1 kardel return arg;
369 1.1 kardel }
370 1.1 kardel
371 1.1 kardel
372 1.1 kardel /*
373 1.1 kardel * greatcircle - compute the great circle distance in kilometers
374 1.1 kardel */
375 1.1 kardel static double
376 1.1 kardel greatcircle(
377 1.1 kardel double lat1,
378 1.1 kardel double long1,
379 1.1 kardel double lat2,
380 1.1 kardel double long2
381 1.1 kardel )
382 1.1 kardel {
383 1.1 kardel double dg;
384 1.1 kardel double l1r, l2r;
385 1.1 kardel
386 1.1 kardel l1r = lat1 * RADPERDEG;
387 1.1 kardel l2r = lat2 * RADPERDEG;
388 1.1 kardel dg = EARTHRADIUS * acos(
389 1.1 kardel (cos(l1r) * cos(l2r) * cos((long2-long1)*RADPERDEG))
390 1.1 kardel + (sin(l1r) * sin(l2r)));
391 1.1 kardel if (debug >= 2)
392 1.1 kardel printf(
393 1.1 kardel "greatcircle lat1 %g long1 %g lat2 %g long2 %g dist %g\n",
394 1.1 kardel lat1, long1, lat2, long2, dg);
395 1.1 kardel return dg;
396 1.1 kardel }
397 1.1 kardel
398 1.1 kardel
399 1.1 kardel /*
400 1.1 kardel * waveangle - compute the wave angle for the given distance, virtual
401 1.1 kardel * height and number of hops.
402 1.1 kardel */
403 1.1 kardel static double
404 1.1 kardel waveangle(
405 1.1 kardel double dg,
406 1.1 kardel double h,
407 1.1 kardel int n
408 1.1 kardel )
409 1.1 kardel {
410 1.1 kardel double theta;
411 1.1 kardel double delta;
412 1.1 kardel
413 1.1 kardel theta = dg / (EARTHRADIUS * (double)(2 * n));
414 1.1 kardel delta = atan((h / (EARTHRADIUS * sin(theta))) + tan(theta/2)) - theta;
415 1.1 kardel if (debug >= 2)
416 1.1 kardel printf("waveangle dist %g height %g hops %d angle %g\n",
417 1.1 kardel dg, h, n, delta / RADPERDEG);
418 1.1 kardel return delta;
419 1.1 kardel }
420 1.1 kardel
421 1.1 kardel
422 1.1 kardel /*
423 1.1 kardel * propdelay - compute the propagation delay
424 1.1 kardel */
425 1.1 kardel static double
426 1.1 kardel propdelay(
427 1.1 kardel double dg,
428 1.1 kardel double h,
429 1.1 kardel int n
430 1.1 kardel )
431 1.1 kardel {
432 1.1 kardel double phi;
433 1.1 kardel double theta;
434 1.1 kardel double td;
435 1.1 kardel
436 1.1 kardel theta = dg / (EARTHRADIUS * (double)(2 * n));
437 1.1 kardel phi = (PI/2.0) - atan((h / (EARTHRADIUS * sin(theta))) + tan(theta/2));
438 1.1 kardel td = dg / (LIGHTSPEED * sin(phi));
439 1.1 kardel if (debug >= 2)
440 1.1 kardel printf("propdelay dist %g height %g hops %d time %g\n",
441 1.1 kardel dg, h, n, td);
442 1.1 kardel return td;
443 1.1 kardel }
444 1.1 kardel
445 1.1 kardel
446 1.1 kardel /*
447 1.1 kardel * finddelay - find the propagation delay
448 1.1 kardel */
449 1.1 kardel static int
450 1.1 kardel finddelay(
451 1.1 kardel double lat1,
452 1.1 kardel double long1,
453 1.1 kardel double lat2,
454 1.1 kardel double long2,
455 1.1 kardel double h,
456 1.1 kardel double *delay
457 1.1 kardel )
458 1.1 kardel {
459 1.1 kardel double dg; /* great circle distance */
460 1.1 kardel double delta; /* wave angle */
461 1.1 kardel int n; /* number of hops */
462 1.1 kardel
463 1.1 kardel dg = greatcircle(lat1, long1, lat2, long2);
464 1.1 kardel if (debug)
465 1.1 kardel printf("great circle distance %g km %g miles\n", dg, dg/MILE);
466 1.1 kardel
467 1.1 kardel n = 1;
468 1.1 kardel while ((delta = waveangle(dg, h, n)) < 0.0) {
469 1.1 kardel if (debug)
470 1.1 kardel printf("tried %d hop%s, no good\n", n, n>1?"s":"");
471 1.1 kardel n++;
472 1.1 kardel }
473 1.1 kardel if (debug)
474 1.1 kardel printf("%d hop%s okay, wave angle is %g\n", n, n>1?"s":"",
475 1.1 kardel delta / RADPERDEG);
476 1.1 kardel
477 1.1 kardel *delay = propdelay(dg, h, n);
478 1.1 kardel return n;
479 1.1 kardel }
480 1.1 kardel
481 1.1 kardel /*
482 1.1 kardel * satdoit - compute a delay and print it
483 1.1 kardel */
484 1.1 kardel static void
485 1.1 kardel satdoit(
486 1.1 kardel double lat1,
487 1.1 kardel double long1,
488 1.1 kardel double lat2,
489 1.1 kardel double long2,
490 1.1 kardel double lat3,
491 1.1 kardel double long3,
492 1.1 kardel char *str
493 1.1 kardel )
494 1.1 kardel {
495 1.1 kardel double up_delay,down_delay;
496 1.1 kardel
497 1.1 kardel satfinddelay(lat1, long1, lat2, long2, &up_delay);
498 1.1 kardel satfinddelay(lat3, long3, lat2, long2, &down_delay);
499 1.1 kardel
500 1.1 kardel printf("%s, delay %g seconds\n", str, up_delay + down_delay);
501 1.1 kardel }
502 1.1 kardel
503 1.1 kardel /*
504 1.1 kardel * satfinddelay - calculate the one-way delay time between a ground station
505 1.1 kardel * and a satellite
506 1.1 kardel */
507 1.1 kardel static void
508 1.1 kardel satfinddelay(
509 1.1 kardel double lat1,
510 1.1 kardel double long1,
511 1.1 kardel double lat2,
512 1.1 kardel double long2,
513 1.1 kardel double *delay
514 1.1 kardel )
515 1.1 kardel {
516 1.1 kardel double dg; /* great circle distance */
517 1.1 kardel
518 1.1 kardel dg = greatcircle(lat1, long1, lat2, long2);
519 1.1 kardel
520 1.1 kardel *delay = satpropdelay(dg);
521 1.1 kardel }
522 1.1 kardel
523 1.1 kardel /*
524 1.1 kardel * satpropdelay - calculate the one-way delay time between a ground station
525 1.1 kardel * and a satellite
526 1.1 kardel */
527 1.1 kardel static double
528 1.1 kardel satpropdelay(
529 1.1 kardel double dg
530 1.1 kardel )
531 1.1 kardel {
532 1.1 kardel double k1, k2, dist;
533 1.1 kardel double theta;
534 1.1 kardel double td;
535 1.1 kardel
536 1.1 kardel theta = dg / (EARTHRADIUS);
537 1.1 kardel k1 = EARTHRADIUS * sin(theta);
538 1.1 kardel k2 = SATHEIGHT - (EARTHRADIUS * cos(theta));
539 1.1 kardel if (debug >= 2)
540 1.1 kardel printf("Theta %g k1 %g k2 %g\n", theta, k1, k2);
541 1.1 kardel dist = sqrt(k1*k1 + k2*k2);
542 1.1 kardel td = dist / LIGHTSPEED;
543 1.1 kardel if (debug >= 2)
544 1.1 kardel printf("propdelay dist %g height %g time %g\n", dg, dist, td);
545 1.1 kardel return td;
546 1.1 kardel }
547