#[test]
#[ignore] fn nfw_equilibrium() {
use crate::tooling::core::init::{
domain::{Domain, SpatialBoundType, VelocityBoundType},
isolated::{NfwIC, sample_on_grid},
};
use crate::tooling::core::phasespace::PhaseSpaceRepr as _;
use crate::tooling::validation::helpers::{
assert_valid_output, build_standard_sim, density_mass, relative_drift, snapshot_density,
};
let domain = Domain::builder()
.spatial_extent(6.0) .velocity_extent(3.0) .spatial_resolution(8)
.velocity_resolution(8)
.t_final(5.0) .spatial_bc(SpatialBoundType::Periodic) .velocity_bc(VelocityBoundType::Truncated)
.build()
.unwrap();
let ic = NfwIC::new(1.0, 1.0, 5.0, 1.0); let snap = sample_on_grid(&ic, &domain);
let initial_density = snapshot_density(&snap, &domain);
let rho_max_init = initial_density.data.iter().cloned().fold(0.0f64, f64::max);
let mut sim = build_standard_sim(domain, snap, 5.0);
let pkg = sim.run().unwrap();
let final_density = sim.repr.compute_density();
let rho_max_final = final_density.data.iter().cloned().fold(0.0f64, f64::max);
assert!(rho_max_final > 0.0, "Final density should be positive");
let dx = sim.domain.dx();
let m_init = density_mass(&initial_density, dx);
let m_final = density_mass(&final_density, dx);
let mass_drift = relative_drift(m_final, m_init);
assert!(m_final > 0.0, "Final mass should be positive");
assert_valid_output(&final_density, pkg.diagnostics_history.len());
println!(
"NFW equilibrium: rho_max init={:.4}, final={:.4}, mass_drift={:.2}%, steps={}",
rho_max_init,
rho_max_final,
mass_drift * 100.0,
pkg.total_steps
);
}