NREL Solar Position Algorithm implemented in C#.
This algorithm calculates the solar zenith and azimuth angles in the period from the year -2000 to 6000, with uncertainties of 0.0003 degrees based on the date, time, and location on Earth. (Reference: Reda, I.; Andreas, A., Solar Position Algorithm for Solar Radiation Applications, Solar Energy. Vol. 76(5), 2004; pp. 577-589). The software has not been tested on a variety of platforms and is not guaranteed to work on yours. It is provided here as a convenience. Further information on this algorithm is available in the following NREL technical report:
Original code in C/C++ and licence can be found here.
Example of use:
using System;
namespace SPACalculator
{
class Program
{
static void Main()
{
SPACalculator.SPAData spa = new SPACalculator.SPAData();
spa.Year = 2003;
spa.Month = 10;
spa.Day = 17;
spa.Hour = 12;
spa.Minute = 30;
spa.Second = 30;
spa.Timezone = -7.0;
spa.DeltaUt1 = 0;
spa.DeltaT = 67;
spa.Longitude = -105.1786;
spa.Latitude = 39.742476;
spa.Elevation = 1830.14;
spa.Pressure = 820;
spa.Temperature = 11;
spa.Slope = 30;
spa.AzmRotation = -10;
spa.AtmosRefract = 0.5667;
spa.Function = SPACalculator.CalculationMode.SPA_ALL;
var result = SPACalculator.SPACalculate(ref spa);
// Check for SPA errors
if (result == 0)
{
Console.Write("Julian Day: {0}\n", spa.Jd);
Console.Write("L: {0} degrees\n", spa.L);
Console.Write("B: {0} degrees\n", spa.B);
Console.Write("R: {0} AU\n", spa.R);
Console.Write("H: {0} degrees\n", spa.H);
Console.Write("Delta Psi: {0} degrees\n", spa.DelPsi);
Console.Write("Delta Epsilon: {0} degrees\n", spa.DelEpsilon);
Console.Write("Epsilon: {0} degrees\n", spa.Epsilon);
Console.Write("Zenith: {0} degrees\n", spa.Zenith);
Console.Write("Azimuth: {0} degrees\n", spa.Azimuth);
Console.Write("Incidence: {0} degrees\n", spa.Incidence);
var min = 60.0 * (spa.Sunrise - (int)(spa.Sunrise));
var sec = 60.0 * (min - (int)min);
Console.Write("Sunrise: {0}:{1}:{2} Local Time\n", (int)(spa.Sunrise), (int)min, (int)sec);
min = 60.0 * (spa.Sunset - (int)(spa.Sunset));
sec = 60.0 * (min - (int)min);
Console.Write("Sunset: {0}:{1}:{2} Local Time\n", (int)(spa.Sunset), (int)min, (int)sec);
}
else Console.WriteLine("SPA Error Code: {0}", result);
Console.ReadKey();
}
}
}
This code should output the following result:
Julian Day: 2452930.31284722
L: 24.0182616916794 degrees
B: -0.000101121924800342 degrees
R: 0.996542297353971 AU
H: 11.1059020139134 degrees
Delta Psi: -0.00399840430333278 degrees
Delta Epsilon: 0.00166656817724969 degrees
Epsilon: 23.4404645196175 degrees
Zenith: 50.1116220240297 degrees
Azimuth: 194.340240510192 degrees
Incidence: 25.1870002003532 degrees
Sunrise: 6:12:43 Local Time
Sunset: 17:20:19 Local Time