Grid 0.7.0
DomainWallEOFAFermiondense.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/DomainWallEOFAFermiondense.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 DomainWallEOFAFermion<Impl>::MooeeInvDag(const FermionField& psi, FermionField& chi)
44{
45 this->MooeeInternal(psi, chi, DaggerYes, InverseYes);
46}
47
48template<class Impl>
49void DomainWallEOFAFermion<Impl>::MooeeInv(const FermionField& psi, FermionField& chi)
50{
51 this->MooeeInternal(psi, chi, DaggerNo, InverseYes);
52}
53
54template<class Impl>
55void DomainWallEOFAFermion<Impl>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv)
56{
57 int Ls = this->Ls;
58 int LLs = psi.Grid()->_rdimensions[0];
59 int vol = psi.Grid()->oSites()/LLs;
60
61 chi.Checkerboard() = psi.Checkerboard();
62
63 assert(Ls==LLs);
64
65 Eigen::MatrixXd Pplus = Eigen::MatrixXd::Zero(Ls,Ls);
66 Eigen::MatrixXd Pminus = Eigen::MatrixXd::Zero(Ls,Ls);
67
68 for(int s=0;s<Ls;s++){
69 Pplus(s,s) = this->bee[s];
70 Pminus(s,s) = this->bee[s];
71 }
72
73 for(int s=0; s<Ls-1; s++){
74 Pminus(s,s+1) = -this->cee[s];
75 }
76
77 for(int s=0; s<Ls-1; s++){
78 Pplus(s+1,s) = -this->cee[s+1];
79 }
80
81 Pplus (0,Ls-1) = this->dp;
82 Pminus(Ls-1,0) = this->dm;
83
84 Eigen::MatrixXd PplusMat ;
85 Eigen::MatrixXd PminusMat;
86
87 if(inv) {
88 PplusMat = Pplus.inverse();
89 PminusMat = Pminus.inverse();
90 } else {
91 PplusMat = Pplus;
92 PminusMat = Pminus;
93 }
94
95 if(dag){
96 PplusMat.adjointInPlace();
97 PminusMat.adjointInPlace();
98 }
99
100 // For the non-vectorised s-direction this is simple
101
102 for(auto site=0; site<vol; site++){
103
104 SiteSpinor SiteChi;
105 SiteHalfSpinor SitePplus;
106 SiteHalfSpinor SitePminus;
107
108 for(int s1=0; s1<Ls; s1++){
109 SiteChi = Zero();
110 for(int s2=0; s2<Ls; s2++){
111 int lex2 = s2 + Ls*site;
112 if(PplusMat(s1,s2) != 0.0){
113 spProj5p(SitePplus,psi[lex2]);
114 accumRecon5p(SiteChi, PplusMat(s1,s2)*SitePplus);
115 }
116 if(PminusMat(s1,s2) != 0.0){
117 spProj5m(SitePminus, psi[lex2]);
118 accumRecon5m(SiteChi, PminusMat(s1,s2)*SitePminus);
119 }
120 }
121 chi[s1+Ls*site] = SiteChi*0.5;
122 }
123 }
124}
125
126#ifdef DOMAIN_WALL_EOFA_DPERP_DENSE
127
128INSTANTIATE_DPERP_DWF_EOFA(GparityWilsonImplF);
129INSTANTIATE_DPERP_DWF_EOFA(GparityWilsonImplD);
130INSTANTIATE_DPERP_DWF_EOFA(WilsonImplF);
131INSTANTIATE_DPERP_DWF_EOFA(WilsonImplD);
132INSTANTIATE_DPERP_DWF_EOFA(ZWilsonImplF);
133INSTANTIATE_DPERP_DWF_EOFA(ZWilsonImplD);
134
135template void DomainWallEOFAFermion<GparityWilsonImplF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
136template void DomainWallEOFAFermion<GparityWilsonImplD>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
137template void DomainWallEOFAFermion<WilsonImplF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
138template void DomainWallEOFAFermion<WilsonImplD>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
139template void DomainWallEOFAFermion<ZWilsonImplF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
140template void DomainWallEOFAFermion<ZWilsonImplD>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
141
142INSTANTIATE_DPERP_DWF_EOFA(GparityWilsonImplFH);
143INSTANTIATE_DPERP_DWF_EOFA(GparityWilsonImplDF);
144INSTANTIATE_DPERP_DWF_EOFA(WilsonImplFH);
145INSTANTIATE_DPERP_DWF_EOFA(WilsonImplDF);
146INSTANTIATE_DPERP_DWF_EOFA(ZWilsonImplFH);
147INSTANTIATE_DPERP_DWF_EOFA(ZWilsonImplDF);
148
149template void DomainWallEOFAFermion<GparityWilsonImplFH>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
150template void DomainWallEOFAFermion<GparityWilsonImplDF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
151template void DomainWallEOFAFermion<WilsonImplFH>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
152template void DomainWallEOFAFermion<WilsonImplDF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
153template void DomainWallEOFAFermion<ZWilsonImplFH>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
154template void DomainWallEOFAFermion<ZWilsonImplDF>::MooeeInternal(const FermionField& psi, FermionField& chi, int dag, int inv);
155
156#endif
157
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
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
virtual void MooeeInv(const FermionField &in, FermionField &out)
virtual void MooeeInvDag(const FermionField &in, FermionField &out)
GridBase * Grid(void)
Coordinate _rdimensions
Definition Simd.h:194