use solar_positioning::{grena3, spa, time::JulianDate, RefractionCorrection};
fn main() {
println!("Solar positioning with the numeric API (no chrono)\n");
let jd = JulianDate::from_utc(
2024, 6, 21, 12, 0, 0.0, 69.0, )
.expect("Valid date");
println!("Julian Date: {:.6}", jd.julian_date());
println!("Delta T: {:.1} seconds\n", jd.delta_t());
let spa_position = spa::solar_position_from_julian(
jd,
48.21, 16.37, 190.0, Some(RefractionCorrection::standard()),
)
.expect("Valid coordinates");
println!("SPA Results:");
println!(" Azimuth: {:.3}°", spa_position.azimuth());
println!(" Elevation: {:.3}°", spa_position.elevation_angle());
println!(" Zenith: {:.3}°\n", spa_position.zenith_angle());
let t = grena3::calc_t_from_components(2024, 6, 21, 12, 0, 0.0).expect("Valid date");
let grena3_position = grena3::solar_position_from_t(
t,
48.21, 16.37, 69.0, Some(RefractionCorrection::standard()),
)
.expect("Valid coordinates");
println!("Grena3 Results:");
println!(" Azimuth: {:.3}°", grena3_position.azimuth());
println!(" Elevation: {:.3}°", grena3_position.elevation_angle());
println!(" Zenith: {:.3}°\n", grena3_position.zenith_angle());
let azimuth_diff = (spa_position.azimuth() - grena3_position.azimuth()).abs();
let elevation_diff = (spa_position.elevation_angle() - grena3_position.elevation_angle()).abs();
println!("Algorithm Differences:");
println!(" Azimuth difference: {:.4}°", azimuth_diff);
println!(" Elevation difference: {:.4}°", elevation_diff);
println!("\nCoordinate sweep example (3 locations, same time):");
let time_parts = spa::spa_time_dependent_from_julian(jd).expect("Valid Julian date");
let locations = [
("Vienna", 48.21, 16.37),
("San Francisco", 37.7749, -122.4194),
("Sydney", -33.8688, 151.2093),
];
for (name, lat, lon) in &locations {
let position = spa::spa_with_time_dependent_parts(
*lat,
*lon,
0.0, Some(RefractionCorrection::standard()),
&time_parts,
)
.expect("Valid coordinates");
println!(
" {} - Azimuth: {:.1}°, Elevation: {:.1}°",
name,
position.azimuth(),
position.elevation_angle()
);
}
}