kryst 3.2.1

Krylov subspace and preconditioned iterative solvers for dense and sparse linear systems, with shared and distributed memory parallelism.
//! Block Krylov solver infrastructure.

#[allow(unused_imports)]
use crate::algebra::blas::{dot_conj, nrm2};
#[allow(unused_imports)]
use crate::algebra::prelude::*;
use crate::context::ksp_context::ReorthPolicy;

#[cfg(feature = "backend-faer")]
pub mod arnoldi;
pub mod bicgstab;
pub mod block_vec;
pub mod gmres;
#[cfg(feature = "backend-faer")]
pub mod kernels;

#[cfg(feature = "backend-faer")]
pub use arnoldi::{ArnoldiOutput, block_arnoldi_step};

/// Configuration options shared across block Krylov solvers.
#[derive(Clone, Debug, PartialEq)]
pub struct BlockKrylovOptions {
    /// Number of right-hand sides processed together.
    pub block_size: usize,
    /// Number of block Arnoldi steps between restarts.
    pub restart_blocks: usize,
    /// Reorthogonalisation policy for the block Arnoldi process.
    pub reorth: ReorthPolicy,
    /// Conditioning guard for the Cholesky/QR factorisations.
    pub max_cond: f64,
    /// Relative tolerance.
    pub rtol: R,
    /// Absolute tolerance.
    pub atol: R,
    /// Divergence tolerance.
    pub dtol: R,
    /// Maximum number of block iterations.
    pub max_iters: usize,
    /// Selected solver variant.
    pub variant: BlockVariant,
}

impl Default for BlockKrylovOptions {
    fn default() -> Self {
        Self {
            block_size: 1,
            restart_blocks: 10,
            reorth: ReorthPolicy::IfNeeded,
            max_cond: 1.0e8,
            rtol: 1.0e-8,
            atol: 1.0e-12,
            dtol: 1.0e3,
            max_iters: 200,
            variant: BlockVariant::Gmres,
        }
    }
}

/// Supported block Krylov variants.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BlockVariant {
    Gmres,
    FgmresRight,
    Bicgstab,
}

pub use block_vec::BlockVec;