|
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 |
|