Skip to main content

lox_frames/iers/nutation/
iau2006.rs

1// SPDX-FileCopyrightText: 2023 Angus Morrison <github@angus-morrison.com>
2// SPDX-FileCopyrightText: 2024 Helge Eichhorn <git@helgeeichhorn.de>
3//
4// SPDX-License-Identifier: MPL-2.0
5
6use lox_time::Time;
7use lox_time::julian_dates::JulianDate;
8use lox_time::time_scales::Tdb;
9
10use crate::iers::nutation::Nutation;
11
12impl Nutation {
13    /// The IAU 2000A nutation model adjusted to match the IAU 2006 precession model per
14    /// Wallace & Capitaine, 2006.
15    pub fn iau2006a(time: Time<Tdb>) -> Nutation {
16        let mut nutation = Self::iau2000a(time);
17
18        let j2_correction = -2.7774e-6 * time.centuries_since_j2000();
19        nutation.dpsi += (0.4697e-6 + j2_correction) * nutation.dpsi;
20        nutation.deps += j2_correction * nutation.deps;
21
22        nutation
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use crate::iers::nutation::Nutation;
29
30    use lox_core::units::AngleUnits;
31    use lox_test_utils::assert_approx_eq;
32    use lox_time::{Time, time_scales::Tdb};
33
34    #[test]
35    fn test_nutation_iau2006a() {
36        let time = Time::from_two_part_julian_date(Tdb, 2400000.5, 53736.0);
37        let expected = Nutation {
38            dpsi: -9.630_912_025_820_31e-6.rad(),
39            deps: 4.063_238_496_887_25e-5.rad(),
40        };
41        let actual = Nutation::iau2006a(time);
42        assert_approx_eq!(expected, actual, rtol <= 1e-13);
43    }
44}