64template <
class cplx, ONLY_IF_SU>
70 int NNm1 = ncolour * (ncolour - 1);
71 if (lieIndex >= NNm1) {
72 diagIndex = lieIndex - NNm1;
76 sigxy = lieIndex & 0x1;
77 su2Index = lieIndex >> 1;
84template <
class cplx, ONLY_IF_SU>
94template <
class cplx, ONLY_IF_SU>
105template <
class cplx, ONLY_IF_SU>
109 int k = diagIndex + 1;
110 for (
int i = 0; i <= diagIndex; i++) {
114 RealD nrm = 1.0 / std::sqrt(2.0 * k * (k + 1));
122 assert((su2_index >= 0) && (su2_index < (ncolour * (ncolour - 1)) / 2));
124 int spare = su2_index;
125 for (i1 = 0; spare >= (ncolour - 1 - i1); i1++) {
126 spare = spare - (ncolour - 1 - i1);
135template <
class vcplx, ONLY_IF_SU>
137 Lattice<iSU2Matrix<vcplx> > &subgroup,
138 const Lattice<iGroupMatrix<vcplx> > &source,
150 subgroup_v[ss]()()(0, 0) = source_v[ss]()()(i0, i0);
151 subgroup_v[ss]()()(0, 1) = source_v[ss]()()(i0, i1);
152 subgroup_v[ss]()()(1, 0) = source_v[ss]()()(i1, i0);
153 subgroup_v[ss]()()(1, 1) = source_v[ss]()()(i1, i1);
155 iSU2Matrix<vcplx> Sigma = subgroup_v[ss];
157 Sigma = Sigma - adj(Sigma) + trace(adj(Sigma));
159 subgroup_v[ss] = Sigma;
163 Sigma()()(0, 0) * Sigma()()(1, 1) - Sigma()()(0, 1) * Sigma()()(1, 0);
170template <
class vcplx, ONLY_IF_SU>
172 Lattice<iGroupMatrix<vcplx> > &dest,
int su2_index) {
182 dest_v[ss]()()(i0, i0) = subgroup_v[ss]()()(0, 0);
183 dest_v[ss]()()(i0, i1) = subgroup_v[ss]()()(0, 1);
184 dest_v[ss]()()(i1, i0) = subgroup_v[ss]()()(1, 0);
185 dest_v[ss]()()(i1, i1) = subgroup_v[ss]()()(1, 1);
212 staple = barestaple * (beta / ncolour);
220 LatticeSU2Matrix uinv(grid);
221 LatticeSU2Matrix ua(grid);
222 LatticeSU2Matrix b(grid);
288 LatticeSU2Matrix lident(grid);
290 SU2Matrix ident =
Complex(1.0);
297 pauli1 =
timesI(pauli1) * 2.0;
298 pauli2 =
timesI(pauli2) * 2.0;
299 pauli3 =
timesI(pauli3) * 2.0;
306 Real machine_epsilon = 1.0e-7;
307 u = where(adet > machine_epsilon, u, lident);
308 udet = where(adet > machine_epsilon, udet, cone);
310 xi = 0.5 *
sqrt(udet);
311 u = 0.5 * u *
pow(xi, -1.0);
316 assert(
norm2(b) < 1.0e-4);
351 rtmp = where(wheremask, rones, rzeros);
358 std::vector<LatticeReal> xr(4, grid);
359 std::vector<LatticeReal> a(4, grid);
377 xr[1] = -
log(xr[1]) / alpha;
378 xr[2] = -
log(xr[2]) / alpha;
381 xr[3] =
cos(xr[3] * twopi);
382 xr[3] = xr[3] * xr[3];
388 xrsq = xr[2] + xr[1] * xr[3];
390 d = where(Accepted, d, xr[2] + xr[1] * xr[3]);
394 thresh = 1.0 - d * 0.5;
395 xrsq = xr[0] * xr[0];
401 newlyAccepted = where(xrsq < thresh, ione, izero);
402 Accepted = where(newlyAccepted, newlyAccepted, Accepted);
403 Accepted = where(wheremask, Accepted, izero);
406 rtmp = where(Accepted, rones, rzeros);
407 numAccepted =
sum(rtmp);
411 }
while ((numAccepted < numSites) && (hit < nheatbath));
415 a[0] = where(wheremask, 1.0 - d, a[0]);
422 a123mag =
sqrt(
abs(1.0 - a[0] * a[0]));
431 cos_theta = (cos_theta * 2.0) - 1.0;
432 sin_theta =
sqrt(
abs(1.0 - cos_theta * cos_theta));
434 a[1] = a123mag * sin_theta *
cos(phi);
435 a[2] = a123mag * sin_theta *
sin(phi);
436 a[3] = a123mag * cos_theta;
442 b = where(wheremask, uinv * ua, b);
446 link = where(Accepted, V * link, link);
451 LatticeSU2Matrix check(grid);
453 check = ua *
adj(ua) - 1.0;
454 check = where(Accepted, check, u);
455 assert(
norm2(check) < 1.0e-4);
457 check = b *
adj(b) - 1.0;
458 check = where(Accepted, check, u);
459 assert(
norm2(check) < 1.0e-4);
463 Vcheck = where(Accepted, V *
adj(V) - 1.0, Vcheck);
465 assert(
norm2(Vcheck) < 1.0e-4);
469 Vcheck = link *
adj(link) - 1.0;
470 assert(
norm2(Vcheck) < 1.0e-4);
479 <<
"Fundamental - Checking trace ta tb is 0.5 delta_ab"
481 for (
int a = 0; a < AdjointDimension; a++) {
482 for (
int b = 0; b < AdjointDimension; b++) {
486 std::cout <<
GridLogMessage <<
"(" << a <<
"," << b <<
") = " << tr
488 if (a == b) assert(
abs(tr -
Complex(0.5)) < 1.0e-6);
489 if (a != b) assert(
abs(tr) < 1.0e-6);
493 std::cout <<
GridLogMessage <<
"Fundamental - Checking if hermitian"
495 for (
int a = 0; a < AdjointDimension; a++) {
498 assert(
norm2(ta -
adj(ta)) < 1.0e-6);
502 std::cout <<
GridLogMessage <<
"Fundamental - Checking if traceless"
504 for (
int a = 0; a < AdjointDimension; a++) {
508 assert(
abs(tr) < 1.0e-6);
514template <
int N,
class vtype>
520template <
class vtype>
525template <
class vtype,
int N>
530template <class vtype,int N, typename std::enable_if< GridTypeMapper<vtype>::TensorLevel == 0 >
::type * =
nullptr>
535template <
typename LatticeMatrixType>
543template<
typename Fundamental,
typename GaugeMat>
553template<
typename Gimpl>
554static void GaugeTransform(
typename Gimpl::GaugeField &Umu,
typename Gimpl::GaugeLinkField &g){
558 typename Gimpl::GaugeLinkField
U(grid);
559 typename Gimpl::GaugeLinkField ag(grid); ag =
adj(g);
561 for(
int mu=0;mu<
Nd;mu++){
563 U = g*
U*Gimpl::CshiftLink(ag, mu, 1);
567template<
typename Gimpl>
568static void GaugeTransform( std::vector<typename Gimpl::GaugeLinkField> &
U,
typename Gimpl::GaugeLinkField &g){
570 typename Gimpl::GaugeLinkField ag(grid); ag =
adj(g);
571 for(
int mu=0;mu<
Nd;mu++){
572 U[mu] = g*
U[mu]*Gimpl::CshiftLink(ag, mu, 1);
575template<
typename Gimpl>
577 LieRandomize(pRNG,g,1.0);
#define accelerator_inline
#define accelerator_for(iterator, num, nsimd,...)
accelerator_inline void timesI(Grid_simd2< S, V > &ret, const Grid_simd2< S, V > &in)
accelerator_inline Grid_simd2< S, V > trace(const Grid_simd2< S, V > &arg)
accelerator_inline Grid_simd< S, V > cos(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > abs(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > sin(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > sqrt(const Grid_simd< S, V > &r)
accelerator_inline Grid_simd< S, V > log(const Grid_simd< S, V > &r)
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< typename vobj::Complexified > toComplex(const Lattice< vobj > &lhs)
Lattice< typename vobj::Realified > toReal(const Lattice< vobj > &lhs)
Lattice< vobj > adj(const Lattice< vobj > &lhs)
vobj::scalar_object sum(const vobj *arg, Integer osites)
RealD norm2(const Lattice< vobj > &arg)
void random(GridParallelRNG &rng, Lattice< vobj > &l)
Lattice< iScalar< iScalar< iScalar< Vec > > > > Determinant(const Lattice< iScalar< iScalar< iMatrix< Vec, N > > > > &Umu)
Lattice< obj > pow(const Lattice< obj > &rhs_i, RealD y)
#define autoView(l_v, l, mode)
GridLogger GridLogMessage(1, "Message", GridLogColours, "NORMAL")
Lattice< vTReal > LatticeReal
Lattice< vTInteger > LatticeInteger
iScalar< iScalar< iScalar< vtype > > > iSinglet
Lattice< vTComplex > LatticeComplex
static void taProj(const LatticeMatrixType &in, LatticeMatrixType &out, GroupName::SU)
static Lattice< iScalar< iScalar< iMatrix< vtype, N > > > > ProjectOnGeneralGroup(const Lattice< iScalar< iScalar< iMatrix< vtype, N > > > > &Umu, GroupName::SU)
static void generatorSigmaX(int su2Index, iGroupMatrix< cplx > &ta)
static void su2Extract(Lattice< iSinglet< vcplx > > &Determinant, Lattice< iSU2Matrix< vcplx > > &subgroup, const Lattice< iGroupMatrix< vcplx > > &source, int su2_index)
static accelerator_inline void su2SubGroupIndex(int &i1, int &i2, int su2_index, GroupName::SU)
static int su2subgroups(GroupName::SU)
static void su2Insert(const Lattice< iSU2Matrix< vcplx > > &subgroup, Lattice< iGroupMatrix< vcplx > > &dest, int su2_index)
static void GaugeTransform(typename Gimpl::GaugeField &Umu, typename Gimpl::GaugeLinkField &g)
static void SubGroupHeatBath(GridSerialRNG &sRNG, GridParallelRNG &pRNG, RealD beta, LatticeMatrix &link, const LatticeMatrix &barestaple, int su2_subgroup, int nheatbath, LatticeInteger &wheremask)
static void testGenerators(GroupName::SU)
static void generatorSigmaY(int su2Index, iGroupMatrix< cplx > &ta)
static void generator(int lieIndex, iGroupMatrix< cplx > &ta, GroupName::SU)
static void GaugeTransformFundamental(Fundamental &ferm, GaugeMat &g)
static void generatorDiagonal(int diagIndex, iGroupMatrix< cplx > &ta)
static void RandomGaugeTransform(GridParallelRNG &pRNG, typename Gimpl::GaugeField &Umu, typename Gimpl::GaugeLinkField &g)
std::complex< Real > Complex
accelerator_inline iScalar< vtype > ProjectOnGroup(const iScalar< vtype > &r)
accelerator_inline iScalar< vtype > Ta(const iScalar< vtype > &r)
accelerator_inline std::enable_if<!isGridTensor< T >::value, T >::type TensorRemove(T arg)
static INTERNAL_PRECISION U
static void generator(int lieIndex, iGroupMatrix< cplx > &ta, GroupName::SU)