diff --git a/lib/algorithms/iterative/GeneralisedMinimalResidual.h b/lib/algorithms/iterative/GeneralisedMinimalResidual.h index d53d05db..da728619 100644 --- a/lib/algorithms/iterative/GeneralisedMinimalResidual.h +++ b/lib/algorithms/iterative/GeneralisedMinimalResidual.h @@ -2,11 +2,11 @@ Grid physics library, www.github.com/paboyle/Grid -Source file: lib/algorithms/iterative/GeneralisedMinimalResidual.h +Source file: ./lib/algorithms/iterative/GeneralisedMinimalResidual.h Copyright (C) 2015 -Copyright (C) 2016 +Author: Daniel Richtmann This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -58,6 +58,9 @@ class GeneralisedMinimalResidual : public OperatorFunction { Integer RestartLength; Integer IterationsToComplete; // Number of iterations the GMRES took to // finish. Filled in upon completion + GridStopWatch MatrixTimer; + GridStopWatch PrecTimer; + GridStopWatch LinalgTimer; GeneralisedMinimalResidual(RealD tol, Integer maxit, @@ -299,7 +302,7 @@ class GeneralisedMinimalResidual : public OperatorFunction { std::cout << GridLogIterative << "GeneralizedMinimalResidual: End of operator()" << std::endl; } - void alternativeOperatorImplementation()(LinearOperatorBase &LinOp, const Field &src, Field &psi) { + void alternativeOperatorImplementation(LinearOperatorBase &LinOp, const Field &src, Field &psi) { psi.checkerboard = src.checkerboard; psi(conformable, src); @@ -314,7 +317,7 @@ class GeneralisedMinimalResidual : public OperatorFunction { Field r(src._grid); PrecTimer.Reset(); - MatTimer.Reset(); + MatrixTimer.Reset(); LinalgTimer.Reset(); GridStopWatch SolverTimer; @@ -323,14 +326,14 @@ class GeneralisedMinimalResidual : public OperatorFunction { int iterations = 0; for (int k=0; k { std::cout << GridLogMessage << "GeneralizedMinimalResidual Time breakdown" << std::endl; std::cout << GridLogMessage << "\tElapsed " << SolverTimer.Elapsed() << std::endl; std::cout << GridLogMessage << "\tPrecon " << PrecTimer.Elapsed() << std::endl; - std::cout << GridLogMessage << "\tMatrix " << MatTimer.Elapsed() << std::endl; + std::cout << GridLogMessage << "\tMatrix " << MatrixTimer.Elapsed() << std::endl; std::cout << GridLogMessage << "\tLinalg " << LinalgTimer.Elapsed() << std::endl; return; } @@ -357,17 +360,21 @@ class GeneralisedMinimalResidual : public OperatorFunction { assert(0); } - RealD outerLoopBody(LinearOperatorBase &Linop, const Field &src, Field &psi, RealD rsd_sq) { + RealD outerLoopBody(LinearOperatorBase &LinOp, const Field &src, Field &psi, RealD rsd_sq) { + + RealD cp = 0; Field w(src._grid); Field r(src._grid); + auto whatDoWePutHere = 1; + std::vector v(whatDoWePutHere, src._grid); // in MG code: m + 1 std::vector> gamma(whatDoWePutHere, 0.); // in MG code: m + 1 MatrixTimer.Start(); - Linop.Op(psi, w); // w = D * psi + LinOp.Op(psi, w); // w = D * psi MatrixTimer.Stop(); LinalgTimer.Start(); @@ -380,7 +387,7 @@ class GeneralisedMinimalResidual : public OperatorFunction { for (int i=0; irestart_length - arnoldiStep(Linop, v, w, whatDoWePutHere); // in MG code: j + arnoldiStep(LinOp, v, w, whatDoWePutHere); // in MG code: j /////////////////////////////////////////////////////////////////////// // Begin of QR Update ///////////////////////////////////////////////// @@ -401,15 +408,15 @@ class GeneralisedMinimalResidual : public OperatorFunction { } } - void arnoldiStep(LinearOperatorBase &Linop, std::vector &v, Field &w, int iter) { + void arnoldiStep(LinearOperatorBase &LinOp, std::vector &v, Field &w, int iter) { MatrixTimer.Start(); - Linop.Op(v[iter], w); + LinOp.Op(v[iter], w); MatrixTimer.Stop(); LinalgTimer.Start(); for(int i = 0; i <= iter; ++i) { - H(i, j) = innerProduct(v[i], w); + H(i, iter) = innerProduct(v[i], w); w = w - H(i, iter) * v[i]; } @@ -608,16 +615,16 @@ class GeneralisedMinimalResidual : public OperatorFunction { std::vector const & v, Field & x, int j) { - for(auto i = j; i >= 0; i--) { + for(auto i = iter; i >= 0; i--) { y[i] = gamma[i]; - for(auto k = i + 1; k <= j; k++) + for(auto k = i + 1; k <= iter; k++) y[i] -= H(i, k) * y[k]; y[i] /= H(i, i); } /* if(true) // TODO ??? */ /* { */ - /* for(auto i = 0; i <= j; i++) */ + /* for(auto i = 0; i <= iter; i++) */ /* x = x + v[i] * y[i]; */ /* } else { */ x = y[0] * v[0];