'=========================================================================== ' Subject: CALCULATE SUNRISE/SUNSET TIMES Date: 05-31-99 (17:23) ' Author: Roger W. Sinnott Code: QB, QBasic, PDS ' Origin: www.gnomehome.demon.nl Packet: DATETIME.ABC '=========================================================================== 310 DIM A(2), D(2) 10 ' Sunrise-Sunset 20 GOSUB 300 30 INPUT "Lat, Long (deg)"; B5, L5 40 INPUT "Time zone (hrs)"; H 50 L5 = L5 / 360: Z0 = H / 24 60 GOSUB 1170: T = (J - 2451545) + F 70 TT = T / 36525 + 1: ' TT = centuries 80 ' from 1900.0 90 GOSUB 410: T = T + Z0 100 ' 110 ' Get Sun's Position 120 GOSUB 910: A(1) = A5: D(1) = D5 130 T = T + 1 140 GOSUB 910: A(2) = A5: D(2) = D5 150 IF A(2) < A(1) THEN A(2) = A(2) + P2 160 Z1 = DR * 90.833: ' Zenith dist. 170 S = SIN(B5 * DR): C = COS(B5 * DR) 180 Z = COS(Z1): M8 = 0: W8 = 0: PRINT 190 A0 = A(1): D0 = D(1) 200 DA = A(2) - A(1): DD = D(2) - D(1) 210 FOR C0 = 0 TO 23 220 P = (C0 + 1) / 24 230 A2 = A(1) + P * DA: D2 = D(1) + P * DD 240 GOSUB 490 250 A0 = A2: D0 = D2: V0 = V2 260 NEXT 270 GOSUB 820: ' Special msg? 280 END 290 ' 300 ' Constants 320 P1 = 3.14159265#: P2 = 2 * P1 330 DR = P1 / 180: K1 = 15 * DR * 1.0027379# 340 S$ = "Sunset at " 350 R$ = "Sunrise at " 360 M1$ = "No sunrise this date" 370 M2$ = "No sunset this date" 380 M3$ = "Sun down all day" 390 M4$ = "Sun up all day" 400 RETURN 410 ' LST at 0h zone time 420 T0 = T / 36525 430 S = 24110.5 + 8640184.812999999# * T0 440 S = S + 86636.6 * Z0 + 86400 * L5 450 S = S / 86400: S = S - INT(S) 460 T0 = S * 360 * DR 470 RETURN 480 ' 490 ' Test an hour for an event 500 L0 = T0 + C0 * K1: L2 = L0 + K1 510 H0 = L0 - A0: H2 = L2 - A2 520 H1 = (H2 + H0) / 2: ' Hour angle, 530 D1 = (D2 + D0) / 2: ' declination, 540 ' at half hour 550 IF C0 > 0 THEN 570 560 V0 = S * SIN(D0) + C * COS(D0) * COS(H0) - Z 570 V2 = S * SIN(D2) + C * COS(D2) * COS(H2) - Z 580 IF SGN(V0) = SGN(V2) THEN 800 590 V1 = S * SIN(D1) + C * COS(D1) * COS(H1) - Z 600 A = 2 * V2 - 4 * V1 + 2 * V0: B = 4 * V1 - 3 * V0 - V2 610 D = B * B - 4 * A * V0: IF D < 0 THEN 800 620 D = SQR(D) 630 IF V0 < 0 AND V2 > 0 THEN PRINT R$; 640 IF V0 < 0 AND V2 > 0 THEN M8 = 1 650 IF V0 > 0 AND V2 < 0 THEN PRINT S$; 660 IF V0 > 0 AND V2 < 0 THEN W8 = 1 670 E = (-B + D) / (2 * A) 680 IF E > 1 OR E < 0 THEN E = (-B - D) / (2 * A) 690 T3 = C0 + E + 1 / 120: ' Round off 700 H3 = INT(T3): M3 = INT((T3 - H3) * 60) 710 PRINT USING "##:##"; H3; M3; 720 H7 = H0 + E * (H2 - H0) 730 N7 = -COS(D1) * SIN(H7) 740 D7 = C * SIN(D1) - S * COS(D1) * COS(H7) 750 AZ = ATN(N7 / D7) / DR 760 IF D7 < 0 THEN AZ = AZ + 180 770 IF AZ < 0 THEN AZ = AZ + 360 780 IF AZ > 360 THEN AZ = AZ - 360 790 PRINT USING ", azimuth ###.#"; AZ 800 RETURN 810 ' 820 ' Special-message routine 830 IF M8 = 0 AND W8 = 0 THEN 870 840 IF M8 = 0 THEN PRINT M1$ 850 IF W8 = 0 THEN PRINT M2$ 860 GOTO 890 870 IF V2 < 0 THEN PRINT M3$ 880 IF V2 > 0 THEN PRINT M4$ 890 RETURN 900 ' 910 ' Fundamental arguments 920 ' (Van Flandern & 930 ' Pulkkinen, 1979) 940 L = .779072 + .00273790931# * T 950 G = .993126 + .0027377785# * T 960 L = L - INT(L): G = G - INT(G) 970 L = L * P2: G = G * P2 980 V = .39785 * SIN(L) 990 V = V - .01 * SIN(L - G) 1000 V = V + .00333 * SIN(L + G) 1010 V = V - .00021 * TT * SIN(L) 1020 U = 1 - .03349 * COS(G) 1030 U = U - .00014 * COS(2 * L) 1040 U = U + .00008 * COS(L) 1050 W = -.0001 - .04129 * SIN(2 * L) 1060 W = W + .03211 * SIN(G) 1070 W = W + .00104 * SIN(2 * L - G) 1080 W = W - .00035 * SIN(2 * L + G) 1090 W = W - .00008 * TT * SIN(G) 1100 ' 1110 ' Compute Sun's RA and Dec 1120 S = W / SQR(U - V * V) 1130 A5 = L + ATN(S / SQR(1 - S * S)) 1140 S = V / SQR(U): D5 = ATN(S / SQR(1 - S * S)) 1150 R5 = 1.00021 * SQR(U) 1160 RETURN 1165 ' 1170 ' Calendar --> JD 1180 INPUT "Year, Month, Day"; Y, M, D 1190 G = 1: IF Y < 1583 THEN G = 0 1200 D1 = INT(D): F = D - D1 - .5 1210 J = -INT(7 * (INT((M + 9) / 12) + Y) / 4) 1220 IF G = 0 THEN 1260 1230 S = SGN(M - 9): A = ABS(M - 9) 1240 J3 = INT(Y + S * INT(A / 7)) 1250 J3 = -INT((INT(J3 / 100) + 1) * 3 / 4) 1260 J = J + INT(275 * M / 9) + D1 + G * J3 1270 J = J + 1721027 + 2 * G + 367 * Y 1280 IF F >= 0 THEN 1300 1290 F = F + 1: J = J - 1 1300 RETURN 1310 ' 1320 ' This program by Roger W. Sinnott calculates the times of sunrise 1330 ' and sunset on any date, accurate to the minute within several 1340 ' centuries of the present. It correctly describes what happens in the 1350 ' arctic and antarctic regions, where the Sun may not rise or set on 1360 ' a given date. Enter north latitudes positive, west longitudes 1370 ' negative. For the time zone, enter the number of hours west of 1380 ' Greenwich (e.g., 5 for EST, 4 for EDT). The calculation is 1390 ' discussed in Sky & Telescope for August 1994, page 84.