1
- #include < cmath>
2
1
#include < SunClock.hpp>
2
+ #include < cmath>
3
3
#include < stdexcept>
4
4
5
5
inline double rad (double degrees) {
@@ -12,7 +12,8 @@ inline double deg(double radians) {
12
12
return radians * radToDeg;
13
13
}
14
14
15
- Sunclock::Sunclock (double const &latitude_, double const &longitude_, double const &tz_offset_)
15
+ Sunclock::Sunclock (double const &latitude_, double const &longitude_,
16
+ double const &tz_offset_)
16
17
: latitude(latitude_), longitude(longitude_), tz_offset(tz_offset_) {}
17
18
18
19
double Sunclock::irradiance () { return irradiance (time (0 )); }
@@ -32,7 +33,8 @@ double Sunclock::irradiance(time_t when) {
32
33
double _sun_app_long = sun_app_long (_sun_true_long, _julian_century);
33
34
double _eccent_earth_orbit = eccent_earth_orbit (_julian_century);
34
35
double _var_y = var_y (_obliq_corr);
35
- double _eq_of_time = eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
36
+ double _eq_of_time =
37
+ eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
36
38
double _declination = declination (_obliq_corr, _sun_app_long);
37
39
double _true_solar_time = true_solar_time (_time_of_day, _eq_of_time);
38
40
double _hour_angle = hour_angle (_true_solar_time);
@@ -57,13 +59,16 @@ time_t Sunclock::sunrise(time_t date) {
57
59
double _sun_app_long = sun_app_long (_sun_true_long, _julian_century);
58
60
double _eccent_earth_orbit = eccent_earth_orbit (_julian_century);
59
61
double _var_y = var_y (_obliq_corr);
60
- double _eq_of_time = eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
62
+ double _eq_of_time =
63
+ eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
61
64
double _declination = declination (_obliq_corr, _sun_app_long);
62
65
double _hour_angle_sunrise = hour_angle_sunrise (_declination);
63
66
64
- double noon_decimal_day = (720 - 4 * longitude - _eq_of_time + tz_offset * 60 ) / 1440 ;
67
+ double noon_decimal_day =
68
+ (720 - 4 * longitude - _eq_of_time + tz_offset * 60 ) / 1440 ;
65
69
double decimal_day = noon_decimal_day - _hour_angle_sunrise * 4 / 1440 ;
66
- return time_from_decimal_day (date, decimal_day) - (time_t )(tz_offset * 60 * 60 );
70
+ return time_from_decimal_day (date, decimal_day) -
71
+ (time_t )(tz_offset * 60 * 60 );
67
72
}
68
73
69
74
time_t Sunclock::solar_noon () { return solar_noon (time (0 )); }
@@ -80,10 +85,13 @@ time_t Sunclock::solar_noon(time_t date) {
80
85
double _obliq_corr = obliq_corr (_mean_obliq_ecliptic, _julian_century);
81
86
double _eccent_earth_orbit = eccent_earth_orbit (_julian_century);
82
87
double _var_y = var_y (_obliq_corr);
83
- double _eq_of_time = eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
88
+ double _eq_of_time =
89
+ eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
84
90
85
- double decimal_day = (720 - 4 * longitude - _eq_of_time + tz_offset * 60 ) / 1440 ;
86
- return time_from_decimal_day (date, decimal_day) - (time_t )(tz_offset * 60 * 60 );
91
+ double decimal_day =
92
+ (720 - 4 * longitude - _eq_of_time + tz_offset * 60 ) / 1440 ;
93
+ return time_from_decimal_day (date, decimal_day) -
94
+ (time_t )(tz_offset * 60 * 60 );
87
95
}
88
96
89
97
time_t Sunclock::sunset () { return sunset (time (0 )); }
@@ -103,13 +111,16 @@ time_t Sunclock::sunset(time_t date) {
103
111
double _sun_app_long = sun_app_long (_sun_true_long, _julian_century);
104
112
double _eccent_earth_orbit = eccent_earth_orbit (_julian_century);
105
113
double _var_y = var_y (_obliq_corr);
106
- double _eq_of_time = eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
114
+ double _eq_of_time =
115
+ eq_of_time (_var_y, _mean_long_sun, _eccent_earth_orbit, _mean_anom_sun);
107
116
double _declination = declination (_obliq_corr, _sun_app_long);
108
117
double _hour_angle_sunrise = hour_angle_sunrise (_declination);
109
118
110
- double noon_decimal_day = (720 - 4 * longitude - _eq_of_time + tz_offset * 60 ) / 1440 ;
119
+ double noon_decimal_day =
120
+ (720 - 4 * longitude - _eq_of_time + tz_offset * 60 ) / 1440 ;
111
121
double decimal_day = noon_decimal_day + _hour_angle_sunrise * 4 / 1440 ;
112
- return time_from_decimal_day (date, decimal_day) - (time_t )(tz_offset * 60 * 60 );
122
+ return time_from_decimal_day (date, decimal_day) -
123
+ (time_t )(tz_offset * 60 * 60 );
113
124
}
114
125
115
126
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) {
142
153
int Sunclock::days_since_1900 (struct tm *t) {
143
154
int year = t->tm_year ;
144
155
if (year < 0 || year > 199 ) {
145
- throw std::invalid_argument (" days_since_1900 - Date must be between 1900 and 2099" );
156
+ throw std::invalid_argument (
157
+ " days_since_1900 - Date must be between 1900 and 2099" );
146
158
}
147
159
int month = t->tm_mon + 1 ;
148
160
int days = t->tm_mday ;
@@ -157,89 +169,108 @@ int Sunclock::days_since_1900(struct tm *t) {
157
169
return (yearDays + monthDays + days - 63 );
158
170
}
159
171
160
- double Sunclock::julian_day (struct tm *t, double const &time_of_day, double const &tz_offset) {
172
+ double Sunclock::julian_day (struct tm *t, double const &time_of_day,
173
+ double const &tz_offset) {
161
174
return days_since_1900 (t) + 2415018.5 + time_of_day - tz_offset / 24 ;
162
175
}
163
176
164
- double Sunclock::julian_century (double _julian_day) { return (_julian_day - 2451545.0 ) / 36525.0 ; }
177
+ double Sunclock::julian_century (double _julian_day) {
178
+ return (_julian_day - 2451545.0 ) / 36525.0 ;
179
+ }
165
180
166
181
double Sunclock::mean_long_sun (double _julian_century) {
167
- return (280.46646 + fmod (_julian_century * (36000.76983 + _julian_century * 0.0003032 ), 360 ));
182
+ return (
183
+ 280.46646 +
184
+ fmod (_julian_century * (36000.76983 + _julian_century * 0.0003032 ), 360 ));
168
185
}
169
186
170
187
double Sunclock::mean_anom_sun (double _julian_century) {
171
- return 357.52911 + _julian_century * (35999.05029 - 0.0001537 * _julian_century);
188
+ return 357.52911 +
189
+ _julian_century * (35999.05029 - 0.0001537 * _julian_century);
172
190
}
173
191
174
- double Sunclock::sun_eq_of_centre (double _mean_anom_sun, double _julian_century) {
175
- return sin (rad (_mean_anom_sun))
176
- * (1.914602 - _julian_century * (0.004817 + 0.000014 * _julian_century))
177
- + sin (rad (2 * _mean_anom_sun)) * (0.019993 - 0.000101 * _julian_century)
178
- + sin (rad (3 * _mean_anom_sun)) * 0.000289 ;
192
+ double Sunclock::sun_eq_of_centre (double _mean_anom_sun,
193
+ double _julian_century) {
194
+ return sin (rad (_mean_anom_sun)) *
195
+ (1.914602 -
196
+ _julian_century * (0.004817 + 0.000014 * _julian_century)) +
197
+ sin (rad (2 * _mean_anom_sun)) *
198
+ (0.019993 - 0.000101 * _julian_century) +
199
+ sin (rad (3 * _mean_anom_sun)) * 0.000289 ;
179
200
}
180
201
181
- double Sunclock::sun_true_long (double _mean_long_sun, double _sun_eq_of_centre) {
202
+ double Sunclock::sun_true_long (double _mean_long_sun,
203
+ double _sun_eq_of_centre) {
182
204
return _mean_long_sun + _sun_eq_of_centre;
183
205
}
184
206
185
207
double Sunclock::eccent_earth_orbit (double _julian_century) {
186
- return 0.016708634 - _julian_century * (0.000042037 + 0.0001537 * _julian_century);
208
+ return 0.016708634 -
209
+ _julian_century * (0.000042037 + 0.0001537 * _julian_century);
187
210
}
188
211
189
212
double Sunclock::var_y (double _obliq_corr) {
190
213
return tan (rad (_obliq_corr / 2 )) * tan (rad (_obliq_corr / 2 ));
191
214
}
192
215
193
216
double Sunclock::mean_obliq_ecliptic (double _julian_century) {
194
- return (23
195
- + (26
196
- + ((21.448
197
- - _julian_century
198
- * (46.815 + _julian_century * (0.00059 - _julian_century * 0.001813 ))))
199
- / 60 )
200
- / 60 );
217
+ return (23 + (26 + ((21.448 - _julian_century *
218
+ (46.815 + _julian_century *
219
+ (0.00059 - _julian_century *
220
+ 0.001813 )))) /
221
+ 60 ) /
222
+ 60 );
201
223
}
202
224
203
- double Sunclock::obliq_corr (double _mean_obliq_ecliptic, double _julian_century) {
204
- return _mean_obliq_ecliptic + 0.00256 * cos (deg (125.04 - 1934.136 * _julian_century));
225
+ double Sunclock::obliq_corr (double _mean_obliq_ecliptic,
226
+ double _julian_century) {
227
+ return _mean_obliq_ecliptic +
228
+ 0.00256 * cos (deg (125.04 - 1934.136 * _julian_century));
205
229
}
206
230
207
231
double Sunclock::sun_app_long (double _sun_true_long, double _julian_century) {
208
- return (_sun_true_long - 0.00569 - 0.00478 * sin (deg (125.04 - 1934.136 * _julian_century)));
232
+ return (_sun_true_long - 0.00569 -
233
+ 0.00478 * sin (deg (125.04 - 1934.136 * _julian_century)));
209
234
}
210
235
211
236
double Sunclock::declination (double _obliq_corr, double _sun_app_long) {
212
237
return deg (asin (sin (rad (_obliq_corr)) * sin (rad (_sun_app_long))));
213
238
}
214
239
215
- double Sunclock::eq_of_time (double _var_y, double _mean_long_sun, double _eccent_earth_orbit,
216
- double _mean_anom_sun) {
217
- return 4
218
- * deg (_var_y * sin ( 2 * rad (_mean_long_sun))
219
- - 2 * _eccent_earth_orbit * sin (rad (_mean_anom_sun))
220
- + 4 * _eccent_earth_orbit * _var_y * sin ( rad (_mean_anom_sun))
221
- * cos ( 2 * rad (_mean_long_sun))
222
- - 0.5 * _var_y * _var_y * sin ( 4 * rad (_mean_long_sun))
223
- - 1.25 * _eccent_earth_orbit * _eccent_earth_orbit * sin (2 * rad (_mean_anom_sun)));
240
+ double Sunclock::eq_of_time (double _var_y, double _mean_long_sun,
241
+ double _eccent_earth_orbit, double _mean_anom_sun) {
242
+ return 4 * deg (_var_y * sin ( 2 * rad (_mean_long_sun)) -
243
+ 2 * _eccent_earth_orbit * sin ( rad (_mean_anom_sun)) +
244
+ 4 * _eccent_earth_orbit * _var_y * sin (rad (_mean_anom_sun)) *
245
+ cos ( 2 * rad (_mean_long_sun)) -
246
+ 0.5 * _var_y * _var_y * sin ( 4 * rad (_mean_long_sun)) -
247
+ 1.25 * _eccent_earth_orbit * _eccent_earth_orbit *
248
+ sin (2 * rad (_mean_anom_sun)));
224
249
}
225
250
226
251
double Sunclock::true_solar_time (double _time_of_day, double _eq_of_time) {
227
- return fmod ((_time_of_day * 1440 + _eq_of_time + 4 * longitude - 60 * tz_offset), 1440 );
252
+ return fmod (
253
+ (_time_of_day * 1440 + _eq_of_time + 4 * longitude - 60 * tz_offset),
254
+ 1440 );
228
255
}
229
256
230
257
double Sunclock::hour_angle (double _true_solar_time) {
231
- return (_true_solar_time / 4 < 0 ? _true_solar_time / 4 + 180 : _true_solar_time / 4 - 180 );
258
+ return (_true_solar_time / 4 < 0 ? _true_solar_time / 4 + 180
259
+ : _true_solar_time / 4 - 180 );
232
260
}
233
261
234
262
double Sunclock::hour_angle_sunrise (double _declination) {
235
- return deg (acos (cos (rad (90.833 )) / (cos (rad (latitude)) * cos (rad (_declination)))
236
- - tan (rad (latitude)) * tan (rad (_declination))));
263
+ return deg (
264
+ acos (cos (rad (90.833 )) / (cos (rad (latitude)) * cos (rad (_declination))) -
265
+ tan (rad (latitude)) * tan (rad (_declination))));
237
266
}
238
267
239
268
double Sunclock::solar_zenith (double _declination, double _hour_angle) {
240
- return deg (acos (sin (rad (latitude)) * sin (rad (_declination))
241
- + cos (rad (latitude)) * cos (rad (_declination)) * cos (rad (_hour_angle))));
269
+ return deg (acos (sin (rad (latitude)) * sin (rad (_declination)) +
270
+ cos (rad (latitude)) * cos (rad (_declination)) *
271
+ cos (rad (_hour_angle))));
242
272
}
243
273
244
- double Sunclock::solar_elevation (double _solar_zenith) { return 90 - _solar_zenith; }
245
-
274
+ double Sunclock::solar_elevation (double _solar_zenith) {
275
+ return 90 - _solar_zenith;
276
+ }
0 commit comments