kryst 3.2.1

Krylov subspace and preconditioned iterative solvers for dense and sparse linear systems, with shared and distributed memory parallelism.
use crate::matrix::sparse::CsrMatrix;
use crate::solver::MonitorCallback;
use crate::parallel::UniverseComm;
use crate::solver::api::Solver as CanonicalSolver;
use crate::solver::legacy;
use crate::{error::KError, utils::convergence::SolveStats};

pub struct LegacyDirectAdapter<'a, S: CanonicalSolver<CsrMatrix<f64>, f64, Error = KError>> {
    inner: &'a mut S,
    comm: &'a UniverseComm,
}

impl<'a, S: CanonicalSolver<CsrMatrix<f64>, f64, Error = KError>> LegacyDirectAdapter<'a, S> {
    pub fn new(inner: &'a mut S, comm: &'a UniverseComm) -> Self {
        Self { inner, comm }
    }
}

impl<'a, S: CanonicalSolver<CsrMatrix<f64>, f64, Error = KError>>
    legacy::LinearSolver<CsrMatrix<f64>, Vec<f64>> for LegacyDirectAdapter<'a, S>
{
    type Error = KError;
    type Scalar = f64;

    fn solve(
        &mut self,
        a: &CsrMatrix<f64>,
        _pc: Option<
            &(dyn crate::preconditioner::legacy::Preconditioner<CsrMatrix<f64>, Vec<f64>> + '_),
        >,
        b: &Vec<f64>,
        x: &mut Vec<f64>,
        _pc_side: crate::preconditioner::PcSide,
        _comm: &UniverseComm,
        _monitors: Option<&[Box<MonitorCallback<Self::Scalar>>]>,
        _work: Option<&mut crate::context::ksp_context::Workspace>,
    ) -> Result<SolveStats<f64>, KError> {
        self.inner.setup(a, self.comm)?;
        self.inner.factor(a)?;
        self.inner.solve(b.as_slice(), x.as_mut_slice(), self.comm)
    }
}