aboutsummaryrefslogtreecommitdiff
path: root/src/SunClock.cpp
diff options
context:
space:
mode:
authorLibravatar Keshav Bhatt <keshavnrj@gmail.com>2022-02-28 18:08:28 +0530
committerLibravatar Keshav Bhatt <keshavnrj@gmail.com>2022-02-28 18:08:28 +0530
commit9867a6b6279229d53fe59854a511c9eea9888427 (patch)
treecefdf3aa78e35741100a554f0fc25d75c4ef3065 /src/SunClock.cpp
parent020ac6daeac226da90bc0c884a9b22a7da9baa99 (diff)
downloadwhatsie-9867a6b6279229d53fe59854a511c9eea9888427.tar.gz
whatsie-9867a6b6279229d53fe59854a511c9eea9888427.zip
build: migrate to qt 5.15
Diffstat (limited to 'src/SunClock.cpp')
-rw-r--r--src/SunClock.cpp133
1 files changed, 82 insertions, 51 deletions
diff --git a/src/SunClock.cpp b/src/SunClock.cpp
index ead4d54..132c0a6 100644
--- a/src/SunClock.cpp
+++ b/src/SunClock.cpp
@@ -1,5 +1,5 @@
-#include <cmath>
#include <SunClock.hpp>
+#include <cmath>
#include <stdexcept>
inline double rad(double degrees) {
@@ -12,7 +12,8 @@ inline double deg(double radians) {
return radians * radToDeg;
}
-Sunclock::Sunclock(double const &latitude_, double const &longitude_, double const &tz_offset_)
+Sunclock::Sunclock(double const &latitude_, double const &longitude_,
+ double const &tz_offset_)
: latitude(latitude_), longitude(longitude_), tz_offset(tz_offset_) {}
double Sunclock::irradiance() { return irradiance(time(0)); }
@@ -32,7 +33,8 @@ double Sunclock::irradiance(time_t when) {
double _sun_app_long = sun_app_long(_sun_true_long, _julian_century);
double _eccent_earth_orbit = eccent_earth_orbit(_julian_century);
double _var_y = var_y(_obliq_corr);
- double _eq_of_time = eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
+ double _eq_of_time =
+ eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
double _declination = declination(_obliq_corr, _sun_app_long);
double _true_solar_time = true_solar_time(_time_of_day, _eq_of_time);
double _hour_angle = hour_angle(_true_solar_time);
@@ -57,13 +59,16 @@ time_t Sunclock::sunrise(time_t date) {
double _sun_app_long = sun_app_long(_sun_true_long, _julian_century);
double _eccent_earth_orbit = eccent_earth_orbit(_julian_century);
double _var_y = var_y(_obliq_corr);
- double _eq_of_time = eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
+ double _eq_of_time =
+ eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
double _declination = declination(_obliq_corr, _sun_app_long);
double _hour_angle_sunrise = hour_angle_sunrise(_declination);
- double noon_decimal_day = (720 - 4 * longitude - _eq_of_time + tz_offset * 60) / 1440;
+ double noon_decimal_day =
+ (720 - 4 * longitude - _eq_of_time + tz_offset * 60) / 1440;
double decimal_day = noon_decimal_day - _hour_angle_sunrise * 4 / 1440;
- return time_from_decimal_day(date, decimal_day) - (time_t)(tz_offset * 60 * 60);
+ return time_from_decimal_day(date, decimal_day) -
+ (time_t)(tz_offset * 60 * 60);
}
time_t Sunclock::solar_noon() { return solar_noon(time(0)); }
@@ -80,10 +85,13 @@ time_t Sunclock::solar_noon(time_t date) {
double _obliq_corr = obliq_corr(_mean_obliq_ecliptic, _julian_century);
double _eccent_earth_orbit = eccent_earth_orbit(_julian_century);
double _var_y = var_y(_obliq_corr);
- double _eq_of_time = eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
+ double _eq_of_time =
+ eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
- double decimal_day = (720 - 4 * longitude - _eq_of_time + tz_offset * 60) / 1440;
- return time_from_decimal_day(date, decimal_day) - (time_t)(tz_offset * 60 * 60);
+ double decimal_day =
+ (720 - 4 * longitude - _eq_of_time + tz_offset * 60) / 1440;
+ return time_from_decimal_day(date, decimal_day) -
+ (time_t)(tz_offset * 60 * 60);
}
time_t Sunclock::sunset() { return sunset(time(0)); }
@@ -103,13 +111,16 @@ time_t Sunclock::sunset(time_t date) {
double _sun_app_long = sun_app_long(_sun_true_long, _julian_century);
double _eccent_earth_orbit = eccent_earth_orbit(_julian_century);
double _var_y = var_y(_obliq_corr);
- double _eq_of_time = eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
+ double _eq_of_time =
+ eq_of_time(_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
double _declination = declination(_obliq_corr, _sun_app_long);
double _hour_angle_sunrise = hour_angle_sunrise(_declination);
- double noon_decimal_day = (720 - 4 * longitude - _eq_of_time + tz_offset * 60) / 1440;
+ double noon_decimal_day =
+ (720 - 4 * longitude - _eq_of_time + tz_offset * 60) / 1440;
double decimal_day = noon_decimal_day + _hour_angle_sunrise * 4 / 1440;
- return time_from_decimal_day(date, decimal_day) - (time_t)(tz_offset * 60 * 60);
+ return time_from_decimal_day(date, decimal_day) -
+ (time_t)(tz_offset * 60 * 60);
}
double Sunclock::time_of_day(time_t date) {
@@ -142,7 +153,8 @@ time_t Sunclock::time_from_decimal_day(time_t date, double decimal_day) {
int Sunclock::days_since_1900(struct tm *t) {
int year = t->tm_year;
if (year < 0 || year > 199) {
- throw std::invalid_argument("days_since_1900 - Date must be between 1900 and 2099");
+ throw std::invalid_argument(
+ "days_since_1900 - Date must be between 1900 and 2099");
}
int month = t->tm_mon + 1;
int days = t->tm_mday;
@@ -157,33 +169,44 @@ int Sunclock::days_since_1900(struct tm *t) {
return (yearDays + monthDays + days - 63);
}
-double Sunclock::julian_day(struct tm *t, double const &time_of_day, double const &tz_offset) {
+double Sunclock::julian_day(struct tm *t, double const &time_of_day,
+ double const &tz_offset) {
return days_since_1900(t) + 2415018.5 + time_of_day - tz_offset / 24;
}
-double Sunclock::julian_century(double _julian_day) { return (_julian_day - 2451545.0) / 36525.0; }
+double Sunclock::julian_century(double _julian_day) {
+ return (_julian_day - 2451545.0) / 36525.0;
+}
double Sunclock::mean_long_sun(double _julian_century) {
- return (280.46646 + fmod(_julian_century * (36000.76983 + _julian_century * 0.0003032), 360));
+ return (
+ 280.46646 +
+ fmod(_julian_century * (36000.76983 + _julian_century * 0.0003032), 360));
}
double Sunclock::mean_anom_sun(double _julian_century) {
- return 357.52911 + _julian_century * (35999.05029 - 0.0001537 * _julian_century);
+ return 357.52911 +
+ _julian_century * (35999.05029 - 0.0001537 * _julian_century);
}
-double Sunclock::sun_eq_of_centre(double _mean_anom_sun, double _julian_century) {
- return sin(rad(_mean_anom_sun))
- * (1.914602 - _julian_century * (0.004817 + 0.000014 * _julian_century))
- + sin(rad(2 * _mean_anom_sun)) * (0.019993 - 0.000101 * _julian_century)
- + sin(rad(3 * _mean_anom_sun)) * 0.000289;
+double Sunclock::sun_eq_of_centre(double _mean_anom_sun,
+ double _julian_century) {
+ return sin(rad(_mean_anom_sun)) *
+ (1.914602 -
+ _julian_century * (0.004817 + 0.000014 * _julian_century)) +
+ sin(rad(2 * _mean_anom_sun)) *
+ (0.019993 - 0.000101 * _julian_century) +
+ sin(rad(3 * _mean_anom_sun)) * 0.000289;
}
-double Sunclock::sun_true_long(double _mean_long_sun, double _sun_eq_of_centre) {
+double Sunclock::sun_true_long(double _mean_long_sun,
+ double _sun_eq_of_centre) {
return _mean_long_sun + _sun_eq_of_centre;
}
double Sunclock::eccent_earth_orbit(double _julian_century) {
- return 0.016708634 - _julian_century * (0.000042037 + 0.0001537 * _julian_century);
+ return 0.016708634 -
+ _julian_century * (0.000042037 + 0.0001537 * _julian_century);
}
double Sunclock::var_y(double _obliq_corr) {
@@ -191,55 +214,63 @@ double Sunclock::var_y(double _obliq_corr) {
}
double Sunclock::mean_obliq_ecliptic(double _julian_century) {
- return (23
- + (26
- + ((21.448
- - _julian_century
- * (46.815 + _julian_century * (0.00059 - _julian_century * 0.001813))))
- / 60)
- / 60);
+ return (23 + (26 + ((21.448 - _julian_century *
+ (46.815 + _julian_century *
+ (0.00059 - _julian_century *
+ 0.001813)))) /
+ 60) /
+ 60);
}
-double Sunclock::obliq_corr(double _mean_obliq_ecliptic, double _julian_century) {
- return _mean_obliq_ecliptic + 0.00256 * cos(deg(125.04 - 1934.136 * _julian_century));
+double Sunclock::obliq_corr(double _mean_obliq_ecliptic,
+ double _julian_century) {
+ return _mean_obliq_ecliptic +
+ 0.00256 * cos(deg(125.04 - 1934.136 * _julian_century));
}
double Sunclock::sun_app_long(double _sun_true_long, double _julian_century) {
- return (_sun_true_long - 0.00569 - 0.00478 * sin(deg(125.04 - 1934.136 * _julian_century)));
+ return (_sun_true_long - 0.00569 -
+ 0.00478 * sin(deg(125.04 - 1934.136 * _julian_century)));
}
double Sunclock::declination(double _obliq_corr, double _sun_app_long) {
return deg(asin(sin(rad(_obliq_corr)) * sin(rad(_sun_app_long))));
}
-double Sunclock::eq_of_time(double _var_y, double _mean_long_sun, double _eccent_earth_orbit,
- double _mean_anom_sun) {
- return 4
- * deg(_var_y * sin(2 * rad(_mean_long_sun))
- - 2 * _eccent_earth_orbit * sin(rad(_mean_anom_sun))
- + 4 * _eccent_earth_orbit * _var_y * sin(rad(_mean_anom_sun))
- * cos(2 * rad(_mean_long_sun))
- - 0.5 * _var_y * _var_y * sin(4 * rad(_mean_long_sun))
- - 1.25 * _eccent_earth_orbit * _eccent_earth_orbit * sin(2 * rad(_mean_anom_sun)));
+double Sunclock::eq_of_time(double _var_y, double _mean_long_sun,
+ double _eccent_earth_orbit, double _mean_anom_sun) {
+ return 4 * deg(_var_y * sin(2 * rad(_mean_long_sun)) -
+ 2 * _eccent_earth_orbit * sin(rad(_mean_anom_sun)) +
+ 4 * _eccent_earth_orbit * _var_y * sin(rad(_mean_anom_sun)) *
+ cos(2 * rad(_mean_long_sun)) -
+ 0.5 * _var_y * _var_y * sin(4 * rad(_mean_long_sun)) -
+ 1.25 * _eccent_earth_orbit * _eccent_earth_orbit *
+ sin(2 * rad(_mean_anom_sun)));
}
double Sunclock::true_solar_time(double _time_of_day, double _eq_of_time) {
- return fmod((_time_of_day * 1440 + _eq_of_time + 4 * longitude - 60 * tz_offset), 1440);
+ return fmod(
+ (_time_of_day * 1440 + _eq_of_time + 4 * longitude - 60 * tz_offset),
+ 1440);
}
double Sunclock::hour_angle(double _true_solar_time) {
- return (_true_solar_time / 4 < 0 ? _true_solar_time / 4 + 180 : _true_solar_time / 4 - 180);
+ return (_true_solar_time / 4 < 0 ? _true_solar_time / 4 + 180
+ : _true_solar_time / 4 - 180);
}
double Sunclock::hour_angle_sunrise(double _declination) {
- return deg(acos(cos(rad(90.833)) / (cos(rad(latitude)) * cos(rad(_declination)))
- - tan(rad(latitude)) * tan(rad(_declination))));
+ return deg(
+ acos(cos(rad(90.833)) / (cos(rad(latitude)) * cos(rad(_declination))) -
+ tan(rad(latitude)) * tan(rad(_declination))));
}
double Sunclock::solar_zenith(double _declination, double _hour_angle) {
- return deg(acos(sin(rad(latitude)) * sin(rad(_declination))
- + cos(rad(latitude)) * cos(rad(_declination)) * cos(rad(_hour_angle))));
+ return deg(acos(sin(rad(latitude)) * sin(rad(_declination)) +
+ cos(rad(latitude)) * cos(rad(_declination)) *
+ cos(rad(_hour_angle))));
}
-double Sunclock::solar_elevation(double _solar_zenith) { return 90 - _solar_zenith; }
-
+double Sunclock::solar_elevation(double _solar_zenith) {
+ return 90 - _solar_zenith;
+}