Grid 0.7.0
WilsonImpl.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/FermionOperatorImpl.h
6
7Copyright (C) 2015
8
9Author: Peter Boyle <pabobyle@ph.ed.ac.uk>
10
11This program is free software; you can redistribute it and/or modify
12it under the terms of the GNU General Public License as published by
13the Free Software Foundation; either version 2 of the License, or
14(at your option) any later version.
15
16This program is distributed in the hope that it will be useful,
17but WITHOUT ANY WARRANTY; without even the implied warranty of
18MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19GNU General Public License for more details.
20
21You should have received a copy of the GNU General Public License along
22with this program; if not, write to the Free Software Foundation, Inc.,
2351 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24
25See the full license in the file "LICENSE" in the top level distribution
26directory
27*************************************************************************************/
28 /* END LEGAL */
29#pragma once
30
32
33
35// Single flavour four spinors with colour index
37template <class S, class Representation = FundamentalRepresentation,class Options = CoeffReal >
38class WilsonImpl : public PeriodicGaugeImpl<GaugeImplTypes<S, Representation::Dimension > > {
39public:
40
41 static const int Dimension = Representation::Dimension;
42 static const bool isFundamental = Representation::isFundamental;
43 static const bool LsVectorised=false;
44 static const bool isGparity=false;
45 static const int Nhcs = Options::Nhcs;
46
49
50 //Necessary?
51 constexpr bool is_fundamental() const{return Dimension == Nc ? 1 : 0;}
52
53 typedef typename Options::_Coeff_t Coeff_t;
54 typedef typename Options::template PrecisionMapper<Simd>::LowerPrecVector SimdL;
55
56 template <typename vtype> using iImplSpinor = iScalar<iVector<iVector<vtype, Dimension>, Ns> >;
57 template <typename vtype> using iImplPropagator = iScalar<iMatrix<iMatrix<vtype, Dimension>, Ns> >;
58 template <typename vtype> using iImplHalfSpinor = iScalar<iVector<iVector<vtype, Dimension>, Nhs> >;
61
67
71
75 typedef const typename StencilImpl::View_type StencilView;
76
78
80 assert(Params.boundary_phases.size() == Nd);
81 };
82
83 template<class _Spinor>
84 static accelerator_inline void multLink(_Spinor &phi,
86 const _Spinor &chi,
87 int mu)
88 {
89 auto UU = coalescedRead(U(mu));
90 mult(&phi(), &UU, &chi());
91 }
92 template<class _Spinor>
93 static accelerator_inline void multLink(_Spinor &phi,
95 const _Spinor &chi,
96 int mu,
97 StencilEntry *SE,
98 StencilView &St)
99 {
100 multLink(phi,U,chi,mu);
101 }
102
103 template<class _SpinorField>
104 inline void multLinkField(_SpinorField & out,
105 const DoubledGaugeField &Umu,
106 const _SpinorField & phi,
107 int mu)
108 {
109 const int Nsimd = SiteHalfSpinor::Nsimd();
110 autoView( out_v, out, AcceleratorWrite);
111 autoView( phi_v, phi, AcceleratorRead);
112 autoView( Umu_v, Umu, AcceleratorRead);
113 typedef decltype(coalescedRead(out_v[0])) calcSpinor;
114 accelerator_for(sss,out.Grid()->oSites(),Nsimd,{
115 calcSpinor tmp;
116 multLink(tmp,Umu_v[sss],phi_v(sss),mu);
117 coalescedWrite(out_v[sss],tmp);
118 });
119 }
120
121 template <class ref>
122 static accelerator_inline void loadLinkElement(Simd &reg, ref &memory)
123 {
124 reg = memory;
125 }
126
127 inline void DoubleStore(GridBase *GaugeGrid,
129 const GaugeField &Umu)
130 {
131 typedef typename Simd::scalar_type scalar_type;
132
133 conformable(Uds.Grid(), GaugeGrid);
134 conformable(Umu.Grid(), GaugeGrid);
135
136 GaugeLinkField U(GaugeGrid);
137 GaugeLinkField tmp(GaugeGrid);
138
139 Lattice<iScalar<vInteger> > coor(GaugeGrid);
141 // apply any boundary phase or twists
143 for (int mu = 0; mu < Nd; mu++) {
144
146 auto pha = Params.boundary_phases[mu];
147 scalar_type phase( real(pha),imag(pha) );
148
149 int L = GaugeGrid->GlobalDimensions()[mu];
150 int Lmu = L - 1;
151
152 LatticeCoordinate(coor, mu);
153
154 U = PeekIndex<LorentzIndex>(Umu, mu);
155
156 // apply any twists
157 RealD theta = Params.twist_n_2pi_L[mu] * 2*M_PI / L;
158 if ( theta != 0.0) {
159 scalar_type twphase(::cos(theta),::sin(theta));
160 U = twphase*U;
161 std::cout << GridLogMessage << " Twist ["<<mu<<"] "<< Params.twist_n_2pi_L[mu]<< " phase"<<phase <<std::endl;
162 }
163
164 tmp = where(coor == Lmu, phase * U, U);
165 PokeIndex<LorentzIndex>(Uds, tmp, mu);
166
167 U = adj(Cshift(U, mu, -1));
168 U = where(coor == 0, conjugate(phase) * U, U);
169 PokeIndex<LorentzIndex>(Uds, U, mu + 4);
170 }
171 }
172
173 inline void InsertForce4D(GaugeField &mat, FermionField &Btilde, FermionField &A,int mu){
174 GaugeLinkField link(mat.Grid());
175 link = TraceIndex<SpinIndex>(outerProduct(Btilde,A));
176 PokeIndex<LorentzIndex>(mat,link,mu);
177 }
178
179 inline void outerProductImpl(PropagatorField &mat, const FermionField &B, const FermionField &A){
180 mat = outerProduct(B,A);
181 }
182
183 inline void TraceSpinImpl(GaugeLinkField &mat, PropagatorField&P) {
184 mat = TraceIndex<SpinIndex>(P);
185 }
186
187 inline void extractLinkField(std::vector<GaugeLinkField> &mat, DoubledGaugeField &Uds)
188 {
189 for (int mu = 0; mu < Nd; mu++)
190 mat[mu] = PeekIndex<LorentzIndex>(Uds, mu);
191 }
192
193 inline void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField &Atilde,int mu)
194 {
195#undef USE_OLD_INSERT_FORCE
196 int Ls=Btilde.Grid()->_fdimensions[0];
197 autoView( mat_v , mat, AcceleratorWrite);
198#ifdef USE_OLD_INSERT_FORCE
199 GaugeLinkField tmp(mat.Grid());
200 tmp = Zero();
201 {
202 const int Nsimd = SiteSpinor::Nsimd();
203 autoView( tmp_v , tmp, AcceleratorWrite);
204 autoView( Btilde_v , Btilde, AcceleratorRead);
205 autoView( Atilde_v , Atilde, AcceleratorRead);
206 accelerator_for(sss,tmp.Grid()->oSites(),1,{
207 int sU=sss;
208 for(int s=0;s<Ls;s++){
209 int sF = s+Ls*sU;
210 tmp_v[sU] = tmp_v[sU]+ traceIndex<SpinIndex>(outerProduct(Btilde_v[sF],Atilde_v[sF])); // ordering here
211 }
212 });
213 }
214 PokeIndex<LorentzIndex>(mat,tmp,mu);
215#else
216 {
217 const int Nsimd = SiteSpinor::Nsimd();
218 autoView( Btilde_v , Btilde, AcceleratorRead);
219 autoView( Atilde_v , Atilde, AcceleratorRead);
220 accelerator_for(sss,mat.Grid()->oSites(),Nsimd,{
221 int sU=sss;
222 typedef decltype(coalescedRead(mat_v[sU](mu)() )) ColorMatrixType;
223 ColorMatrixType sum;
224 zeroit(sum);
225 for(int s=0;s<Ls;s++){
226 int sF = s+Ls*sU;
227 for(int spn=0;spn<Ns;spn++){ //sum over spin
228 auto bb = coalescedRead(Btilde_v[sF]()(spn) ); //color vector
229 auto aa = coalescedRead(Atilde_v[sF]()(spn) );
230 auto op = outerProduct(bb,aa);
231 sum = sum + op;
232 }
233 }
234 coalescedWrite(mat_v[sU](mu)(), sum);
235 });
236 }
237#endif
238 }
239};
240
241
246
251
252// Sp(2N)
257
258
262
266
270
271//sp 2n
272
276
280
284
285typedef WilsonImpl<vComplex, SpTwoIndexSymmetricRepresentation, CoeffReal > SpWilsonAdjImplR; // Real.. whichever prec // adj = 2indx symmetric for Sp(2N)
288
#define accelerator_inline
#define accelerator_for(iterator, num, nsimd,...)
auto Cshift(const Expression &expr, int dim, int shift) -> decltype(closure(expr))
Definition Cshift.h:55
accelerator_inline Grid_simd< S, V > cos(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > sin(const Grid_simd< S, V > &r)
B
void mult(Lattice< obj1 > &ret, const Lattice< obj2 > &lhs, const Lattice< obj3 > &rhs)
void conformable(const Lattice< obj1 > &lhs, const Lattice< obj2 > &rhs)
void LatticeCoordinate(Lattice< iobj > &l, int mu)
auto outerProduct(const Lattice< ll > &lhs, const Lattice< rr > &rhs) -> Lattice< decltype(outerProduct(ll(), rr()))>
void PokeIndex(Lattice< vobj > &lhs, const Lattice< decltype(peekIndex< Index >(vobj(), 0))> &rhs, int i)
auto PeekIndex(const Lattice< vobj > &lhs, int i) -> Lattice< decltype(peekIndex< Index >(vobj(), i))>
Lattice< vobj > real(const Lattice< vobj > &lhs)
Lattice< vobj > imag(const Lattice< vobj > &lhs)
Lattice< vobj > conjugate(const Lattice< vobj > &lhs)
Lattice< vobj > adj(const Lattice< vobj > &lhs)
vobj::scalar_object sum(const vobj *arg, Integer osites)
auto TraceIndex(const Lattice< vobj > &lhs) -> Lattice< decltype(traceIndex< Index >(vobj()))>
#define autoView(l_v, l, mode)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
@ AcceleratorRead
@ AcceleratorWrite
#define NAMESPACE_BEGIN(A)
Definition Namespace.h:35
#define NAMESPACE_END(A)
Definition Namespace.h:36
static constexpr int Nhs
Definition QCD.h:53
static constexpr int Ns
Definition QCD.h:51
static constexpr int Nd
Definition QCD.h:52
static constexpr int Nc
Definition QCD.h:50
static constexpr int Nds
Definition QCD.h:54
double RealD
Definition Simd.h:61
accelerator_inline void coalescedWrite(vobj &__restrict__ vec, const vobj &__restrict__ extracted, int lane=0)
Definition Tensor_SIMT.h:87
accelerator_inline vobj coalescedRead(const vobj &__restrict__ vec, int lane=0)
Definition Tensor_SIMT.h:61
WilsonCompressorTemplate< HCS, HS, S, WilsonProjector > WilsonCompressor
WilsonImpl< vComplex, TwoIndexSymmetricRepresentation, CoeffReal > WilsonTwoIndexSymmetricImplR
Definition WilsonImpl.h:263
WilsonImpl< vComplexF, FundamentalRepresentation, CoeffReal > WilsonImplF
Definition WilsonImpl.h:243
WilsonImpl< vComplexD, SpTwoIndexSymmetricRepresentation, CoeffReal > SpWilsonTwoIndexSymmetricImplD
Definition WilsonImpl.h:283
WilsonImpl< vComplex, SpTwoIndexSymmetricRepresentation, CoeffReal > SpWilsonTwoIndexSymmetricImplR
Definition WilsonImpl.h:281
WilsonImpl< vComplexD2, FundamentalRepresentation, CoeffComplex > ZWilsonImplD2
Definition WilsonImpl.h:250
WilsonImpl< vComplex, TwoIndexAntiSymmetricRepresentation, CoeffReal > WilsonTwoIndexAntiSymmetricImplR
Definition WilsonImpl.h:267
WilsonImpl< vComplex, SpTwoIndexAntiSymmetricRepresentation, CoeffReal > SpWilsonTwoIndexAntiSymmetricImplR
Definition WilsonImpl.h:277
WilsonImpl< vComplexD, TwoIndexSymmetricRepresentation, CoeffReal > WilsonTwoIndexSymmetricImplD
Definition WilsonImpl.h:265
WilsonImpl< vComplexD2, FundamentalRepresentation, CoeffReal > WilsonImplD2
Definition WilsonImpl.h:245
WilsonImpl< vComplex, SpTwoIndexSymmetricRepresentation, CoeffReal > SpWilsonAdjImplR
Definition WilsonImpl.h:285
WilsonImpl< vComplex, FundamentalRepresentation, CoeffReal > WilsonImplR
Definition WilsonImpl.h:242
WilsonImpl< vComplex, SpFundamentalRepresentation, CoeffComplex > ZSpWilsonImplR
Definition WilsonImpl.h:253
WilsonImpl< vComplexD, SpFundamentalRepresentation, CoeffComplex > ZSpWilsonImplD
Definition WilsonImpl.h:255
WilsonImpl< vComplexF, TwoIndexSymmetricRepresentation, CoeffReal > WilsonTwoIndexSymmetricImplF
Definition WilsonImpl.h:264
WilsonImpl< vComplex, AdjointRepresentation, CoeffReal > WilsonAdjImplR
Definition WilsonImpl.h:259
WilsonImpl< vComplexD, FundamentalRepresentation, CoeffComplex > ZWilsonImplD
Definition WilsonImpl.h:249
WilsonImpl< vComplexD, SpTwoIndexAntiSymmetricRepresentation, CoeffReal > SpWilsonTwoIndexAntiSymmetricImplD
Definition WilsonImpl.h:279
WilsonImpl< vComplexF, TwoIndexAntiSymmetricRepresentation, CoeffReal > WilsonTwoIndexAntiSymmetricImplF
Definition WilsonImpl.h:268
WilsonImpl< vComplexF, SpFundamentalRepresentation, CoeffComplex > ZSpWilsonImplF
Definition WilsonImpl.h:254
WilsonImpl< vComplexF, SpFundamentalRepresentation, CoeffReal > SpWilsonImplF
Definition WilsonImpl.h:274
WilsonImpl< vComplexF, SpTwoIndexAntiSymmetricRepresentation, CoeffReal > SpWilsonTwoIndexAntiSymmetricImplF
Definition WilsonImpl.h:278
WilsonImpl< vComplex, FundamentalRepresentation, CoeffComplex > ZWilsonImplR
Definition WilsonImpl.h:247
WilsonImpl< vComplexD, FundamentalRepresentation, CoeffReal > WilsonImplD
Definition WilsonImpl.h:244
WilsonImpl< vComplexD, SpFundamentalRepresentation, CoeffReal > SpWilsonImplD
Definition WilsonImpl.h:275
WilsonImpl< vComplexD2, SpFundamentalRepresentation, CoeffComplex > ZSpWilsonImplD2
Definition WilsonImpl.h:256
WilsonImpl< vComplexD, SpTwoIndexSymmetricRepresentation, CoeffReal > SpWilsonAdjImplD
Definition WilsonImpl.h:287
WilsonImpl< vComplex, SpFundamentalRepresentation, CoeffReal > SpWilsonImplR
Definition WilsonImpl.h:273
WilsonImpl< vComplexD, TwoIndexAntiSymmetricRepresentation, CoeffReal > WilsonTwoIndexAntiSymmetricImplD
Definition WilsonImpl.h:269
WilsonImpl< vComplexF, SpTwoIndexSymmetricRepresentation, CoeffReal > SpWilsonTwoIndexSymmetricImplF
Definition WilsonImpl.h:282
WilsonImpl< vComplexF, AdjointRepresentation, CoeffReal > WilsonAdjImplF
Definition WilsonImpl.h:260
WilsonImpl< vComplexF, SpTwoIndexSymmetricRepresentation, CoeffReal > SpWilsonAdjImplF
Definition WilsonImpl.h:286
WilsonImpl< vComplexF, FundamentalRepresentation, CoeffComplex > ZWilsonImplF
Definition WilsonImpl.h:248
WilsonImpl< vComplexD, AdjointRepresentation, CoeffReal > WilsonAdjImplD
Definition WilsonImpl.h:261
static INTERNAL_PRECISION U
Definition Zolotarev.cc:230
#define M_PI
Definition Zolotarev.cc:41
const Coordinate & GlobalDimensions(void)
Coordinate _fdimensions
GridBase * Grid(void) const
Options::template PrecisionMapper< Simd >::LowerPrecVector SimdL
Definition WilsonImpl.h:54
static accelerator_inline void multLink(_Spinor &phi, const SiteDoubledGaugeField &U, const _Spinor &chi, int mu)
Definition WilsonImpl.h:84
PeriodicGaugeImpl< GaugeImplTypes< S, Dimension > > Gimpl
Definition WilsonImpl.h:47
INHERIT_GIMPL_TYPES(Gimpl)
void DoubleStore(GridBase *GaugeGrid, DoubledGaugeField &Uds, const GaugeField &Umu)
Definition WilsonImpl.h:127
Lattice< SiteSpinor > FermionField
Definition WilsonImpl.h:68
iImplHalfSpinor< Simd > SiteHalfSpinor
Definition WilsonImpl.h:64
Lattice< SiteDoubledGaugeField > DoubledGaugeField
Definition WilsonImpl.h:70
void multLinkField(_SpinorField &out, const DoubledGaugeField &Umu, const _SpinorField &phi, int mu)
Definition WilsonImpl.h:104
constexpr bool is_fundamental() const
Definition WilsonImpl.h:51
WilsonImpl(const ImplParams &p=ImplParams())
Definition WilsonImpl.h:79
const StencilImpl::View_type StencilView
Definition WilsonImpl.h:75
iImplHalfCommSpinor< SimdL > SiteHalfCommSpinor
Definition WilsonImpl.h:65
WilsonCompressor< SiteHalfCommSpinor, SiteHalfSpinor, SiteSpinor > Compressor
Definition WilsonImpl.h:72
static accelerator_inline void loadLinkElement(Simd &reg, ref &memory)
Definition WilsonImpl.h:122
static accelerator_inline void multLink(_Spinor &phi, const SiteDoubledGaugeField &U, const _Spinor &chi, int mu, StencilEntry *SE, StencilView &St)
Definition WilsonImpl.h:93
iScalar< iVector< iVector< vtype, Dimension >, Nhs > > iImplHalfSpinor
Definition WilsonImpl.h:58
void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField &Atilde, int mu)
Definition WilsonImpl.h:193
iImplDoubledGaugeField< Simd > SiteDoubledGaugeField
Definition WilsonImpl.h:66
iVector< iScalar< iMatrix< vtype, Dimension > >, Nds > iImplDoubledGaugeField
Definition WilsonImpl.h:60
void TraceSpinImpl(GaugeLinkField &mat, PropagatorField &P)
Definition WilsonImpl.h:183
void InsertForce4D(GaugeField &mat, FermionField &Btilde, FermionField &A, int mu)
Definition WilsonImpl.h:173
iImplSpinor< Simd > SiteSpinor
Definition WilsonImpl.h:62
void outerProductImpl(PropagatorField &mat, const FermionField &B, const FermionField &A)
Definition WilsonImpl.h:179
iImplPropagator< Simd > SitePropagator
Definition WilsonImpl.h:63
iScalar< iMatrix< iMatrix< vtype, Dimension >, Ns > > iImplPropagator
Definition WilsonImpl.h:57
iScalar< iVector< iVector< vtype, Dimension >, Nhcs > > iImplHalfCommSpinor
Definition WilsonImpl.h:59
WilsonStencil< SiteSpinor, SiteHalfSpinor, ImplParams > StencilImpl
Definition WilsonImpl.h:74
iScalar< iVector< iVector< vtype, Dimension >, Ns > > iImplSpinor
Definition WilsonImpl.h:56
Lattice< SitePropagator > PropagatorField
Definition WilsonImpl.h:69
Options::_Coeff_t Coeff_t
Definition WilsonImpl.h:53
WilsonImplParams ImplParams
Definition WilsonImpl.h:73
void extractLinkField(std::vector< GaugeLinkField > &mat, DoubledGaugeField &Uds)
Definition WilsonImpl.h:187
Definition Simd.h:194
static accelerator_inline constexpr int Nsimd(void)