mod block;
mod diagonal;
mod schur;
use super::col::copy_col;
use faer::Col;
use faer::Par;
use faer::dyn_stack::{MemBuffer, MemStack};
use faer_traits::ComplexField;
pub use block::{
BlockDiagonalPrecond2, BlockPrecondError, BlockSplit2, BlockUpperTriangularPrecond2,
};
pub use diagonal::{DiagonalPrecond, DiagonalPrecondError};
pub use faer::matrix_free::{BiPrecond, IdentityPrecond, Precond};
pub use schur::SchurPrecond2;
#[inline]
pub(crate) fn precond_buffer<T, P>(precond: &P) -> MemBuffer
where
T: ComplexField,
P: Precond<T>,
{
MemBuffer::new(precond.apply_in_place_scratch(1, Par::Seq))
}
#[inline]
pub(crate) fn apply_precond_to_col<T, P>(
precond: &P,
out: &mut Col<T>,
rhs: &Col<T>,
buffer: &mut MemBuffer,
) where
T: ComplexField + Copy,
P: Precond<T>,
{
copy_col(out, rhs);
let stack = MemStack::new(buffer);
precond.apply_in_place(out.as_mat_mut(), Par::Seq, stack);
}