diff --git a/Grid/algorithms/LinearOperator.h b/Grid/algorithms/LinearOperator.h index 1add212c..5a73f881 100644 --- a/Grid/algorithms/LinearOperator.h +++ b/Grid/algorithms/LinearOperator.h @@ -223,9 +223,14 @@ class SchurOperatorBase : public LinearOperatorBase { Mpc(in,tmp); MpcDag(tmp,out); } + virtual void MpcMpcDag(const Field &in, Field &out) { + Field tmp(in.Grid()); + tmp.Checkerboard() = in.Checkerboard(); + MpcDag(in,tmp); + Mpc(tmp,out); + } virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){ - out.Checkerboard() = in.Checkerboard(); - MpcDagMpc(in,out); + HermOp(in,out); ComplexD dot= innerProduct(in,out); n1=real(dot); n2=norm2(out); @@ -276,6 +281,16 @@ template axpy(out,-1.0,tmp,out); } }; +// Mpc MpcDag system presented as the HermOp +template +class SchurDiagMooeeDagOperator : public SchurDiagMooeeOperator { + public: + virtual void HermOp(const Field &in, Field &out){ + out.Checkerboard() = in.Checkerboard(); + this->MpcMpcDag(in,out); + } + SchurDiagMooeeDagOperator (Matrix &Mat): SchurDiagMooeeOperator(Mat){}; +}; template class SchurDiagOneOperator : public SchurOperatorBase { protected: