1use std::f64::consts::TAU;
7
8use lox_core::types::units::{Arcseconds, JulianCenturies};
9use lox_core::units::{Angle, AngleUnits};
10use lox_time::{Time, julian_dates::JulianDate, time_scales::Tdb};
11
12use crate::iers::nutation::Nutation;
13
14struct Coefficients {
15 l: f64,
17 lp: f64,
18 f: f64,
19 d: f64,
20 om: f64,
21
22 sin_psi: f64,
24 sin_psi_t: f64,
25
26 cos_eps: f64,
28 cos_eps_t: f64,
29}
30
31impl Nutation {
32 pub fn iau1980(time: Time<Tdb>) -> Self {
33 let t = time.centuries_since_j2000();
34 let l = l(t);
35 let lp = lp(t);
36 let f = f(t);
37 let d = d(t);
38 let om = omega(t);
39
40 let (dpsi, deps) = COEFFICIENTS
41 .iter()
42 .rev()
45 .fold((0.0, 0.0), |(mut dpsi, mut deps), coeff| {
46 let arg = coeff.l * l + coeff.lp * lp + coeff.f * f + coeff.d * d + coeff.om * om;
48
49 let sin = coeff.sin_psi + coeff.sin_psi_t * t;
51 let cos = coeff.cos_eps + coeff.cos_eps_t * t;
52 dpsi += sin * arg.sin();
53 deps += cos * arg.cos();
54
55 (dpsi, deps)
56 });
57
58 Self {
59 dpsi: (1e-1 * dpsi).mas(),
60 deps: (1e-1 * deps).mas(),
61 }
62 }
63}
64
65fn l(centuries_since_j2000_tdb: JulianCenturies) -> Angle {
68 let l_poly: Arcseconds = fast_polynomial::poly_array(
69 centuries_since_j2000_tdb,
70 &[485866.733, 715922.633, 31.31, 0.064],
71 );
72 (l_poly.arcsec() + ((1325.0 * centuries_since_j2000_tdb % 1.0) * TAU).rad())
73 .normalize_two_pi(Angle::ZERO)
74}
75
76fn lp(centuries_since_j2000_tdb: JulianCenturies) -> Angle {
79 let lp_poly: Arcseconds = fast_polynomial::poly_array(
80 centuries_since_j2000_tdb,
81 &[1287099.804, 1292581.224, -0.577, -0.012],
82 );
83 (lp_poly.arcsec() + ((99.0 * centuries_since_j2000_tdb % 1.0) * TAU).rad())
84 .normalize_two_pi(Angle::ZERO)
85}
86
87fn f(centuries_since_j2000_tdb: JulianCenturies) -> Angle {
90 let f_poly: Arcseconds = fast_polynomial::poly_array(
91 centuries_since_j2000_tdb,
92 &[335778.877, 295263.137, -13.257, 0.011],
93 );
94 (f_poly.arcsec() + ((1342.0 * centuries_since_j2000_tdb % 1.0) * TAU).rad())
95 .normalize_two_pi(Angle::ZERO)
96}
97
98fn d(centuries_since_j2000_tdb: JulianCenturies) -> Angle {
100 let d_poly: Arcseconds = fast_polynomial::poly_array(
101 centuries_since_j2000_tdb,
102 &[1072261.307, 1105601.328, -6.891, 0.019],
103 );
104 (d_poly.arcsec() + ((1236.0 * centuries_since_j2000_tdb % 1.0) * TAU).rad())
105 .normalize_two_pi(Angle::ZERO)
106}
107
108fn omega(centuries_since_j2000_tdb: JulianCenturies) -> Angle {
111 let om_poly: Arcseconds = fast_polynomial::poly_array(
112 centuries_since_j2000_tdb,
113 &[450160.280, -482890.539, 7.455, 0.008],
114 );
115 (om_poly.arcsec() + ((-5.0 * centuries_since_j2000_tdb % 1.0) * TAU).rad())
116 .normalize_two_pi(Angle::ZERO)
117}
118
119#[rustfmt::skip]
120const COEFFICIENTS: [Coefficients; 106] = [
122 Coefficients{ l: 0.0, lp: 0.0, f: 0.0, d: 0.0, om: 1.0, sin_psi:-171996.0, sin_psi_t:-174.2, cos_eps: 92025.0, cos_eps_t: 8.9 },
123 Coefficients{ l: 0.0, lp: 0.0, f: 0.0, d: 0.0, om: 2.0, sin_psi: 2062.0, sin_psi_t: 0.2, cos_eps: -895.0, cos_eps_t: 0.5 },
124 Coefficients{ l: -2.0, lp: 0.0, f: 2.0, d: 0.0, om: 1.0, sin_psi: 46.0, sin_psi_t: 0.0, cos_eps: -24.0, cos_eps_t: 0.0 },
125 Coefficients{ l: 2.0, lp: 0.0, f:-2.0, d: 0.0, om: 0.0, sin_psi: 11.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
126 Coefficients{ l: -2.0, lp: 0.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: -3.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
127 Coefficients{ l: 1.0, lp:-1.0, f: 0.0, d:-1.0, om: 0.0, sin_psi: -3.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
128 Coefficients{ l: 0.0, lp:-2.0, f: 2.0, d:-2.0, om: 1.0, sin_psi: -2.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
129 Coefficients{ l: 2.0, lp: 0.0, f:-2.0, d: 0.0, om: 1.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
130 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: -13187.0, sin_psi_t: -1.6, cos_eps: 5736.0, cos_eps_t: -3.1 },
131 Coefficients{ l: 0.0, lp: 1.0, f: 0.0, d: 0.0, om: 0.0, sin_psi: 1426.0, sin_psi_t: -3.4, cos_eps: 54.0, cos_eps_t: -0.1 },
132 Coefficients{ l: 0.0, lp: 1.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: -517.0, sin_psi_t: 1.2, cos_eps: 224.0, cos_eps_t: -0.6 },
133 Coefficients{ l: 0.0, lp:-1.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: 217.0, sin_psi_t: -0.5, cos_eps: -95.0, cos_eps_t: 0.3 },
134 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d:-2.0, om: 1.0, sin_psi: 129.0, sin_psi_t: 0.1, cos_eps: -70.0, cos_eps_t: 0.0 },
135 Coefficients{ l: 2.0, lp: 0.0, f: 0.0, d:-2.0, om: 0.0, sin_psi: 48.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
136 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d:-2.0, om: 0.0, sin_psi: -22.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
137 Coefficients{ l: 0.0, lp: 2.0, f: 0.0, d: 0.0, om: 0.0, sin_psi: 17.0, sin_psi_t: -0.1, cos_eps: 0.0, cos_eps_t: 0.0 },
138 Coefficients{ l: 0.0, lp: 1.0, f: 0.0, d: 0.0, om: 1.0, sin_psi: -15.0, sin_psi_t: 0.0, cos_eps: 9.0, cos_eps_t: 0.0 },
139 Coefficients{ l: 0.0, lp: 2.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: -16.0, sin_psi_t: 0.1, cos_eps: 7.0, cos_eps_t: 0.0 },
140 Coefficients{ l: 0.0, lp:-1.0, f: 0.0, d: 0.0, om: 1.0, sin_psi: -12.0, sin_psi_t: 0.0, cos_eps: 6.0, cos_eps_t: 0.0 },
141 Coefficients{ l: -2.0, lp: 0.0, f: 0.0, d: 2.0, om: 1.0, sin_psi: -6.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
142 Coefficients{ l: 0.0, lp:-1.0, f: 2.0, d:-2.0, om: 1.0, sin_psi: -5.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
143 Coefficients{ l: 2.0, lp: 0.0, f: 0.0, d:-2.0, om: 1.0, sin_psi: 4.0, sin_psi_t: 0.0, cos_eps: -2.0, cos_eps_t: 0.0 },
144 Coefficients{ l: 0.0, lp: 1.0, f: 2.0, d:-2.0, om: 1.0, sin_psi: 4.0, sin_psi_t: 0.0, cos_eps: -2.0, cos_eps_t: 0.0 },
145 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d:-1.0, om: 0.0, sin_psi: -4.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
146 Coefficients{ l: 2.0, lp: 1.0, f: 0.0, d:-2.0, om: 0.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
147 Coefficients{ l: 0.0, lp: 0.0, f:-2.0, d: 2.0, om: 1.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
148 Coefficients{ l: 0.0, lp: 1.0, f:-2.0, d: 2.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
149 Coefficients{ l: 0.0, lp: 1.0, f: 0.0, d: 0.0, om: 2.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
150 Coefficients{ l: -1.0, lp: 0.0, f: 0.0, d: 1.0, om: 1.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
151 Coefficients{ l: 0.0, lp: 1.0, f: 2.0, d:-2.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
152 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: -2274.0, sin_psi_t: -0.2, cos_eps: 977.0, cos_eps_t: -0.5 },
153 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d: 0.0, om: 0.0, sin_psi: 712.0, sin_psi_t: 0.1, cos_eps: -7.0, cos_eps_t: 0.0 },
154 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d: 0.0, om: 1.0, sin_psi: -386.0, sin_psi_t: -0.4, cos_eps: 200.0, cos_eps_t: 0.0 },
155 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: -301.0, sin_psi_t: 0.0, cos_eps: 129.0, cos_eps_t: -0.1 },
156 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d:-2.0, om: 0.0, sin_psi: -158.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
157 Coefficients{ l: -1.0, lp: 0.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: 123.0, sin_psi_t: 0.0, cos_eps: -53.0, cos_eps_t: 0.0 },
158 Coefficients{ l: 0.0, lp: 0.0, f: 0.0, d: 2.0, om: 0.0, sin_psi: 63.0, sin_psi_t: 0.0, cos_eps: -2.0, cos_eps_t: 0.0 },
159 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d: 0.0, om: 1.0, sin_psi: 63.0, sin_psi_t: 0.1, cos_eps: -33.0, cos_eps_t: 0.0 },
160 Coefficients{ l: -1.0, lp: 0.0, f: 0.0, d: 0.0, om: 1.0, sin_psi: -58.0, sin_psi_t: -0.1, cos_eps: 32.0, cos_eps_t: 0.0 },
161 Coefficients{ l: -1.0, lp: 0.0, f: 2.0, d: 2.0, om: 2.0, sin_psi: -59.0, sin_psi_t: 0.0, cos_eps: 26.0, cos_eps_t: 0.0 },
162 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d: 0.0, om: 1.0, sin_psi: -51.0, sin_psi_t: 0.0, cos_eps: 27.0, cos_eps_t: 0.0 },
163 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d: 2.0, om: 2.0, sin_psi: -38.0, sin_psi_t: 0.0, cos_eps: 16.0, cos_eps_t: 0.0 },
164 Coefficients{ l: 2.0, lp: 0.0, f: 0.0, d: 0.0, om: 0.0, sin_psi: 29.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
165 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: 29.0, sin_psi_t: 0.0, cos_eps: -12.0, cos_eps_t: 0.0 },
166 Coefficients{ l: 2.0, lp: 0.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: -31.0, sin_psi_t: 0.0, cos_eps: 13.0, cos_eps_t: 0.0 },
167 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d: 0.0, om: 0.0, sin_psi: 26.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
168 Coefficients{ l: -1.0, lp: 0.0, f: 2.0, d: 0.0, om: 1.0, sin_psi: 21.0, sin_psi_t: 0.0, cos_eps: -10.0, cos_eps_t: 0.0 },
169 Coefficients{ l: -1.0, lp: 0.0, f: 0.0, d: 2.0, om: 1.0, sin_psi: 16.0, sin_psi_t: 0.0, cos_eps: -8.0, cos_eps_t: 0.0 },
170 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d:-2.0, om: 1.0, sin_psi: -13.0, sin_psi_t: 0.0, cos_eps: 7.0, cos_eps_t: 0.0 },
171 Coefficients{ l: -1.0, lp: 0.0, f: 2.0, d: 2.0, om: 1.0, sin_psi: -10.0, sin_psi_t: 0.0, cos_eps: 5.0, cos_eps_t: 0.0 },
172 Coefficients{ l: 1.0, lp: 1.0, f: 0.0, d:-2.0, om: 0.0, sin_psi: -7.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
173 Coefficients{ l: 0.0, lp: 1.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: 7.0, sin_psi_t: 0.0, cos_eps: -3.0, cos_eps_t: 0.0 },
174 Coefficients{ l: 0.0, lp:-1.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: -7.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
175 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d: 2.0, om: 2.0, sin_psi: -8.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
176 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d: 2.0, om: 0.0, sin_psi: 6.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
177 Coefficients{ l: 2.0, lp: 0.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: 6.0, sin_psi_t: 0.0, cos_eps: -3.0, cos_eps_t: 0.0 },
178 Coefficients{ l: 0.0, lp: 0.0, f: 0.0, d: 2.0, om: 1.0, sin_psi: -6.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
179 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d: 2.0, om: 1.0, sin_psi: -7.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
180 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d:-2.0, om: 1.0, sin_psi: 6.0, sin_psi_t: 0.0, cos_eps: -3.0, cos_eps_t: 0.0 },
181 Coefficients{ l: 0.0, lp: 0.0, f: 0.0, d:-2.0, om: 1.0, sin_psi: -5.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
182 Coefficients{ l: 1.0, lp:-1.0, f: 0.0, d: 0.0, om: 0.0, sin_psi: 5.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
183 Coefficients{ l: 2.0, lp: 0.0, f: 2.0, d: 0.0, om: 1.0, sin_psi: -5.0, sin_psi_t: 0.0, cos_eps: 3.0, cos_eps_t: 0.0 },
184 Coefficients{ l: 0.0, lp: 1.0, f: 0.0, d:-2.0, om: 0.0, sin_psi: -4.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
185 Coefficients{ l: 1.0, lp: 0.0, f:-2.0, d: 0.0, om: 0.0, sin_psi: 4.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
186 Coefficients{ l: 0.0, lp: 0.0, f: 0.0, d: 1.0, om: 0.0, sin_psi: -4.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
187 Coefficients{ l: 1.0, lp: 1.0, f: 0.0, d: 0.0, om: 0.0, sin_psi: -3.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
188 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d: 0.0, om: 0.0, sin_psi: 3.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
189 Coefficients{ l: 1.0, lp:-1.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: -3.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
190 Coefficients{ l: -1.0, lp:-1.0, f: 2.0, d: 2.0, om: 2.0, sin_psi: -3.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
191 Coefficients{ l: -2.0, lp: 0.0, f: 0.0, d: 0.0, om: 1.0, sin_psi: -2.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
192 Coefficients{ l: 3.0, lp: 0.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: -3.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
193 Coefficients{ l: 0.0, lp:-1.0, f: 2.0, d: 2.0, om: 2.0, sin_psi: -3.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
194 Coefficients{ l: 1.0, lp: 1.0, f: 2.0, d: 0.0, om: 2.0, sin_psi: 2.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
195 Coefficients{ l: -1.0, lp: 0.0, f: 2.0, d:-2.0, om: 1.0, sin_psi: -2.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
196 Coefficients{ l: 2.0, lp: 0.0, f: 0.0, d: 0.0, om: 1.0, sin_psi: 2.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
197 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d: 0.0, om: 2.0, sin_psi: -2.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
198 Coefficients{ l: 3.0, lp: 0.0, f: 0.0, d: 0.0, om: 0.0, sin_psi: 2.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
199 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d: 1.0, om: 2.0, sin_psi: 2.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
200 Coefficients{ l: -1.0, lp: 0.0, f: 0.0, d: 0.0, om: 2.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
201 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d:-4.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
202 Coefficients{ l: -2.0, lp: 0.0, f: 2.0, d: 2.0, om: 2.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
203 Coefficients{ l: -1.0, lp: 0.0, f: 2.0, d: 4.0, om: 2.0, sin_psi: -2.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
204 Coefficients{ l: 2.0, lp: 0.0, f: 0.0, d:-4.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
205 Coefficients{ l: 1.0, lp: 1.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
206 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d: 2.0, om: 1.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
207 Coefficients{ l: -2.0, lp: 0.0, f: 2.0, d: 4.0, om: 2.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 1.0, cos_eps_t: 0.0 },
208 Coefficients{ l: -1.0, lp: 0.0, f: 4.0, d: 0.0, om: 2.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
209 Coefficients{ l: 1.0, lp:-1.0, f: 0.0, d:-2.0, om: 0.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
210 Coefficients{ l: 2.0, lp: 0.0, f: 2.0, d:-2.0, om: 1.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: -1.0, cos_eps_t: 0.0 },
211 Coefficients{ l: 2.0, lp: 0.0, f: 2.0, d: 2.0, om: 2.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
212 Coefficients{ l: 1.0, lp: 0.0, f: 0.0, d: 2.0, om: 1.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
213 Coefficients{ l: 0.0, lp: 0.0, f: 4.0, d:-2.0, om: 2.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
214 Coefficients{ l: 3.0, lp: 0.0, f: 2.0, d:-2.0, om: 2.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
215 Coefficients{ l: 1.0, lp: 0.0, f: 2.0, d:-2.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
216 Coefficients{ l: 0.0, lp: 1.0, f: 2.0, d: 0.0, om: 1.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
217 Coefficients{ l: -1.0, lp:-1.0, f: 0.0, d: 2.0, om: 1.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
218 Coefficients{ l: 0.0, lp: 0.0, f:-2.0, d: 0.0, om: 1.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
219 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d:-1.0, om: 2.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
220 Coefficients{ l: 0.0, lp: 1.0, f: 0.0, d: 2.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
221 Coefficients{ l: 1.0, lp: 0.0, f:-2.0, d:-2.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
222 Coefficients{ l: 0.0, lp:-1.0, f: 2.0, d: 0.0, om: 1.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
223 Coefficients{ l: 1.0, lp: 1.0, f: 0.0, d:-2.0, om: 1.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
224 Coefficients{ l: 1.0, lp: 0.0, f:-2.0, d: 2.0, om: 0.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
225 Coefficients{ l: 2.0, lp: 0.0, f: 0.0, d: 2.0, om: 0.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
226 Coefficients{ l: 0.0, lp: 0.0, f: 2.0, d: 4.0, om: 2.0, sin_psi: -1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
227 Coefficients{ l: 0.0, lp: 1.0, f: 0.0, d: 1.0, om: 0.0, sin_psi: 1.0, sin_psi_t: 0.0, cos_eps: 0.0, cos_eps_t: 0.0 },
228];
229#[cfg(test)]
232mod tests {
233 use lox_test_utils::assert_approx_eq;
234
235 use super::*;
236
237 #[test]
238 fn test_nutation_iau1980() {
239 let time = Time::from_two_part_julian_date(Tdb, 2400000.5, 53736.0);
240 let actual = Nutation::iau1980(time);
241 let expected = Nutation {
242 dpsi: -9.643_658_353_226_563e-6.rad(),
243 deps: 4.060_051_006_879_713e-5.rad(),
244 };
245 assert_approx_eq!(expected, actual, rtol <= 1e-13);
246 }
247}