## Fidonet Portal

From: DAVID WILLIAMS (1:250/514)
To: All
Date: Mon, 18.12.06 22:37
Satellite calculator
TID: PX/Win v3.0pr5 PX98-1028M6
MSGID: 1:250/514 fa198954
TZUTC: -0600
If any of you old-timers is interested... I've been playing with a
little computer program I wrote long ago - most of it back in 1982. It
does some calculations concerning geostationary satellites, such as the
ones that are used for TV broadcasting. It calculates the compass
bearing (magnetic or true) of the satellite, and its altitude (or angle
of elevation), given the observer's latitude and longitude on the
earth, and the longitude of the satellite on the geostationary orbit.
So it tells you which way to point a dish to aim at the satellite. It
also calculates the dates and times of "solar outages", which occur
when the satellite passes in front of, or very close to, the sun in the
sky. When this happens, radio waves from the sun get received by the
dish, and interfere with signals from the satellite.

I have recently "downgraded" the program to try to make it compatible
with many different dialects of BASIC. I have a much nicer version
which runs under QBasic, but that won't work in most other dialects.
The following version *should* work under many versions of the
language.

Let me know if you find it interesting...

dow

--------------------------------------------------------

100 REM ' Satellite information calculator
110 REM ' Calculates position in sky (compass bearing (magnetic/true)
120 REM ' and altitude (or angle of elevation) of any geostationary
130 REM ' satellite, as seen from anywhere on earth. Also calculates
140 REM ' dates and times of 'solar outages', when satellite is very
150 REM ' close to the sun in the sky, so the sun's radio emissions
160 REM ' can interfere with communications.
170 PI = 4 * ATN(1): CF2 = PI / 182.5: CF = PI / 180
180 W1 = 12 * CF2: R = 6.615: CLS
190 PRINT "Use negative numbers for opposite directions."
200 INPUT "Observer's Latitude (deg. N)"; LA
210 INPUT "Observer's Longitude (deg. W)"; LG
220 INPUT "Satellite's Longitude (deg. W)"; LS
230 INPUT "Time Zone (+/- hours from GMT)"; TZ
240 INPUT "Magnetic variation (deg. W) (0 for true bearing)"; MV
250 PRINT : LD = (LG - LS) * CF: LR = CF * LA: LT = LR + PI / 2
260 X = R * SIN(LD): Z = R * COS(LD): D = ABS(Z)
270 AN = SGN(Z) * PI / 2 + LT: Y = D * COS(AN): Z = D * SIN(AN)
280 IF Y > -1 THEN PRINT "Satellite is below horizon.": END
290 AY = -1 - Y: AX = SQR(X * X + Z * Z): GOSUB 570: AL = AA / CF
300 AY = X: AX = Z: GOSUB 570: BE = AA / CF + MV
310 BE = INT(10 * BE + .5) / 10: AL = INT(10 * AL + .5) / 10
320 BE = BE - 360 * INT(BE / 360)
330 PRINT "Satellite's position:": PRINT "Bearing is"; BE; "degrees."
340 PRINT "Altitude is"; AL; "degrees.": PRINT
350 X1 = -R * SIN(LD): Y1 = -SIN(LR): Z1 = R * COS(LD) - COS(LR)
360 C = Y1 / (.3979 * SQR(X1 * X1 + Y1 * Y1 + Z1 * Z1) 370 AY = C: AX = SQR(1 - C * C): GOSUB 570: AD = PI / 2 - AA
380 AY = X1: AX = Z1: GOSUB 570: AG = AA
390 V = 4 * (AG / CF + LG) + 60 * TZ + 720.5
400 PRINT "Nominal solar outage dates and times:": FOR J = 0 TO 1
410 U = 182: L = 364 * J: FOR K = 1 TO 20: D = (U + L) / 2
420 G = CF2 * D: A = G + .0334 * SIN(G - W1)
430 IF ABS(U - L) < .1 THEN K = 20: GOTO 450
440 IF ABS(A - PI) < AD THEN U = D ELSE L = D
450 NEXT: B = (ATN(TAN(A) / .9174) - G) / PI: E = B - INT(B + .5)
460 T = INT(V + E * 720): T = T - 1440 * INT(T / 1440)
470 HI = INT(T / 60): MI = T - 60 * HI: D = D - 40 + TZ / 24
480 DI = INT(D): Q = D - DI - T / 1440: P = 1
490 IF ABS(Q) > .5 THEN DI = DI + SGN(Q)
500 L = VAL(MID\$(" 28 31122 31 30999", P, 3) 510 IF DI