erfa_rust/
G35_safe.rs

1// G35
2//   xys00a.c → eraXys00a_safe
3//   xys00b.c → eraXys00b_safe
4//   xys06a.c → eraXys06a_safe
5//   zp.c     → eraZp_safe
6//   zpv.c    → eraZpv_safe
7//   zr.c     → eraZr_safe
8
9use crate::G26_safe::{eraPnm00a_safe, eraPnm00b_safe, eraPnm06a_safe};
10use crate::G29_safe::eraS00_safe;
11use crate::G30_safe::eraS06_safe;
12use crate::G6_safe::eraBpn2xy_safe;
13
14pub type ErfaResult<T> = Result<T, ()>;
15
16
17//  eraXys00a_safe    CIP X,Y and CIO locator s using IAU 2000A model
18//  Returns: (x, y, s)
19pub fn eraXys00a_safe(date1: f64, date2: f64) -> ErfaResult<(f64, f64, f64)> {
20    // Form NPB matrix, IAU 2000A
21    let rbpn = eraPnm00a_safe(date1, date2)?;
22    // Extract X, Y
23    let (x, y) = eraBpn2xy_safe(&rbpn)?;
24    // CIO locator s
25    let s = eraS00_safe(date1, date2, x, y)?;
26    Ok((x, y, s))
27}
28
29// CIP X,Y and CIO locator s using IAU 2000B model.
30pub fn eraXys00b_safe(date1: f64, date2: f64) -> ErfaResult<(f64, f64, f64)> {
31    let rbpn = eraPnm00b_safe(date1, date2)?;
32    let (x, y) = eraBpn2xy_safe(&rbpn)?;
33    let s = eraS00_safe(date1, date2, x, y)?;
34    Ok((x, y, s))
35}
36
37// CIP X,Y and CIO locator s using IAU 2006/2000A model.
38pub fn eraXys06a_safe(date1: f64, date2: f64) -> ErfaResult<(f64, f64, f64)> {
39    // NPB matrix, IAU 2006 precession + 2000A nutation
40    let rbpn = eraPnm06a_safe(date1, date2)?;
41    let (x, y) = eraBpn2xy_safe(&rbpn)?;
42    let s = eraS06_safe(date1, date2, x, y)?;
43    Ok((x, y, s))
44}
45
46// Zero a 3-vector.
47pub fn eraZp_safe() -> [f64; 3] {
48    [0.0, 0.0, 0.0]
49}
50
51// Zero a 2×3 pv-vector.
52pub fn eraZpv_safe() -> [[f64; 3]; 2] {
53    [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
54}
55
56// Initialize a 3×3 matrix to zero.
57pub fn eraZr_safe() -> [[f64; 3]; 3] {
58    [[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]
59}