|
|
|
@ -9,6 +9,7 @@ Copyright (C) 2015
|
|
|
|
|
Author: Azusa Yamaguchi <ayamaguc@staffmail.ed.ac.uk>
|
|
|
|
|
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
|
|
|
|
Author: Guido Cossu <guido.cossu@ed.ac.uk>
|
|
|
|
|
Author: Jamie Hudspith <renwick.james.hudspth@gmail.com>
|
|
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
@ -42,14 +43,14 @@ directory
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
using namespace Grid;
|
|
|
|
|
;
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
|
Grid_init(&argc, &argv);
|
|
|
|
|
|
|
|
|
|
std::vector<int> latt({4, 4, 4, 8});
|
|
|
|
|
GridCartesian* grid = SpaceTimeGrid::makeFourDimGrid(
|
|
|
|
|
latt, GridDefaultSimd(Nd, vComplex::Nsimd()), GridDefaultMpi());
|
|
|
|
|
latt, GridDefaultSimd(Nd, vComplex::Nsimd()), GridDefaultMpi());
|
|
|
|
|
|
|
|
|
|
GridRedBlackCartesian* rbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(grid);
|
|
|
|
|
|
|
|
|
@ -60,15 +61,19 @@ int main(int argc, char** argv) {
|
|
|
|
|
<< std::endl;
|
|
|
|
|
SU2::printGenerators();
|
|
|
|
|
std::cout << "Dimension of adjoint representation: "<< SU2Adjoint::Dimension << std::endl;
|
|
|
|
|
|
|
|
|
|
// guard as this code fails to compile for Nc != 3
|
|
|
|
|
#if (Nc == 3)
|
|
|
|
|
|
|
|
|
|
SU2Adjoint::printGenerators();
|
|
|
|
|
SU2::testGenerators();
|
|
|
|
|
SU2Adjoint::testGenerators();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "* Generators for SU(Nc" << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
SU3::printGenerators();
|
|
|
|
|
std::cout << "Dimension of adjoint representation: "<< SU3Adjoint::Dimension << std::endl;
|
|
|
|
|
SU3Adjoint::printGenerators();
|
|
|
|
@ -111,12 +116,10 @@ int main(int argc, char** argv) {
|
|
|
|
|
|
|
|
|
|
// AdjointRepresentation has the predefined number of colours Nc
|
|
|
|
|
// Representations<FundamentalRepresentation, AdjointRepresentation, TwoIndexSymmetricRepresentation> RepresentationTypes(grid);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LatticeGaugeField U(grid), V(grid);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, U);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, V);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Adjoint representation
|
|
|
|
|
// Test group structure
|
|
|
|
|
// (U_f * V_f)_r = U_r * V_r
|
|
|
|
@ -127,17 +130,17 @@ int main(int argc, char** argv) {
|
|
|
|
|
SU3::LatticeMatrix Vmu = peekLorentz(V,mu);
|
|
|
|
|
pokeLorentz(UV,Umu*Vmu, mu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AdjRep.update_representation(UV);
|
|
|
|
|
typename AdjointRep<Nc>::LatticeField UVr = AdjRep.U; // (U_f * V_f)_r
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AdjRep.update_representation(U);
|
|
|
|
|
typename AdjointRep<Nc>::LatticeField Ur = AdjRep.U; // U_r
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AdjRep.update_representation(V);
|
|
|
|
|
typename AdjointRep<Nc>::LatticeField Vr = AdjRep.U; // V_r
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename AdjointRep<Nc>::LatticeField UrVr(grid);
|
|
|
|
|
UrVr = Zero();
|
|
|
|
|
for (int mu = 0; mu < Nd; mu++) {
|
|
|
|
@ -145,10 +148,10 @@ int main(int argc, char** argv) {
|
|
|
|
|
typename AdjointRep<Nc>::LatticeMatrix Vrmu = peekLorentz(Vr,mu);
|
|
|
|
|
pokeLorentz(UrVr,Urmu*Vrmu, mu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename AdjointRep<Nc>::LatticeField Diff_check = UVr - UrVr;
|
|
|
|
|
std::cout << GridLogMessage << "Group structure SU("<<Nc<<") check difference (Adjoint representation) : " << norm2(Diff_check) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check correspondence of algebra and group transformations
|
|
|
|
|
// Create a random vector
|
|
|
|
|
SU3::LatticeAlgebraVector h_adj(grid);
|
|
|
|
@ -156,32 +159,31 @@ int main(int argc, char** argv) {
|
|
|
|
|
random(gridRNG,h_adj);
|
|
|
|
|
h_adj = real(h_adj);
|
|
|
|
|
SU_Adjoint<Nc>::AdjointLieAlgebraMatrix(h_adj,Ar);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Re-extract h_adj
|
|
|
|
|
SU3::LatticeAlgebraVector h_adj2(grid);
|
|
|
|
|
SU_Adjoint<Nc>::projectOnAlgebra(h_adj2, Ar);
|
|
|
|
|
SU3::LatticeAlgebraVector h_diff = h_adj - h_adj2;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check vector difference (Adjoint representation) : " << norm2(h_diff) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exponentiate
|
|
|
|
|
typename AdjointRep<Nc>::LatticeMatrix Uadj(grid);
|
|
|
|
|
Uadj = expMat(Ar, 1.0, 16);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename AdjointRep<Nc>::LatticeMatrix uno(grid);
|
|
|
|
|
uno = 1.0;
|
|
|
|
|
// Check matrix Uadj, must be real orthogonal
|
|
|
|
|
typename AdjointRep<Nc>::LatticeMatrix Ucheck = Uadj - conjugate(Uadj);
|
|
|
|
|
std::cout << GridLogMessage << "Reality check: " << norm2(Ucheck)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
Ucheck = Uadj * adj(Uadj) - uno;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 1: " << norm2(Ucheck)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
Ucheck = adj(Uadj) * Uadj - uno;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 2: " << norm2(Ucheck)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
// Construct the fundamental matrix in the group
|
|
|
|
|
SU3::LatticeMatrix Af(grid);
|
|
|
|
|
SU3::FundamentalLieAlgebraMatrix(h_adj,Af);
|
|
|
|
@ -193,72 +195,65 @@ int main(int argc, char** argv) {
|
|
|
|
|
SU3::LatticeMatrix UnitCheck(grid);
|
|
|
|
|
UnitCheck = Ufund * adj(Ufund) - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 1: " << norm2(UnitCheck)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
UnitCheck = adj(Ufund) * Ufund - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 2: " << norm2(UnitCheck)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
// Tranform to the adjoint representation
|
|
|
|
|
U = Zero(); // fill this with only one direction
|
|
|
|
|
pokeLorentz(U,Ufund,0); // the representation transf acts on full gauge fields
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AdjRep.update_representation(U);
|
|
|
|
|
Ur = AdjRep.U; // U_r
|
|
|
|
|
typename AdjointRep<Nc>::LatticeMatrix Ur0 = peekLorentz(Ur,0); // this should be the same as Uadj
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename AdjointRep<Nc>::LatticeMatrix Diff_check_mat = Ur0 - Uadj;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check group difference : " << norm2(Diff_check_mat) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TwoIndexRep tests
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "* eS^{ij} base for SU(2)" << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Dimension of Two Index Symmetric representation: "<< SU2TwoIndexSymm::Dimension << std::endl;
|
|
|
|
|
SU2TwoIndexSymm::printBase();
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Generators of Two Index Symmetric representation: "<< SU2TwoIndexSymm::Dimension << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Generators of Two Index Symmetric representation: "<< SU2TwoIndexSymm::Dimension << std::endl;
|
|
|
|
|
SU2TwoIndexSymm::printGenerators();
|
|
|
|
|
std::cout << GridLogMessage << "Test of Two Index Symmetric Generators: "<< SU2TwoIndexSymm::Dimension << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Test of Two Index Symmetric Generators: "<< SU2TwoIndexSymm::Dimension << std::endl;
|
|
|
|
|
SU2TwoIndexSymm::testGenerators();
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "* eAS^{ij} base for SU(2)" << std::endl;
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Dimension of Two Index anti-Symmetric representation: "<< SU2TwoIndexAntiSymm::Dimension << std::endl;
|
|
|
|
|
SU2TwoIndexAntiSymm::printBase();
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Dimension of Two Index anti-Symmetric representation: "<< SU2TwoIndexAntiSymm::Dimension << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Dimension of Two Index anti-Symmetric representation: "<< SU2TwoIndexAntiSymm::Dimension << std::endl;
|
|
|
|
|
SU2TwoIndexAntiSymm::printGenerators();
|
|
|
|
|
std::cout << GridLogMessage << "Test of Two Index anti-Symmetric Generators: "<< SU2TwoIndexAntiSymm::Dimension << std::endl;
|
|
|
|
|
SU2TwoIndexAntiSymm::testGenerators();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Test for the Two Index Symmetric projectors"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
// Projectors
|
|
|
|
|
SU3TwoIndexSymm::LatticeTwoIndexMatrix Gauss2(grid);
|
|
|
|
|
random(gridRNG,Gauss2);
|
|
|
|
@ -276,13 +271,13 @@ int main(int argc, char** argv) {
|
|
|
|
|
SU3::LatticeAlgebraVector diff2 = ha - hb;
|
|
|
|
|
std::cout << GridLogMessage << "Difference: " << norm2(diff) << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "Test for the Two index anti-Symmetric projectors"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
// Projectors
|
|
|
|
|
SU3TwoIndexAntiSymm::LatticeTwoIndexMatrix Gauss2a(grid);
|
|
|
|
|
random(gridRNG,Gauss2a);
|
|
|
|
@ -300,11 +295,11 @@ int main(int argc, char** argv) {
|
|
|
|
|
SU3::LatticeAlgebraVector diff2a = ha - hb;
|
|
|
|
|
std::cout << GridLogMessage << "Difference: " << norm2(diff2a) << std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "Two index Symmetric: Checking Group Structure"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
// Testing HMC representation classes
|
|
|
|
|
TwoIndexRep< Nc, Symmetric > TIndexRep(grid);
|
|
|
|
|
|
|
|
|
@ -313,7 +308,7 @@ int main(int argc, char** argv) {
|
|
|
|
|
LatticeGaugeField U2(grid), V2(grid);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, U2);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, V2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LatticeGaugeField UV2(grid);
|
|
|
|
|
UV2 = Zero();
|
|
|
|
|
for (int mu = 0; mu < Nd; mu++) {
|
|
|
|
@ -321,16 +316,16 @@ int main(int argc, char** argv) {
|
|
|
|
|
SU3::LatticeMatrix Vmu2 = peekLorentz(V2,mu);
|
|
|
|
|
pokeLorentz(UV2,Umu2*Vmu2, mu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(UV2);
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric >::LatticeField UVr2 = TIndexRep.U; // (U_f * V_f)_r
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(U2);
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric >::LatticeField Ur2 = TIndexRep.U; // U_r
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(V2);
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric >::LatticeField Vr2 = TIndexRep.U; // V_r
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric >::LatticeField Ur2Vr2(grid);
|
|
|
|
|
Ur2Vr2 = Zero();
|
|
|
|
|
for (int mu = 0; mu < Nd; mu++) {
|
|
|
|
@ -338,11 +333,11 @@ int main(int argc, char** argv) {
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric >::LatticeMatrix Vrmu2 = peekLorentz(Vr2,mu);
|
|
|
|
|
pokeLorentz(Ur2Vr2,Urmu2*Vrmu2, mu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric >::LatticeField Diff_check2 = UVr2 - Ur2Vr2;
|
|
|
|
|
std::cout << GridLogMessage << "Group structure SU("<<Nc<<") check difference (Two Index Symmetric): " << norm2(Diff_check2) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check correspondence of algebra and group transformations
|
|
|
|
|
// Create a random vector
|
|
|
|
|
SU3::LatticeAlgebraVector h_sym(grid);
|
|
|
|
@ -350,34 +345,31 @@ int main(int argc, char** argv) {
|
|
|
|
|
random(gridRNG,h_sym);
|
|
|
|
|
h_sym = real(h_sym);
|
|
|
|
|
SU_TwoIndex<Nc,Symmetric>::TwoIndexLieAlgebraMatrix(h_sym,Ar_sym);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Re-extract h_sym
|
|
|
|
|
SU3::LatticeAlgebraVector h_sym2(grid);
|
|
|
|
|
SU_TwoIndex< Nc, Symmetric>::projectOnAlgebra(h_sym2, Ar_sym);
|
|
|
|
|
SU3::LatticeAlgebraVector h_diff_sym = h_sym - h_sym2;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check vector difference (Two Index Symmetric): " << norm2(h_diff_sym) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exponentiate
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric>::LatticeMatrix U2iS(grid);
|
|
|
|
|
U2iS = expMat(Ar_sym, 1.0, 16);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric>::LatticeMatrix uno2iS(grid);
|
|
|
|
|
uno2iS = 1.0;
|
|
|
|
|
// Check matrix U2iS, must be real orthogonal
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric>::LatticeMatrix Ucheck2iS = U2iS - conjugate(U2iS);
|
|
|
|
|
std::cout << GridLogMessage << "Reality check: " << norm2(Ucheck2iS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
Ucheck2iS = U2iS * adj(U2iS) - uno2iS;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 1: " << norm2(Ucheck2iS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
Ucheck2iS = adj(U2iS) * U2iS - uno2iS;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 2: " << norm2(Ucheck2iS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
// Construct the fundamental matrix in the group
|
|
|
|
|
SU3::LatticeMatrix Af_sym(grid);
|
|
|
|
|
SU3::FundamentalLieAlgebraMatrix(h_sym,Af_sym);
|
|
|
|
@ -386,147 +378,137 @@ int main(int argc, char** argv) {
|
|
|
|
|
SU3::LatticeMatrix UnitCheck2(grid);
|
|
|
|
|
UnitCheck2 = Ufund2 * adj(Ufund2) - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 1: " << norm2(UnitCheck2)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
<< std::endl;
|
|
|
|
|
UnitCheck2 = adj(Ufund2) * Ufund2 - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 2: " << norm2(UnitCheck2)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Tranform to the 2Index Sym representation
|
|
|
|
|
U = Zero(); // fill this with only one direction
|
|
|
|
|
pokeLorentz(U,Ufund2,0); // the representation transf acts on full gauge fields
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(U);
|
|
|
|
|
Ur2 = TIndexRep.U; // U_r
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric>::LatticeMatrix Ur02 = peekLorentz(Ur2,0); // this should be the same as U2iS
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, Symmetric>::LatticeMatrix Diff_check_mat2 = Ur02 - U2iS;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check group difference (Two Index Symmetric): " << norm2(Diff_check_mat2) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (TwoIndexRep<Nc, AntiSymmetric >::Dimension != 1){
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
std::cout << GridLogMessage << "*********************************************"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::cout << GridLogMessage << "Two Index anti-Symmetric: Check Group Structure"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
// Testing HMC representation classes
|
|
|
|
|
TwoIndexRep< Nc, AntiSymmetric > TIndexRepA(grid);
|
|
|
|
|
std::cout << GridLogMessage << "Two Index anti-Symmetric: Check Group Structure"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
// Testing HMC representation classes
|
|
|
|
|
TwoIndexRep< Nc, AntiSymmetric > TIndexRepA(grid);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Test group structure
|
|
|
|
|
// (U_f * V_f)_r = U_r * V_r
|
|
|
|
|
LatticeGaugeField U2A(grid), V2A(grid);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, U2A);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, V2A);
|
|
|
|
|
// Test group structure
|
|
|
|
|
// (U_f * V_f)_r = U_r * V_r
|
|
|
|
|
LatticeGaugeField U2A(grid), V2A(grid);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, U2A);
|
|
|
|
|
SU3::HotConfiguration<LatticeGaugeField>(gridRNG, V2A);
|
|
|
|
|
|
|
|
|
|
LatticeGaugeField UV2A(grid);
|
|
|
|
|
UV2A = Zero();
|
|
|
|
|
for (int mu = 0; mu < Nd; mu++) {
|
|
|
|
|
SU3::LatticeMatrix Umu2A = peekLorentz(U2,mu);
|
|
|
|
|
SU3::LatticeMatrix Vmu2A = peekLorentz(V2,mu);
|
|
|
|
|
pokeLorentz(UV2A,Umu2A*Vmu2A, mu);
|
|
|
|
|
LatticeGaugeField UV2A(grid);
|
|
|
|
|
UV2A = Zero();
|
|
|
|
|
for (int mu = 0; mu < Nd; mu++) {
|
|
|
|
|
SU3::LatticeMatrix Umu2A = peekLorentz(U2,mu);
|
|
|
|
|
SU3::LatticeMatrix Vmu2A = peekLorentz(V2,mu);
|
|
|
|
|
pokeLorentz(UV2A,Umu2A*Vmu2A, mu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(UV2A);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField UVr2A = TIndexRepA.U; // (U_f * V_f)_r
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(U2A);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Ur2A = TIndexRepA.U; // U_r
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(V2A);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Vr2A = TIndexRepA.U; // V_r
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Ur2Vr2A(grid);
|
|
|
|
|
Ur2Vr2A = Zero();
|
|
|
|
|
for (int mu = 0; mu < Nd; mu++) {
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeMatrix Urmu2A = peekLorentz(Ur2A,mu);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeMatrix Vrmu2A = peekLorentz(Vr2A,mu);
|
|
|
|
|
pokeLorentz(Ur2Vr2A,Urmu2A*Vrmu2A, mu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Diff_check2A = UVr2A - Ur2Vr2A;
|
|
|
|
|
std::cout << GridLogMessage << "Group structure SU("<<Nc<<") check difference (Two Index anti-Symmetric): " << norm2(Diff_check2A) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check correspondence of algebra and group transformations
|
|
|
|
|
// Create a random vector
|
|
|
|
|
SU3::LatticeAlgebraVector h_Asym(grid);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Ar_Asym(grid);
|
|
|
|
|
random(gridRNG,h_Asym);
|
|
|
|
|
h_Asym = real(h_Asym);
|
|
|
|
|
SU_TwoIndex< Nc, AntiSymmetric>::TwoIndexLieAlgebraMatrix(h_Asym,Ar_Asym);
|
|
|
|
|
|
|
|
|
|
// Re-extract h_sym
|
|
|
|
|
SU3::LatticeAlgebraVector h_Asym2(grid);
|
|
|
|
|
SU_TwoIndex< Nc, AntiSymmetric>::projectOnAlgebra(h_Asym2, Ar_Asym);
|
|
|
|
|
SU3::LatticeAlgebraVector h_diff_Asym = h_Asym - h_Asym2;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check vector difference (Two Index anti-Symmetric): " << norm2(h_diff_Asym) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exponentiate
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix U2iAS(grid);
|
|
|
|
|
U2iAS = expMat(Ar_Asym, 1.0, 16);
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix uno2iAS(grid);
|
|
|
|
|
uno2iAS = 1.0;
|
|
|
|
|
// Check matrix U2iS, must be real orthogonal
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Ucheck2iAS = U2iAS - conjugate(U2iAS);
|
|
|
|
|
std::cout << GridLogMessage << "Reality check: " << norm2(Ucheck2iAS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
Ucheck2iAS = U2iAS * adj(U2iAS) - uno2iAS;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 1: " << norm2(Ucheck2iAS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
Ucheck2iAS = adj(U2iAS) * U2iAS - uno2iAS;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 2: " << norm2(Ucheck2iAS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Construct the fundamental matrix in the group
|
|
|
|
|
SU3::LatticeMatrix Af_Asym(grid);
|
|
|
|
|
SU3::FundamentalLieAlgebraMatrix(h_Asym,Af_Asym);
|
|
|
|
|
SU3::LatticeMatrix Ufund2A(grid);
|
|
|
|
|
Ufund2A = expMat(Af_Asym, 1.0, 16);
|
|
|
|
|
SU3::LatticeMatrix UnitCheck2A(grid);
|
|
|
|
|
UnitCheck2A = Ufund2A * adj(Ufund2A) - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 1: " << norm2(UnitCheck2A)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
UnitCheck2A = adj(Ufund2A) * Ufund2A - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 2: " << norm2(UnitCheck2A)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Tranform to the 2Index Sym representation
|
|
|
|
|
U = Zero(); // fill this with only one direction
|
|
|
|
|
pokeLorentz(U,Ufund2A,0); // the representation transf acts on full gauge fields
|
|
|
|
|
|
|
|
|
|
TIndexRepA.update_representation(U);
|
|
|
|
|
Ur2A = TIndexRepA.U; // U_r
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Ur02A = peekLorentz(Ur2A,0); // this should be the same as U2iS
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Diff_check_mat2A = Ur02A - U2iAS;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check group difference (Two Index anti-Symmetric): " << norm2(Diff_check_mat2A) << std::endl;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
std::cout << GridLogMessage << "Skipping Two Index anti-Symmetric tests "
|
|
|
|
|
"because representation is trivial (dim = 1)"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(UV2A);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField UVr2A = TIndexRepA.U; // (U_f * V_f)_r
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(U2A);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Ur2A = TIndexRepA.U; // U_r
|
|
|
|
|
|
|
|
|
|
TIndexRep.update_representation(V2A);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Vr2A = TIndexRepA.U; // V_r
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Ur2Vr2A(grid);
|
|
|
|
|
Ur2Vr2A = Zero();
|
|
|
|
|
for (int mu = 0; mu < Nd; mu++) {
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeMatrix Urmu2A = peekLorentz(Ur2A,mu);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeMatrix Vrmu2A = peekLorentz(Vr2A,mu);
|
|
|
|
|
pokeLorentz(Ur2Vr2A,Urmu2A*Vrmu2A, mu);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric >::LatticeField Diff_check2A = UVr2A - Ur2Vr2A;
|
|
|
|
|
std::cout << GridLogMessage << "Group structure SU("<<Nc<<") check difference (Two Index anti-Symmetric): " << norm2(Diff_check2A) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Check correspondence of algebra and group transformations
|
|
|
|
|
// Create a random vector
|
|
|
|
|
SU3::LatticeAlgebraVector h_Asym(grid);
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Ar_Asym(grid);
|
|
|
|
|
random(gridRNG,h_Asym);
|
|
|
|
|
h_Asym = real(h_Asym);
|
|
|
|
|
SU_TwoIndex< Nc, AntiSymmetric>::TwoIndexLieAlgebraMatrix(h_Asym,Ar_Asym);
|
|
|
|
|
|
|
|
|
|
// Re-extract h_sym
|
|
|
|
|
SU3::LatticeAlgebraVector h_Asym2(grid);
|
|
|
|
|
SU_TwoIndex< Nc, AntiSymmetric>::projectOnAlgebra(h_Asym2, Ar_Asym);
|
|
|
|
|
SU3::LatticeAlgebraVector h_diff_Asym = h_Asym - h_Asym2;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check vector difference (Two Index anti-Symmetric): " << norm2(h_diff_Asym) << std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Exponentiate
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix U2iAS(grid);
|
|
|
|
|
U2iAS = expMat(Ar_Asym, 1.0, 16);
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix uno2iAS(grid);
|
|
|
|
|
uno2iAS = 1.0;
|
|
|
|
|
// Check matrix U2iS, must be real orthogonal
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Ucheck2iAS = U2iAS - conjugate(U2iAS);
|
|
|
|
|
std::cout << GridLogMessage << "Reality check: " << norm2(Ucheck2iAS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
Ucheck2iAS = U2iAS * adj(U2iAS) - uno2iAS;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 1: " << norm2(Ucheck2iAS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
Ucheck2iAS = adj(U2iAS) * U2iAS - uno2iAS;
|
|
|
|
|
std::cout << GridLogMessage << "orthogonality check 2: " << norm2(Ucheck2iAS)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Construct the fundamental matrix in the group
|
|
|
|
|
SU3::LatticeMatrix Af_Asym(grid);
|
|
|
|
|
SU3::FundamentalLieAlgebraMatrix(h_Asym,Af_Asym);
|
|
|
|
|
SU3::LatticeMatrix Ufund2A(grid);
|
|
|
|
|
Ufund2A = expMat(Af_Asym, 1.0, 16);
|
|
|
|
|
SU3::LatticeMatrix UnitCheck2A(grid);
|
|
|
|
|
UnitCheck2A = Ufund2A * adj(Ufund2A) - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 1: " << norm2(UnitCheck2A)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
UnitCheck2A = adj(Ufund2A) * Ufund2A - uno_f;
|
|
|
|
|
std::cout << GridLogMessage << "unitarity check 2: " << norm2(UnitCheck2A)
|
|
|
|
|
<< std::endl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Tranform to the 2Index Sym representation
|
|
|
|
|
U = Zero(); // fill this with only one direction
|
|
|
|
|
pokeLorentz(U,Ufund2A,0); // the representation transf acts on full gauge fields
|
|
|
|
|
|
|
|
|
|
TIndexRepA.update_representation(U);
|
|
|
|
|
Ur2A = TIndexRepA.U; // U_r
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Ur02A = peekLorentz(Ur2A,0); // this should be the same as U2iS
|
|
|
|
|
|
|
|
|
|
typename TwoIndexRep< Nc, AntiSymmetric>::LatticeMatrix Diff_check_mat2A = Ur02A - U2iAS;
|
|
|
|
|
std::cout << GridLogMessage << "Projections structure check group difference (Two Index anti-Symmetric): " << norm2(Diff_check_mat2A) << std::endl;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
std::cout << GridLogMessage << "Skipping Two Index anti-Symmetric tests "
|
|
|
|
|
"because representation is trivial (dim = 1)"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
Grid_finalize();
|
|
|
|
|
}
|
|
|
|
|