Grid 0.7.0
CayleyFermion5D.h
Go to the documentation of this file.
1/*************************************************************************************
2
3 Grid physics library, www.github.com/paboyle/Grid
4
5 Source file: ./lib/qcd/action/fermion/CayleyFermion5D.h
6
7 Copyright (C) 2015
8
9Author: Peter Boyle <pabobyle@ph.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
35template<class Impl>
36class CayleyFermion5D : public WilsonFermion5D<Impl>
37{
38public:
40public:
41
42 // override multiply
43 virtual void M (const FermionField &in, FermionField &out);
44 virtual void Mdag (const FermionField &in, FermionField &out);
45
46 // half checkerboard operations
47 virtual void Meooe (const FermionField &in, FermionField &out);
48 virtual void MeooeDag (const FermionField &in, FermionField &out);
49 virtual void Mooee (const FermionField &in, FermionField &out);
50 virtual void MooeeDag (const FermionField &in, FermionField &out);
51 virtual void MooeeInv (const FermionField &in, FermionField &out);
52 virtual void MooeeInvDag (const FermionField &in, FermionField &out);
53 virtual void Meo5D (const FermionField &psi, FermionField &chi);
54
55 virtual void M5D (const FermionField &psi, FermionField &chi);
56 virtual void M5Ddag(const FermionField &psi, FermionField &chi);
57
59 // Physical surface field utilities
61 virtual void Dminus(const FermionField &psi, FermionField &chi);
62 virtual void DminusDag(const FermionField &psi, FermionField &chi);
63 virtual void ExportPhysicalFermionSolution(const FermionField &solution5d,FermionField &exported4d);
64 virtual void ExportPhysicalFermionSource(const FermionField &solution5d, FermionField &exported4d);
65 virtual void ImportPhysicalFermionSource(const FermionField &input4d,FermionField &imported5d);
66 virtual void ImportUnphysicalFermion(const FermionField &solution5d, FermionField &exported4d);
67
69 // Support for MADWF tricks
71 RealD Mass(void) { return (mass_plus + mass_minus) / 2.0; };
72 RealD MassPlus(void) { return mass_plus; };
73 RealD MassMinus(void) { return mass_minus; };
74
75 void SetMass(RealD _mass) {
76 mass_plus=mass_minus=_mass;
78 } ;
79 void SetMass(RealD _mass_plus, RealD _mass_minus) {
80 mass_plus=_mass_plus;
81 mass_minus=_mass_minus;
83 } ;
84 void P(const FermionField &psi, FermionField &chi);
85 void Pdag(const FermionField &psi, FermionField &chi);
86
88 // Instantiate different versions depending on Impl
90 void M5D(const FermionField &psi,
91 const FermionField &phi,
92 FermionField &chi,
93 std::vector<Coeff_t> &lower,
94 std::vector<Coeff_t> &diag,
95 std::vector<Coeff_t> &upper);
96
97 void M5Ddag(const FermionField &psi,
98 const FermionField &phi,
99 FermionField &chi,
100 std::vector<Coeff_t> &lower,
101 std::vector<Coeff_t> &diag,
102 std::vector<Coeff_t> &upper);
103
104 virtual void Instantiatable(void)=0;
105
106 // force terms; five routines; default to Dhop on diagonal
107 virtual void MDeriv (GaugeField &mat,const FermionField &U,const FermionField &V,int dag);
108 virtual void MoeDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag);
109 virtual void MeoDeriv(GaugeField &mat,const FermionField &U,const FermionField &V,int dag);
110
111 // Efficient support for multigrid coarsening
112 virtual void Mdir (const FermionField &in, FermionField &out,int dir,int disp);
113 virtual void MdirAll(const FermionField &in, std::vector<FermionField> &out);
114
115 void Meooe5D (const FermionField &in, FermionField &out);
116 void MeooeDag5D (const FermionField &in, FermionField &out);
117
118 // protected:
120
121 // Save arguments to SetCoefficientsInternal
122 std::vector<Coeff_t> _gamma;
126
127 // possible boost
128 std::vector<ComplexD> qmu;
129 void set_qmu(std::vector<ComplexD> _qmu) { qmu=_qmu; assert(qmu.size()==Nd);};
130 void addQmu(const FermionField &in, FermionField &out, int dag);
131
132 // Cayley form Moebius (tanh and zolotarev)
133 std::vector<Coeff_t> omega;
134 std::vector<Coeff_t> bs; // S dependent coeffs
135 std::vector<Coeff_t> cs;
136 std::vector<Coeff_t> as;
137 // For preconditioning Cayley form
138 std::vector<Coeff_t> bee;
139 std::vector<Coeff_t> cee;
140 std::vector<Coeff_t> aee;
141 std::vector<Coeff_t> beo;
142 std::vector<Coeff_t> ceo;
143 std::vector<Coeff_t> aeo;
144 // LDU factorisation of the eeoo matrix
145 std::vector<Coeff_t> lee;
146 std::vector<Coeff_t> leem;
147 std::vector<Coeff_t> uee;
148 std::vector<Coeff_t> ueem;
149 std::vector<Coeff_t> dee;
150
151 // Device memory
155
161
162 // Matrices of 5d ee inverse params
163 // std::vector<iSinglet<Simd> > MatpInv;
164 // std::vector<iSinglet<Simd> > MatmInv;
165 // std::vector<iSinglet<Simd> > MatpInvDag;
166 // std::vector<iSinglet<Simd> > MatmInvDag;
167
169 // Conserved current utilities
171
172 // Virtual can't template
173 void ContractConservedCurrent(PropagatorField &q_in_1,
174 PropagatorField &q_in_2,
175 PropagatorField &q_out,
176 PropagatorField &phys_src,
177 Current curr_type,
178 unsigned int mu);
179
180 void SeqConservedCurrent(PropagatorField &q_in,
181 PropagatorField &q_out,
182 PropagatorField &phys_src,
183 Current curr_type,
184 unsigned int mu,
185 unsigned int tmin,
186 unsigned int tmax,
187 ComplexField &lattice_cmplx);
188
189 void ContractJ5q(PropagatorField &q_in,ComplexField &J5q);
190 void ContractJ5q(FermionField &q_in,ComplexField &J5q);
191
193 // Constructors
195 CayleyFermion5D(GaugeField &_Umu,
196 GridCartesian &FiveDimGrid,
197 GridRedBlackCartesian &FiveDimRedBlackGrid,
198 GridCartesian &FourDimGrid,
199 GridRedBlackCartesian &FourDimRedBlackGrid,
200 RealD _mass,RealD _M5,const ImplParams &p= ImplParams());
201
202
203protected:
204 virtual void SetCoefficientsZolotarev(RealD zolohi,Approx::zolotarev_data *zdata,RealD b,RealD c);
205 virtual void SetCoefficientsTanh(Approx::zolotarev_data *zdata,RealD b,RealD c);
206 virtual void SetCoefficientsInternal(RealD zolo_hi,std::vector<Coeff_t> & gamma,RealD b,RealD c);
207};
208
210
std::vector< T, devAllocator< T > > deviceVector
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
static constexpr int Nd
Definition QCD.h:52
double RealD
Definition Simd.h:61
static INTERNAL_PRECISION U
Definition Zolotarev.cc:230
CayleyFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, RealD _mass, RealD _M5, const ImplParams &p=ImplParams())
void Meooe5D(const FermionField &in, FermionField &out)
virtual void SetCoefficientsInternal(RealD zolo_hi, std::vector< Coeff_t > &gamma, RealD b, RealD c)
std::vector< ComplexD > qmu
virtual void MooeeInvDag(const FermionField &in, FermionField &out)
std::vector< Coeff_t > leem
virtual void Mdir(const FermionField &in, FermionField &out, int dir, int disp)
std::vector< Coeff_t > as
virtual void MeoDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
std::vector< Coeff_t > lee
deviceVector< Coeff_t > d_upper
virtual void SetCoefficientsZolotarev(RealD zolohi, Approx::zolotarev_data *zdata, RealD b, RealD c)
deviceVector< Coeff_t > d_uee
virtual void MoeDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
deviceVector< Coeff_t > d_dee
std::vector< Coeff_t > bee
std::vector< Coeff_t > dee
virtual void MDeriv(GaugeField &mat, const FermionField &U, const FermionField &V, int dag)
deviceVector< Coeff_t > d_diag
void SetMass(RealD _mass_plus, RealD _mass_minus)
virtual void ExportPhysicalFermionSource(const FermionField &solution5d, FermionField &exported4d)
virtual void Mdag(const FermionField &in, FermionField &out)
std::vector< Coeff_t > cs
virtual void M5Ddag(const FermionField &psi, FermionField &chi)
virtual void Meo5D(const FermionField &psi, FermionField &chi)
virtual void ImportPhysicalFermionSource(const FermionField &input4d, FermionField &imported5d)
virtual void DminusDag(const FermionField &psi, FermionField &chi)
RealD MassMinus(void)
void addQmu(const FermionField &in, FermionField &out, int dag)
void ContractConservedCurrent(PropagatorField &q_in_1, PropagatorField &q_in_2, PropagatorField &q_out, PropagatorField &phys_src, Current curr_type, unsigned int mu)
RealD MassPlus(void)
virtual void MdirAll(const FermionField &in, std::vector< FermionField > &out)
virtual void Dminus(const FermionField &psi, FermionField &chi)
virtual void MeooeDag(const FermionField &in, FermionField &out)
std::vector< Coeff_t > beo
void P(const FermionField &psi, FermionField &chi)
std::vector< Coeff_t > bs
virtual void M(const FermionField &in, FermionField &out)
void MeooeDag5D(const FermionField &in, FermionField &out)
std::vector< Coeff_t > _gamma
std::vector< Coeff_t > aeo
void ContractJ5q(PropagatorField &q_in, ComplexField &J5q)
void SetMass(RealD _mass)
virtual void M5D(const FermionField &psi, FermionField &chi)
virtual void ExportPhysicalFermionSolution(const FermionField &solution5d, FermionField &exported4d)
deviceVector< Coeff_t > d_lower
virtual void MooeeInv(const FermionField &in, FermionField &out)
virtual void SetCoefficientsTanh(Approx::zolotarev_data *zdata, RealD b, RealD c)
std::vector< Coeff_t > ceo
void SeqConservedCurrent(PropagatorField &q_in, PropagatorField &q_out, PropagatorField &phys_src, Current curr_type, unsigned int mu, unsigned int tmin, unsigned int tmax, ComplexField &lattice_cmplx)
void set_qmu(std::vector< ComplexD > _qmu)
deviceVector< Coeff_t > d_leem
virtual void Meooe(const FermionField &in, FermionField &out)
deviceVector< Coeff_t > d_lee
virtual void MooeeDag(const FermionField &in, FermionField &out)
std::vector< Coeff_t > ueem
virtual void ImportUnphysicalFermion(const FermionField &solution5d, FermionField &exported4d)
std::vector< Coeff_t > cee
void Pdag(const FermionField &psi, FermionField &chi)
std::vector< Coeff_t > omega
INHERIT_IMPL_TYPES(Impl)
virtual void Mooee(const FermionField &in, FermionField &out)
deviceVector< Coeff_t > d_ueem
virtual void Instantiatable(void)=0
std::vector< Coeff_t > aee
std::vector< Coeff_t > uee
WilsonFermion5D(GaugeField &_Umu, GridCartesian &FiveDimGrid, GridRedBlackCartesian &FiveDimRedBlackGrid, GridCartesian &FourDimGrid, GridRedBlackCartesian &FourDimRedBlackGrid, double _M5, const ImplParams &p=ImplParams())