28#ifndef GRID_SCHUR_RED_BLACK_H
29#define GRID_SCHUR_RED_BLACK_H
106 const bool _solnAsInitGuess =
false) :
127 (*this)(_Matrix,in,out,guess);
132 (*this)(_Matrix,in,out,guess);
139 int nblock = in.size();
140 for(
int b=0;b<nblock;b++){
149 void RedBlackSolution(
Matrix &_Matrix,
const std::vector<Field> &in,
const std::vector<Field> &sol_o, std::vector<Field> &out)
153 int nblock = in.size();
154 for(
int b=0;b<nblock;b++) {
160 template<
class Guesser>
161 void operator()(
Matrix &_Matrix,
const std::vector<Field> &in, std::vector<Field> &out,Guesser &guess)
165 int nblock = in.size();
167 std::vector<Field> src_o(nblock,grid);
168 std::vector<Field> sol_o(nblock,grid);
170 std::vector<Field> guess_save;
186 if (
subGuess ) guess_save.resize(nblock,grid);
190 for(
int b=0;b<nblock;b++){
198 for(
int b=0;b<nblock;b++){
199 guess_save[b] = sol_o[b];
205 std::cout<<
GridLogMessage <<
"SchurRedBlackBase calling the solver for "<<nblock<<
" RHS" <<std::endl;
211 for(
int b=0;b<nblock;b++) {
213 if (
subGuess) sol_o[b] = sol_o[b] - guess_save[b];
223 _Matrix.
M(out[b],resid);
228 std::cout<<
GridLogMessage<<
"SchurRedBlackBase solver true unprec resid["<<b<<
"] "<<std::sqrt(nr/ns) << std::endl;
230 std::cout<<
GridLogMessage<<
"SchurRedBlackBase Guess subtracted after solve["<<b<<
"] " << std::endl;
235 template<
class Guesser>
262 Field guess_save(grid);
273 if (
subGuess) sol_o= sol_o-guess_save;
282 _Matrix.
M(out,resid);
287 std::cout<<
GridLogMessage <<
"SchurRedBlackBase solver true unprec resid "<< std::sqrt(nr/ns) << std::endl;
289 std::cout <<
GridLogMessage <<
"SchurRedBlackBase Guess subtracted after solve." << std::endl;
299 virtual void RedBlackSolve (
Matrix & _Matrix,
const std::vector<Field> &src_o, std::vector<Field> &sol_o)=0;
308 const bool _solnAsInitGuess =
false)
330 _Matrix.
MooeeInv(src_e,tmp); assert( tmp.Checkerboard() ==
Even);
331 _Matrix.
Meooe (tmp,Mtmp); assert( Mtmp.Checkerboard() ==
Odd);
332 tmp=src_o-Mtmp; assert( tmp.Checkerboard() ==
Odd);
334 _Matrix.
Mooee(tmp,src_o);
350 _Matrix.
Meooe(sol_o,tmp); assert( tmp.Checkerboard() ==
Even);
351 src_e = src_e-tmp; assert( src_e.Checkerboard() ==
Even);
352 _Matrix.
MooeeInv(src_e,sol_e); assert( sol_e.Checkerboard() ==
Even);
378 const bool _solnAsInitGuess =
false)
399 _Matrix.
MooeeInv(src_e,tmp); assert( tmp.Checkerboard() ==
Even);
400 _Matrix.
Meooe (tmp,Mtmp); assert( Mtmp.Checkerboard() ==
Odd);
401 tmp=src_o-Mtmp; assert( tmp.Checkerboard() ==
Odd);
405 _HermOpEO.
MpcDag(tmp,src_o); assert(src_o.Checkerboard() ==
Odd);
419 _Matrix.
Meooe(sol_o,tmp); assert( tmp.Checkerboard() ==
Even);
420 src_e_i = src_e-tmp; assert( src_e_i.Checkerboard() ==
Even);
421 _Matrix.
MooeeInv(src_e_i,sol_e); assert( sol_e.Checkerboard() ==
Even);
444 const bool _solnAsInitGuess =
false)
464 _Matrix.
MooeeInv(src_e, tmp); assert( tmp.Checkerboard() ==
Even );
465 _Matrix.
Meooe (tmp, Mtmp); assert( Mtmp.Checkerboard() ==
Odd );
466 src_o -= Mtmp; assert( src_o.Checkerboard() ==
Odd );
481 _Matrix.
Meooe(sol_o, tmp); assert( tmp.Checkerboard() ==
Even );
482 src_e_i = src_e - tmp; assert( src_e_i.Checkerboard() ==
Even );
483 _Matrix.
MooeeInv(src_e_i, sol_e); assert( sol_e.Checkerboard() ==
Even );
523 const bool _solnAsInitGuess =
false)
542 _Matrix.
MooeeInv(src_e,tmp); assert( tmp.Checkerboard() ==
Even);
543 _Matrix.
Meooe (tmp,Mtmp); assert( Mtmp.Checkerboard() ==
Odd);
545 _Matrix.
MooeeInv(Mtmp,tmp); assert( tmp.Checkerboard() ==
Odd);
548 _HermOpEO.
MpcDag(tmp,src_o); assert(src_o.Checkerboard() ==
Odd);
563 _Matrix.
Meooe(sol_o,tmp); assert( tmp.Checkerboard() ==
Even);
564 tmp = src_e-tmp; assert( src_e.Checkerboard() ==
Even);
565 _Matrix.
MooeeInv(tmp,sol_e); assert( sol_e.Checkerboard() ==
Even);
596 const bool _solnAsInitGuess =
false)
615 _Matrix.
MooeeInv(src_e,tmp); assert( tmp.Checkerboard() ==
Even);
616 _Matrix.
Meooe (tmp,Mtmp); assert( Mtmp.Checkerboard() ==
Odd);
617 tmp=src_o-Mtmp; assert( tmp.Checkerboard() ==
Odd);
620 _HermOpEO.
MpcDag(tmp,src_o); assert(src_o.Checkerboard() ==
Odd);
641 _Matrix.
Meooe(sol_o_i,tmp); assert( tmp.Checkerboard() ==
Even);
642 tmp = src_e-tmp; assert( src_e.Checkerboard() ==
Even);
643 _Matrix.
MooeeInv(tmp,sol_e); assert( sol_e.Checkerboard() ==
Even);
670 const bool _solnAsInitGuess =
false)
687 _Matrix.
MooeeInv(src_e, tmp); assert( tmp.Checkerboard() ==
Even );
688 _Matrix.
Meooe (tmp, Mtmp); assert( Mtmp.Checkerboard() ==
Odd );
689 src_o -= Mtmp; assert( src_o.Checkerboard() ==
Odd );
710 _Matrix.
Meooe(sol_o_i, tmp); assert( tmp.Checkerboard() ==
Even );
711 tmp = src_e - tmp; assert( src_e.Checkerboard() ==
Even );
712 _Matrix.
MooeeInv(tmp, sol_e); assert( sol_e.Checkerboard() ==
Even );
RealD norm2(const Lattice< vobj > &arg)
void setCheckerboard(Lattice< vobj > &full, const Lattice< vobj > &half)
void pickCheckerboard(int cb, Lattice< vobj > &half, const Lattice< vobj > &full)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
virtual void Mooee(const Field &in, Field &out)=0
virtual void MooeeInv(const Field &in, Field &out)=0
virtual void Meooe(const Field &in, Field &out)=0
virtual GridBase * RedBlackGrid(void)=0
NonHermitianSchurRedBlackDiagMooeeSolve(OperatorFunction< Field > &RBSolver, const bool initSubGuess=false, const bool _solnAsInitGuess=false)
virtual void RedBlackSource(Matrix &_Matrix, const Field &src, Field &src_e, Field &src_o)
virtual void RedBlackSolution(Matrix &_Matrix, const Field &sol_o, const Field &src_e, Field &sol)
virtual void RedBlackSolve(Matrix &_Matrix, const Field &src_o, Field &sol_o)
virtual void RedBlackSolve(Matrix &_Matrix, const std::vector< Field > &src_o, std::vector< Field > &sol_o)
CheckerBoardedSparseMatrixBase< Field > Matrix
virtual void RedBlackSolution(Matrix &_Matrix, const Field &sol_o, const Field &src_e, Field &sol)
virtual void RedBlackSolve(Matrix &_Matrix, const std::vector< Field > &src_o, std::vector< Field > &sol_o)
virtual void RedBlackSource(Matrix &_Matrix, const Field &src, Field &src_e, Field &src_o)
virtual void RedBlackSolve(Matrix &_Matrix, const Field &src_o, Field &sol_o)
CheckerBoardedSparseMatrixBase< Field > Matrix
NonHermitianSchurRedBlackDiagTwoSolve(OperatorFunction< Field > &RBSolver, const bool initSubGuess=false, const bool _solnAsInitGuess=false)
virtual void RedBlackSolve(Matrix &_Matrix, const Field &src_o, Field &sol_o)=0
bool isSubtractGuess(void)
virtual void RedBlackSolution(Matrix &_Matrix, const Field &sol_o, const Field &src_e, Field &sol)=0
OperatorFunction< Field > & _HermitianRBSolver
CheckerBoardedSparseMatrixBase< Field > Matrix
void operator()(Matrix &_Matrix, const std::vector< Field > &in, std::vector< Field > &out, Guesser &guess)
SchurRedBlackBase(OperatorFunction< Field > &HermitianRBSolver, const bool initSubGuess=false, const bool _solnAsInitGuess=false)
virtual void RedBlackSource(Matrix &_Matrix, const Field &src, Field &src_e, Field &src_o)=0
void operator()(Matrix &_Matrix, const std::vector< Field > &in, std::vector< Field > &out)
void RedBlackSource(Matrix &_Matrix, const std::vector< Field > &in, std::vector< Field > &src_o)
void subtractGuess(const bool initSubGuess)
virtual void RedBlackSolve(Matrix &_Matrix, const std::vector< Field > &src_o, std::vector< Field > &sol_o)=0
void operator()(Matrix &_Matrix, const Field &in, Field &out)
void RedBlackSolution(Matrix &_Matrix, const std::vector< Field > &in, const std::vector< Field > &sol_o, std::vector< Field > &out)
CheckerBoardedSparseMatrixBase< Field > Matrix
virtual void RedBlackSolve(Matrix &_Matrix, const std::vector< Field > &src_o, std::vector< Field > &sol_o)
virtual void RedBlackSolve(Matrix &_Matrix, const Field &src_o, Field &sol_o)
SchurRedBlackDiagMooeeSolve(OperatorFunction< Field > &HermitianRBSolver, const bool initSubGuess=false, const bool _solnAsInitGuess=false)
virtual void RedBlackSource(Matrix &_Matrix, const Field &src, Field &src_e, Field &src_o)
virtual void RedBlackSolution(Matrix &_Matrix, const Field &sol_o, const Field &src_e, Field &sol)
virtual void RedBlackSolve(Matrix &_Matrix, const Field &src_o, Field &sol_o)
virtual void RedBlackSource(Matrix &_Matrix, const Field &src, Field &src_e, Field &src_o)
virtual void RedBlackSolve(Matrix &_Matrix, const std::vector< Field > &src_o, std::vector< Field > &sol_o)
CheckerBoardedSparseMatrixBase< Field > Matrix
SchurRedBlackDiagOneSolve(OperatorFunction< Field > &HermitianRBSolver, const bool initSubGuess=false, const bool _solnAsInitGuess=false)
virtual void RedBlackSolution(Matrix &_Matrix, const Field &sol_o, const Field &src_e, Field &sol)
virtual void RedBlackSolve(Matrix &_Matrix, const std::vector< Field > &src_o, std::vector< Field > &sol_o)
CheckerBoardedSparseMatrixBase< Field > Matrix
virtual void RedBlackSolution(Matrix &_Matrix, const Field &sol_o, const Field &src_e, Field &sol)
virtual void RedBlackSource(Matrix &_Matrix, const Field &src, Field &src_e, Field &src_o)
virtual void RedBlackSolve(Matrix &_Matrix, const Field &src_o, Field &sol_o)
SchurRedBlackDiagTwoSolve(OperatorFunction< Field > &HermitianRBSolver, const bool initSubGuess=false, const bool _solnAsInitGuess=false)
virtual void RedBlackSolve(Matrix &_Matrix, const std::vector< Field > &src_o, std::vector< Field > &sol_o)
SchurRedBlackStaggeredSolve(OperatorFunction< Field > &HermitianRBSolver, const bool initSubGuess=false, const bool _solnAsInitGuess=false)
virtual void RedBlackSource(Matrix &_Matrix, const Field &src, Field &src_e, Field &src_o)
virtual void RedBlackSolve(Matrix &_Matrix, const Field &src_o, Field &sol_o)
CheckerBoardedSparseMatrixBase< Field > Matrix
virtual void RedBlackSolution(Matrix &_Matrix, const Field &sol_o, const Field &src_e_c, Field &sol)
virtual void MpcDag(const Field &in, Field &out)
virtual void MpcDag(const Field &in, Field &out)
virtual void MpcDag(const Field &in, Field &out)
virtual void M(const Field &in, Field &out)=0
virtual GridBase * Grid(void)=0
SchurRedBlackStaggeredSolve< Field > SchurRedBlackStagSolve