Blame demo/solar_params.dem

Packit 0986c0
#
Packit 0986c0
# Calculate solar position in equitorial coordinates (ascension, declination)
Packit 0986c0
# then convert to horizontal coordinates (altitude, azimuth).
Packit 0986c0
# Parameters L, g, lambda, and eps are appoximated using values chosen
Packit 0986c0
# for accuracy in the era on either side of Jan 2000.
Packit 0986c0
#
Packit 0986c0
# Input:
Packit 0986c0
#	Date - string with format "dd-mm-YYYY HH:MM"
Packit 0986c0
#	Latitude - in degrees
Packit 0986c0
#	Longitude - in degrees
Packit 0986c0
#
Packit 0986c0
# Output:
Packit 0986c0
#	Function definitions
Packit 0986c0
#		Azimuth(t) = Solar azimuth at time t
Packit 0986c0
#		Altitude(t) = Solar altitude at time t
Packit 0986c0
#	where t is time in seconds relative to local solar noon on Date.
Packit 0986c0
#		sunrise, sunset (string containing local standard time)
Packit 0986c0
#		sunlight (string containing time between sunrise, sunset)
Packit 0986c0
#
Packit 0986c0
# Local values:
Packit 0986c0
	Minute = 60.
Packit 0986c0
	Hour = 3600.
Packit 0986c0
	Day = 86400.
Packit 0986c0
	TimeFormat = "%d-%m-%Y %H:%M"
Packit 0986c0
	Phi = Latitude
Packit 0986c0
	set angle degrees
Packit 0986c0
#
Packit 0986c0
#     n	= local time in days since noon on 1 Jan 2000
Packit 0986c0
#     L	= mean solar longitude in ecliptic coordinates
Packit 0986c0
#  	= 280.460° + 0.9856474° * n
Packit 0986c0
#     g	= orbital anomaly
Packit 0986c0
#  	= 357.528° + 0.9856003° * n
Packit 0986c0
# lamba	= solar longitude
Packit 0986c0
#      	= L + 1.915° * sin(g) + 0.020° * sin(2g)
Packit 0986c0
#   eps	= obliquity of the ecliptic
Packit 0986c0
#	= 23.439° - 0.0000004° * n
Packit 0986c0
Packit 0986c0
n = (strptime(TimeFormat, Date) - strptime(TimeFormat, "01-01-2000 12:00")) / Day
Packit 0986c0
Packit 0986c0
L = n * 0.9856474 + 280.460
Packit 0986c0
L = L - 360 * int(L / 360.)
Packit 0986c0
if (L < 0) { L += 360. }
Packit 0986c0
Packit 0986c0
g = n * 0.9856003 + 357.528
Packit 0986c0
g = g - 360 * int(g / 360.)
Packit 0986c0
if (g < 0) { g += 360. }
Packit 0986c0
Packit 0986c0
lambda = L + 1.915 * sin(g) + 0.020 * sin(2*g)
Packit 0986c0
Packit 0986c0
eps = 23.439 - n * 0.0000004
Packit 0986c0
Packit 0986c0
# Equatorial coordinates
Packit 0986c0
#     RAsc  = right ascension
Packit 0986c0
#     Dec = declination
Packit 0986c0
Packit 0986c0
RAsc = atan2( cos(eps) * sin(lambda), cos(lambda) )
Packit 0986c0
Dec = asin( sin(eps) * sin(lambda) )
Packit 0986c0
Packit 0986c0
# Length of day
Packit 0986c0
daylength = 2.0 * acos( -sin(Dec)*sin(Phi) / cos(Phi) )
Packit 0986c0
# Correction for displacement of this location from center of timezone
Packit 0986c0
corr = Longitude - floor(Longitude/15.0) * 15.0 - 7.5
Packit 0986c0
rise = (daylength/2.0 - corr) * Day/360.
Packit 0986c0
set  = (daylength/2.0 + corr) * Day/360.
Packit 0986c0
Packit 0986c0
sunlight = strftime("%tH h %tM m", daylength * Day/360.)
Packit 0986c0
sunrise = strftime("%tH:%tM", (Day/2)-rise)
Packit 0986c0
sunset  = strftime("%tH:%tM", (Day/2)+set)
Packit 0986c0
Packit 0986c0
# Horizontal coordinates
Packit 0986c0
Packit 0986c0
h(t) = 360. * t / Day
Packit 0986c0
Altitude(t) = asin( sin(Dec) * sin(Phi) + cos(Dec) * cos(Phi) * cos(h(t)) )
Packit 0986c0
Packit 0986c0
cosAzi(t)  = ( sin(Dec) * sin(Phi) - cos(Dec) * cos(h(t)) * sin(Phi) ) \
Packit 0986c0
           / cos(Altitude(t))
Packit 0986c0
sinAzi(t)  = ( -cos(Dec) * sin(h(t)) ) \
Packit 0986c0
           / cos(Altitude(t))
Packit 0986c0
Azimuth(t) = atan2( sinAzi(t), cosAzi(t) )
Packit 0986c0