pub mod backend;
#[derive(Clone, Debug)]
pub struct Pattern {
pub n: usize,
pub entries: Vec<(usize, usize)>,
}
#[derive(Debug, thiserror::Error)]
pub enum LinalgError {
#[error("singular matrix at row {row}")]
Singular { row: usize },
}
pub trait LinearSolver {
fn analyze(&mut self, pattern: &Pattern);
fn factor(&mut self, values: &[f64], diag_gmin: f64) -> Result<(), LinalgError>;
fn solve_in_place(&mut self, rhs: &mut [f64]) -> Result<(), LinalgError>;
fn factor_complex(&mut self, re: &[f64], im: &[f64]) -> Result<(), LinalgError>;
fn solve_complex_in_place(
&mut self,
rhs_re: &mut [f64],
rhs_im: &mut [f64],
) -> Result<(), LinalgError>;
fn solve_complex_transposed_in_place(
&mut self,
rhs_re: &mut [f64],
rhs_im: &mut [f64],
) -> Result<(), LinalgError>;
fn det_complex(&mut self, re: &[f64], im: &[f64]) -> (num_complex::Complex64, i32);
}
pub fn default_solver() -> Box<dyn LinearSolver> {
#[cfg(feature = "solver-xingo")]
{
Box::new(backend::xingo_sparse::XingoSparse::default())
}
#[cfg(all(feature = "solver-faer", not(feature = "solver-xingo")))]
{
Box::new(backend::faer_dense::FaerDense::default())
}
#[cfg(not(any(feature = "solver-faer", feature = "solver-xingo")))]
{
compile_error!(
"dune-core needs a linear solver backend (enable the `solver-faer` or the `solver-xingo` feature)"
);
}
}