From afa458c81247fb7148d7d77af7f8f4dce92c3df3 Mon Sep 17 00:00:00 2001 From: Peter Boyle Date: Fri, 10 Apr 2020 11:08:19 -0400 Subject: [PATCH] Extra solvers --- Grid/algorithms/iterative/NormalEquations.h | 48 +++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Grid/algorithms/iterative/NormalEquations.h b/Grid/algorithms/iterative/NormalEquations.h index df82b6dc..c9c92777 100644 --- a/Grid/algorithms/iterative/NormalEquations.h +++ b/Grid/algorithms/iterative/NormalEquations.h @@ -60,5 +60,53 @@ public: } }; +template class HPDSolver { +private: + LinearOperatorBase & _Matrix; + OperatorFunction & _HermitianSolver; + LinearFunction & _Guess; +public: + + ///////////////////////////////////////////////////// + // Wrap the usual normal equations trick + ///////////////////////////////////////////////////// + HPDSolver(LinearOperatorBase &Matrix, + OperatorFunction &HermitianSolver, + LinearFunction &Guess) + : _Matrix(Matrix), _HermitianSolver(HermitianSolver), _Guess(Guess) {}; + + void operator() (const Field &in, Field &out){ + + _Guess(in,out); + _HermitianSolver(_Matrix,in,out); // Mdag M out = Mdag in + + } +}; + + +template class MdagMSolver { +private: + SparseMatrixBase & _Matrix; + OperatorFunction & _HermitianSolver; + LinearFunction & _Guess; +public: + + ///////////////////////////////////////////////////// + // Wrap the usual normal equations trick + ///////////////////////////////////////////////////// + MdagMSolver(SparseMatrixBase &Matrix, OperatorFunction &HermitianSolver, + LinearFunction &Guess) + : _Matrix(Matrix), _HermitianSolver(HermitianSolver), _Guess(Guess) {}; + + void operator() (const Field &in, Field &out){ + + MdagMLinearOperator,Field> MdagMOp(_Matrix); + _Guess(in,out); + + _HermitianSolver(MdagMOp,in,out); // Mdag M out = Mdag in + + } +}; + NAMESPACE_END(Grid); #endif