mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-10 06:00:45 +01:00
Unify TwoIndex
This commit is contained in:
parent
aa9df63a05
commit
e8ad1fef53
@ -25,63 +25,73 @@
|
|||||||
#ifndef QCD_UTIL_SUN2INDEX_H
|
#ifndef QCD_UTIL_SUN2INDEX_H
|
||||||
#define QCD_UTIL_SUN2INDEX_H
|
#define QCD_UTIL_SUN2INDEX_H
|
||||||
|
|
||||||
|
|
||||||
NAMESPACE_BEGIN(Grid);
|
NAMESPACE_BEGIN(Grid);
|
||||||
|
|
||||||
enum TwoIndexSymmetry { Symmetric = 1, AntiSymmetric = -1 };
|
enum TwoIndexSymmetry { Symmetric = 1, AntiSymmetric = -1 };
|
||||||
|
|
||||||
inline Real delta(int a, int b) { return (a == b) ? 1.0 : 0.0; }
|
inline Real delta(int a, int b) { return (a == b) ? 1.0 : 0.0; }
|
||||||
|
|
||||||
template <int ncolour, TwoIndexSymmetry S>
|
template <int ncolour, TwoIndexSymmetry S, class group_name>
|
||||||
class SU_TwoIndex : public SU<ncolour> {
|
class GaugeGroupTwoIndex : public GaugeGroup<ncolour, group_name> {
|
||||||
public:
|
public:
|
||||||
static const int Dimension = ncolour * (ncolour + S) / 2;
|
// The chosen convention is that we are taking ncolour to be N in SU<N> but 2N
|
||||||
static const int NumGenerators = SU<ncolour>::AdjointDimension;
|
// in Sp(2N). ngroup is equal to N for SU but 2N/2 = N for Sp(2N).
|
||||||
|
static_assert(std::is_same<group_name, GroupName::SU>::value or
|
||||||
|
std::is_same<group_name, GroupName::Sp>::value,
|
||||||
|
"ngroup is only implemented for SU and Sp currently.");
|
||||||
|
static const int ngroup =
|
||||||
|
std::is_same<group_name, GroupName::SU>::value ? ncolour : ncolour / 2;
|
||||||
|
static const int Dimension = ngroup * (ncolour + S) / 2;
|
||||||
|
static const int NumGenerators =
|
||||||
|
GaugeGroup<ncolour, group_name>::AlgebraDimension;
|
||||||
|
|
||||||
template <typename vtype>
|
template <typename vtype>
|
||||||
using iSUnTwoIndexMatrix = iScalar<iScalar<iMatrix<vtype, Dimension> > >;
|
using iGroupTwoIndexMatrix = iScalar<iScalar<iMatrix<vtype, Dimension> > >;
|
||||||
|
|
||||||
typedef iSUnTwoIndexMatrix<Complex> TIMatrix;
|
typedef iGroupTwoIndexMatrix<Complex> TIMatrix;
|
||||||
typedef iSUnTwoIndexMatrix<ComplexF> TIMatrixF;
|
typedef iGroupTwoIndexMatrix<ComplexF> TIMatrixF;
|
||||||
typedef iSUnTwoIndexMatrix<ComplexD> TIMatrixD;
|
typedef iGroupTwoIndexMatrix<ComplexD> TIMatrixD;
|
||||||
|
|
||||||
typedef iSUnTwoIndexMatrix<vComplex> vTIMatrix;
|
typedef iGroupTwoIndexMatrix<vComplex> vTIMatrix;
|
||||||
typedef iSUnTwoIndexMatrix<vComplexF> vTIMatrixF;
|
typedef iGroupTwoIndexMatrix<vComplexF> vTIMatrixF;
|
||||||
typedef iSUnTwoIndexMatrix<vComplexD> vTIMatrixD;
|
typedef iGroupTwoIndexMatrix<vComplexD> vTIMatrixD;
|
||||||
|
|
||||||
typedef Lattice<vTIMatrix> LatticeTwoIndexMatrix;
|
typedef Lattice<vTIMatrix> LatticeTwoIndexMatrix;
|
||||||
typedef Lattice<vTIMatrixF> LatticeTwoIndexMatrixF;
|
typedef Lattice<vTIMatrixF> LatticeTwoIndexMatrixF;
|
||||||
typedef Lattice<vTIMatrixD> LatticeTwoIndexMatrixD;
|
typedef Lattice<vTIMatrixD> LatticeTwoIndexMatrixD;
|
||||||
|
|
||||||
typedef Lattice<iVector<iScalar<iMatrix<vComplex, Dimension> >, Nd> >
|
typedef Lattice<iVector<iScalar<iMatrix<vComplex, Dimension> >, Nd> >
|
||||||
LatticeTwoIndexField;
|
LatticeTwoIndexField;
|
||||||
typedef Lattice<iVector<iScalar<iMatrix<vComplexF, Dimension> >, Nd> >
|
typedef Lattice<iVector<iScalar<iMatrix<vComplexF, Dimension> >, Nd> >
|
||||||
LatticeTwoIndexFieldF;
|
LatticeTwoIndexFieldF;
|
||||||
typedef Lattice<iVector<iScalar<iMatrix<vComplexD, Dimension> >, Nd> >
|
typedef Lattice<iVector<iScalar<iMatrix<vComplexD, Dimension> >, Nd> >
|
||||||
LatticeTwoIndexFieldD;
|
LatticeTwoIndexFieldD;
|
||||||
|
|
||||||
template <typename vtype>
|
template <typename vtype>
|
||||||
using iSUnMatrix = iScalar<iScalar<iMatrix<vtype, ncolour> > >;
|
using iGroupMatrix = iScalar<iScalar<iMatrix<vtype, ncolour> > >;
|
||||||
|
|
||||||
typedef iSUnMatrix<Complex> Matrix;
|
typedef iGroupMatrix<Complex> Matrix;
|
||||||
typedef iSUnMatrix<ComplexF> MatrixF;
|
typedef iGroupMatrix<ComplexF> MatrixF;
|
||||||
typedef iSUnMatrix<ComplexD> MatrixD;
|
typedef iGroupMatrix<ComplexD> MatrixD;
|
||||||
|
|
||||||
template <class cplx>
|
template <class cplx>
|
||||||
static void base(int Index, iSUnMatrix<cplx> &eij) {
|
static void base(int Index, iGroupMatrix<cplx> &eij) {
|
||||||
// returns (e)^(ij)_{kl} necessary for change of base U_F -> U_R
|
// returns (e)^(ij)_{kl} necessary for change of base U_F -> U_R
|
||||||
assert(Index < NumGenerators);
|
assert(Index < NumGenerators);
|
||||||
eij = Zero();
|
eij = Zero();
|
||||||
|
|
||||||
// for the linearisation of the 2 indexes
|
// for the linearisation of the 2 indexes
|
||||||
static int a[ncolour * (ncolour - 1) / 2][2]; // store the a <-> i,j
|
static int a[ncolour * (ncolour - 1) / 2][2]; // store the a <-> i,j
|
||||||
static bool filled = false;
|
static bool filled = false;
|
||||||
if (!filled) {
|
if (!filled) {
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
for (int i = 1; i < ncolour; i++) {
|
for (int i = 1; i < ncolour; i++) {
|
||||||
for (int j = 0; j < i; j++) {
|
for (int j = 0; j < i; j++) {
|
||||||
a[counter][0] = i;
|
a[counter][0] = i;
|
||||||
a[counter][1] = j;
|
a[counter][1] =
|
||||||
|
i == ngroup ? j + 1
|
||||||
|
: j; // this will only ever trigger for Sp because
|
||||||
|
// ngroup == ncolour is out of range for SU
|
||||||
counter++;
|
counter++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -89,26 +99,65 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Index < ncolour * (ncolour - 1) / 2) {
|
if (Index < ncolour * (ncolour - 1) / 2) {
|
||||||
baseOffDiagonal(a[Index][0], a[Index][1], eij);
|
baseOffDiagonal(a[Index][0], a[Index][1], eij, group_name());
|
||||||
} else {
|
} else {
|
||||||
baseDiagonal(Index, eij);
|
baseDiagonal(Index, eij);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class cplx>
|
template <class cplx>
|
||||||
static void baseDiagonal(int Index, iSUnMatrix<cplx> &eij) {
|
static void baseDiagonal(int Index, iGroupMatrix<cplx> &eij) {
|
||||||
eij = Zero();
|
eij = Zero();
|
||||||
eij()()(Index - ncolour * (ncolour - 1) / 2,
|
eij()()(Index - ncolour * (ncolour - 1) / 2,
|
||||||
Index - ncolour * (ncolour - 1) / 2) = 1.0;
|
Index - ncolour * (ncolour - 1) / 2) = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class cplx>
|
template <class cplx>
|
||||||
static void baseOffDiagonal(int i, int j, iSUnMatrix<cplx> &eij) {
|
static void baseOffDiagonal(int i, int j, iGroupMatrix<cplx> &eij,
|
||||||
|
GroupName::Sp) {
|
||||||
|
eij = Zero();
|
||||||
|
RealD tmp;
|
||||||
|
|
||||||
|
if ((i == ngroup + j) && (1 <= j) && (j < ngroup)) {
|
||||||
|
for (int k = 0; k < ngroup; k++) {
|
||||||
|
if (k < j) {
|
||||||
|
tmp = sqrt(2 * j * (j + 1));
|
||||||
|
tmp = 1 / tmp;
|
||||||
|
tmp *= std::sqrt(2.0);
|
||||||
|
eij()()(k, k + ngroup) = tmp;
|
||||||
|
eij()()(k + ngroup, k) = -tmp;
|
||||||
|
}
|
||||||
|
if (k == j) {
|
||||||
|
tmp = sqrt(2 * j * (j + 1));
|
||||||
|
tmp = -j / tmp;
|
||||||
|
tmp *= std::sqrt(2.0);
|
||||||
|
eij()()(k, k + ngroup) = tmp;
|
||||||
|
eij()()(k + ngroup, k) = -tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (i != ngroup + j) {
|
||||||
|
for (int k = 0; k < ncolour; k++)
|
||||||
|
for (int l = 0; l < ncolour; l++) {
|
||||||
|
eij()()(l, k) =
|
||||||
|
delta(i, k) * delta(j, l) + S * delta(j, k) * delta(i, l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RealD nrm = 1. / std::sqrt(2.0);
|
||||||
|
eij = eij * nrm;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class cplx>
|
||||||
|
static void baseOffDiagonal(int i, int j, iGroupMatrix<cplx> &eij,
|
||||||
|
GroupName::SU) {
|
||||||
eij = Zero();
|
eij = Zero();
|
||||||
for (int k = 0; k < ncolour; k++)
|
for (int k = 0; k < ncolour; k++)
|
||||||
for (int l = 0; l < ncolour; l++)
|
for (int l = 0; l < ncolour; l++)
|
||||||
eij()()(l, k) = delta(i, k) * delta(j, l) +
|
eij()()(l, k) =
|
||||||
S * delta(j, k) * delta(i, l);
|
delta(i, k) * delta(j, l) + S * delta(j, k) * delta(i, l);
|
||||||
|
|
||||||
RealD nrm = 1. / std::sqrt(2.0);
|
RealD nrm = 1. / std::sqrt(2.0);
|
||||||
eij = eij * nrm;
|
eij = eij * nrm;
|
||||||
@ -125,22 +174,21 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class cplx>
|
template <class cplx>
|
||||||
static void generator(int Index, iSUnTwoIndexMatrix<cplx> &i2indTa) {
|
static void generator(int Index, iGroupTwoIndexMatrix<cplx> &i2indTa) {
|
||||||
Vector<iSUnMatrix<cplx> > ta(ncolour * ncolour - 1);
|
Vector<iGroupMatrix<cplx> > ta(NumGenerators);
|
||||||
Vector<iSUnMatrix<cplx> > eij(Dimension);
|
Vector<iGroupMatrix<cplx> > eij(Dimension);
|
||||||
iSUnMatrix<cplx> tmp;
|
iGroupMatrix<cplx> tmp;
|
||||||
i2indTa = Zero();
|
i2indTa = Zero();
|
||||||
|
|
||||||
for (int a = 0; a < ncolour * ncolour - 1; a++)
|
for (int a = 0; a < ncolour * ncolour - 1; a++)
|
||||||
SU<ncolour>::generator(a, ta[a]);
|
GaugeGroup<ncolour, group_name>::generator(a, ta[a]);
|
||||||
|
|
||||||
for (int a = 0; a < Dimension; a++) base(a, eij[a]);
|
for (int a = 0; a < Dimension; a++) base(a, eij[a]);
|
||||||
|
|
||||||
for (int a = 0; a < Dimension; a++) {
|
for (int a = 0; a < Dimension; a++) {
|
||||||
tmp = transpose(ta[Index]) * adj(eij[a]) + adj(eij[a]) * ta[Index];
|
tmp = transpose(ta[Index]) * adj(eij[a]) + adj(eij[a]) * ta[Index];
|
||||||
for (int b = 0; b < Dimension; b++) {
|
for (int b = 0; b < Dimension; b++) {
|
||||||
iSUnMatrix<cplx> tmp1 =
|
iGroupMatrix<cplx> tmp1 = tmp * eij[b];
|
||||||
tmp * eij[b];
|
|
||||||
Complex iTr = TensorRemove(timesI(trace(tmp1)));
|
Complex iTr = TensorRemove(timesI(trace(tmp1)));
|
||||||
i2indTa()()(a, b) = iTr;
|
i2indTa()()(a, b) = iTr;
|
||||||
}
|
}
|
||||||
@ -195,8 +243,8 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void TwoIndexLieAlgebraMatrix(
|
static void TwoIndexLieAlgebraMatrix(
|
||||||
const typename SU<ncolour>::LatticeAlgebraVector &h,
|
const typename SU<ncolour>::LatticeAlgebraVector &h,
|
||||||
LatticeTwoIndexMatrix &out, Real scale = 1.0) {
|
LatticeTwoIndexMatrix &out, Real scale = 1.0) {
|
||||||
conformable(h, out);
|
conformable(h, out);
|
||||||
GridBase *grid = out.Grid();
|
GridBase *grid = out.Grid();
|
||||||
LatticeTwoIndexMatrix la(grid);
|
LatticeTwoIndexMatrix la(grid);
|
||||||
@ -214,8 +262,8 @@ public:
|
|||||||
// Projects the algebra components
|
// Projects the algebra components
|
||||||
// of a lattice matrix ( of dimension ncol*ncol -1 )
|
// of a lattice matrix ( of dimension ncol*ncol -1 )
|
||||||
static void projectOnAlgebra(
|
static void projectOnAlgebra(
|
||||||
typename SU<ncolour>::LatticeAlgebraVector &h_out,
|
typename SU<ncolour>::LatticeAlgebraVector &h_out,
|
||||||
const LatticeTwoIndexMatrix &in, Real scale = 1.0) {
|
const LatticeTwoIndexMatrix &in, Real scale = 1.0) {
|
||||||
conformable(h_out, in);
|
conformable(h_out, in);
|
||||||
h_out = Zero();
|
h_out = Zero();
|
||||||
TIMatrix i2indTa;
|
TIMatrix i2indTa;
|
||||||
@ -233,7 +281,7 @@ public:
|
|||||||
const LatticeTwoIndexMatrix &in, Real scale = 1.0) {
|
const LatticeTwoIndexMatrix &in, Real scale = 1.0) {
|
||||||
conformable(h_out, in);
|
conformable(h_out, in);
|
||||||
// to store the generators
|
// to store the generators
|
||||||
static std::vector<TIMatrix> i2indTa(ncolour * ncolour -1);
|
static std::vector<TIMatrix> i2indTa(ncolour * ncolour - 1);
|
||||||
h_out = Zero();
|
h_out = Zero();
|
||||||
static bool precalculated = false;
|
static bool precalculated = false;
|
||||||
if (!precalculated) {
|
if (!precalculated) {
|
||||||
@ -242,7 +290,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Real coefficient =
|
Real coefficient =
|
||||||
-2.0 / (ncolour + 2 * S) * scale; // 2/(Nc +/- 2) for the normalization
|
-2.0 / (ncolour + 2 * S) * scale; // 2/(Nc +/- 2) for the normalization
|
||||||
// of the trace in the two index rep
|
// of the trace in the two index rep
|
||||||
|
|
||||||
for (int a = 0; a < ncolour * ncolour - 1; a++) {
|
for (int a = 0; a < ncolour * ncolour - 1; a++) {
|
||||||
@ -252,6 +300,9 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <int ncolour, TwoIndexSymmetry S>
|
||||||
|
using SU_TwoIndex = GaugeGroupTwoIndex<ncolour, S, GroupName::SU>;
|
||||||
|
|
||||||
// Some useful type names
|
// Some useful type names
|
||||||
typedef SU_TwoIndex<Nc, Symmetric> TwoIndexSymmMatrices;
|
typedef SU_TwoIndex<Nc, Symmetric> TwoIndexSymmMatrices;
|
||||||
typedef SU_TwoIndex<Nc, AntiSymmetric> TwoIndexAntiSymmMatrices;
|
typedef SU_TwoIndex<Nc, AntiSymmetric> TwoIndexAntiSymmMatrices;
|
||||||
@ -266,6 +317,19 @@ typedef SU_TwoIndex<3, AntiSymmetric> SU3TwoIndexAntiSymm;
|
|||||||
typedef SU_TwoIndex<4, AntiSymmetric> SU4TwoIndexAntiSymm;
|
typedef SU_TwoIndex<4, AntiSymmetric> SU4TwoIndexAntiSymm;
|
||||||
typedef SU_TwoIndex<5, AntiSymmetric> SU5TwoIndexAntiSymm;
|
typedef SU_TwoIndex<5, AntiSymmetric> SU5TwoIndexAntiSymm;
|
||||||
|
|
||||||
|
template <int ncolour, TwoIndexSymmetry S>
|
||||||
|
using Sp_TwoIndex = GaugeGroupTwoIndex<ncolour, S, GroupName::Sp>;
|
||||||
|
|
||||||
|
typedef Sp_TwoIndex<Nc, Symmetric> SpTwoIndexSymmMatrices;
|
||||||
|
typedef Sp_TwoIndex<Nc, AntiSymmetric> SpTwoIndexAntiSymmMatrices;
|
||||||
|
|
||||||
|
typedef Sp_TwoIndex<2, Symmetric> Sp2TwoIndexSymm;
|
||||||
|
typedef Sp_TwoIndex<4, Symmetric> Sp4TwoIndexSymm;
|
||||||
|
|
||||||
|
typedef Sp_TwoIndex<2, AntiSymmetric> Sp2TwoIndexAntiSymm;
|
||||||
|
typedef Sp_TwoIndex<4, AntiSymmetric> Sp4TwoIndexAntiSymm;
|
||||||
|
|
||||||
|
|
||||||
NAMESPACE_END(Grid);
|
NAMESPACE_END(Grid);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -1,319 +0,0 @@
|
|||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// * Two index representation generators
|
|
||||||
//
|
|
||||||
// * Normalisation for the fundamental generators:
|
|
||||||
// trace ta tb = 1/2 delta_ab = T_F delta_ab
|
|
||||||
// T_F = 1/2 for SU(N) groups
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// base for NxN two index (anti-symmetric) matrices
|
|
||||||
// normalized to 1 (d_ij is the kroenecker delta)
|
|
||||||
//
|
|
||||||
// (e^(ij)_{kl} = 1 / sqrt(2) (d_ik d_jl +/- d_jk d_il)
|
|
||||||
//
|
|
||||||
// Then the generators are written as
|
|
||||||
//
|
|
||||||
// (iT_a)^(ij)(lk) = i * ( tr[e^(ij)^dag e^(lk) T^trasp_a] +
|
|
||||||
// tr[e^(lk)e^(ij)^dag T_a] ) //
|
|
||||||
//
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// Authors: David Preti, Guido Cossu
|
|
||||||
|
|
||||||
#ifndef QCD_UTIL_SP2N2INDEX_H
|
|
||||||
#define QCD_UTIL_SP2N2INDEX_H
|
|
||||||
|
|
||||||
|
|
||||||
NAMESPACE_BEGIN(Grid);
|
|
||||||
|
|
||||||
//enum SpTwoIndexSymmetry { S = 1, AS = -1 };
|
|
||||||
|
|
||||||
//inline Real delta(int a, int b) { return (a == b) ? 1.0 : 0.0; }
|
|
||||||
|
|
||||||
template <int ncolour, TwoIndexSymmetry S>
|
|
||||||
class Sp_TwoIndex : public Sp<ncolour> {
|
|
||||||
public:
|
|
||||||
static const int nsp = ncolour/2;
|
|
||||||
static const int Dimension = nsp * (ncolour + S) - 1 ;
|
|
||||||
static const int NumGenerators = Sp<ncolour>::AlgebraDimension;
|
|
||||||
|
|
||||||
template <typename vtype>
|
|
||||||
using iSp2nTwoIndexMatrix = iScalar<iScalar<iMatrix<vtype, Dimension> > >;
|
|
||||||
|
|
||||||
typedef iSp2nTwoIndexMatrix<Complex> TIMatrix;
|
|
||||||
typedef iSp2nTwoIndexMatrix<ComplexF> TIMatrixF;
|
|
||||||
typedef iSp2nTwoIndexMatrix<ComplexD> TIMatrixD;
|
|
||||||
|
|
||||||
typedef iSp2nTwoIndexMatrix<vComplex> vTIMatrix;
|
|
||||||
typedef iSp2nTwoIndexMatrix<vComplexF> vTIMatrixF;
|
|
||||||
typedef iSp2nTwoIndexMatrix<vComplexD> vTIMatrixD;
|
|
||||||
|
|
||||||
typedef Lattice<vTIMatrix> LatticeTwoIndexMatrix;
|
|
||||||
typedef Lattice<vTIMatrixF> LatticeTwoIndexMatrixF;
|
|
||||||
typedef Lattice<vTIMatrixD> LatticeTwoIndexMatrixD;
|
|
||||||
|
|
||||||
typedef Lattice<iVector<iScalar<iMatrix<vComplex, Dimension> >, Nd> >
|
|
||||||
LatticeTwoIndexField;
|
|
||||||
typedef Lattice<iVector<iScalar<iMatrix<vComplexF, Dimension> >, Nd> >
|
|
||||||
LatticeTwoIndexFieldF;
|
|
||||||
typedef Lattice<iVector<iScalar<iMatrix<vComplexD, Dimension> >, Nd> >
|
|
||||||
LatticeTwoIndexFieldD;
|
|
||||||
|
|
||||||
template <typename vtype>
|
|
||||||
using iSp2nMatrix = iScalar<iScalar<iMatrix<vtype, ncolour> > >;
|
|
||||||
|
|
||||||
typedef iSp2nMatrix<Complex> Matrix;
|
|
||||||
typedef iSp2nMatrix<ComplexF> MatrixF;
|
|
||||||
typedef iSp2nMatrix<ComplexD> MatrixD;
|
|
||||||
|
|
||||||
template <class cplx>
|
|
||||||
static void base(int Index, iSp2nMatrix<cplx> &eij) {
|
|
||||||
// returns (e)^(ij)_{kl} necessary for change of base U_F -> U_R
|
|
||||||
assert(Index < NumGenerators);
|
|
||||||
eij = Zero();
|
|
||||||
|
|
||||||
// for the linearisation of the 2 indexes
|
|
||||||
static int a[ncolour * (ncolour - 1) / 2][2]; // store the a <-> i,j
|
|
||||||
static bool filled = false;
|
|
||||||
if (!filled) {
|
|
||||||
int counter = 0;
|
|
||||||
for (int i = 1; i < ncolour; i++) {
|
|
||||||
for (int j = 0; j < i; j++) {
|
|
||||||
|
|
||||||
if (i==nsp)
|
|
||||||
{
|
|
||||||
j = j+1;
|
|
||||||
}
|
|
||||||
a[counter][0] = i;
|
|
||||||
a[counter][1] = j;
|
|
||||||
counter++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
filled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Index < ncolour * (ncolour - 1) / 2) {
|
|
||||||
baseOffDiagonal(a[Index][0], a[Index][1], eij);
|
|
||||||
} else {
|
|
||||||
baseDiagonal(Index, eij);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
template <class cplx>
|
|
||||||
static void baseDiagonal(int Index, iSp2nMatrix<cplx> &eij) {
|
|
||||||
eij = Zero();
|
|
||||||
eij()()(Index - ncolour * (ncolour - 1) / 2,
|
|
||||||
Index - ncolour * (ncolour - 1) / 2) = 1.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class cplx>
|
|
||||||
static void baseOffDiagonal(int i, int j, iSp2nMatrix<cplx> &eij) {
|
|
||||||
eij = Zero();
|
|
||||||
//std::cout << GridLogMessage << " doing i j = " << i << j << std::endl;
|
|
||||||
RealD tmp;
|
|
||||||
|
|
||||||
if ( (i == nsp + j) && (1 <= j) && (j < nsp) )
|
|
||||||
{
|
|
||||||
for (int k = 0; k < nsp; k++)
|
|
||||||
{
|
|
||||||
if (k < j)
|
|
||||||
{
|
|
||||||
//std::cout << GridLogMessage << "b=N+a 1"<< std::endl;
|
|
||||||
//std::cout << GridLogMessage << "j i "<< j << i << std::endl;
|
|
||||||
tmp = sqrt( 2*j*(j+1) );
|
|
||||||
tmp = 1/tmp;
|
|
||||||
tmp *= std::sqrt(2.0);
|
|
||||||
eij()()(k,k+nsp) = tmp;
|
|
||||||
eij()()(k+nsp,k) = - tmp;
|
|
||||||
}
|
|
||||||
if (k == j)
|
|
||||||
{
|
|
||||||
//std::cout << GridLogMessage << "b=N+a 2"<< std::endl;
|
|
||||||
//std::cout << GridLogMessage << "j i "<< j << i << std::endl;
|
|
||||||
tmp = sqrt(2*j*(j+1) );
|
|
||||||
tmp = -j/tmp;
|
|
||||||
tmp *= std::sqrt(2.0);
|
|
||||||
eij()()(k,k+nsp) = tmp ;
|
|
||||||
eij()()(k+nsp,k) = - tmp ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
else if (i != nsp+j)
|
|
||||||
{
|
|
||||||
for (int k = 0; k < ncolour; k++)
|
|
||||||
for (int l = 0; l < ncolour; l++)
|
|
||||||
{
|
|
||||||
eij()()(l, k) = delta(i, k) * delta(j, l) + S * delta(j, k) * delta(i, l);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
RealD nrm = 1. / std::sqrt(2.0);
|
|
||||||
eij = eij * nrm;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void printBase(void) {
|
|
||||||
for (int gen = 0; gen < Dimension; gen++) {
|
|
||||||
Matrix tmp;
|
|
||||||
base(gen, tmp);
|
|
||||||
std::cout << GridLogMessage << "Nc = " << ncolour << " t_" << gen
|
|
||||||
<< std::endl;
|
|
||||||
std::cout << GridLogMessage << tmp << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class cplx>
|
|
||||||
static void generator(int Index, iSp2nTwoIndexMatrix<cplx> &i2indTa) {
|
|
||||||
Vector<iSp2nMatrix<cplx> > ta(
|
|
||||||
NumGenerators);
|
|
||||||
Vector<iSp2nMatrix<cplx> > eij(Dimension);
|
|
||||||
iSp2nMatrix<cplx> tmp;
|
|
||||||
i2indTa = Zero();
|
|
||||||
|
|
||||||
for (int a = 0; a < NumGenerators; a++)
|
|
||||||
Sp<ncolour>::generator(a, ta[a]);
|
|
||||||
|
|
||||||
for (int a = 0; a < Dimension; a++) base(a, eij[a]);
|
|
||||||
|
|
||||||
for (int a = 0; a < Dimension; a++) {
|
|
||||||
tmp = transpose(ta[Index]) * adj(eij[a]) + adj(eij[a]) * ta[Index];
|
|
||||||
for (int b = 0; b < Dimension; b++) {
|
|
||||||
iSp2nMatrix<cplx> tmp1 =
|
|
||||||
tmp * eij[b];
|
|
||||||
Complex iTr = TensorRemove(timesI(trace(tmp1)));
|
|
||||||
i2indTa()()(a, b) = iTr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void printGenerators(void) {
|
|
||||||
for (int gen = 0; gen < NumGenerators; gen++) {
|
|
||||||
TIMatrix i2indTa;
|
|
||||||
generator(gen, i2indTa);
|
|
||||||
std::cout << GridLogMessage << "Nc = " << ncolour << " t_" << gen
|
|
||||||
<< std::endl;
|
|
||||||
std::cout << GridLogMessage << i2indTa << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void testGenerators(void) {
|
|
||||||
TIMatrix i2indTa, i2indTb;
|
|
||||||
std::cout << GridLogMessage << "2IndexRep - Checking if traceless"
|
|
||||||
<< std::endl;
|
|
||||||
for (int a = 0; a < NumGenerators; a++) {
|
|
||||||
generator(a, i2indTa);
|
|
||||||
std::cout << GridLogMessage << a << std::endl;
|
|
||||||
assert(norm2(trace(i2indTa)) < 1.0e-6);
|
|
||||||
}
|
|
||||||
std::cout << GridLogMessage << std::endl;
|
|
||||||
|
|
||||||
std::cout << GridLogMessage << "2IndexRep - Checking if antihermitean"
|
|
||||||
<< std::endl;
|
|
||||||
for (int a = 0; a < NumGenerators; a++) {
|
|
||||||
generator(a, i2indTa);
|
|
||||||
std::cout << GridLogMessage << a << std::endl;
|
|
||||||
assert(norm2(adj(i2indTa) + i2indTa) < 1.0e-6);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cout << GridLogMessage << std::endl;
|
|
||||||
std::cout << GridLogMessage
|
|
||||||
<< "2IndexRep - Checking Tr[Ta*Tb]=delta(a,b)*(N +- 2)/2"
|
|
||||||
<< std::endl;
|
|
||||||
for (int a = 0; a < NumGenerators; a++) {
|
|
||||||
for (int b = 0; b < NumGenerators; b++) {
|
|
||||||
generator(a, i2indTa);
|
|
||||||
generator(b, i2indTb);
|
|
||||||
|
|
||||||
// generator returns iTa, so we need a minus sign here
|
|
||||||
Complex Tr = -TensorRemove(trace(i2indTa * i2indTb));
|
|
||||||
std::cout << GridLogMessage << "a=" << a << "b=" << b << "Tr=" << Tr
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::cout << GridLogMessage << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void TwoIndexLieAlgebraMatrix(
|
|
||||||
const typename Sp<ncolour>::LatticeAlgebraVector &h,
|
|
||||||
LatticeTwoIndexMatrix &out, Real scale = 1.0) {
|
|
||||||
conformable(h, out);
|
|
||||||
GridBase *grid = out.Grid();
|
|
||||||
LatticeTwoIndexMatrix la(grid);
|
|
||||||
TIMatrix i2indTa;
|
|
||||||
|
|
||||||
out = Zero();
|
|
||||||
for (int a = 0; a < NumGenerators; a++) {
|
|
||||||
generator(a, i2indTa);
|
|
||||||
la = peekColour(h, a) * i2indTa;
|
|
||||||
out += la;
|
|
||||||
}
|
|
||||||
out *= scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Projects the algebra components
|
|
||||||
// of a lattice matrix ( of dimension ncol*ncol -1 )
|
|
||||||
static void projectOnAlgebra(
|
|
||||||
typename Sp<ncolour>::LatticeAlgebraVector &h_out,
|
|
||||||
const LatticeTwoIndexMatrix &in, Real scale = 1.0) {
|
|
||||||
conformable(h_out, in);
|
|
||||||
h_out = Zero();
|
|
||||||
TIMatrix i2indTa;
|
|
||||||
Real coefficient = -2.0 / (ncolour + 2 * S) * scale;
|
|
||||||
// 2/(Nc +/- 2) for the normalization of the trace in the two index rep
|
|
||||||
for (int a = 0; a < NumGenerators; a++) {
|
|
||||||
generator(a, i2indTa);
|
|
||||||
pokeColour(h_out, real(trace(i2indTa * in)) * coefficient, a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// a projector that keeps the generators stored to avoid the overhead of
|
|
||||||
// recomputing them
|
|
||||||
static void projector(typename Sp<ncolour>::LatticeAlgebraVector &h_out,
|
|
||||||
const LatticeTwoIndexMatrix &in, Real scale = 1.0) {
|
|
||||||
conformable(h_out, in);
|
|
||||||
// to store the generators
|
|
||||||
static std::vector<TIMatrix> i2indTa(NumGenerators);
|
|
||||||
h_out = Zero();
|
|
||||||
static bool precalculated = false;
|
|
||||||
if (!precalculated) {
|
|
||||||
precalculated = true;
|
|
||||||
for (int a = 0; a < NumGenerators; a++) generator(a, i2indTa[a]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Real coefficient =
|
|
||||||
-2.0 / (ncolour + 2 * S) * scale; // 2/(Nc +/- 2) for the normalization
|
|
||||||
// of the trace in the two index rep
|
|
||||||
|
|
||||||
for (int a = 0; a < NumGenerators; a++) {
|
|
||||||
auto tmp = real(trace(i2indTa[a] * in)) * coefficient;
|
|
||||||
pokeColour(h_out, tmp, a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Some useful type names
|
|
||||||
typedef Sp_TwoIndex<Nc, Symmetric> SpTwoIndexSymmMatrices;
|
|
||||||
typedef Sp_TwoIndex<Nc, AntiSymmetric> SpTwoIndexAntiSymmMatrices;
|
|
||||||
|
|
||||||
typedef Sp_TwoIndex<2, Symmetric> Sp2TwoIndexSymm;
|
|
||||||
typedef Sp_TwoIndex<4, Symmetric> Sp4TwoIndexSymm;
|
|
||||||
|
|
||||||
typedef Sp_TwoIndex<2, AntiSymmetric> Sp2TwoIndexAntiSymm;
|
|
||||||
typedef Sp_TwoIndex<4, AntiSymmetric> Sp4TwoIndexAntiSymm;
|
|
||||||
|
|
||||||
|
|
||||||
NAMESPACE_END(Grid);
|
|
||||||
|
|
||||||
#endif
|
|
@ -10,8 +10,7 @@
|
|||||||
// Include representations
|
// Include representations
|
||||||
#include <Grid/qcd/utils/GaugeGroup.h>
|
#include <Grid/qcd/utils/GaugeGroup.h>
|
||||||
#include <Grid/qcd/utils/SUnAdjoint.h>
|
#include <Grid/qcd/utils/SUnAdjoint.h>
|
||||||
#include <Grid/qcd/utils/SUnTwoIndex.h>
|
#include <Grid/qcd/utils/GaugeGroupTwoIndex.h>
|
||||||
#include <Grid/qcd/utils/Sp2nTwoIndex.h>
|
|
||||||
|
|
||||||
// All-to-all contraction kernels that touch the
|
// All-to-all contraction kernels that touch the
|
||||||
// internal lattice structure
|
// internal lattice structure
|
||||||
|
@ -35,7 +35,7 @@ directory
|
|||||||
|
|
||||||
#include <Grid/qcd/utils/GaugeGroup.h>
|
#include <Grid/qcd/utils/GaugeGroup.h>
|
||||||
#include <Grid/qcd/utils/SUnAdjoint.h>
|
#include <Grid/qcd/utils/SUnAdjoint.h>
|
||||||
#include <Grid/qcd/utils/SUnTwoIndex.h>
|
#include <Grid/qcd/utils/GaugeGroupTwoIndex.h>
|
||||||
|
|
||||||
#include <Grid/qcd/representations/adjoint.h>
|
#include <Grid/qcd/representations/adjoint.h>
|
||||||
#include <Grid/qcd/representations/two_index.h>
|
#include <Grid/qcd/representations/two_index.h>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user