russell_sparse 2.0.0

Solvers for large sparse linear systems (wraps MUMPS and UMFPACK)
Documentation
use russell_lab::*;
use russell_sparse::prelude::*;

#[test]
fn test_complex_coo_matrix() -> Result<(), StrError> {
    let mut coo = ComplexCooMatrix::new(3, 3, 4, Sym::YesLower)?;
    coo.put(0, 0, cpx!(1.0, 0.1))?;
    coo.put(1, 0, cpx!(2.0, 0.2))?;
    coo.put(1, 1, cpx!(3.0, 0.3))?;
    coo.put(2, 1, cpx!(4.0, 0.4))?;
    let mut a = ComplexMatrix::new(3, 3);
    coo.to_dense(&mut a).unwrap();
    let correct = "┌                      ┐\n\
                   │ 1+0.1i 2+0.2i   0+0i │\n\
                   │ 2+0.2i 3+0.3i 4+0.4i │\n\
                   │   0+0i 4+0.4i   0+0i │\n\
                   └                      ┘";
    assert_eq!(format!("{}", a), correct);

    let u = ComplexVector::from(&[cpx!(3.0, 0.0), cpx!(2.0, 2.0), cpx!(1.0, 0.0)]);
    let mut v = ComplexVector::new(3);
    coo.mat_vec_mul(&mut v, cpx!(1.0, 0.0), &u)?;
    complex_vec_approx_eq(&v, &[cpx!(6.6, 4.7), cpx!(15.4, 7.6), cpx!(7.2, 8.8)], 1e-15);

    coo.mat_vec_mul(&mut v, cpx!(1.0, 2.0), &u)?;
    complex_vec_approx_eq(&v, &[cpx!(-2.8, 17.9), cpx!(0.2, 38.4), cpx!(-10.4, 23.2)], 1e-14);
    Ok(())
}