25template<
typename T>
requires requires(
const T& a,
const mat& b) { { a * b } -> std::same_as<mat>; a.n_rows; }
int fgmres_solve(
const T& kernel,
const vec& diagonal,
double* left,
double* right,
const double tolerance) {
26 const auto N =
static_cast<MKL_INT
>(kernel.n_rows);
28 const auto R = std::min(
static_cast<MKL_INT
>(150),
N);
30 std::vector work((2 * R + 1) *
N + R * (R + 9) / 2 + 1, 0.);
37 dfgmres_init(&
N,
nullptr,
nullptr, &info, ipar, dpar, work.data());
46 dfgmres(&
N, left, right, &info, ipar, dpar, work.data());
47 if(-1 == info || -10 == info || -11 == info || -12 == info) {
51 if(0 == info || 4 == info && dpar[6] <= dpar[0]) {
53 dfgmres_get(&
N, left, right, &info, ipar, dpar, work.data(), &counter);
57 const vec xn(&work[ipar[21] - 1],
N);
60 vec yn(&work[ipar[22] - 1],
N,
false,
true);
62 if(1 == info) yn = kernel * xn;
64 else if(3 == info) yn = xn / diagonal;
int fgmres_solve(const T &kernel, const vec &diagonal, double *left, double *right, const double tolerance)
Definition fgmres.hpp:25