TIP: Click on subject to list as thread! ANSI
echo: science
to: All
from: DAVID WILLIAMS
date: 2007-06-10 16:21:08
subject: sun position program

Where is everyone? 
  
I'm not sure if I've previously posted this here. I can't find it among 
the messages that are still on Bayman, so if I have posted it, it must 
have been long ago. 
  
This is a little QBasic demo program of a function that calculates the 
declination (latitude) of the sun and the equation of time on any date. 
The equation of time is the difference between solar time, as shown by 
a sundial, and mean time, as shown by a clock. It is essentially the 
same as the longitude of the sun, relative to its mean position. So the 
two quantities, solar declination and equation of time, essentially 
describe the position of the sun, relative to a "mean" sun which is 
always on the celestial equator and which appears to revolve around the 
earth exactly once every 24 hours. 
  
The FUNCTION ET.Dec does the calculations in just a few lines of BASIC. 
I have never seen, anywhere else, anything that does the same things 
anything like as simply. 
  
The code should be easy to translate to other programming languages. 
Does anyone feel like trying this? 
  
Enjoy... 
  
                             dow 
  
--------------------------------------------- 
  
' ETimDec.BAS 
' Demonstrates simple calculations of solar declination and 
' equation of time. 
  
' David Williams 
' P.O. Box 48512 
' Toronto, Canada 
' M8W 4Y6 
  
' Version dated 2007 Jun 09 
  
DECLARE FUNCTION ET.Dec (D, F%) 
DECLARE FUNCTION ROff$ (X) 
  
CLS 
  
PRINT "This program shows Equation of Time and Solar Declination" 
PRINT "calculations, performed in the function ET.Dec." 
PRINT 
PRINT "These calculations can be used in the programs of computer-" 
PRINT "controlled solar-energy equipment, such as sun trackers and" 
PRINT "heliostats." 
PRINT 
PRINT "Equation of Time is difference between Solar Time and Mean" 
PRINT "Time. Sundials show solar time. Clocks show mean time. The" 
PRINT "Equation of Time is related to solar longitude, relative to" 
PRINT "its mean value (the value it would have if the sun's apparent" 
PRINT "motion were at uniform speed). One degree westward of solar" 
PRINT "longitude corresponds to four minutes in positive direction in" 
PRINT "the Equation of Time." 
PRINT 
PRINT "Solar Declination is latitude of sun in celestial coordinates." 
PRINT 
PRINT 
PRINT "Program will calculate Equation of Time and" 
PRINT "Solar Declination on date you will now input." 
  
DO 
  
  PRINT 
  DO 
    INPUT "Date (M#,D#)"; Mth%, Day% 
  LOOP UNTIL Mth% > 0 AND Mth%  0 AND Day% < 32 
  
  PRINT 
  D = INT(30.6 * ((Mth% + 9) MOD 12) + 58.5 + Day%) MOD 365 
  PRINT "Day number"; D + 1; "of year." 
  
  ET = ET.Dec(D, 1) ' Equation of Time 
  DC = ET.Dec(D, 0) ' Declination 
  
  PRINT 
  PRINT "Equation of Time: "; ROff$(ET); " minutes" 
  PRINT "Solar Declination: "; ROff$(DC); " degrees" 
  
  PRINT 
  PRINT "Another calculation? (y/n) "; 
  WHILE INKEY$  "": WEND 
  DO 
    K$ = UCASE$(INKEY$) 
  LOOP UNTIL K$ = "Y" OR K$ = "N" 
  PRINT K$ 
  
LOOP UNTIL K$ = "N" 
  
