astrodyn_frames 0.1.1

Reference frame tree and Earth rotation (RNP, nutation, precession) for the astrodyn orbital-dynamics pipeline
Documentation
//! IAU 1980 nutation coefficient tables for J2000.
//!
//! Extracted from
//! [`models/environment/RNP/RNPJ2000/data/src/data_nutation_j2000.cc`](https://github.com/nasa/jeod/blob/jeod_v5.4.0/models/environment/RNP/RNPJ2000/data/src/data_nutation_j2000.cc)
//! in JEOD v5.4.0.
//!
//! Reference: Mulcahy, David D. and Bond, Victor R., *"The RNP Routine
//! for the Standard Epoch J2000"*, NASA:JSC-24574, September 1990.
//!
//! 106 terms of the IAU 1980 Theory of Nutation — each array has length
//! [`NUM_NUTATION_COEFFS`] and is indexed `0..NUM_NUTATION_COEFFS`.
//!
//! The five fundamental-argument multiplier arrays
//! ([`L_COEFFS`], [`M_COEFFS`], [`F_COEFFS`], [`D_COEFFS`],
//! [`OMEGA_COEFFS`]) are integer coefficients that select which
//! combination of Delaunay arguments drives each nutation term:
//!
//! - `L`: mean anomaly of the Moon
//! - `M` (= `l'`): mean anomaly of the Sun
//! - `F`: mean argument of latitude of the Moon
//! - `D`: mean elongation of the Moon from the Sun
//! - `Omega`: mean longitude of the ascending node of the Moon
//!
//! [`LONG_COEFFS`] / [`LONG_T_COEFFS`] hold the longitude-nutation
//! amplitude and its time-dependent (secular) part.
//! [`OBLIQ_COEFFS`] / [`OBLIQ_T_COEFFS`] hold the same for obliquity
//! nutation. All amplitudes are in `0.0001 arcsec`; the `*_T_COEFFS`
//! arrays multiply Julian centuries from J2000.

/// Number of nutation coefficients.
pub const NUM_NUTATION_COEFFS: usize = 106;

/// Multipliers of l (mean anomaly of the Moon).
pub const L_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    0.0, 0.0, -2.0, 2.0, -2.0, 1.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0,
    0.0, -2.0, 0.0, 2.0, 0.0, 1.0, 2.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, -1.0,
    0.0, 1.0, -1.0, -1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 0.0, -1.0, -1.0, 1.0, -1.0, 1.0, 0.0, 0.0, 1.0,
    1.0, 2.0, 0.0, 0.0, 1.0, 0.0, 1.0, 2.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, -1.0, -2.0, 3.0, 0.0,
    1.0, -1.0, 2.0, 1.0, 3.0, 0.0, -1.0, 1.0, -2.0, -1.0, 2.0, 1.0, 1.0, -2.0, -1.0, 1.0, 2.0, 2.0,
    1.0, 0.0, 3.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 2.0, 0.0, 0.0,
];

/// Multipliers of l' (mean anomaly of the Sun).
pub const M_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -2.0, 0.0, 0.0, 1.0, 1.0, -1.0, 0.0, 0.0, 0.0, 2.0, 1.0, 2.0,
    -1.0, 0.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, -1.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, -1.0, -1.0, 0.0, 0.0, -1.0, 1.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 0.0, -1.0, 1.0, 0.0, 0.0, 0.0, 1.0,
];

/// Multipliers of F (mean argument of latitude of the Moon).
pub const F_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    0.0, 0.0, 2.0, -2.0, 2.0, 0.0, 2.0, -2.0, 2.0, 0.0, 2.0, 2.0, 2.0, 0.0, 2.0, 0.0, 0.0, 2.0,
    0.0, 0.0, 2.0, 0.0, 2.0, 0.0, 0.0, -2.0, -2.0, 0.0, 0.0, 2.0, 2.0, 0.0, 2.0, 2.0, 0.0, 2.0,
    0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 0.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0, 2.0, 0.0, 2.0, 2.0, 2.0, 0.0,
    2.0, 0.0, 2.0, 2.0, 0.0, 0.0, 2.0, 0.0, -2.0, 0.0, 0.0, 2.0, 2.0, 2.0, 0.0, 2.0, 2.0, 2.0, 2.0,
    0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 2.0, 2.0, 0.0, 2.0, 2.0, 2.0, 4.0, 0.0, 2.0, 2.0, 0.0, 4.0, 2.0,
    2.0, 2.0, 0.0, -2.0, 2.0, 0.0, -2.0, 2.0, 0.0, -2.0, 0.0, 2.0, 0.0,
];

