Grid 0.7.0
MobiusEOFAFermion.h
Go to the documentation of this file.
1/*************************************************************************************
2
3Grid physics library, www.github.com/paboyle/Grid
4
5Source file: ./lib/qcd/action/fermion/MobiusEOFAFermion.h
6
7Copyright (C) 2017
8
9Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
10Author: Peter Boyle <paboyle@ph.ed.ac.uk>
11Author: David Murphy <dmurphy@phys.columbia.edu>
12
13This program is free software; you can redistribute it and/or modify
14it under the terms of the GNU General Public License as published by
15the Free Software Foundation; either version 2 of the License, or
16(at your option) any later version.
17
18This program is distributed in the hope that it will be useful,
19but WITHOUT ANY WARRANTY; without even the implied warranty of
20MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21GNU General Public License for more details.
22
23You should have received a copy of the GNU General Public License along
24with this program; if not, write to the Free Software Foundation, Inc.,
2551 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26
27See the full license in the file "LICENSE" in the top level distribution directory
28*************************************************************************************/
29 /* END LEGAL */
30#ifndef GRID_QCD_MOBIUS_EOFA_FERMION_H
31#define GRID_QCD_MOBIUS_EOFA_FERMION_H
32
34
36
37template<class Impl>
39{
40public:
42
43public:
44 // Shift operator coefficients for red-black preconditioned Mobius EOFA
45 std::vector<Coeff_t> Mooee_shift;
46 std::vector<Coeff_t> MooeeInv_shift_lc;
47 std::vector<Coeff_t> MooeeInv_shift_norm;
48 std::vector<Coeff_t> MooeeInvDag_shift_lc;
49 std::vector<Coeff_t> MooeeInvDag_shift_norm;
50
51 virtual void Instantiatable(void) {};
52
53 // EOFA-specific operations
54 virtual void Omega (const FermionField& in, FermionField& out, int sign, int dag);
55 virtual void Dtilde (const FermionField& in, FermionField& out);
56 virtual void DtildeInv (const FermionField& in, FermionField& out);
57
58 // override multiply
59 virtual void M (const FermionField& in, FermionField& out);
60 virtual void Mdag (const FermionField& in, FermionField& out);
61
62 // half checkerboard operations
63 virtual void Mooee (const FermionField& in, FermionField& out);
64 virtual void MooeeDag (const FermionField& in, FermionField& out);
65 virtual void MooeeInv (const FermionField& in, FermionField& out);
66 virtual void MooeeInv_shift (const FermionField& in, FermionField& out);
67 virtual void MooeeInvDag (const FermionField& in, FermionField& out);
68 virtual void MooeeInvDag_shift(const FermionField& in, FermionField& out);
69
70 virtual void M5D (const FermionField& psi, FermionField& chi);
71 virtual void M5Ddag (const FermionField& psi, FermionField& chi);
72
74 // Instantiate different versions depending on Impl
76 void M5D(const FermionField& psi, const FermionField& phi, FermionField& chi,
77 std::vector<Coeff_t>& lower, std::vector<Coeff_t>& diag, std::vector<Coeff_t>& upper);
78
79 void M5D_shift(const FermionField& psi, const FermionField& phi, FermionField& chi,
80 std::vector<Coeff_t>& lower, std::vector<Coeff_t>& diag, std::vector<Coeff_t>& upper,
81 std::vector<Coeff_t>& shift_coeffs);
82
83 void M5Ddag(const FermionField& psi, const FermionField& phi, FermionField& chi,
84 std::vector<Coeff_t>& lower, std::vector<Coeff_t>& diag, std::vector<Coeff_t>& upper);
85
86 void M5Ddag_shift(const FermionField& psi, const FermionField& phi, FermionField& chi,
87 std::vector<Coeff_t>& lower, std::vector<Coeff_t>& diag, std::vector<Coeff_t>& upper,
88 std::vector<Coeff_t>& shift_coeffs);
89
90 virtual void RefreshShiftCoefficients(RealD new_shift);
91
92 // Constructors
93 MobiusEOFAFermion(GaugeField& _Umu, GridCartesian& FiveDimGrid, GridRedBlackCartesian& FiveDimRedBlackGrid,
94 GridCartesian& FourDimGrid, GridRedBlackCartesian& FourDimRedBlackGrid,
95 RealD _mq1, RealD _mq2, RealD _mq3, RealD _shift, int pm,
96 RealD _M5, RealD _b, RealD _c, const ImplParams& p=ImplParams());
97
98protected:
100};
101
103
104#endif
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
double RealD
Definition Simd.h:61
AbstractEOFAFermion(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mq1, RealD _mq2, RealD _mq3, RealD _shift, int _pm, RealD _M5, RealD _b, RealD _c, const ImplParams &p=ImplParams())
virtual void DtildeInv(const FermionField &in, FermionField &out)
void M5Ddag_shift(const FermionField &psi, const FermionField &phi, FermionField &chi, std::vector< Coeff_t > &lower, std::vector< Coeff_t > &diag, std::vector< Coeff_t > &upper, std::vector< Coeff_t > &shift_coeffs)
MobiusEOFAFermion(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mq1, RealD _mq2, RealD _mq3, RealD _shift, int pm, RealD _M5, RealD _b, RealD _c, const ImplParams &p=ImplParams())
std::vector< Coeff_t > MooeeInv_shift_lc
std::vector< Coeff_t > MooeeInv_shift_norm
std::vector< Coeff_t > MooeeInvDag_shift_lc
virtual void MooeeInv(const FermionField &in, FermionField &out)
virtual void Omega(const FermionField &in, FermionField &out, int sign, int dag)
virtual void MooeeInvDag_shift(const FermionField &in, FermionField &out)
virtual void Instantiatable(void)
virtual void Mooee(const FermionField &in, FermionField &out)
void M5D(const FermionField &psi, const FermionField &phi, FermionField &chi, std::vector< Coeff_t > &lower, std::vector< Coeff_t > &diag, std::vector< Coeff_t > &upper)
std::vector< Coeff_t > MooeeInvDag_shift_norm
virtual void MooeeDag(const FermionField &in, FermionField &out)
virtual void Mdag(const FermionField &in, FermionField &out)
virtual void Dtilde(const FermionField &in, FermionField &out)
virtual void RefreshShiftCoefficients(RealD new_shift)
virtual void M(const FermionField &in, FermionField &out)
virtual void M5D(const FermionField &psi, FermionField &chi)
virtual void MooeeInv_shift(const FermionField &in, FermionField &out)
void M5Ddag(const FermionField &psi, const FermionField &phi, FermionField &chi, std::vector< Coeff_t > &lower, std::vector< Coeff_t > &diag, std::vector< Coeff_t > &upper)
virtual void M5Ddag(const FermionField &psi, FermionField &chi)
virtual void MooeeInvDag(const FermionField &in, FermionField &out)
void M5D_shift(const FermionField &psi, const FermionField &phi, FermionField &chi, std::vector< Coeff_t > &lower, std::vector< Coeff_t > &diag, std::vector< Coeff_t > &upper, std::vector< Coeff_t > &shift_coeffs)