29#ifndef GRID_COMMUNICATION_AVOIDING_GENERALISED_MINIMAL_RESIDUAL_H
30#define GRID_COMMUNICATION_AVOIDING_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 std::cout <<
GridLogWarning <<
"This algorithm currently doesn't differ from regular GMRES" << std::endl;
81 psi.Checkerboard() = src.Checkerboard();
85 assert(std::isnan(guess) == 0);
93 std::cout << std::setprecision(4) << std::scientific;
94 std::cout <<
GridLogIterative <<
"CommunicationAvoidingGeneralisedMinimalResidual: guess " << guess << std::endl;
95 std::cout <<
GridLogIterative <<
"CommunicationAvoidingGeneralisedMinimalResidual: src " << ssq << std::endl;
121 RealD true_residual = resnorm / srcnorm;
124 <<
" computed residual " <<
sqrt(cp / ssq)
125 <<
" true residual " << true_residual
137 std::cout <<
GridLogMessage <<
"CommunicationAvoidingGeneralisedMinimalResidual did NOT converge" << std::endl;
151 std::vector<Field> v(
RestartLength + 1, src.Grid());
for (
auto &elem : v) elem =
Zero();
175 cp = norm(
gamma[i+1]);
178 <<
" residual " << cp <<
" target " << rsq << std::endl;
195 LinOp.
Op(v[iter], w);
199 for (
int i = 0; i <= iter; ++i) {
205 v[iter + 1] =
ComplexD(1. /
H(iter, iter + 1)) * w;
212 for (
int i = 0; i < iter ; ++i) {
215 H(iter, i + 1) = tmp;
219 auto nu =
sqrt(std::norm(
H(iter, iter)) + std::norm(
H(iter, iter + 1)));
220 c[iter] =
H(iter, iter) / nu;
221 s[iter] =
H(iter, iter + 1) / nu;
225 H(iter, iter + 1) = 0.;
235 for (
int i = iter; i >= 0; i--) {
237 for (
int k = i + 1; k <= iter; k++)
242 for (
int i = 0; i <= iter; i++)
243 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")
GridLogger GridLogWarning(1, "Warning", GridLogColours, "YELLOW")
std::complex< RealD > ComplexD
GridTime Elapsed(void) const
void arnoldiStep(LinearOperatorBase< Field > &LinOp, std::vector< Field > &v, Field &w, int iter)
std::vector< ComplexD > c
RealD outerLoopBody(LinearOperatorBase< Field > &LinOp, const Field &src, Field &psi, RealD rsq)
GridStopWatch CompSolutionTimer
GridStopWatch LinalgTimer
void computeSolution(std::vector< Field > const &v, Field &psi, int iter)
GridStopWatch MatrixTimer
std::vector< ComplexD > gamma
std::vector< ComplexD > y
Integer MaxNumberOfRestarts
void operator()(LinearOperatorBase< Field > &LinOp, const Field &src, Field &psi)
std::vector< ComplexD > s
CommunicationAvoidingGeneralisedMinimalResidual(RealD tol, Integer maxit, Integer restart_length, bool err_on_no_conv=true)
virtual void Op(const Field &in, Field &out)=0