Skip to main content

LinearSolver

Trait LinearSolver 

Source
pub trait LinearSolver: Send + Any {
    type Error;

    // Required methods
    fn as_any_mut(&mut self) -> &mut dyn Any;
    fn solve(
        &mut self,
        a: &dyn LinOp<S = f64>,
        pc: Option<&mut dyn Preconditioner>,
        b: &[f64],
        x: &mut [f64],
        pc_side: PcSide,
        comm: &UniverseComm,
        monitors: Option<&[Box<MonitorCallback<f64>>]>,
        work: Option<&mut Workspace>,
    ) -> Result<SolveStats<f64>, Self::Error>;

    // Provided method
    fn setup_workspace(&mut self, _work: &mut Workspace) { ... }
}
Expand description

Object-safe linear solver operating on f64 slices and LinOp operators.

Required Associated Types§

Required Methods§

Source

fn as_any_mut(&mut self) -> &mut dyn Any

Source

fn solve( &mut self, a: &dyn LinOp<S = f64>, pc: Option<&mut dyn Preconditioner>, b: &[f64], x: &mut [f64], pc_side: PcSide, comm: &UniverseComm, monitors: Option<&[Box<MonitorCallback<f64>>]>, work: Option<&mut Workspace>, ) -> Result<SolveStats<f64>, Self::Error>

Solve a * x = b optionally using a preconditioner.

Provided Methods§

Source

fn setup_workspace(&mut self, _work: &mut Workspace)

Allow solver to configure workspace buffers.

Examples found in repository?
examples/complex_matrix_market_demo.rs (line 3015)
2999    fn solve_with_selected_ksp(
3000        spec: &RunSpec,
3001        bench_cfg: &BenchmarkConfig,
3002        problem: &Problem,
3003        op: &(dyn KLinOp<Scalar = S> + '_),
3004        mut pc: Option<&mut dyn KPreconditioner<Scalar = S>>,
3005        b: &[S],
3006        x: &mut [S],
3007        pc_side: PcSide,
3008        monitors: Option<&[Box<MonitorCallback<R>>]>,
3009        mut work: Option<&mut Workspace>,
3010    ) -> Result<kryst::utils::convergence::SolveStats<R>, KError> {
3011        match spec.ksp {
3012            KspKind::Gmres => {
3013                let mut solver = configured_gmres_solver(spec, bench_cfg);
3014                if let Some(w) = work.as_deref_mut() {
3015                    solver.setup_workspace(w);
3016                }
3017                let pc_ref = pc
3018                    .as_deref_mut()
3019                    .map(|p| p as &dyn KPreconditioner<Scalar = S>);
3020                solver.solve(op, pc_ref, b, x, pc_side, &problem.comm, monitors, work)
3021            }
3022            KspKind::Fgmres => {
3023                let mut solver = configured_fgmres_solver(spec, bench_cfg);
3024                if bench_cfg.dist_policy == DistPolicyMode::Auto {
3025                    apply_fgmres_dist_plan_policy(&mut solver, problem);
3026                }
3027                if let Some(w) = work.as_deref_mut() {
3028                    solver.setup_workspace(w);
3029                }
3030                solver.solve_k(op, pc, b, x, pc_side, &problem.comm, monitors, work)
3031            }
3032        }
3033    }

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§

Source§

impl LinearSolver for BiCgStabSolver

Source§

impl LinearSolver for BlockBicgstabSolver

Source§

impl LinearSolver for BlockGmresSolver

Source§

impl LinearSolver for CgSolver

Source§

impl LinearSolver for CgnrSolver

Source§

impl LinearSolver for CgsSolver

Source§

impl LinearSolver for ChebyshevSolver

Source§

impl LinearSolver for CrSolver

Source§

impl LinearSolver for FgmresSolver

Source§

impl LinearSolver for GcrSolver

Source§

impl LinearSolver for GmresSolver

Source§

impl LinearSolver for IdrsSolver

Source§

impl LinearSolver for LsmrSolver

Source§

impl LinearSolver for LsqrSolver

Source§

impl LinearSolver for MinresSolver

Source§

impl LinearSolver for PcaGmresSolver

Source§

impl LinearSolver for PcgSolver

Source§

impl LinearSolver for PipeGcrSolver

Source§

impl LinearSolver for QmrSolver

Source§

impl LinearSolver for RichardsonSolver

Source§

impl LinearSolver for TcqmrSolver

Source§

impl LinearSolver for TfqmrSolver