aboutsummaryrefslogtreecommitdiff
path: root/src/sunclock.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sunclock.hpp')
-rw-r--r--src/sunclock.hpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/sunclock.hpp b/src/sunclock.hpp
new file mode 100644
index 0000000..4cfad57
--- /dev/null
+++ b/src/sunclock.hpp
@@ -0,0 +1,126 @@
+#ifndef DAYLIGHT_SUNCLOCK_HPP
+#define DAYLIGHT_SUNCLOCK_HPP
+
+#include <ctime>
+
+class Sunclock {
+public:
+ Sunclock(double const &latitude_, double const &longitude_, double const &tz_offset_ = 0);
+
+ /**
+ * \overload double Sunclock::irradiance(time_t when)
+ */
+ double irradiance();
+
+ /**
+ * Specifically, we calculate Direct Normal Irradiance
+ * That is we do not consider atmospheric components like cloud cover,
+ * moisture content etc.
+ *
+ * @param when
+ * @return a value representing irradiance (power per unit area)
+ */
+ double irradiance(time_t when);
+
+ /**
+ * \overload time_t Sunclock::sunrise(time_t date)
+ */
+ time_t sunrise();
+
+ /**
+ * Returns sunrise time for given date
+ *
+ * @param date only date is considered
+ * @return sunrise time
+ */
+ time_t sunrise(time_t date);
+
+ /**
+ * \overload time_t Sunclock::solar_noon(time_t date)
+ */
+ time_t solar_noon();
+
+ /**
+ * Returns solar_noon time for given date
+ *
+ * @param date only date is considered
+ * @return solar_noon time
+ */
+ time_t solar_noon(time_t date);
+
+ /**
+ * \overload time_t Sunclock::sunset(time_t date)
+ */
+ time_t sunset();
+
+ /**
+ * Returns sunset time for given date
+ *
+ * @param date only date is considered
+ * @return sunset time
+ */
+ time_t sunset(time_t date);
+
+private:
+ // in decimal degrees, east is positive
+ double const latitude;
+
+ // in decimal degrees, north is positive
+ double const longitude;
+
+ // in hours, east is positive, i.e. IST (+05:30) is 5.5
+ double const tz_offset;
+
+ /**
+ * @param date
+ * @return percentage past midnight, i.e. noon is 0.5
+ */
+ double time_of_day(time_t date);
+
+ static int days_since_1900(struct tm *t);
+
+ /**
+ * @param date
+ * @param decimal_day decimal between 0.0 and 1.0, e.g. noon = 0.5
+ * @return time_t with date and time set accordingly
+ */
+ static time_t time_from_decimal_day(time_t date, double decimal_day);
+
+ /**
+ * Get day count since Monday, January 1, 4713 BC
+ * https://en.wikipedia.org/wiki/Julian_day
+ *
+ * @param t
+ * @param time_of_day percentage past midnight, i.e. noon is 0.5
+ * @param tz_offset in hours, east is positive, i.e. IST (+05:30) is 5.5
+ * @return julian day
+ */
+ static double julian_day(struct tm *t, double const &time_of_day, double const &tz_offset);
+
+ /**
+ * Extract information in a suitable format from a time_t object.
+ */
+ void prepare_time(time_t const &when, struct tm *ptm);
+
+ double julian_century(double _julian_day);
+ double mean_long_sun(double _julian_century);
+ double mean_anom_sun(double _julian_century);
+ double sun_eq_of_centre(double _mean_anom_sun, double _julian_century);
+ double eccent_earth_orbit(double _julian_century);
+ double var_y(double _obliq_corr);
+ double mean_obliq_ecliptic(double _julian_century);
+ double sun_true_long(double _mean_long_sun, double _sun_eq_of_centre);
+ double obliq_corr(double _mean_obliq_ecliptic, double _julian_century);
+ double sun_app_long(double _sun_true_long, double _julian_century);
+ double declination(double _obliq_corr, double _sun_app_long);
+ double eq_of_time(double _var_y, double _mean_long_sun, double _eccent_earth_orbit,
+ double _mean_anom_sun);
+ double true_solar_time(double _time_of_day, double _eq_of_time);
+ double hour_angle(double _true_solar_time);
+ double hour_angle_sunrise(double _declination);
+ double solar_zenith(double _declination, double _hour_angle);
+ double solar_elevation(double _solar_zenith);
+};
+
+#endif
+