use crate::algebra::bridge::BridgeScratch;
use crate::algebra::prelude::*;
use crate::error::KError;
use crate::preconditioner::PcSide;
#[cfg(not(feature = "complex"))]
use crate::preconditioner::Preconditioner as PreconditionerF64;
pub trait KPreconditioner: Send {
type Scalar: KrystScalar;
fn dims(&self) -> (usize, usize);
fn apply_s(
&self,
side: PcSide,
x: &[Self::Scalar],
y: &mut [Self::Scalar],
scratch: &mut BridgeScratch,
) -> Result<(), KError>;
fn apply_mut_s(
&mut self,
side: PcSide,
x: &[Self::Scalar],
y: &mut [Self::Scalar],
scratch: &mut BridgeScratch,
) -> Result<(), KError> {
self.apply_s(side, x, y, scratch)
}
#[allow(unused_variables)]
fn on_restart_s(
&mut self,
outer_iter: usize,
residual_norm: <Self::Scalar as KrystScalar>::Real,
) -> Result<(), KError> {
let _ = (outer_iter, residual_norm);
Ok(())
}
}
#[cfg(not(feature = "complex"))]
impl<T> KPreconditioner for T
where
T: PreconditionerF64 + Send + Sync,
{
type Scalar = f64;
#[inline]
fn dims(&self) -> (usize, usize) {
<T as PreconditionerF64>::dims(self)
}
#[inline]
fn apply_s(
&self,
side: PcSide,
x: &[f64],
y: &mut [f64],
_scratch: &mut BridgeScratch,
) -> Result<(), KError> {
<T as PreconditionerF64>::apply(self, side, x, y)
}
#[inline]
fn apply_mut_s(
&mut self,
side: PcSide,
x: &[f64],
y: &mut [f64],
_scratch: &mut BridgeScratch,
) -> Result<(), KError> {
<T as PreconditionerF64>::apply_mut(self, side, x, y)
}
#[inline]
fn on_restart_s(
&mut self,
outer_iter: usize,
residual_norm: <Self::Scalar as KrystScalar>::Real,
) -> Result<(), KError> {
<T as PreconditionerF64>::on_restart(self, outer_iter, residual_norm)
}
}