47 virtual void OpDiag (
const Field &in, Field &out) = 0;
48 virtual void OpDir (
const Field &in, Field &out,
int dir,
int disp) = 0;
49 virtual void OpDirAll (
const Field &in, std::vector<Field> &out) = 0;
51 virtual void Op (
const Field &in, Field &out) = 0;
52 virtual void AdjOp (
const Field &in, Field &out) = 0;
54 virtual void HermOp(
const Field &in, Field &out)=0;
74template<
class Matrix,
class Field>
81 void OpDiag (
const Field &in, Field &out) {
84 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
85 _Mat.Mdir(in,out,dir,disp);
87 void OpDirAll (
const Field &in, std::vector<Field> &out){
90 void Op (
const Field &in, Field &out){
93 void AdjOp (
const Field &in, Field &out){
102 void HermOp(
const Field &in, Field &out){
106template<
class Matrix,
class Field>
113 void OpDiag (
const Field &in, Field &out) {
116 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
117 _Mat.Mdir(in,out,dir,disp);
119 void OpDirAll (
const Field &in, std::vector<Field> &out){
120 _Mat.MdirAll(in,out);
122 void Op (
const Field &in, Field &out){
125 void AdjOp (
const Field &in, Field &out){
134 void HermOp(
const Field &in, Field &out){
142template<
class Matrix,
class Field>
149 void OpDiag (
const Field &in, Field &out) {
153 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
154 _Mat.Mdir(in,out,dir,disp);
157 void OpDirAll (
const Field &in, std::vector<Field> &out){
160 void Op (
const Field &in, Field &out){
164 void AdjOp (
const Field &in, Field &out){
174 void HermOp(
const Field &in, Field &out){
190 void OpDiag (
const Field &in, Field &out) {
193 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
196 void OpDirAll (
const Field &in, std::vector<Field> &out){
199 void Op (
const Field &in, Field &out){
202 void AdjOp (
const Field &in, Field &out){
211 void HermOp(
const Field &in, Field &out){
221template<
class Matrix,
class Field>
227 void OpDiag (
const Field &in, Field &out) {
230 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
231 _Mat.Mdir(in,out,dir,disp);
233 void OpDirAll (
const Field &in, std::vector<Field> &out){
234 _Mat.MdirAll(in,out);
236 void Op (
const Field &in, Field &out){
239 void AdjOp (
const Field &in, Field &out){
247 void HermOp(
const Field &in, Field &out){
252template<
class Matrix,
class Field>
258 void OpDiag (
const Field &in, Field &out) {
261 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
262 _Mat.Mdir(in,out,dir,disp);
264 void OpDirAll (
const Field &in, std::vector<Field> &out){
265 _Mat.MdirAll(in,out);
267 void Op (
const Field &in, Field &out){
270 void AdjOp (
const Field &in, Field &out){
276 void HermOp(
const Field &in, Field &out){
280template<
class Matrix,
class Field>
287 void OpDiag (
const Field &in, Field &out) {
289 out = out +
shift*in;
291 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
292 _Mat.Mdir(in,out,dir,disp);
294 void OpDirAll (
const Field &in, std::vector<Field> &out){
295 _Mat.MdirAll(in,out);
297 void Op (
const Field &in, Field &out){
299 out = out +
shift * in;
301 void AdjOp (
const Field &in, Field &out){
303 out = out +
shift * in;
308 void HermOp(
const Field &in, Field &out){
321 virtual void Mpc (
const Field &in, Field &out) =0;
322 virtual void MpcDag (
const Field &in, Field &out) =0;
324 Field tmp(in.Grid());
325 tmp.Checkerboard() = in.Checkerboard();
330 out.Checkerboard() = in.Checkerboard();
336 virtual void HermOp(
const Field &in, Field &out){
337 out.Checkerboard() = in.Checkerboard();
340 void Op (
const Field &in, Field &out){
343 void AdjOp (
const Field &in, Field &out){
347 void OpDiag (
const Field &in, Field &out) {
350 void OpDir (
const Field &in, Field &out,
int dir,
int disp) {
353 void OpDirAll (
const Field &in, std::vector<Field> &out){
357template<
class Matrix,
class Field>
362 virtual void Mpc (
const Field &in, Field &out) {
363 Field tmp(in.Grid());
364 tmp.Checkerboard() = !in.Checkerboard();
367 _Mat.MooeeInv(tmp,out);
370 axpy(out,-1.0,tmp,out);
372 virtual void MpcDag (
const Field &in, Field &out){
373 Field tmp(in.Grid());
375 _Mat.MeooeDag(in,tmp);
376 _Mat.MooeeInvDag(tmp,out);
377 _Mat.MeooeDag(out,tmp);
378 _Mat.MooeeDag(in,out);
379 axpy(out,-1.0,tmp,out);
382template<
class Matrix,
class Field>
389 virtual void Mpc (
const Field &in, Field &out) {
390 Field tmp(in.Grid());
393 _Mat.MooeeInv(out,tmp);
395 _Mat.MooeeInv(out,tmp);
396 axpy(out,-1.0,tmp,in);
398 virtual void MpcDag (
const Field &in, Field &out){
399 Field tmp(in.Grid());
401 _Mat.MooeeInvDag(in,out);
402 _Mat.MeooeDag(out,tmp);
403 _Mat.MooeeInvDag(tmp,out);
404 _Mat.MeooeDag(out,tmp);
405 axpy(out,-1.0,tmp,in);
408template<
class Matrix,
class Field>
415 virtual void Mpc (
const Field &in, Field &out) {
416 Field tmp(in.Grid());
418 _Mat.MooeeInv(in,out);
420 _Mat.MooeeInv(tmp,out);
423 axpy(out,-1.0,tmp,in);
425 virtual void MpcDag (
const Field &in, Field &out){
426 Field tmp(in.Grid());
428 _Mat.MeooeDag(in,out);
429 _Mat.MooeeInvDag(out,tmp);
430 _Mat.MeooeDag(tmp,out);
431 _Mat.MooeeInvDag(out,tmp);
433 axpy(out,-1.0,tmp,in);
441 virtual void Mpc (
const Field& in, Field& out) = 0;
442 virtual void MpcDag (
const Field& in, Field& out) = 0;
444 Field tmp(in.Grid());
445 tmp.Checkerboard() = in.Checkerboard();
452 virtual void HermOp(
const Field& in, Field& out) {
455 void Op(
const Field& in, Field& out) {
458 void AdjOp(
const Field& in, Field& out) {
462 void OpDiag(
const Field& in, Field& out) {
465 void OpDir(
const Field& in, Field& out,
int dir,
int disp) {
468 void OpDirAll(
const Field& in, std::vector<Field>& out){
473template<
class Matrix,
class Field>
479 virtual void Mpc(
const Field& in, Field& out) {
480 Field tmp(in.Grid());
481 tmp.Checkerboard() = !in.Checkerboard();
484 _Mat.MooeeInv(tmp, out);
485 _Mat.Meooe(out, tmp);
489 axpy(out, -1.0, tmp, out);
491 virtual void MpcDag(
const Field& in, Field& out) {
492 Field tmp(in.Grid());
494 _Mat.MeooeDag(in, tmp);
495 _Mat.MooeeInvDag(tmp, out);
496 _Mat.MeooeDag(out, tmp);
498 _Mat.MooeeDag(in, out);
500 axpy(out, -1.0, tmp, out);
504template<
class Matrix,
class Field>
512 virtual void Mpc(
const Field& in, Field& out) {
513 Field tmp(in.Grid());
516 _Mat.MooeeInv(out, tmp);
517 _Mat.Meooe(tmp, out);
518 _Mat.MooeeInv(out, tmp);
520 axpy(out, -1.0, tmp, in);
522 virtual void MpcDag(
const Field& in, Field& out) {
523 Field tmp(in.Grid());
525 _Mat.MooeeInvDag(in, out);
526 _Mat.MeooeDag(out, tmp);
527 _Mat.MooeeInvDag(tmp, out);
528 _Mat.MeooeDag(out, tmp);
530 axpy(out, -1.0, tmp, in);
534template<
class Matrix,
class Field>
543 virtual void Mpc(
const Field& in, Field& out) {
544 Field tmp(in.Grid());
546 _Mat.MooeeInv(in, out);
547 _Mat.Meooe(out, tmp);
548 _Mat.MooeeInv(tmp, out);
549 _Mat.Meooe(out, tmp);
551 axpy(out, -1.0, tmp, in);
553 virtual void MpcDag(
const Field& in, Field& out) {
554 Field tmp(in.Grid());
556 _Mat.MeooeDag(in, out);
557 _Mat.MooeeInvDag(out, tmp);
558 _Mat.MeooeDag(tmp, out);
559 _Mat.MooeeInvDag(out, tmp);
561 axpy(out, -1.0, tmp, in);
574template<
class Matrix,
class Field>
583 assert(
_Mat.isTrivialEE() );
592 virtual void HermOp(
const Field &in, Field &out){
598 virtual void Mpc (
const Field &in, Field &out)
600 Field
tmp(in.Grid());
601 Field tmp2(in.Grid());
610 virtual void MpcDag (
const Field &in, Field &out){
626 assert(in.size()==out.size());
627 for(
int k=0;k<in.size();k++){
628 (*this)(Linop,in[k],out[k]);
638 virtual void operator() (
const std::vector<Field> &in, std::vector<Field> &out)
640 assert(in.size() == out.size());
642 for (
unsigned int i = 0; i < in.size(); ++i)
644 (*this)(in[i], out[i]);
690template<
typename Field>
704template<
typename Field>
731 Field AtoN(in.Grid());
732 Field Mtmp(in.Grid());
735 for(
int n=1;n<
Coeffs.size();n++){
void axpy(Lattice< vobj > &ret, sobj a, const Lattice< vobj > &x, const Lattice< vobj > &y)
void axpby(Lattice< vobj > &ret, sobj a, sobj b, const Lattice< vobj > &x, const Lattice< vobj > &y)
Lattice< vobj > real(const Lattice< vobj > &lhs)
ComplexD innerProduct(const Lattice< vobj > &left, const Lattice< vobj > &right)
RealD norm2(const Lattice< vobj > &arg)
SchurStaggeredOperator< Matrix, Field > SchurStagOperator
SchurDiagTwoOperator< Matrix, Field > SchurDiagOneRH
SchurDiagOneOperator< Matrix, Field > SchurDiagOneLH
#define NAMESPACE_BEGIN(A)
std::complex< RealD > ComplexD
void operator()(const Field &in, Field &out)
LinearOperatorBase< Field > & _Linop
FunctionHermOp(OperatorFunction< Field > &poly, LinearOperatorBase< Field > &linop)
OperatorFunction< Field > & _poly
void operator()(LinearOperatorBase< Field > &Linop, const Field &in, Field &out)
HermitianLinearOperator(Matrix &Mat)
void AdjOp(const Field &in, Field &out)
void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void OpDiag(const Field &in, Field &out)
void Op(const Field &in, Field &out)
void HermOp(const Field &in, Field &out)
void OpDirAll(const Field &in, std::vector< Field > &out)
void OpDir(const Field &in, Field &out, int dir, int disp)
void operator()(const Field &in, Field &out)
virtual ~LinearFunction()
virtual void operator()(const Field &in, Field &out)=0
virtual void OpDir(const Field &in, Field &out, int dir, int disp)=0
virtual void Op(const Field &in, Field &out)=0
virtual void OpDiag(const Field &in, Field &out)=0
virtual void AdjOp(const Field &in, Field &out)=0
virtual ~LinearOperatorBase()
virtual void OpDirAll(const Field &in, std::vector< Field > &out)=0
virtual void HermOp(const Field &in, Field &out)=0
virtual void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)=0
void HermOp(const Field &in, Field &out)
void OpDirAll(const Field &in, std::vector< Field > &out)
void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void OpDir(const Field &in, Field &out, int dir, int disp)
void Op(const Field &in, Field &out)
MMdagLinearOperator(Matrix &Mat)
void OpDiag(const Field &in, Field &out)
void AdjOp(const Field &in, Field &out)
void OpDirAll(const Field &in, std::vector< Field > &out)
void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void OpDir(const Field &in, Field &out, int dir, int disp)
void Op(const Field &in, Field &out)
void AdjOp(const Field &in, Field &out)
void OpDiag(const Field &in, Field &out)
MdagMLinearOperator(Matrix &Mat)
void HermOp(const Field &in, Field &out)
void OpDiag(const Field &in, Field &out)
void OpDirAll(const Field &in, std::vector< Field > &out)
NonHermitianLinearOperator(Matrix &Mat)
void Op(const Field &in, Field &out)
void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void OpDir(const Field &in, Field &out, int dir, int disp)
void HermOp(const Field &in, Field &out)
void AdjOp(const Field &in, Field &out)
virtual void Mpc(const Field &in, Field &out)
virtual void MpcDag(const Field &in, Field &out)
NonHermitianSchurDiagMooeeOperator(Matrix &Mat)
NonHermitianSchurDiagOneOperator(Matrix &Mat)
virtual void MpcDag(const Field &in, Field &out)
virtual void Mpc(const Field &in, Field &out)
virtual void Mpc(const Field &in, Field &out)
virtual void MpcDag(const Field &in, Field &out)
NonHermitianSchurDiagTwoOperator(Matrix &Mat)
void AdjOp(const Field &in, Field &out)
void Op(const Field &in, Field &out)
void OpDir(const Field &in, Field &out, int dir, int disp)
virtual void Mpc(const Field &in, Field &out)=0
virtual void HermOp(const Field &in, Field &out)
virtual void MpcDag(const Field &in, Field &out)=0
void OpDiag(const Field &in, Field &out)
virtual void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void OpDirAll(const Field &in, std::vector< Field > &out)
virtual void MpcDagMpc(const Field &in, Field &out)
virtual ~OperatorFunction()
virtual void operator()(LinearOperatorBase< Field > &Linop, const Field &in, Field &out)=0
virtual void operator()(LinearOperatorBase< Field > &Linop, const Field &in, std::vector< Field > &out)=0
void operator()(const Field &in, Field &out)
PlainHermOp(LinearOperatorBase< Field > &linop)
LinearOperatorBase< Field > & _Linop
std::vector< RealD > Coeffs
void operator()(LinearOperatorBase< Field > &Linop, const Field &in, Field &out)
Polynomial(std::vector< RealD > &_Coeffs)
SchurDiagMooeeOperator(Matrix &Mat)
virtual void MpcDag(const Field &in, Field &out)
virtual void Mpc(const Field &in, Field &out)
virtual void Mpc(const Field &in, Field &out)
virtual void MpcDag(const Field &in, Field &out)
SchurDiagOneOperator(Matrix &Mat)
virtual void MpcDag(const Field &in, Field &out)
virtual void Mpc(const Field &in, Field &out)
SchurDiagTwoOperator(Matrix &Mat)
virtual void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void OpDir(const Field &in, Field &out, int dir, int disp)
virtual void HermOp(const Field &in, Field &out)
void AdjOp(const Field &in, Field &out)
void Op(const Field &in, Field &out)
void OpDiag(const Field &in, Field &out)
virtual void Mpc(const Field &in, Field &out)=0
virtual void MpcDag(const Field &in, Field &out)=0
virtual void MpcDagMpc(const Field &in, Field &out)
void OpDirAll(const Field &in, std::vector< Field > &out)
virtual void MpcDagMpc(const Field &in, Field &out)
virtual void HermOp(const Field &in, Field &out)
virtual void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
virtual void Mpc(const Field &in, Field &out)
virtual void MpcDag(const Field &in, Field &out)
SchurStaggeredOperator(Matrix &Mat)
void Op(const Field &in, Field &out)
void HermOp(const Field &in, Field &out)
void OpDir(const Field &in, Field &out, int dir, int disp)
void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void OpDirAll(const Field &in, std::vector< Field > &out)
LinearOperatorBase< Field > & _Mat
void AdjOp(const Field &in, Field &out)
ShiftedHermOpLinearOperator(LinearOperatorBase< Field > &Mat, RealD shift)
void OpDiag(const Field &in, Field &out)
void OpDir(const Field &in, Field &out, int dir, int disp)
void OpDirAll(const Field &in, std::vector< Field > &out)
void AdjOp(const Field &in, Field &out)
void OpDiag(const Field &in, Field &out)
ShiftedMdagMLinearOperator(Matrix &Mat, RealD shift)
void HermOp(const Field &in, Field &out)
void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void Op(const Field &in, Field &out)
void AdjOp(const Field &in, Field &out)
void HermOp(const Field &in, Field &out)
void OpDir(const Field &in, Field &out, int dir, int disp)
void HermOpAndNorm(const Field &in, Field &out, RealD &n1, RealD &n2)
void Op(const Field &in, Field &out)
void OpDiag(const Field &in, Field &out)
ShiftedNonHermitianLinearOperator(Matrix &Mat, RealD shft)
void OpDirAll(const Field &in, std::vector< Field > &out)