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::context::ksp_context::Workspace;
use crate::error::KError;
use crate::parallel::{NoComm, UniverseComm};
use crate::preconditioner::PcSide;
use crate::solver::gmres::{AugmentationPolicy, GmresSolver};

use super::util;

#[test]
fn gmres_configures_recycling_workspace() -> Result<(), KError> {
    let mut solver = GmresSolver::new(12, 1e-8, 200);
    solver.augmentation = AugmentationPolicy::GmresDR { k: 6 };
    let a = util::spd_poisson2d(8);
    let b = util::rhs_random(a.nrows(), 11);
    let mut x: Vec<R> = vec![R::default(); a.nrows()];
    let mut ws = Workspace::default();
    let comm = UniverseComm::NoComm(NoComm);
    let _ = solver.solve_f64(
        &a,
        None,
        &b,
        &mut x,
        PcSide::Left,
        &comm,
        None,
        Some(&mut ws),
    )?;

    assert_eq!(ws.gmres_recycle.capacity(), 6);
    assert!(matches!(
        ws.gmres_recycle.policy(),
        AugmentationPolicy::GmresDR { k } if k == 6
    ));
    Ok(())
}