erfa_rust/
G7_safe.rs

1// G7
2//   c2i00a.c  → eraC2i00a_safe
3//   c2i00b.c  → eraC2i00b_safe
4//   c2i06a.c  → eraC2i06a_safe
5//   c2ibpn.c  → eraC2ibpn_safe
6//   c2ixy.c   → eraC2ixy_safe
7//   c2ixys.c  → eraC2ixys_safe
8//   c2s.c     → eraC2s_safe
9//   c2t00a.c  → eraC2t00a_safe
10//   c2t00b.c  → eraC2t00b_safe
11//   c2t06a.c  → eraC2t06a_safe
12
13use crate::G14_safe::eraEra00_safe;
14use crate::G19_safe::eraIr_safe;
15use crate::G26_safe::{eraPnm00a_safe, eraPnm00b_safe, eraPnm06a_safe, eraPom00_safe};
16use crate::G28_safe::{eraRy_safe, eraRz_safe};
17use crate::G29_safe::eraS00_safe;
18use crate::G30_safe::{eraS06_safe, eraSp00_safe};
19use crate::G6_safe::eraBpn2xy_safe;
20use crate::G8_safe::eraC2tcio_safe;
21
22pub type ErfaResult<T> = Result<T, ()>;
23
24// Celestial-to-intermediate matrix, IAU 2000A; returns rc2i.
25pub fn eraC2i00a_safe(date1: f64, date2: f64) -> ErfaResult<[[f64; 3]; 3]> {
26    let rbpn = eraPnm00a_safe(date1, date2)?;
27    eraC2ibpn_safe(date1, date2, &rbpn)
28}
29
30// Celestial-to-intermediate matrix, IAU 2000B; returns rc2i.
31pub fn eraC2i00b_safe(date1: f64, date2: f64) -> ErfaResult<[[f64; 3]; 3]> {
32    let rbpn = eraPnm00b_safe(date1, date2)?;
33    eraC2ibpn_safe(date1, date2, &rbpn)
34}
35
36// Celestial-to-intermediate matrix, IAU 2006/2000A; returns rc2i.
37pub fn eraC2i06a_safe(date1: f64, date2: f64) -> ErfaResult<[[f64; 3]; 3]> {
38    let rbpn = eraPnm06a_safe(date1, date2)?;
39    let (x, y) = eraBpn2xy_safe(&rbpn)?;
40    let s = eraS06_safe(date1, date2, x, y)?;
41    eraC2ixys_safe(x, y, s)
42}
43
44// Celestial-to-intermediate matrix from supplied NPB; returns rc2i.
45pub fn eraC2ibpn_safe(date1: f64, date2: f64, rbpn: &[[f64; 3]; 3]) -> ErfaResult<[[f64; 3]; 3]> {
46    let (x, y) = eraBpn2xy_safe(rbpn)?;
47    eraC2ixy_safe(date1, date2, x, y)
48}
49
50// Celestial-to-intermediate matrix from X,Y and date (S00); returns rc2i.
51pub fn eraC2ixy_safe(date1: f64, date2: f64, x: f64, y: f64) -> ErfaResult<[[f64; 3]; 3]> {
52    let s = eraS00_safe(date1, date2, x, y)?;
53    eraC2ixys_safe(x, y, s)
54}
55
56// Celestial-to-intermediate matrix from X,Y and CIO locator s; returns rc2i.
57pub fn eraC2ixys_safe(x: f64, y: f64, s: f64) -> ErfaResult<[[f64; 3]; 3]> {
58    // Compute e (longitude of the CIP) and d (pole inclination).
59    let r2 = x * x + y * y;
60    let e = if r2 > 0.0 { y.atan2(x) } else { 0.0 };
61    let d = (r2 / (1.0 - r2)).sqrt().atan();
62
63    // Compose rc2i = Rz(e)  Ry(d)  Rz(-(e+s)).
64    let mut rc2i = [[0.0_f64; 3]; 3];
65    eraIr_safe(&mut rc2i)?;
66    eraRz_safe(e, &mut rc2i)?;
67    eraRy_safe(d, &mut rc2i)?;
68    eraRz_safe(-(e + s), &mut rc2i)?;
69    Ok(rc2i)
70}
71
72// P-vector to spherical angles; returns (theta, phi).
73pub fn eraC2s_safe(p: &[f64; 3]) -> ErfaResult<(f64, f64)> {
74    let x = p[0];
75    let y = p[1];
76    let z = p[2];
77    let d2 = x * x + y * y;
78    let theta = if d2 == 0.0 { 0.0 } else { y.atan2(x) };
79    let phi = if z == 0.0 { 0.0 } else { z.atan2(d2.sqrt()) };
80    Ok((theta, phi))
81}
82
83// Celestial-to-terrestrial matrix, IAU 2000A; returns rc2t.
84pub fn eraC2t00a_safe(
85    tta: f64,
86    ttb: f64,
87    uta: f64,
88    utb: f64,
89    xp: f64,
90    yp: f64,
91) -> ErfaResult<[[f64; 3]; 3]> {
92    let rc2i = eraC2i00a_safe(tta, ttb)?;
93    let era = eraEra00_safe(uta, utb)?;
94    let sp = eraSp00_safe(tta, ttb)?;
95    let rpom = eraPom00_safe(xp, yp, sp)?;
96
97    let mut rc2t = [[0.0_f64; 3]; 3];
98    eraC2tcio_safe(&rc2i, era, &rpom, &mut rc2t)?;
99    Ok(rc2t)
100}
101
102// Celestial-to-terrestrial matrix, IAU 2000B; returns rc2t.
103pub fn eraC2t00b_safe(
104    tta: f64,
105    ttb: f64,
106    uta: f64,
107    utb: f64,
108    xp: f64,
109    yp: f64,
110) -> ErfaResult<[[f64; 3]; 3]> {
111    let rc2i = eraC2i00b_safe(tta, ttb)?;
112    let era = eraEra00_safe(uta, utb)?;
113    let rpom = eraPom00_safe(xp, yp, 0.0)?;
114
115    let mut rc2t = [[0.0_f64; 3]; 3];
116    eraC2tcio_safe(&rc2i, era, &rpom, &mut rc2t)?;
117    Ok(rc2t)
118}
119
120// Celestial-to-terrestrial matrix, IAU 2006/2000A; returns rc2t.
121pub fn eraC2t06a_safe(
122    tta: f64,
123    ttb: f64,
124    uta: f64,
125    utb: f64,
126    xp: f64,
127    yp: f64,
128) -> ErfaResult<[[f64; 3]; 3]> {
129    let rc2i = eraC2i06a_safe(tta, ttb)?;
130    let era = eraEra00_safe(uta, utb)?;
131    let sp = eraSp00_safe(tta, ttb)?;
132    let rpom = eraPom00_safe(xp, yp, sp)?;
133
134    let mut rc2t = [[0.0_f64; 3]; 3];
135    eraC2tcio_safe(&rc2i, era, &rpom, &mut rc2t)?;
136    Ok(rc2t)
137}