Grid 0.7.0
LinearOperator.h
Go to the documentation of this file.
1/*************************************************************************************
2
3 Grid physics library, www.github.com/paboyle/Grid
4
5 Source file: ./lib/algorithms/LinearOperator.h
6
7 Copyright (C) 2015
8
9Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
10Author: Peter Boyle <paboyle@ph.ed.ac.uk>
11
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
16
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License along
23 with this program; if not, write to the Free Software Foundation, Inc.,
24 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25
26 See the full license in the file "LICENSE" in the top level distribution directory
27*************************************************************************************/
28/* END LEGAL */
29#pragma once
30
32
34// LinearOperators Take a something and return a something.
36//
37// Hopefully linearity is satisfied and the AdjOp is indeed the Hermitian Conjugateugate (transpose if real):
38//SBase
39// i) F(a x + b y) = aF(x) + b F(y).
40// ii) <x|Op|y> = <y|AdjOp|x>^\ast
41//
42// Would be fun to have a test linearity & Herm Conj function!
44template<class Field> class LinearOperatorBase {
45public:
46 // Support for coarsening to a multigrid
47 virtual void OpDiag (const Field &in, Field &out) = 0; // Abstract base
48 virtual void OpDir (const Field &in, Field &out,int dir,int disp) = 0; // Abstract base
49 virtual void OpDirAll (const Field &in, std::vector<Field> &out) = 0; // Abstract base
50
51 virtual void Op (const Field &in, Field &out) = 0; // Abstract base
52 virtual void AdjOp (const Field &in, Field &out) = 0; // Abstract base
53 virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2)=0;
54 virtual void HermOp(const Field &in, Field &out)=0;
56};
57
58
60// By sharing the class for Sparse Matrix across multiple operator wrappers, we can share code
61// between RB and non-RB variants. Sparse matrix is like the fermion action def, and then
62// the wrappers implement the specialisation of "Op" and "AdjOp" to the cases minimising
63// replication of code.
64//
65// I'm not entirely happy with implementation; to share the Schur code between herm and non-herm
66// while still having a "OpAndNorm" in the abstract base I had to implement it in both cases
67// with an assert trap in the non-herm. This isn't right; there must be a better C++ way to
68// do it, but I fear it required multiple inheritance and mixed in abstract base classes
70
72// Construct herm op from non-herm matrix
74template<class Matrix,class Field>
76 Matrix &_Mat;
77public:
78 MdagMLinearOperator(Matrix &Mat): _Mat(Mat){};
79
80 // Support for coarsening to a multigrid
81 void OpDiag (const Field &in, Field &out) {
82 _Mat.Mdiag(in,out);
83 }
84 void OpDir (const Field &in, Field &out,int dir,int disp) {
85 _Mat.Mdir(in,out,dir,disp);
86 }
87 void OpDirAll (const Field &in, std::vector<Field> &out){
88 _Mat.MdirAll(in,out);
89 };
90 void Op (const Field &in, Field &out){
91 _Mat.M(in,out);
92 }
93 void AdjOp (const Field &in, Field &out){
94 _Mat.Mdag(in,out);
95 }
96 void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
97 _Mat.MdagM(in,out);
98 ComplexD dot = innerProduct(in,out);
99 n1=real(dot);
100 n2=norm2(out);
101 }
102 void HermOp(const Field &in, Field &out){
103 _Mat.MdagM(in,out);
104 }
105};
106template<class Matrix,class Field>
108 Matrix &_Mat;
109public:
110 MMdagLinearOperator(Matrix &Mat): _Mat(Mat){};
111
112 // Support for coarsening to a multigrid
113 void OpDiag (const Field &in, Field &out) {
114 _Mat.Mdiag(in,out);
115 }
116 void OpDir (const Field &in, Field &out,int dir,int disp) {
117 _Mat.Mdir(in,out,dir,disp);
118 }
119 void OpDirAll (const Field &in, std::vector<Field> &out){
120 _Mat.MdirAll(in,out);
121 };
122 void Op (const Field &in, Field &out){
123 _Mat.M(in,out);
124 }
125 void AdjOp (const Field &in, Field &out){
126 _Mat.Mdag(in,out);
127 }
128 void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
129 _Mat.MMdag(in,out);
130 ComplexD dot = innerProduct(in,out);
131 n1=real(dot);
132 n2=norm2(out);
133 }
134 void HermOp(const Field &in, Field &out){
135 _Mat.MMdag(in,out);
136 }
137};
138
140// Construct herm op and shift it for mgrid smoother
142template<class Matrix,class Field>
144 Matrix &_Mat;
146public:
147 ShiftedMdagMLinearOperator(Matrix &Mat,RealD shift): _Mat(Mat), _shift(shift){};
148 // Support for coarsening to a multigrid
149 void OpDiag (const Field &in, Field &out) {
150 _Mat.Mdiag(in,out);
151 assert(0);
152 }
153 void OpDir (const Field &in, Field &out,int dir,int disp) {
154 _Mat.Mdir(in,out,dir,disp);
155 assert(0);
156 }
157 void OpDirAll (const Field &in, std::vector<Field> &out){
158 assert(0);
159 };
160 void Op (const Field &in, Field &out){
161 _Mat.M(in,out);
162 assert(0);
163 }
164 void AdjOp (const Field &in, Field &out){
165 _Mat.Mdag(in,out);
166 assert(0);
167 }
168 void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
169 HermOp(in,out);
170 ComplexD dot = innerProduct(in,out);
171 n1=real(dot);
172 n2=norm2(out);
173 }
174 void HermOp(const Field &in, Field &out){
175 _Mat.MdagM(in,out);
176 out = out + _shift*in;
177 }
178};
179
181// Create a shifted HermOp
183template<class Field>
187public:
189 // Support for coarsening to a multigrid
190 void OpDiag (const Field &in, Field &out) {
191 assert(0);
192 }
193 void OpDir (const Field &in, Field &out,int dir,int disp) {
194 assert(0);
195 }
196 void OpDirAll (const Field &in, std::vector<Field> &out){
197 assert(0);
198 };
199 void Op (const Field &in, Field &out){
200 HermOp(in,out);
201 }
202 void AdjOp (const Field &in, Field &out){
203 HermOp(in,out);
204 }
205 void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
206 HermOp(in,out);
207 ComplexD dot = innerProduct(in,out);
208 n1=real(dot);
209 n2=norm2(out);
210 }
211 void HermOp(const Field &in, Field &out){
212 _Mat.HermOp(in,out);
213 out = out + _shift*in;
214 }
215};
216
217
219// Wrap an already herm matrix
221template<class Matrix,class Field>
223 Matrix &_Mat;
224public:
225 HermitianLinearOperator(Matrix &Mat): _Mat(Mat){};
226 // Support for coarsening to a multigrid
227 void OpDiag (const Field &in, Field &out) {
228 _Mat.Mdiag(in,out);
229 }
230 void OpDir (const Field &in, Field &out,int dir,int disp) {
231 _Mat.Mdir(in,out,dir,disp);
232 }
233 void OpDirAll (const Field &in, std::vector<Field> &out){
234 _Mat.MdirAll(in,out);
235 };
236 void Op (const Field &in, Field &out){
237 _Mat.M(in,out);
238 }
239 void AdjOp (const Field &in, Field &out){
240 _Mat.M(in,out);
241 }
242 void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
243 HermOp(in,out);
244 ComplexD dot= innerProduct(in,out); n1=real(dot);
245 n2=norm2(out);
246 }
247 void HermOp(const Field &in, Field &out){
248 _Mat.M(in,out);
249 }
250};
251
252template<class Matrix,class Field>
254 Matrix &_Mat;
255public:
256 NonHermitianLinearOperator(Matrix &Mat): _Mat(Mat){};
257 // Support for coarsening to a multigrid
258 void OpDiag (const Field &in, Field &out) {
259 _Mat.Mdiag(in,out);
260 }
261 void OpDir (const Field &in, Field &out,int dir,int disp) {
262 _Mat.Mdir(in,out,dir,disp);
263 }
264 void OpDirAll (const Field &in, std::vector<Field> &out){
265 _Mat.MdirAll(in,out);
266 };
267 void Op (const Field &in, Field &out){
268 _Mat.M(in,out);
269 }
270 void AdjOp (const Field &in, Field &out){
271 _Mat.Mdag(in,out);
272 }
273 void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
274 assert(0);
275 }
276 void HermOp(const Field &in, Field &out){
277 assert(0);
278 }
279};
280template<class Matrix,class Field>
282 Matrix &_Mat;
284public:
285 ShiftedNonHermitianLinearOperator(Matrix &Mat,RealD shft): _Mat(Mat),shift(shft){};
286 // Support for coarsening to a multigrid
287 void OpDiag (const Field &in, Field &out) {
288 _Mat.Mdiag(in,out);
289 out = out + shift*in;
290 }
291 void OpDir (const Field &in, Field &out,int dir,int disp) {
292 _Mat.Mdir(in,out,dir,disp);
293 }
294 void OpDirAll (const Field &in, std::vector<Field> &out){
295 _Mat.MdirAll(in,out);
296 };
297 void Op (const Field &in, Field &out){
298 _Mat.M(in,out);
299 out = out + shift * in;
300 }
301 void AdjOp (const Field &in, Field &out){
302 _Mat.Mdag(in,out);
303 out = out + shift * in;
304 }
305 void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
306 assert(0);
307 }
308 void HermOp(const Field &in, Field &out){
309 assert(0);
310 }
311};
312
314// Even Odd Schur decomp operators; there are several
315// ways to introduce the even odd checkerboarding
317
318template<class Field>
320 public:
321 virtual void Mpc (const Field &in, Field &out) =0;
322 virtual void MpcDag (const Field &in, Field &out) =0;
323 virtual void MpcDagMpc(const Field &in, Field &out) {
324 Field tmp(in.Grid());
325 tmp.Checkerboard() = in.Checkerboard();
326 Mpc(in,tmp);
327 MpcDag(tmp,out);
328 }
329 virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
330 out.Checkerboard() = in.Checkerboard();
331 MpcDagMpc(in,out);
332 ComplexD dot= innerProduct(in,out);
333 n1=real(dot);
334 n2=norm2(out);
335 }
336 virtual void HermOp(const Field &in, Field &out){
337 out.Checkerboard() = in.Checkerboard();
338 MpcDagMpc(in,out);
339 }
340 void Op (const Field &in, Field &out){
341 Mpc(in,out);
342 }
343 void AdjOp (const Field &in, Field &out){
344 MpcDag(in,out);
345 }
346 // Support for coarsening to a multigrid
347 void OpDiag (const Field &in, Field &out) {
348 assert(0); // must coarsen the unpreconditioned system
349 }
350 void OpDir (const Field &in, Field &out,int dir,int disp) {
351 assert(0);
352 }
353 void OpDirAll (const Field &in, std::vector<Field> &out){
354 assert(0);
355 };
356};
357template<class Matrix,class Field>
359 public:
360 Matrix &_Mat;
361 SchurDiagMooeeOperator (Matrix &Mat): _Mat(Mat){};
362 virtual void Mpc (const Field &in, Field &out) {
363 Field tmp(in.Grid());
364 tmp.Checkerboard() = !in.Checkerboard();
365
366 _Mat.Meooe(in,tmp);
367 _Mat.MooeeInv(tmp,out);
368 _Mat.Meooe(out,tmp);
369 _Mat.Mooee(in,out);
370 axpy(out,-1.0,tmp,out);
371 }
372 virtual void MpcDag (const Field &in, Field &out){
373 Field tmp(in.Grid());
374
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);
380 }
381};
382template<class Matrix,class Field>
384 protected:
385 Matrix &_Mat;
386 public:
387 SchurDiagOneOperator (Matrix &Mat): _Mat(Mat){};
388
389 virtual void Mpc (const Field &in, Field &out) {
390 Field tmp(in.Grid());
391
392 _Mat.Meooe(in,out);
393 _Mat.MooeeInv(out,tmp);
394 _Mat.Meooe(tmp,out);
395 _Mat.MooeeInv(out,tmp);
396 axpy(out,-1.0,tmp,in);
397 }
398 virtual void MpcDag (const Field &in, Field &out){
399 Field tmp(in.Grid());
400
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);
406 }
407};
408template<class Matrix,class Field>
410 protected:
411 Matrix &_Mat;
412 public:
413 SchurDiagTwoOperator (Matrix &Mat): _Mat(Mat){};
414
415 virtual void Mpc (const Field &in, Field &out) {
416 Field tmp(in.Grid());
417
418 _Mat.MooeeInv(in,out);
419 _Mat.Meooe(out,tmp);
420 _Mat.MooeeInv(tmp,out);
421 _Mat.Meooe(out,tmp);
422
423 axpy(out,-1.0,tmp,in);
424 }
425 virtual void MpcDag (const Field &in, Field &out){
426 Field tmp(in.Grid());
427
428 _Mat.MeooeDag(in,out);
429 _Mat.MooeeInvDag(out,tmp);
430 _Mat.MeooeDag(tmp,out);
431 _Mat.MooeeInvDag(out,tmp);
432
433 axpy(out,-1.0,tmp,in);
434 }
435};
436
437template<class Field>
439{
440 public:
441 virtual void Mpc (const Field& in, Field& out) = 0;
442 virtual void MpcDag (const Field& in, Field& out) = 0;
443 virtual void MpcDagMpc(const Field& in, Field& out) {
444 Field tmp(in.Grid());
445 tmp.Checkerboard() = in.Checkerboard();
446 Mpc(in,tmp);
447 MpcDag(tmp,out);
448 }
449 virtual void HermOpAndNorm(const Field& in, Field& out, RealD& n1, RealD& n2) {
450 assert(0);
451 }
452 virtual void HermOp(const Field& in, Field& out) {
453 assert(0);
454 }
455 void Op(const Field& in, Field& out) {
456 Mpc(in, out);
457 }
458 void AdjOp(const Field& in, Field& out) {
459 MpcDag(in, out);
460 }
461 // Support for coarsening to a multigrid
462 void OpDiag(const Field& in, Field& out) {
463 assert(0); // must coarsen the unpreconditioned system
464 }
465 void OpDir(const Field& in, Field& out, int dir, int disp) {
466 assert(0);
467 }
468 void OpDirAll(const Field& in, std::vector<Field>& out){
469 assert(0);
470 };
471};
472
473template<class Matrix, class Field>
475{
476 public:
477 Matrix& _Mat;
479 virtual void Mpc(const Field& in, Field& out) {
480 Field tmp(in.Grid());
481 tmp.Checkerboard() = !in.Checkerboard();
482
483 _Mat.Meooe(in, tmp);
484 _Mat.MooeeInv(tmp, out);
485 _Mat.Meooe(out, tmp);
486
487 _Mat.Mooee(in, out);
488
489 axpy(out, -1.0, tmp, out);
490 }
491 virtual void MpcDag(const Field& in, Field& out) {
492 Field tmp(in.Grid());
493
494 _Mat.MeooeDag(in, tmp);
495 _Mat.MooeeInvDag(tmp, out);
496 _Mat.MeooeDag(out, tmp);
497
498 _Mat.MooeeDag(in, out);
499
500 axpy(out, -1.0, tmp, out);
501 }
502};
503
504template<class Matrix,class Field>
506{
507 protected:
508 Matrix &_Mat;
509
510 public:
512 virtual void Mpc(const Field& in, Field& out) {
513 Field tmp(in.Grid());
514
515 _Mat.Meooe(in, out);
516 _Mat.MooeeInv(out, tmp);
517 _Mat.Meooe(tmp, out);
518 _Mat.MooeeInv(out, tmp);
519
520 axpy(out, -1.0, tmp, in);
521 }
522 virtual void MpcDag(const Field& in, Field& out) {
523 Field tmp(in.Grid());
524
525 _Mat.MooeeInvDag(in, out);
526 _Mat.MeooeDag(out, tmp);
527 _Mat.MooeeInvDag(tmp, out);
528 _Mat.MeooeDag(out, tmp);
529
530 axpy(out, -1.0, tmp, in);
531 }
532};
533
534template<class Matrix, class Field>
536{
537 protected:
538 Matrix& _Mat;
539
540 public:
542
543 virtual void Mpc(const Field& in, Field& out) {
544 Field tmp(in.Grid());
545
546 _Mat.MooeeInv(in, out);
547 _Mat.Meooe(out, tmp);
548 _Mat.MooeeInv(tmp, out);
549 _Mat.Meooe(out, tmp);
550
551 axpy(out, -1.0, tmp, in);
552 }
553 virtual void MpcDag(const Field& in, Field& out) {
554 Field tmp(in.Grid());
555
556 _Mat.MeooeDag(in, out);
557 _Mat.MooeeInvDag(out, tmp);
558 _Mat.MeooeDag(tmp, out);
559 _Mat.MooeeInvDag(out, tmp);
560
561 axpy(out, -1.0, tmp, in);
562 }
563};
564
566// Left handed Moo^-1 ; (Moo - Moe Mee^-1 Meo) psi = eta --> ( 1 - Moo^-1 Moe Mee^-1 Meo ) psi = Moo^-1 eta
567// Right handed Moo^-1 ; (Moo - Moe Mee^-1 Meo) Moo^-1 Moo psi = eta --> ( 1 - Moe Mee^-1 Meo Moo^-1) phi=eta ; psi = Moo^-1 phi
569template<class Matrix,class Field> using SchurDiagOneRH = SchurDiagTwoOperator<Matrix,Field> ;
570template<class Matrix,class Field> using SchurDiagOneLH = SchurDiagOneOperator<Matrix,Field> ;
572// Staggered use
574template<class Matrix,class Field>
576 protected:
577 Matrix &_Mat;
578 Field tmp;
580 public:
581 SchurStaggeredOperator (Matrix &Mat): _Mat(Mat), tmp(_Mat.RedBlackGrid())
582 {
583 assert( _Mat.isTrivialEE() );
584 mass = _Mat.Mass();
585 }
586 virtual void HermOpAndNorm(const Field &in, Field &out,RealD &n1,RealD &n2){
587 Mpc(in,out);
588 ComplexD dot= innerProduct(in,out);
589 n1 = real(dot);
590 n2 =0.0;
591 }
592 virtual void HermOp(const Field &in, Field &out){
593 Mpc(in,out);
594 // _Mat.Meooe(in,out);
595 // _Mat.Meooe(out,tmp);
596 // axpby(out,-1.0,mass*mass,tmp,in);
597 }
598 virtual void Mpc (const Field &in, Field &out)
599 {
600 Field tmp(in.Grid());
601 Field tmp2(in.Grid());
602
603 // _Mat.Mooee(in,out);
604 // _Mat.Mooee(out,tmp);
605
606 _Mat.Meooe(in,out);
607 _Mat.Meooe(out,tmp);
608 axpby(out,-1.0,mass*mass,tmp,in);
609 }
610 virtual void MpcDag (const Field &in, Field &out){
611 Mpc(in,out);
612 }
613 virtual void MpcDagMpc(const Field &in, Field &out) {
614 assert(0);// Never need with staggered
615 }
616};
617template<class Matrix,class Field> using SchurStagOperator = SchurStaggeredOperator<Matrix,Field>;
618
620// Base classes for functions of operators
622template<class Field> class OperatorFunction {
623public:
624 virtual void operator() (LinearOperatorBase<Field> &Linop, const Field &in, Field &out) = 0;
625 virtual void operator() (LinearOperatorBase<Field> &Linop, const std::vector<Field> &in,std::vector<Field> &out) {
626 assert(in.size()==out.size());
627 for(int k=0;k<in.size();k++){
628 (*this)(Linop,in[k],out[k]);
629 }
630 };
631 virtual ~OperatorFunction(){};
632};
633
634template<class Field> class LinearFunction {
635public:
636 virtual void operator() (const Field &in, Field &out) = 0;
637
638 virtual void operator() (const std::vector<Field> &in, std::vector<Field> &out)
639 {
640 assert(in.size() == out.size());
641
642 for (unsigned int i = 0; i < in.size(); ++i)
643 {
644 (*this)(in[i], out[i]);
645 }
646 }
647 virtual ~LinearFunction(){};
648};
649
650template<class Field> class IdentityLinearFunction : public LinearFunction<Field> {
651public:
652 void operator() (const Field &in, Field &out){
653 out = in;
654 };
655};
656
657
659// Base classes for Multishift solvers for operators
661template<class Field> class OperatorMultiFunction {
662public:
663 virtual void operator() (LinearOperatorBase<Field> &Linop, const Field &in, std::vector<Field> &out) = 0;
664};
665
666// FIXME : To think about
667
668// Chroma functionality list defining LinearOperator
669/*
670 virtual void operator() (T& chi, const T& psi, enum PlusMinus isign) const = 0;
671 virtual void operator() (T& chi, const T& psi, enum PlusMinus isign, Real epsilon) const
672 virtual const Subset& subset() const = 0;
673 virtual unsigned long nFlops() const { return 0; }
674 virtual void deriv(P& ds_u, const T& chi, const T& psi, enum PlusMinus isign) const
675 class UnprecLinearOperator : public DiffLinearOperator<T,P,Q>
676 const Subset& subset() const {return all;}
677 };
678*/
679
681// Hermitian operator Linear function and operator function
683template<class Field>
685 void operator() (LinearOperatorBase<Field> &Linop, const Field &in, Field &out) {
686 Linop.HermOp(in,out);
687 };
688};
689
690template<typename Field>
691class PlainHermOp : public LinearFunction<Field> {
692public:
693 using LinearFunction<Field>::operator();
695
698
699 void operator()(const Field& in, Field& out) {
700 _Linop.HermOp(in,out);
701 }
702};
703
704template<typename Field>
705class FunctionHermOp : public LinearFunction<Field> {
706public:
707 using LinearFunction<Field>::operator();
710
713
714 void operator()(const Field& in, Field& out) {
715 _poly(_Linop,in,out);
716 }
717};
718
719template<class Field>
720class Polynomial : public OperatorFunction<Field> {
721private:
722 std::vector<RealD> Coeffs;
723public:
724 using OperatorFunction<Field>::operator();
725
726 Polynomial(std::vector<RealD> &_Coeffs) : Coeffs(_Coeffs) { };
727
728 // Implement the required interface
729 void operator() (LinearOperatorBase<Field> &Linop, const Field &in, Field &out) {
730
731 Field AtoN(in.Grid());
732 Field Mtmp(in.Grid());
733 AtoN = in;
734 out = AtoN*Coeffs[0];
735 for(int n=1;n<Coeffs.size();n++){
736 Mtmp = AtoN;
737 Linop.HermOp(Mtmp,AtoN);
738 out=out+AtoN*Coeffs[n];
739 }
740 };
741};
742
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)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
std::complex< RealD > ComplexD
Definition Simd.h:79
double RealD
Definition Simd.h:61
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)
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)
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)