/// Multipliers of D (mean elongation of the Moon from the Sun).
pub const D_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    0.0, 0.0, 0.0, 0.0, 0.0, -1.0, -2.0, 0.0, -2.0, 0.0, -2.0, -2.0, -2.0, -2.0, -2.0, 0.0, 0.0,
    -2.0, 0.0, 2.0, -2.0, -2.0, -2.0, -1.0, -2.0, 2.0, 2.0, 0.0, 1.0, -2.0, 0.0, 0.0, 0.0, 0.0,
    -2.0, 0.0, 2.0, 0.0, 0.0, 2.0, 0.0, 2.0, 0.0, -2.0, 0.0, 0.0, 0.0, 2.0, -2.0, 2.0, -2.0, 0.0,
    0.0, 2.0, 2.0, -2.0, 2.0, 2.0, -2.0, -2.0, 0.0, 0.0, -2.0, 0.0, 1.0, 0.0, 0.0, 0.0, 2.0, 0.0,
    0.0, 2.0, 0.0, -2.0, 0.0, 0.0, 0.0, 1.0, 0.0, -4.0, 2.0, 4.0, -4.0, -2.0, 2.0, 4.0, 0.0, -2.0,
    -2.0, 2.0, 2.0, -2.0, -2.0, -2.0, 0.0, 2.0, 0.0, -1.0, 2.0, -2.0, 0.0, -2.0, 2.0, 2.0, 4.0,
    1.0,
];

/// Multipliers of Omega (mean longitude of ascending node of the Moon).
pub const OMEGA_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    1.0, 2.0, 1.0, 0.0, 2.0, 0.0, 1.0, 1.0, 2.0, 0.0, 2.0, 2.0, 1.0, 0.0, 0.0, 0.0, 1.0, 2.0, 1.0,
    1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 2.0, 1.0, 0.0, 2.0, 0.0, 1.0, 2.0, 0.0, 2.0, 0.0, 1.0,
    1.0, 2.0, 1.0, 2.0, 0.0, 2.0, 2.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 2.0, 2.0, 2.0, 0.0, 2.0, 1.0,
    1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 1.0, 2.0, 2.0, 2.0, 1.0, 1.0, 2.0,
    0.0, 2.0, 2.0, 0.0, 2.0, 2.0, 0.0, 2.0, 1.0, 2.0, 2.0, 0.0, 1.0, 2.0, 1.0, 2.0, 2.0, 0.0, 1.0,
    1.0, 1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 2.0, 0.0,
];

/// Longitude nutation coefficients (units: 0.0001 arcsec).
pub const LONG_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    -171996.0, 2062.0, 46.0, 11.0, -3.0, -3.0, -2.0, 1.0, -13187.0, 1426.0, -517.0, 217.0, 129.0,
    48.0, -22.0, 17.0, -15.0, -16.0, -12.0, -6.0, -5.0, 4.0, 4.0, -4.0, 1.0, 1.0, -1.0, 1.0, 1.0,
    -1.0, -2274.0, 712.0, -386.0, -301.0, -158.0, 123.0, 63.0, 63.0, -58.0, -59.0, -51.0, -38.0,
    29.0, 29.0, -31.0, 26.0, 21.0, 16.0, -13.0, -10.0, -7.0, 7.0, -7.0, -8.0, 6.0, 6.0, -6.0, -7.0,
    6.0, -5.0, 5.0, -5.0, -4.0, 4.0, -4.0, -3.0, 3.0, -3.0, -3.0, -2.0, -3.0, -3.0, 2.0, -2.0, 2.0,
    -2.0, 2.0, 2.0, 1.0, -1.0, 1.0, -2.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, -1.0, 1.0,
    1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0,
];

/// Longitude nutation secular coefficients (units: 0.0001 arcsec / century).
pub const LONG_T_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    -174.2, 0.2, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -1.6, -3.4, 1.2, -0.5, 0.1, 0.0, 0.0, -0.1, 0.0,
    0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.2, 0.1, -0.4, 0.0, 0.0,
    0.0, 0.0, 0.1, -0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
];

/// Obliquity nutation coefficients (units: 0.0001 arcsec).
pub const OBLIQ_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    92025.0, -895.0, -24.0, 0.0, 1.0, 0.0, 1.0, 0.0, 5736.0, 54.0, 224.0, -95.0, -70.0, 1.0, 0.0,
    0.0, 9.0, 7.0, 6.0, 3.0, 3.0, -2.0, -2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 977.0, -7.0,
    200.0, 129.0, -1.0, -53.0, -2.0, -33.0, 32.0, 26.0, 27.0, 16.0, -1.0, -12.0, 13.0, -1.0, -10.0,
    -8.0, 7.0, 5.0, 0.0, -3.0, 3.0, 3.0, 0.0, -3.0, 3.0, 3.0, -3.0, 3.0, 0.0, 3.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 0.0, -1.0, -1.0, 0.0, -1.0, 1.0, 0.0,
    -1.0, 1.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0,
];

/// Obliquity nutation secular coefficients (units: 0.0001 arcsec / century).
pub const OBLIQ_T_COEFFS: [f64; NUM_NUTATION_COEFFS] = [
    8.9, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -3.1, -0.1, -0.6, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.5, 0.0, 0.0, -0.1, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
    0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
];