linear.cpp serif/solver/linear/linear.hpp algorithm cmath stdexcept serif/utils/error/errors.hpp serif serif::solver serif::solver::linear #include"serif/solver/linear/linear.hpp" #include<algorithm> #include<cmath> #include<stdexcept> #include"serif/utils/error/errors.hpp" namespaceserif::solver::linear{ voidControl::validate()const{ utils::errors::serif_ensure<utils::errors::SERiFErrorCode::SOLVER_ERROR, std::invalid_argument>( std::isfinite(relative_tolerance)&&relative_tolerance>=0.0&& std::isfinite(absolute_tolerance)&&absolute_tolerance>=0.0&&maximum_iterations>0, "Alinearsolveneedsfinitenonnegativetolerancesandapositiveiterationbudget;received{},{},and{}.", relative_tolerance,absolute_tolerance,maximum_iterations); } doubleControl::convergence_threshold(doubleright_hand_side_norm)const{ validate(); constdoublerelative_threshold=relative_tolerance*right_hand_side_norm; utils::errors::serif_ensure<utils::errors::SERiFErrorCode::SOLVER_ERROR, std::invalid_argument>( std::isfinite(right_hand_side_norm)&&right_hand_side_norm>=0.0&&std::isfinite(relative_threshold), "Alinearconvergencethresholdneedsafinitenonnegativeright-hand-sidenormandfiniteproductwiththerelativetolerance;received{}.", right_hand_side_norm); returnstd::max(absolute_tolerance,relative_threshold); } voidFGMRES::validate()const{ utils::errors::serif_ensure<utils::errors::SERiFErrorCode::SOLVER_ERROR, std::invalid_argument>( restart_length>0&&print_level>=-1&&print_level<=3, "FGMRESneedsapositiverestartlengthandprintlevelbetween-1and3;received{}and{}.",restart_length,print_level); } }