#![cfg(not(feature = "complex"))]
use kryst::algebra::prelude::*;
use kryst::utils::convergence::{ConvergedReason, Convergence};
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_convergence_rtol() {
let conv = Convergence::new(R::from(1e-6), R::from(1e-12), R::from(1e3), 100);
let bnorm = R::from(1.0);
let rnorm = R::from(1e-7);
let (reason, stats) = conv.check(rnorm, bnorm, 5);
assert_eq!(reason, ConvergedReason::ConvergedRtol);
assert_eq!(stats.reason, ConvergedReason::ConvergedRtol);
assert_eq!(stats.iterations, 5);
assert_eq!(stats.final_residual, rnorm);
}
#[test]
fn test_convergence_atol() {
let conv = Convergence::new(R::from(1e-6), R::from(1e-8), R::from(1e3), 100);
let bnorm = R::from(1.0);
let rnorm = R::from(1e-9);
let (reason, stats) = conv.check(rnorm, bnorm, 3);
assert_eq!(reason, ConvergedReason::ConvergedAtol);
assert_eq!(stats.reason, ConvergedReason::ConvergedAtol);
assert_eq!(stats.iterations, 3);
assert_eq!(stats.final_residual, rnorm);
}
#[test]
fn test_divergence_dtol() {
let conv = Convergence::new(R::from(1e-6), R::from(1e-12), R::from(1e2), 100);
let bnorm = R::from(1.0);
let rnorm = R::from(150.0);
let (reason, stats) = conv.check(rnorm, bnorm, 10);
assert_eq!(reason, ConvergedReason::DivergedDtol);
assert_eq!(stats.reason, ConvergedReason::DivergedDtol);
assert_eq!(stats.iterations, 10);
assert_eq!(stats.final_residual, rnorm);
}
#[test]
fn test_divergence_max_iters() {
let conv = Convergence::new(R::from(1e-6), R::from(1e-12), R::from(1e3), 50);
let bnorm = R::from(1.0);
let rnorm = R::from(0.1);
let (reason, stats) = conv.check(rnorm, bnorm, 50);
assert_eq!(reason, ConvergedReason::DivergedMaxIts);
assert_eq!(stats.reason, ConvergedReason::DivergedMaxIts);
assert_eq!(stats.iterations, 50);
assert_eq!(stats.final_residual, rnorm);
}
#[test]
fn test_continued() {
let conv = Convergence::new(R::from(1e-6), R::from(1e-12), R::from(1e3), 100);
let bnorm = R::from(1.0);
let rnorm = R::from(1e-3);
let (reason, stats) = conv.check(rnorm, bnorm, 10);
assert_eq!(reason, ConvergedReason::Continued);
assert_eq!(stats.reason, ConvergedReason::Continued);
assert_eq!(stats.iterations, 10);
assert_eq!(stats.final_residual, rnorm);
}
#[test]
fn test_convergence_order_atol_first() {
let conv = Convergence::new(R::from(1e-3), R::from(1e-6), R::from(1e3), 100);
let bnorm = R::from(1.0);
let rnorm = R::from(1e-7);
let (reason, _) = conv.check(rnorm, bnorm, 5);
assert_eq!(reason, ConvergedReason::ConvergedAtol);
}
#[test]
fn test_multiple_threshold_precedence() {
let conv = Convergence::new(R::from(1e-3), R::from(1e-4), R::from(1e2), 10);
let (reason, _) = conv.check(R::from(1e-5), R::from(1.0), 5);
assert_eq!(reason, ConvergedReason::ConvergedAtol);
let (reason, _) = conv.check(R::from(5e-4), R::from(1.0), 5); assert_eq!(reason, ConvergedReason::ConvergedRtol);
let (reason, _) = conv.check(R::from(200.0), R::from(1.0), 5);
assert_eq!(reason, ConvergedReason::DivergedDtol);
let (reason, _) = conv.check(R::from(0.1), R::from(1.0), 10);
assert_eq!(reason, ConvergedReason::DivergedMaxIts);
}
}