use glam::{DMat3, DVec3};
#[derive(Debug, Clone)]
pub struct GravityTestCase {
pub case_num: usize,
pub degree: usize,
pub order: usize,
pub perturb_only: bool,
pub grad_active: bool,
pub position: DVec3,
pub potential: f64,
pub acceleration: DVec3,
pub gradient: DMat3,
}
pub fn load_gravity_test_cases() -> Vec<GravityTestCase> {
let path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("test_data/gravity/grav_geospherical_verif_out.txt");
let content = std::fs::read_to_string(&path).unwrap_or_else(|e| {
panic!(
"Cannot read {}: {e}. Regenerate with: cargo run -p astrodyn_verif_jeod \
--bin extract_jeod_validation",
path.display(),
)
});
parse_gravity_test_cases_text(&content)
}
pub fn parse_gravity_test_cases_text(content: &str) -> Vec<GravityTestCase> {
let mut cases = Vec::new();
for line in content.lines() {
let line = line.trim();
if line.is_empty() {
continue;
}
let fields: Vec<&str> = line.split_whitespace().collect();
if fields.len() < 18 {
continue;
}
let parse_f64 = |s: &str| -> f64 { s.parse().unwrap() };
let parse_usize = |s: &str| -> usize { s.parse().unwrap() };
let g00 = parse_f64(fields[12]);
let g01 = parse_f64(fields[13]);
let g02 = parse_f64(fields[14]);
let g11 = parse_f64(fields[15]);
let g12 = parse_f64(fields[16]);
let g22 = parse_f64(fields[17]);
cases.push(GravityTestCase {
case_num: parse_usize(fields[0]),
degree: parse_usize(fields[1]),
order: parse_usize(fields[2]),
perturb_only: fields[3] == "1",
grad_active: fields[4] == "1",
position: DVec3::new(
parse_f64(fields[5]),
parse_f64(fields[6]),
parse_f64(fields[7]),
),
potential: parse_f64(fields[8]),
acceleration: DVec3::new(
parse_f64(fields[9]),
parse_f64(fields[10]),
parse_f64(fields[11]),
),
gradient: DMat3::from_cols(
DVec3::new(g00, g01, g02), DVec3::new(g01, g11, g12), DVec3::new(g02, g12, g22), ),
});
}
cases
}