45template <
class S,
class Representation = FundamentalRepresentation,
class Options=CoeffReal>
49 static const int Dimension = Representation::Dimension;
51 static const int Nhcs = Options::Nhcs;
58 typedef typename Options::_Coeff_t
Coeff_t;
59 typedef typename Options::template PrecisionMapper<Simd>::LowerPrecVector
SimdL;
88 template<
class _Spinor>
97 template<
class _Spinor>
124 int permute_lane = (sl==1)
125 || ((distance== 1)&&(icoor[direction]==1))
126 || ((distance==-1)&&(icoor[direction]==0));
131 int f_upper = permute_lane ? 1 : 0;
132 int f_lower = !f_upper;
134 mult(&phi(0),&UU0,&chi(f_upper));
135 mult(&phi(1),&UU1,&chi(f_lower));
138 typedef _Spinor vobj;
139 typedef typename SiteHalfSpinor::scalar_object sobj;
140 typedef typename SiteHalfSpinor::vector_type vector_type;
145 const int Nsimd =vector_type::Nsimd();
151 assert((distance == 1) || (distance == -1));
152 assert((sl == 1) || (sl == 2));
155 if ( mmu < Nd-1 && SE->_around_the_world && St.
parameters.twists[mmu] ) {
161 for(
int s=0;s<Nsimd;s++){
165 assert((icoor[direction]==0)||(icoor[direction]==1));
168 if ( distance == 1) {
169 permute_lane = icoor[direction]?1:0;
171 permute_lane = icoor[direction]?0:1;
174 if ( permute_lane ) {
175 stmp(0) = vals[s](1);
176 stmp(1) = vals[s](0);
186 mult(&phi(0),&
U(0)(mu),&vtmp(0));
187 mult(&phi(1),&
U(1)(mu),&vtmp(1));
190 mult(&phi(0),&
U(0)(mu),&chi(0));
191 mult(&phi(1),&
U(1)(mu),&chi(1));
197 template<
class _SpinorField>
200 const _SpinorField & phi,
219 Uds_v[ss](0)(mu) = poke_f0_v[ss]();
220 Uds_v[ss](1)(mu) = poke_f1_v[ss]();
230 GaugeLinkField Utmp (GaugeGrid);
231 GaugeLinkField
U (GaugeGrid);
232 GaugeLinkField Uconj(GaugeGrid);
238 for(
int mu=0;mu<
Nd-1;mu++){
250 if (
Params.twists[mu] ) {
251 Uconj = where(coor==neglink,-Uconj,Uconj);
260 Uds_v[ss](0)(mu) = U_v[ss]();
261 Uds_v[ss](1)(mu) = Uconj_v[ss]();
269 if (
Params.twists[mu] ) {
270 Utmp = where(coor==0,Uconj,Utmp);
277 Uds_v[ss](0)(mu+4) = Utmp_v[ss]();
281 if (
Params.twists[mu] ) {
282 Utmp = where(coor==0,
U,Utmp);
289 Uds_v[ss](1)(mu+4) = Utmp_v[ss]();
303 GaugeLinkField *Upoke = &
U;
306 Utmp = where(coor == Lmu, -
U,
U);
318 U = where(coor == 0, -Utmp, Utmp);
330 GaugeLinkField link(mat.Grid());
338 link_v[ss]() = tmp_v[ss](0, 0) +
conjugate(tmp_v[ss](1, 1));
378 accelerator_for(sss,mat.Grid()->oSites(), FermionField::vector_type::Nsimd(),{
380 typedef decltype(coalescedRead(mat_v[sU](mu)() )) ColorMatrixType;
383 for(int s=0;s<Ls;s++){
385 for(int spn=0;spn<Ns;spn++){
387 auto bb = coalescedRead(Btilde_v[sF](0)(spn) );
388 auto aa = coalescedRead(Atilde_v[sF](0)(spn) );
389 sum = sum + outerProduct(bb,aa);
392 bb = coalescedRead(Btilde_v[sF](1)(spn) );
393 aa = coalescedRead(Atilde_v[sF](1)(spn) );
394 sum = sum + conjugate(outerProduct(bb,aa));
accelerator_inline int acceleratorSIMTlane(int Nsimd)
#define accelerator_inline
#define accelerator_for(iterator, num, nsimd,...)
AcceleratorVector< int, MaxDims > Coordinate
auto Cshift(const Expression &expr, int dim, int shift) -> decltype(closure(expr))
GparityWilsonImpl< vComplex, FundamentalRepresentation, CoeffReal > GparityWilsonImplR
GparityWilsonImpl< vComplexF, FundamentalRepresentation, CoeffReal > GparityWilsonImplF
GparityWilsonImpl< vComplexD, FundamentalRepresentation, CoeffReal > GparityWilsonImplD
void mult(Lattice< obj1 > &ret, const Lattice< obj2 > &lhs, const Lattice< obj3 > &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 > 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)
#define NAMESPACE_BEGIN(A)
accelerator_inline void coalescedWrite(vobj &__restrict__ vec, const vobj &__restrict__ extracted, int lane=0)
accelerator_inline vobj coalescedRead(const vobj &__restrict__ vec, int lane=0)
#define thread_foreach(i, container,...)
WilsonCompressorTemplate< HCS, HS, S, WilsonProjector > WilsonCompressor
static INTERNAL_PRECISION U
StencilVector _permute_type
accelerator_inline void iCoorFromIindex(Coordinate &coor, int lane) const
StencilVector _directions
static accelerator_inline void multLink(_Spinor &phi, const SiteDoubledGaugeField &U, const _Spinor &chi, int mu)
ConjugateGaugeImpl< GaugeImplTypes< S, Dimension > > Gimpl
void outerProductImpl(PropagatorField &mat, const FermionField &Btilde, const FermionField &A)
void DoubleStore(GridBase *GaugeGrid, DoubledGaugeField &Uds, const GaugeField &Umu)
Options::_Coeff_t Coeff_t
Lattice< SitePropagator > PropagatorField
void extractLinkField(std::vector< GaugeLinkField > &mat, DoubledGaugeField &Uds)
void InsertForce5D(GaugeField &mat, FermionField &Btilde, FermionField Ã, int mu)
iVector< iVector< iVector< vtype, Dimension >, Ns >, Ngp > iImplSpinor
Lattice< SiteSpinor > FermionField
void pokeGparityDoubledGaugeField(DoubledGaugeField &Uds, const GaugeLinkField &poke_f0, const GaugeLinkField &poke_f1, const int mu)
static const bool LsVectorised
iMatrix< iMatrix< iMatrix< vtype, Dimension >, Ns >, Ngp > iImplPropagator
WilsonStencil< SiteSpinor, SiteHalfSpinor, ImplParams > StencilImpl
iImplDoubledGaugeField< Simd > SiteDoubledGaugeField
void InsertForce4D(GaugeField &mat, FermionField &Btilde, FermionField &A, int mu)
static const bool isFundamental
StencilImpl::View_type StencilView
void TraceSpinImpl(GaugeLinkField &mat, PropagatorField &P)
static const int Dimension
static const bool isGparity
iVector< iVector< iScalar< iMatrix< vtype, Dimension > >, Nds >, Ngp > iImplDoubledGaugeField
iImplHalfSpinor< Simd > SiteHalfSpinor
iVector< iVector< iVector< vtype, Dimension >, Nhs >, Ngp > iImplHalfSpinor
Options::template PrecisionMapper< Simd >::LowerPrecVector SimdL
Lattice< SiteDoubledGaugeField > DoubledGaugeField
iImplHalfCommSpinor< SimdL > SiteHalfCommSpinor
iImplPropagator< Simd > SitePropagator
iVector< iVector< iVector< vtype, Dimension >, Nhcs >, Ngp > iImplHalfCommSpinor
WilsonCompressor< SiteHalfCommSpinor, SiteHalfSpinor, SiteSpinor > Compressor
static accelerator_inline void multLink(_Spinor &phi, const SiteDoubledGaugeField &U, const _Spinor &chi, int mu, StencilEntry *SE, StencilView &St)
INHERIT_GIMPL_TYPES(Gimpl)
GparityWilsonImplParams ImplParams
GparityWilsonImpl(const ImplParams &p=ImplParams())
iImplSpinor< Simd > SiteSpinor
void multLinkField(_SpinorField &out, const DoubledGaugeField &Umu, const _SpinorField &phi, int mu)
static accelerator_inline void loadLinkElement(Simd ®, ref &memory)
const Coordinate & GlobalDimensions(void)
GridBase * Grid(void) const
Base::View_type View_type
static accelerator_inline constexpr int Nsimd(void)
uint8_t _around_the_world