|
|
|
@ -95,16 +95,26 @@ namespace Grid {
|
|
|
|
|
private:
|
|
|
|
|
OperatorFunction<Field> & _HermitianRBSolver;
|
|
|
|
|
int CBfactorise;
|
|
|
|
|
bool subGuess;
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
// Wrap the usual normal equations Schur trick
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
SchurRedBlackStaggeredSolve(OperatorFunction<Field> &HermitianRBSolver) :
|
|
|
|
|
SchurRedBlackStaggeredSolve(OperatorFunction<Field> &HermitianRBSolver, const bool initSubGuess = false) :
|
|
|
|
|
_HermitianRBSolver(HermitianRBSolver)
|
|
|
|
|
{
|
|
|
|
|
CBfactorise=0;
|
|
|
|
|
subtractGuess(initSubGuess);
|
|
|
|
|
};
|
|
|
|
|
void subtractGuess(const bool initSubGuess)
|
|
|
|
|
{
|
|
|
|
|
subGuess = initSubGuess;
|
|
|
|
|
}
|
|
|
|
|
bool isSubtractGuess(void)
|
|
|
|
|
{
|
|
|
|
|
return subGuess;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class Matrix>
|
|
|
|
|
void operator() (Matrix & _Matrix,const Field &in, Field &out){
|
|
|
|
@ -150,9 +160,12 @@ namespace Grid {
|
|
|
|
|
// Call the red-black solver
|
|
|
|
|
//////////////////////////////////////////////////////////////
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackStaggeredSolver calling the Mpc solver" <<std::endl;
|
|
|
|
|
guess(src_o,sol_o);
|
|
|
|
|
guess(src_o, sol_o);
|
|
|
|
|
Mtmp = sol_o;
|
|
|
|
|
_HermitianRBSolver(_HermOpEO,src_o,sol_o); assert(sol_o.checkerboard==Odd);
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackStaggeredSolver called the Mpc solver" <<std::endl;
|
|
|
|
|
// Fionn A2A boolean behavioural control
|
|
|
|
|
if (subGuess) sol_o = sol_o-Mtmp;
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////
|
|
|
|
|
// sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
|
|
|
|
@ -167,11 +180,15 @@ namespace Grid {
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackStaggeredSolver inserted solution" <<std::endl;
|
|
|
|
|
|
|
|
|
|
// Verify the unprec residual
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackStaggered solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl;
|
|
|
|
|
if ( ! subGuess ) {
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackStaggered solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl;
|
|
|
|
|
} else {
|
|
|
|
|
std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
template<class Field> using SchurRedBlackStagSolve = SchurRedBlackStaggeredSolve<Field>;
|
|
|
|
@ -184,15 +201,25 @@ namespace Grid {
|
|
|
|
|
private:
|
|
|
|
|
OperatorFunction<Field> & _HermitianRBSolver;
|
|
|
|
|
int CBfactorise;
|
|
|
|
|
bool subGuess;
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
// Wrap the usual normal equations Schur trick
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
SchurRedBlackDiagMooeeSolve(OperatorFunction<Field> &HermitianRBSolver,int cb=0) : _HermitianRBSolver(HermitianRBSolver)
|
|
|
|
|
SchurRedBlackDiagMooeeSolve(OperatorFunction<Field> &HermitianRBSolver,int cb=0, const bool initSubGuess = false) : _HermitianRBSolver(HermitianRBSolver)
|
|
|
|
|
{
|
|
|
|
|
CBfactorise=cb;
|
|
|
|
|
subtractGuess(initSubGuess);
|
|
|
|
|
};
|
|
|
|
|
void subtractGuess(const bool initSubGuess)
|
|
|
|
|
{
|
|
|
|
|
subGuess = initSubGuess;
|
|
|
|
|
}
|
|
|
|
|
bool isSubtractGuess(void)
|
|
|
|
|
{
|
|
|
|
|
return subGuess;
|
|
|
|
|
}
|
|
|
|
|
template<class Matrix>
|
|
|
|
|
void operator() (Matrix & _Matrix,const Field &in, Field &out){
|
|
|
|
|
ZeroGuesser<Field> guess;
|
|
|
|
@ -236,7 +263,10 @@ namespace Grid {
|
|
|
|
|
//////////////////////////////////////////////////////////////
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl;
|
|
|
|
|
guess(src_o,sol_o);
|
|
|
|
|
Mtmp = sol_o;
|
|
|
|
|
_HermitianRBSolver(_HermOpEO,src_o,sol_o); assert(sol_o.checkerboard==Odd);
|
|
|
|
|
// Fionn A2A boolean behavioural control
|
|
|
|
|
if (subGuess) sol_o = sol_o-Mtmp;
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////
|
|
|
|
|
// sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
|
|
|
|
@ -249,12 +279,16 @@ namespace Grid {
|
|
|
|
|
setCheckerboard(out,sol_o); assert( sol_o.checkerboard ==Odd );
|
|
|
|
|
|
|
|
|
|
// Verify the unprec residual
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
if ( ! subGuess ) {
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackDiagMooee solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl;
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackDiagMooee solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl;
|
|
|
|
|
} else {
|
|
|
|
|
std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -267,16 +301,26 @@ namespace Grid {
|
|
|
|
|
private:
|
|
|
|
|
OperatorFunction<Field> & _HermitianRBSolver;
|
|
|
|
|
int CBfactorise;
|
|
|
|
|
bool subGuess;
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
// Wrap the usual normal equations Schur trick
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
SchurRedBlackDiagTwoSolve(OperatorFunction<Field> &HermitianRBSolver) :
|
|
|
|
|
SchurRedBlackDiagTwoSolve(OperatorFunction<Field> &HermitianRBSolver, const bool initSubGuess = false) :
|
|
|
|
|
_HermitianRBSolver(HermitianRBSolver)
|
|
|
|
|
{
|
|
|
|
|
CBfactorise=0;
|
|
|
|
|
CBfactorise = 0;
|
|
|
|
|
subtractGuess(initSubGuess);
|
|
|
|
|
};
|
|
|
|
|
void subtractGuess(const bool initSubGuess)
|
|
|
|
|
{
|
|
|
|
|
subGuess = initSubGuess;
|
|
|
|
|
}
|
|
|
|
|
bool isSubtractGuess(void)
|
|
|
|
|
{
|
|
|
|
|
return subGuess;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class Matrix>
|
|
|
|
|
void operator() (Matrix & _Matrix,const Field &in, Field &out){
|
|
|
|
@ -322,8 +366,11 @@ namespace Grid {
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlack solver calling the MpcDagMp solver" <<std::endl;
|
|
|
|
|
// _HermitianRBSolver(_HermOpEO,src_o,sol_o); assert(sol_o.checkerboard==Odd);
|
|
|
|
|
guess(src_o,tmp);
|
|
|
|
|
Mtmp = tmp;
|
|
|
|
|
_HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd);
|
|
|
|
|
_Matrix.MooeeInv(tmp,sol_o); assert( sol_o.checkerboard ==Odd);
|
|
|
|
|
// Fionn A2A boolean behavioural control
|
|
|
|
|
if (subGuess) tmp = tmp-Mtmp;
|
|
|
|
|
_Matrix.MooeeInv(tmp,sol_o); assert( sol_o.checkerboard ==Odd);
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////
|
|
|
|
|
// sol_e = M_ee^-1 * ( src_e - Meo sol_o )...
|
|
|
|
@ -336,12 +383,16 @@ namespace Grid {
|
|
|
|
|
setCheckerboard(out,sol_o); assert( sol_o.checkerboard ==Odd );
|
|
|
|
|
|
|
|
|
|
// Verify the unprec residual
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
if ( ! subGuess ) {
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackDiagTwo solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl;
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackDiagTwo solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl;
|
|
|
|
|
} else {
|
|
|
|
|
std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
@ -352,16 +403,26 @@ namespace Grid {
|
|
|
|
|
private:
|
|
|
|
|
LinearFunction<Field> & _HermitianRBSolver;
|
|
|
|
|
int CBfactorise;
|
|
|
|
|
bool subGuess;
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
// Wrap the usual normal equations Schur trick
|
|
|
|
|
/////////////////////////////////////////////////////
|
|
|
|
|
SchurRedBlackDiagTwoMixed(LinearFunction<Field> &HermitianRBSolver) :
|
|
|
|
|
SchurRedBlackDiagTwoMixed(LinearFunction<Field> &HermitianRBSolver, const bool initSubGuess = false) :
|
|
|
|
|
_HermitianRBSolver(HermitianRBSolver)
|
|
|
|
|
{
|
|
|
|
|
CBfactorise=0;
|
|
|
|
|
subtractGuess(initSubGuess);
|
|
|
|
|
};
|
|
|
|
|
void subtractGuess(const bool initSubGuess)
|
|
|
|
|
{
|
|
|
|
|
subGuess = initSubGuess;
|
|
|
|
|
}
|
|
|
|
|
bool isSubtractGuess(void)
|
|
|
|
|
{
|
|
|
|
|
return subGuess;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<class Matrix>
|
|
|
|
|
void operator() (Matrix & _Matrix,const Field &in, Field &out){
|
|
|
|
@ -408,7 +469,10 @@ namespace Grid {
|
|
|
|
|
// _HermitianRBSolver(_HermOpEO,src_o,sol_o); assert(sol_o.checkerboard==Odd);
|
|
|
|
|
// _HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd);
|
|
|
|
|
guess(src_o,tmp);
|
|
|
|
|
_HermitianRBSolver(src_o,tmp); assert(tmp.checkerboard==Odd);
|
|
|
|
|
Mtmp = tmp;
|
|
|
|
|
_HermitianRBSolver(_HermOpEO,src_o,tmp); assert(tmp.checkerboard==Odd);
|
|
|
|
|
// Fionn A2A boolean behavioural control
|
|
|
|
|
if (subGuess) tmp = tmp-Mtmp;
|
|
|
|
|
_Matrix.MooeeInv(tmp,sol_o); assert( sol_o.checkerboard ==Odd);
|
|
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////
|
|
|
|
@ -422,12 +486,16 @@ namespace Grid {
|
|
|
|
|
setCheckerboard(out,sol_o); assert( sol_o.checkerboard ==Odd );
|
|
|
|
|
|
|
|
|
|
// Verify the unprec residual
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
if ( ! subGuess ) {
|
|
|
|
|
_Matrix.M(out,resid);
|
|
|
|
|
resid = resid-in;
|
|
|
|
|
RealD ns = norm2(in);
|
|
|
|
|
RealD nr = norm2(resid);
|
|
|
|
|
|
|
|
|
|
std::cout<<GridLogMessage << "SchurRedBlackDiagTwo solver true unprec resid "<< std::sqrt(nr/ns) <<" nr "<< nr <<" ns "<<ns << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "SchurRedBlackDiagTwo solver true unprec resid " << std::sqrt(nr / ns) << " nr " << nr << " ns " << ns << std::endl;
|
|
|
|
|
} else {
|
|
|
|
|
std::cout << GridLogMessage << "Guess subtracted after solve." << std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|