52 lines
1.7 KiB
Rust
52 lines
1.7 KiB
Rust
//! Tests for the gravity models.
|
|
|
|
use apsis_sgp4::GravityModel;
|
|
|
|
#[test]
|
|
fn wgs72_defining_values_match_the_standard() {
|
|
assert_eq!(GravityModel::WGS72.mu, 398_600.8);
|
|
assert_eq!(GravityModel::WGS72.radius, 6_378.135);
|
|
assert_eq!(GravityModel::WGS72.j2, 0.001_082_616);
|
|
assert_eq!(GravityModel::WGS72.j3, -0.000_002_538_81);
|
|
assert_eq!(GravityModel::WGS72.j4, -0.000_001_655_97);
|
|
}
|
|
|
|
#[test]
|
|
fn wgs84_defining_values_match_the_standard() {
|
|
assert_eq!(GravityModel::WGS84.mu, 398_600.5);
|
|
assert_eq!(GravityModel::WGS84.radius, 6_378.137);
|
|
assert_eq!(GravityModel::WGS84.j2, 0.001_082_629_89);
|
|
}
|
|
|
|
#[test]
|
|
fn kepler_constant_matches_the_reference_value() {
|
|
// The reference implementation uses xke = 0.07436691613317342 for WGS
|
|
// 72, derived as 60 / sqrt(radius^3 / mu).
|
|
let xke = GravityModel::WGS72.xke();
|
|
assert!((xke - 0.074_366_916_133_173_42).abs() < 1e-15, "got {xke}");
|
|
}
|
|
|
|
#[test]
|
|
fn time_unit_is_the_reciprocal_of_the_kepler_constant() {
|
|
let model = GravityModel::WGS72;
|
|
assert!((model.tumin() * model.xke() - 1.0).abs() < 1e-15);
|
|
// The value is close to 13.44684 minutes for WGS 72.
|
|
assert!((model.tumin() - 13.446_839_696_959_309).abs() < 1e-12);
|
|
}
|
|
|
|
#[test]
|
|
fn j3_over_j2_matches_the_quotient() {
|
|
let model = GravityModel::WGS72;
|
|
let expected = model.j3 / model.j2;
|
|
assert!((model.j3_over_j2() - expected).abs() < 1e-18);
|
|
// The value is about -0.002345069720011528.
|
|
assert!((model.j3_over_j2() + 0.002_345_069_720_011_528).abs() < 1e-15);
|
|
}
|
|
|
|
#[test]
|
|
fn sqrt_and_reciprocal_sqrt_are_consistent() {
|
|
let model = GravityModel::WGS84;
|
|
assert!((model.sqrt_mu() * model.reciprocal_sqrt_mu() - 1.0).abs() < 1e-15);
|
|
assert!((model.sqrt_mu() - 398_600.5_f64.sqrt()).abs() < 1e-9);
|
|
}
|