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§
fn as_any_mut(&mut self) -> &mut dyn Any
Sourcefn 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>
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§
Sourcefn setup_workspace(&mut self, _work: &mut Workspace)
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".