29#ifndef GRID_GENERALISED_MINIMAL_RESIDUAL_H
30#define GRID_GENERALISED_MINIMAL_RESIDUAL_H
57 std::vector<ComplexD>
y;
59 std::vector<ComplexD>
c;
60 std::vector<ComplexD>
s;
65 bool err_on_no_conv =
true)
79 psi.Checkerboard() = src.Checkerboard();
83 assert(std::isnan(guess) == 0);
91 std::cout << std::setprecision(4) << std::scientific;
92 std::cout <<
GridLogIterative <<
"GeneralisedMinimalResidual: guess " << guess << std::endl;
93 std::cout <<
GridLogIterative <<
"GeneralisedMinimalResidual: src " << ssq << std::endl;
119 RealD true_residual = resnorm / srcnorm;
122 <<
" computed residual " <<
sqrt(cp / ssq)
123 <<
" true residual " << true_residual
135 std::cout <<
GridLogMessage <<
"GeneralisedMinimalResidual did NOT converge" << std::endl;
149 std::vector<Field> v(
RestartLength + 1, src.Grid());
for (
auto &elem : v) elem =
Zero();
160 v[0] = (1. /
gamma[0]) * r;
171 cp = norm(
gamma[i+1]);
174 <<
" residual " << cp <<
" target " << rsq << std::endl;
191 LinOp.
Op(v[iter], w);
195 for (
int i = 0; i <= iter; ++i) {
201 v[iter + 1] =
ComplexD(1. /
H(iter, iter + 1)) * w;
208 for (
int i = 0; i < iter ; ++i) {
211 H(iter, i + 1) = tmp;
215 auto nu =
sqrt(std::norm(
H(iter, iter)) + std::norm(
H(iter, iter + 1)));
216 c[iter] =
H(iter, iter) / nu;
217 s[iter] =
H(iter, iter + 1) / nu;
221 H(iter, iter + 1) = 0.;
231 for (
int i = iter; i >= 0; i--) {
233 for (
int k = i + 1; k <= iter; k++)
238 for (
int i = 0; i <= iter; i++)
239 psi = psi + v[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 > gamma
GridStopWatch LinalgTimer
std::vector< ComplexD > c
GridStopWatch MatrixTimer
GeneralisedMinimalResidual(RealD tol, Integer maxit, Integer restart_length, bool err_on_no_conv=true)
void arnoldiStep(LinearOperatorBase< Field > &LinOp, std::vector< Field > &v, Field &w, int iter)
void operator()(LinearOperatorBase< Field > &LinOp, const Field &src, Field &psi)
RealD outerLoopBody(LinearOperatorBase< Field > &LinOp, const Field &src, Field &psi, RealD rsq)
void computeSolution(std::vector< Field > const &v, Field &psi, int iter)
Integer MaxNumberOfRestarts
std::vector< ComplexD > y
std::vector< ComplexD > s
GridStopWatch CompSolutionTimer
virtual void Op(const Field &in, Field &out)=0