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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
//! Astronomical calculations module.
//!
//! This module implements high-precision astronomical algorithms for calculating
//! solar and lunar positions, rise/set times, and related phenomena.
//!
//! ## Algorithms
//!
//! - **Solar calculations**: Based on NOAA solar position algorithms
//! - **Lunar calculations**: Based on Jean Meeus "Astronomical Algorithms"
//!
//! ## Modules
//!
//! - [`sun`] - Solar position and event calculations
//! - [`moon`] - Lunar position, phases, and event calculations
//! - [`units`] - Type-safe angle and coordinate units
//! - [`coordinates`] - Coordinate system transformations
//! - [`time_utils`] - Time and Julian Day utilities
//! - [`simd_math`] - SIMD-optimized mathematical operations
//! - [`m1_optimizations`] - Apple Silicon specific optimizations
//! - [`moon_batch_optimized`] - Batch lunar calculations with parallelization
use ;
use ;
// Re-export commonly used types
pub use ;
/// Location on Earth
/// All calculations assume sea level (0m elevation) per USNO celestial navigation convention
/// Calculate Julian Day from a given date and time.
///
/// Julian Day is a continuous count of days since the beginning of the Julian Period.
/// This function converts any timezone-aware DateTime to UTC before calculating the Julian Day.
///
/// # Arguments
///
/// * `dt` - A timezone-aware DateTime
///
/// # Returns
///
/// The Julian Day number as a floating-point value.
///
/// # Notes
///
/// - Julian Day is always defined in UTC
/// - The algorithms are formulated for Universal Time (UT), not Terrestrial Time (TT)
/// - The epoch (JD 0) corresponds to January 1, 4713 BC at noon
///
/// # Examples
///
/// ```
/// use solunatus::astro::julian_day;
/// use chrono::{TimeZone, Utc};
///
/// let dt = Utc.with_ymd_and_hms(2000, 1, 1, 12, 0, 0).unwrap();
/// let jd = julian_day(&dt);
/// assert!((jd - 2451545.0).abs() < 0.001); // J2000.0 epoch
/// ```
/// Calculate Julian Century from a Julian Day number.
///
/// Julian Century is the number of centuries since the J2000.0 epoch (JD 2451545.0),
/// which corresponds to January 1, 2000, 12:00 TT.
///
/// # Arguments
///
/// * `jd` - Julian Day number
///
/// # Returns
///
/// The Julian Century value (number of centuries since J2000.0).
///
/// # Examples
///
/// ```
/// use solunatus::astro::julian_century;
///
/// // J2000.0 epoch
/// let t = julian_century(2451545.0);
/// assert_eq!(t, 0.0);
/// ```
/// Normalize an angle to the range [0, 360) degrees.
///
/// # Arguments
///
/// * `angle` - Angle in degrees (can be any value)
///
/// # Returns
///
/// The normalized angle in the range [0, 360).
///
/// # Examples
///
/// ```
/// use solunatus::astro::normalize_degrees;
///
/// assert_eq!(normalize_degrees(370.0), 10.0);
/// assert_eq!(normalize_degrees(-10.0), 350.0);
/// assert_eq!(normalize_degrees(0.0), 0.0);
/// ```
/// Normalize an angle to the range [-180, 180) degrees.
///
/// This is useful for representing angles relative to a reference direction,
/// where negative values indicate one direction and positive values indicate the other.
///
/// # Arguments
///
/// * `angle` - Angle in degrees (can be any value)
///
/// # Returns
///
/// The normalized angle in the range [-180, 180).
///
/// # Examples
///
/// ```
/// use solunatus::astro::normalize_degrees_signed;
///
/// assert_eq!(normalize_degrees_signed(190.0), -170.0);
/// assert_eq!(normalize_degrees_signed(-190.0), 170.0);
/// ```