mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-14 01:35:36 +00:00
d0e4673a3f
cut at Conjugate gradient. Also copied in Remez, Zolotarev, Chebyshev from Mike Clark, Tony Kennedy and my BFM package respectively since we know we will need these. I wanted the structure of algorithms/approx algorithms/iterative etc.. to start taking shape.
35 lines
1.1 KiB
C++
35 lines
1.1 KiB
C++
#ifndef GRID_NORMAL_EQUATIONS_H
|
|
#define GRID_NORMAL_EQUATIONS_H
|
|
|
|
namespace Grid {
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Take a matrix and form a Red Black solver calling a Herm solver
|
|
// Use of RB info prevents making SchurRedBlackSolve conform to standard interface
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
template<class Field> class NormalEquations : public OperatorFunction<Field>{
|
|
private:
|
|
SparseMatrixBase<Field> & _Matrix;
|
|
OperatorFunction<Field> & _HermitianSolver;
|
|
|
|
public:
|
|
|
|
/////////////////////////////////////////////////////
|
|
// Wrap the usual normal equations Schur trick
|
|
/////////////////////////////////////////////////////
|
|
NormalEquations(SparseMatrixBase<Field> &Matrix, OperatorFunction<Field> &HermitianSolver)
|
|
: _Matrix(Matrix), _HermitianSolver(HermitianSolver) {};
|
|
|
|
void operator() (const Field &in, Field &out){
|
|
|
|
Field src(in._grid);
|
|
|
|
_Matrix.Mdag(in,src);
|
|
_HermitianSolver(src,out); // Mdag M out = Mdag in
|
|
|
|
}
|
|
};
|
|
|
|
}
|
|
#endif
|