29#ifndef GRID_FLEXIBLE_GENERALISED_MINIMAL_RESIDUAL_H
30#define GRID_FLEXIBLE_GENERALISED_MINIMAL_RESIDUAL_H
58 std::vector<ComplexD>
y;
60 std::vector<ComplexD>
c;
61 std::vector<ComplexD>
s;
69 bool err_on_no_conv =
true)
84 psi.Checkerboard() = src.Checkerboard();
88 assert(std::isnan(guess) == 0);
96 std::cout << std::setprecision(4) << std::scientific;
97 std::cout <<
GridLogIterative <<
"FlexibleGeneralisedMinimalResidual: guess " << guess << std::endl;
98 std::cout <<
GridLogIterative <<
"FlexibleGeneralisedMinimalResidual: src " << ssq << std::endl;
125 RealD true_residual = resnorm / srcnorm;
128 <<
" computed residual " <<
sqrt(cp / ssq)
129 <<
" true residual " << true_residual
142 std::cout <<
GridLogMessage <<
"FlexibleGeneralisedMinimalResidual did NOT converge" << std::endl;
156 std::vector<Field> v(
RestartLength + 1, src.Grid());
for (
auto &elem : v) elem =
Zero();
157 std::vector<Field> z(
RestartLength + 1, src.Grid());
for (
auto &elem : z) elem =
Zero();
168 v[0] = (1. /
gamma[0]) * r;
179 cp = norm(
gamma[i+1]);
182 <<
" residual " << cp <<
" target " << rsq << std::endl;
203 LinOp.
Op(z[iter], w);
207 for (
int i = 0; i <= iter; ++i) {
213 v[iter + 1] =
ComplexD(1. /
H(iter, iter + 1)) * w;
220 for (
int i = 0; i < iter ; ++i) {
223 H(iter, i + 1) = tmp;
227 auto nu =
sqrt(std::norm(
H(iter, iter)) + std::norm(
H(iter, iter + 1)));
228 c[iter] =
H(iter, iter) / nu;
229 s[iter] =
H(iter, iter + 1) / nu;
233 H(iter, iter + 1) = 0.;
243 for (
int i = iter; i >= 0; i--) {
245 for (
int k = i + 1; k <= iter; k++)
250 for (
int i = 0; i <= iter; i++)
251 psi = psi + z[i] *
y[i];
accelerator_inline Grid_simd< S, V > sqrt(const Grid_simd< S, V > &r)
void axpy(Lattice< vobj > &ret, sobj a, const Lattice< vobj > &x, const Lattice< vobj > &y)
Lattice< vobj > conjugate(const Lattice< vobj > &lhs)
ComplexD innerProduct(const Lattice< vobj > &left, const Lattice< vobj > &right)
RealD norm2(const Lattice< vobj > &arg)
GridLogger GridLogIterative(1, "Iterative", GridLogColours, "BLUE")
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
std::complex< RealD > ComplexD
GridTime Elapsed(void) const
std::vector< ComplexD > c
std::vector< ComplexD > gamma
GridStopWatch MatrixTimer
void operator()(LinearOperatorBase< Field > &LinOp, const Field &src, Field &psi)
Integer MaxNumberOfRestarts
LinearFunction< Field > & Preconditioner
std::vector< ComplexD > s
void computeSolution(std::vector< Field > const &z, Field &psi, int iter)
FlexibleGeneralisedMinimalResidual(RealD tol, Integer maxit, LinearFunction< Field > &Prec, Integer restart_length, bool err_on_no_conv=true)
void arnoldiStep(LinearOperatorBase< Field > &LinOp, std::vector< Field > &v, std::vector< Field > &z, Field &w, int iter)
std::vector< ComplexD > y
GridStopWatch LinalgTimer
GridStopWatch CompSolutionTimer
RealD outerLoopBody(LinearOperatorBase< Field > &LinOp, const Field &src, Field &psi, RealD rsq)
virtual void Op(const Field &in, Field &out)=0