This repository has been archived by the owner on Apr 9, 2022. It is now read-only.
forked from troglobit/sun
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sunriset.h
143 lines (109 loc) · 4.2 KB
/
sunriset.h
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
* SUNRISET.H - computes Sun rise/set times, start/end of twilight, and
* the length of the day at any date and latitude
*
* Written as DAYLEN.C, 1989-08-16
*
* Modified to SUNRISET.C, 1992-12-01
* Split to a header file, 2017-12-10, by Joachim Nilsson
*
* (c) Paul Schlyter, 1989, 1992
*
* Released to the public domain by Paul Schlyter, December 1992
*/
/*
* A macro to compute the number of days elapsed since 2000 Jan 0.0
* (which is equal to 1999 Dec 31, 0h UTC).
*/
#define days_since_2000_Jan_0(y,m,d) \
(367L*(y)-((7*((y)+(((m)+9)/12)))/4)+((275*(m))/9)+(d)-730530L)
/*
* Some conversion factors between radians and degrees
*/
#ifndef PI
#define PI 3.1415926535897932384
#endif
#define RADEG (180.0 / PI)
#define DEGRAD (PI / 180.0)
/* The trigonometric functions in degrees */
#define sind(x) sin((x)*DEGRAD)
#define cosd(x) cos((x)*DEGRAD)
#define tand(x) tan((x)*DEGRAD)
#define atand(x) (RADEG*atan(x))
#define asind(x) (RADEG*asin(x))
#define acosd(x) (RADEG*acos(x))
#define atan2d(y,x) (RADEG*atan2(y,x))
/*
* Following are some macros around the "workhorse" function __daylen__
* They mainly fill in the desired values for the reference altitude
* below the horizon, and also selects whether this altitude should
* refer to the Sun's center or its upper limb.
*/
/*
* This macro computes the length of the day, from sunrise to sunset.
* Sunrise/set is considered to occur when the Sun's upper limb is
* 35 arc minutes below the horizon (this accounts for the refraction
* of the Earth's atmosphere).
*/
#define day_length(year,month,day,lon,lat) \
__daylen__(year, month, day, lon, lat, -35.0/60.0, 1)
/*
* This macro computes the length of the day, including civil twilight.
* Civil twilight starts/ends when the Sun's center is 6 degrees below
* the horizon.
*/
#define day_civil_twilight_length(year,month,day,lon,lat) \
__daylen__(year, month, day, lon, lat, -6.0, 0)
/*
* This macro computes the length of the day, incl. nautical twilight.
* Nautical twilight starts/ends when the Sun's center is 12 degrees
* below the horizon.
*/
#define day_nautical_twilight_length(year,month,day,lon,lat) \
__daylen__(year, month, day, lon, lat, -12.0, 0)
/*
* This macro computes the length of the day, incl. astronomical twilight.
* Astronomical twilight starts/ends when the Sun's center is 18 degrees
* below the horizon.
*/
#define day_astronomical_twilight_length(year,month,day,lon,lat) \
__daylen__(year, month, day, lon, lat, -18.0, 0)
/*
* This macro computes times for sunrise/sunset.
* Sunrise/set is considered to occur when the Sun's upper limb is
* 35 arc minutes below the horizon (this accounts for the refraction
* of the Earth's atmosphere).
*/
#define sun_rise_set(year,month,day,lon,lat,rise,set) \
__sunriset__(year, month, day, lon, lat, -35.0/60.0, 1, rise, set)
/*
* This macro computes the start and end times of civil twilight.
* Civil twilight starts/ends when the Sun's center is 6 degrees below
* the horizon.
*/
#define civil_twilight(year,month,day,lon,lat,start,end) \
__sunriset__(year, month, day, lon, lat, -6.0, 0, start, end)
/*
* This macro computes the start and end times of nautical twilight.
* Nautical twilight starts/ends when the Sun's center is 12 degrees
* below the horizon.
*/
#define nautical_twilight(year,month,day,lon,lat,start,end) \
__sunriset__(year, month, day, lon, lat, -12.0, 0, start, end)
/*
* This macro computes the start and end times of astronomical twilight.
* Astronomical twilight starts/ends when the Sun's center is 18 degrees
* below the horizon.
*/
#define astronomical_twilight(year,month,day,lon,lat,start,end) \
__sunriset__(year, month, day, lon, lat, -18.0, 0, start, end)
/* Function prototypes */
double __daylen__(int year, int month, int day, double lon, double lat,
double altit, int upper_limb);
int __sunriset__(int year, int month, int day, double lon, double lat,
double altit, int upper_limb, double *rise, double *set);
void sunpos(double d, double *lon, double *r);
void sun_RA_dec(double d, double *RA, double *dec, double *r);
double revolution(double x);
double rev180(double x);
double GMST0(double d);