kryst 3.2.1

Krylov subspace and preconditioned iterative solvers for dense and sparse linear systems, with shared and distributed memory parallelism.
use crate::algebra::prelude::*;
use crate::matrix::sparse::CsrMatrix;
use crate::preconditioner::amg::prolong::{TentativeP, smooth_tentative_sa_multi};

use crate::assert_s_close;

#[test]
fn nns_tentative_reproduces_basis() {
    let n = 4;
    let a = CsrMatrix::identity(n);
    let one = S::from_real(1.0).real();
    let zero = R::default();
    let d_inv = vec![one; n];
    let agg = vec![0, 0, 1, 1];
    let t0 = vec![one; n];
    let t1 = vec![zero, one, zero, one];
    let tp = TentativeP {
        agg_of: agg.clone(),
        n_coarse: 2,
        num_functions: 2,
        nns: Some(vec![t0.clone(), t1.clone()]),
        comp_of: None,
    };
    let p = smooth_tentative_sa_multi(&a, &d_inv, &tp, zero, zero, 0, zero);
    assert_eq!(p.n, 4);
    for i in 0..n {
        let g = agg[i];
        let rs = p.row_ptr[i];
        let re = p.row_ptr[i + 1];
        for alpha in 0..2 {
            let col = g * 2 + alpha;
            let mut found = false;
            for k in rs..re {
                if p.col_idx[k] == col {
                    let expected = if alpha == 0 { t0[i] } else { t1[i] };
                    assert_s_close!(
                        "tentative prolongator entry",
                        S::from_real(p.vals[k]),
                        S::from_real(expected)
                    );
                    found = true;
                }
            }
            assert!(found);
        }
    }
}