use rmumps::coo::CooMatrix;
use rmumps::solver::{Solver, SolverOptions};
fn main() {
let n = 5;
let delta = 1e-8;
let mut rows = Vec::new();
let mut cols = Vec::new();
let mut vals = Vec::new();
for i in 0..3 {
rows.push(i);
cols.push(i);
vals.push(2.0);
}
for i in 3..5 {
rows.push(i);
cols.push(i);
vals.push(-delta);
}
rows.push(0);
cols.push(3);
vals.push(1.0);
rows.push(1);
cols.push(3);
vals.push(1.0);
rows.push(1);
cols.push(4);
vals.push(1.0);
rows.push(2);
cols.push(4);
vals.push(1.0);
let coo = CooMatrix::new(n, rows, cols, vals).unwrap();
let mut solver = Solver::new(SolverOptions::default());
let inertia = solver.analyze_and_factor(&coo).unwrap();
println!("Inertia: {}", inertia);
assert_eq!(inertia.positive, 3);
assert_eq!(inertia.negative, 2);
let rhs = vec![1.0, 2.0, 3.0, 0.0, 0.0]; let mut solution = vec![0.0; n];
solver.solve(&rhs, &mut solution).unwrap();
println!("dx = [{:.6}, {:.6}, {:.6}]", solution[0], solution[1], solution[2]);
println!("dy = [{:.6}, {:.6}]", solution[3], solution[4]);
let mut ax = vec![0.0; n];
coo.matvec(&solution, &mut ax).unwrap();
let residual: f64 = ax
.iter()
.zip(&rhs)
.map(|(a, b)| (a - b).abs())
.fold(0.0, f64::max);
println!("Max residual: {:.2e}", residual);
assert!(residual < 1e-6);
}