/rust/registry/src/index.crates.io-1949cf8c6b5b557f/sofars-0.6.2/src/pnp/pmat76.rs
Line | Count | Source |
1 | | use super::prec76; |
2 | | use crate::consts::DJ00; |
3 | | use crate::vm::{cr, ir, ry, rz}; |
4 | | |
5 | | /// Precession matrix from J2000.0 to a specified date, IAU 1976 model. |
6 | | /// |
7 | | /// This function is part of the International Astronomical Union's |
8 | | /// SOFA (Standards of Fundamental Astronomy) software collection. |
9 | | /// |
10 | | /// Status: support function. |
11 | | /// |
12 | | /// Given: |
13 | | /// date1,date2 f64 ending date, TT (Note 1) |
14 | | /// |
15 | | /// Returned: |
16 | | /// rmatp f64[3][3] precession matrix, J2000.0 -> date1+date2 |
17 | | /// |
18 | | /// Notes: |
19 | | /// |
20 | | /// 1) The TT date date1+date2 is a Julian Date, apportioned in any |
21 | | /// convenient way between the two arguments. For example, |
22 | | /// JD(TT)=2450123.7 could be expressed in any of these ways, |
23 | | /// among others: |
24 | | /// |
25 | | /// ```text |
26 | | /// date1 date2 |
27 | | /// |
28 | | /// 2450123.7 0.0 (JD method) |
29 | | /// 2451545.0 -1421.3 (J2000 method) |
30 | | /// 2400000.5 50123.2 (MJD method) |
31 | | /// 2450123.5 0.2 (date & time method) |
32 | | /// ``` |
33 | | /// |
34 | | /// The JD method is the most natural and convenient to use in |
35 | | /// cases where the loss of several decimal digits of resolution |
36 | | /// is acceptable. The J2000 method is best matched to the way |
37 | | /// the argument is handled internally and will deliver the |
38 | | /// optimum resolution. The MJD method and the date & time methods |
39 | | /// are both good compromises between resolution and convenience. |
40 | | /// |
41 | | /// 2) The matrix operates in the sense V(date) = RMATP * V(J2000), |
42 | | /// where the p-vector V(J2000) is with respect to the mean |
43 | | /// equatorial triad of epoch J2000.0 and the p-vector V(date) |
44 | | /// is with respect to the mean equatorial triad of the given |
45 | | /// date. |
46 | | /// |
47 | | /// 3) Though the matrix method itself is rigorous, the precession |
48 | | /// angles are expressed through canonical polynomials which are |
49 | | /// valid only for a limited time span. In addition, the IAU 1976 |
50 | | /// precession rate is known to be imperfect. The absolute accuracy |
51 | | /// of the present formulation is better than 0.1 arcsec from |
52 | | /// 1960AD to 2040AD, better than 1 arcsec from 1640AD to 2360AD, |
53 | | /// and remains below 3 arcsec for the whole of the period |
54 | | /// 500BC to 3000AD. The errors exceed 10 arcsec outside the |
55 | | /// range 1200BC to 3900AD, exceed 100 arcsec outside 4200BC to |
56 | | /// 5600AD and exceed 1000 arcsec outside 6800BC to 8200AD. |
57 | | /// |
58 | | /// References: |
59 | | /// |
60 | | /// Lieske, J.H., 1979, Astron.Astrophys. 73, 282. |
61 | | /// equations (6) & (7), p283. |
62 | | /// |
63 | | /// Kaplan,G.H., 1981. USNO circular no. 163, pA2. |
64 | 0 | pub fn pmat76(date1: f64, date2: f64) -> [[f64; 3]; 3] { |
65 | 0 | let mut wmat = [[0.0; 3]; 3]; |
66 | 0 | let mut rmatp = [[0.0; 3]; 3]; |
67 | | |
68 | | /* Precession Euler angles, J2000.0 to specified date. */ |
69 | 0 | let (zeta, z, theta) = prec76(DJ00, 0.0, date1, date2); |
70 | | |
71 | | /* Form the rotation matrix. */ |
72 | 0 | ir(&mut wmat); |
73 | 0 | rz(-zeta, &mut wmat); |
74 | 0 | ry(theta, &mut wmat); |
75 | 0 | rz(-z, &mut wmat); |
76 | 0 | cr(&wmat, &mut rmatp); |
77 | | |
78 | 0 | rmatp |
79 | 0 | } |