Grid 0.7.0
MobiusEOFAFermiondense.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/MobiusEOFAFermiondense.cc
6
7Copyright (C) 2017
8
9Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
10Author: Peter Boyle <paboyle@ph.ed.ac.uk>
11Author: Peter Boyle <peterboyle@Peters-MacBook-Pro-2.local>
12Author: paboyle <paboyle@ph.ed.ac.uk>
13Author: David Murphy <dmurphy@phys.columbia.edu>
14
15This program is free software; you can redistribute it and/or modify
16it under the terms of the GNU General Public License as published by
17the Free Software Foundation; either version 2 of the License, or
18(at your option) any later version.
19
20This program is distributed in the hope that it will be useful,
21but WITHOUT ANY WARRANTY; without even the implied warranty of
22MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23GNU General Public License for more details.
24
25You should have received a copy of the GNU General Public License along
26with this program; if not, write to the Free Software Foundation, Inc.,
2751 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28
29See the full license in the file "LICENSE" in the top level distribution directory
30*************************************************************************************/
31 /* END LEGAL */
32
36
38
39/*
40 * Dense matrix versions of routines
41 */
42template<class Impl>
43void MobiusEOFAFermion<Impl>::MooeeInv(const FermionField& psi, FermionField& chi)
44{
45 this->MooeeInternal(psi, chi, DaggerNo, InverseYes);
46}
47
48template<class Impl>
49void MobiusEOFAFermion<Impl>::MooeeInv_shift(const FermionField& psi, FermionField& chi)
50{
51 this->MooeeInternal(psi, chi, DaggerNo, InverseYes);
52}
53
54template<class Impl>
55void MobiusEOFAFermion<Impl>::MooeeInvDag(const FermionField& psi, FermionField& chi)
56{
57 this->MooeeInternal(psi, chi, DaggerYes, InverseYes);
58}
59
60template<class Impl>
61void MobiusEOFAFermion<Impl>::MooeeInvDag_shift(const FermionField& psi, FermionField& chi)
62{
63 this->MooeeInternal(psi, chi, DaggerYes, InverseYes);
64}
65
66template<class Impl>
67void MobiusEOFAFermion<Impl>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv)
68{
69 int Ls = this->Ls;
70 int LLs = psi.Grid()->_rdimensions[0];
71 int vol = psi.Grid()->oSites()/LLs;
72
73 int pm = this->pm;
74 RealD shift = this->shift;
75 RealD alpha = this->alpha;
76 RealD k = this->k;
77 RealD mq1 = this->mq1;
78
79 chi.Checkerboard() = psi.Checkerboard();
80
81 assert(Ls==LLs);
82
83 Eigen::MatrixXd Pplus = Eigen::MatrixXd::Zero(Ls,Ls);
84 Eigen::MatrixXd Pminus = Eigen::MatrixXd::Zero(Ls,Ls);
85
86 for(int s=0;s<Ls;s++){
87 Pplus(s,s) = this->bee[s];
88 Pminus(s,s) = this->bee[s];
89 }
90
91 for(int s=0; s<Ls-1; s++){
92 Pminus(s,s+1) = -this->cee[s];
93 }
94
95 for(int s=0; s<Ls-1; s++){
96 Pplus(s+1,s) = -this->cee[s+1];
97 }
98 Pplus (0,Ls-1) = mq1*this->cee[0];
99 Pminus(Ls-1,0) = mq1*this->cee[Ls-1];
100
101 if(shift != 0.0){
102 Coeff_t N = 2.0 * ( std::pow(alpha+1.0,Ls) + mq1*std::pow(alpha-1.0,Ls) );
103 for(int s=0; s<Ls; ++s){
104 if(pm == 1){ Pplus(s,Ls-1) += shift * k * N * std::pow(-1.0,s) * std::pow(alpha-1.0,s) / std::pow(alpha+1.0,Ls+s+1); }
105 else{ Pminus(Ls-1-s,Ls-1) -= shift * k * N * std::pow(-1.0,s) * std::pow(alpha-1.0,s) / std::pow(alpha+1.0,Ls+s+1); }
106 }
107 }
108
109 Eigen::MatrixXd PplusMat ;
110 Eigen::MatrixXd PminusMat;
111
112 if(inv){
113 PplusMat = Pplus.inverse();
114 PminusMat = Pminus.inverse();
115 } else {
116 PplusMat = Pplus;
117 PminusMat = Pminus;
118 }
119
120 if(dag){
121 PplusMat.adjointInPlace();
122 PminusMat.adjointInPlace();
123 }
124
125 // For the non-vectorised s-direction this is simple
126
127 for(auto site=0; site<vol; site++){
128
129 SiteSpinor SiteChi;
130 SiteHalfSpinor SitePplus;
131 SiteHalfSpinor SitePminus;
132
133 for(int s1=0; s1<Ls; s1++){
134 SiteChi = Zero();
135 for(int s2=0; s2<Ls; s2++){
136 int lex2 = s2 + Ls*site;
137 if(PplusMat(s1,s2) != 0.0){
138 spProj5p(SitePplus,psi[lex2]);
139 accumRecon5p(SiteChi, PplusMat(s1,s2)*SitePplus);
140 }
141 if(PminusMat(s1,s2) != 0.0){
142 spProj5m(SitePminus, psi[lex2]);
143 accumRecon5m(SiteChi, PminusMat(s1,s2)*SitePminus);
144 }
145 }
146 chi[s1+Ls*site] = SiteChi*0.5;
147 }
148 }
149}
150
151#ifdef MOBIUS_EOFA_DPERP_DENSE
152
153INSTANTIATE_DPERP_MOBIUS_EOFA(GparityWilsonImplF);
154INSTANTIATE_DPERP_MOBIUS_EOFA(GparityWilsonImplD);
155INSTANTIATE_DPERP_MOBIUS_EOFA(WilsonImplF);
156INSTANTIATE_DPERP_MOBIUS_EOFA(WilsonImplD);
157INSTANTIATE_DPERP_MOBIUS_EOFA(ZWilsonImplF);
158INSTANTIATE_DPERP_MOBIUS_EOFA(ZWilsonImplD);
159
160template void MobiusEOFAFermion<GparityWilsonImplF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
161template void MobiusEOFAFermion<GparityWilsonImplD>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
162template void MobiusEOFAFermion<WilsonImplF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
163template void MobiusEOFAFermion<WilsonImplD>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
164template void MobiusEOFAFermion<ZWilsonImplF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
165template void MobiusEOFAFermion<ZWilsonImplD>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
166
167INSTANTIATE_DPERP_MOBIUS_EOFA(GparityWilsonImplFH);
168INSTANTIATE_DPERP_MOBIUS_EOFA(GparityWilsonImplDF);
169INSTANTIATE_DPERP_MOBIUS_EOFA(WilsonImplFH);
170INSTANTIATE_DPERP_MOBIUS_EOFA(WilsonImplDF);
171INSTANTIATE_DPERP_MOBIUS_EOFA(ZWilsonImplFH);
172INSTANTIATE_DPERP_MOBIUS_EOFA(ZWilsonImplDF);
173
174template void MobiusEOFAFermion<GparityWilsonImplFH>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
175template void MobiusEOFAFermion<GparityWilsonImplDF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
176template void MobiusEOFAFermion<WilsonImplFH>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
177template void MobiusEOFAFermion<WilsonImplDF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
178template void MobiusEOFAFermion<ZWilsonImplFH>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
179template void MobiusEOFAFermion<ZWilsonImplDF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
180
181#endif
182
GparityWilsonImpl< vComplexF, FundamentalRepresentation, CoeffReal > GparityWilsonImplF
GparityWilsonImpl< vComplexD, FundamentalRepresentation, CoeffReal > GparityWilsonImplD
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
static constexpr int DaggerYes
Definition QCD.h:70
static constexpr int DaggerNo
Definition QCD.h:69
static constexpr int InverseYes
Definition QCD.h:72
double RealD
Definition Simd.h:61
accelerator_inline void accumRecon5p(iVector< vtype, Ns > &fspin, const iVector< vtype, Nhs > &hspin)
Definition TwoSpinor.h:344
accelerator_inline void spProj5m(iVector< vtype, Nhs > &hspin, const iVector< vtype, Ns > &fspin)
Definition TwoSpinor.h:146
accelerator_inline void accumRecon5m(iVector< vtype, Ns > &fspin, const iVector< vtype, Nhs > &hspin)
Definition TwoSpinor.h:349
accelerator_inline void spProj5p(iVector< vtype, Nhs > &hspin, const iVector< vtype, Ns > &fspin)
Definition TwoSpinor.h:140
WilsonImpl< vComplexF, FundamentalRepresentation, CoeffReal > WilsonImplF
Definition WilsonImpl.h:243
WilsonImpl< vComplexD, FundamentalRepresentation, CoeffComplex > ZWilsonImplD
Definition WilsonImpl.h:249
WilsonImpl< vComplexD, FundamentalRepresentation, CoeffReal > WilsonImplD
Definition WilsonImpl.h:244
WilsonImpl< vComplexF, FundamentalRepresentation, CoeffComplex > ZWilsonImplF
Definition WilsonImpl.h:248
GridBase * Grid(void)
Coordinate _rdimensions
virtual void MooeeInv(const FermionField &in, FermionField &out)
virtual void MooeeInvDag_shift(const FermionField &in, FermionField &out)
virtual void MooeeInv_shift(const FermionField &in, FermionField &out)
virtual void MooeeInvDag(const FermionField &in, FermionField &out)
Definition Simd.h:194