1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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
|