CLS 
PRINT "These calculations of Equation of Time and Solar Declination" 
PRINT "are simplified and approximate. However, they are quite good." 
PRINT "All differences between calculated values and published ones" 
PRINT "of the solar declination are small compared with the angular" 
PRINT "diameter of the sun in the sky (0.5 degrees). Similarly," 
PRINT "differences between calculated and published values of the" 
PRINT "equation of time are small compared with the time the sun" 
PRINT "takes to traverse its own diameter as it moves across the sky" 
PRINT "(2 minutes). The non-zero size of the sun, rather than any" 
PRINT "inaccuracies of calculation, is the limiting factor on how" 
PRINT "accurately the sun can be tracked in solar energy" 
PRINT "applications, using this routine." 
PRINT 
PRINT 
PRINT "Press any key to continue"; 
  
WHILE INKEY$  "": WEND 
WHILE INKEY$ = "": WEND 
  
CLS 
PRINT "The Equation of Time is treated here as the correction to be" 
PRINT "subtracted from a sundial reading to get local mean (clock)" 
PRINT "time. It is therefore positive when sundial is ahead of clock." 
PRINT "This is the usual sign convention, but the opposite usage is" 
PRINT "sometimes found. Take care when comparing values of the" 
PRINT "Equation of Time from different sources." 
PRINT 
PRINT "Note that atmospheric refraction of light affects the apparent" 
PRINT "position of the sun in the sky when it is close to the" 
PRINT "horizon. Sunlight is then too weak to be used for most" 
PRINT "solar-energy applications, so refraction is not usually" 
PRINT "included in calculations related to solar energy. This program" 
PRINT "does not take account of refraction." 
  
END 
  
FUNCTION ET.Dec (D, F%) STATIC 
  ' Calculates equation of time, in minutes, or solar declination, 
  ' in degrees, on day number D of year. (D = 0 on January 1.) 
  ' F% selects function: True (non-zero) for Equation of Time, 
  ' False (zero) for Declination. 
  ' STATIC means variables are preserved between calls of function 
  
IF PI = 0 THEN ' first call, initialize constants 
  
 PI = 4 * ATN(1) ' ATN = arctangent 
 W = PI / 182.5'earth's mean orbital angular speed in radians per day 
 DR = 180 / PI ' degree/radian factor 
 C = -23.45 / DR ' reverse angle of earth's axial tilt 
 ST = SIN(C) ' sine of reverse tilt 
 CT = COS(C) ' cosine of reverse tilt 
 E2 = 2 * .0167 ' twice earth's orbital eccentricity 
 ZI = 12 * W ' 12 days from solstice to perihelion 
 D1 = -1 ' holds last D. Saves time if D repeated for both functions 
  
END IF 
  
IF D  D1 THEN ' new value of D 
  A = W * (D + 10) ' Solstice 10 days before Jan 1 
  B = A + E2 * SIN(A - ZI) 
  D1 = D 
END IF 
  
IF F% THEN  ' equation of time calculation 
  C = (A - ATN(TAN(B) / CT)) / PI 
  ET.Dec = 720 * (C - INT(C + .5)) 
  ' in 720 minutes, earth rotates PI radians 
  
ELSE ' declination calculation 
  C = ST * COS(B) 
  ET.Dec = ATN(C / SQR(1 - C * C)) * DR 
  ' arcsine of C in degrees. ASN not directly available in QBasic 
  
END IF 
  
END FUNCTION 
  
FUNCTION ROff$ (X) 
 ' neatly rounds number to one place of decimals 
  
S$ = LTRIM$(STR$(INT(10 * ABS(X) + .5))) 
IF LEN(S$) = 1 THEN S$ = "0" + S$ 
IF VAL(S$) THEN S$ = MID$("-x+", SGN(X) + 2, 1) + S$ 
ROff$ = LEFT$(S$, LEN(S$) - 1) + "." + RIGHT$(S$, 1) 
  
END FUNCTION 
  
------------------------------------------------- 
--- Platinum Xpress/Win/WINServer v3.0pr5
* Origin: The Bayman BBS,Toronto, (416)698-6573 - 1:250/514 (1:250/514)
SEEN-BY: 633/267
@PATH: 250/514 123/500 379/1 633/267

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.