mirror of
https://github.com/paboyle/Grid.git
synced 2025-04-10 06:00:45 +01:00
Namespace
This commit is contained in:
parent
66f8a2f082
commit
b331ecea78
@ -28,16 +28,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
See the full license in the file "LICENSE" in the top level distribution
|
See the full license in the file "LICENSE" in the top level distribution
|
||||||
directory
|
directory
|
||||||
*************************************************************************************/
|
*************************************************************************************/
|
||||||
/* END LEGAL */
|
/* END LEGAL */
|
||||||
#ifndef QCD_UTIL_SUN_H
|
#ifndef QCD_UTIL_SUN_H
|
||||||
#define QCD_UTIL_SUN_H
|
#define QCD_UTIL_SUN_H
|
||||||
|
|
||||||
namespace Grid {
|
NAMESPACE_BEGIN(Grid);
|
||||||
namespace QCD {
|
|
||||||
|
|
||||||
template <int ncolour>
|
template <int ncolour>
|
||||||
class SU {
|
class SU {
|
||||||
public:
|
public:
|
||||||
static const int Dimension = ncolour;
|
static const int Dimension = ncolour;
|
||||||
static const int AdjointDimension = ncolour * ncolour - 1;
|
static const int AdjointDimension = ncolour * ncolour - 1;
|
||||||
static int su2subgroups(void) { return (ncolour * (ncolour - 1)) / 2; }
|
static int su2subgroups(void) { return (ncolour * (ncolour - 1)) / 2; }
|
||||||
@ -48,7 +47,7 @@ class SU {
|
|||||||
using iSU2Matrix = iScalar<iScalar<iMatrix<vtype, 2> > >;
|
using iSU2Matrix = iScalar<iScalar<iMatrix<vtype, 2> > >;
|
||||||
template <typename vtype>
|
template <typename vtype>
|
||||||
using iSUnAlgebraVector =
|
using iSUnAlgebraVector =
|
||||||
iScalar<iScalar<iVector<vtype, AdjointDimension> > >;
|
iScalar<iScalar<iVector<vtype, AdjointDimension> > >;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Types can be accessed as SU<2>::Matrix , SU<2>::vSUnMatrix,
|
// Types can be accessed as SU<2>::Matrix , SU<2>::vSUnMatrix,
|
||||||
@ -238,7 +237,7 @@ class SU {
|
|||||||
|
|
||||||
// this should be purely real
|
// this should be purely real
|
||||||
Determinant._odata[ss] =
|
Determinant._odata[ss] =
|
||||||
Sigma()()(0, 0) * Sigma()()(1, 1) - Sigma()()(0, 1) * Sigma()()(1, 0);
|
Sigma()()(0, 0) * Sigma()()(1, 1) - Sigma()()(0, 1) * Sigma()()(1, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,11 +272,11 @@ class SU {
|
|||||||
//
|
//
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
static void SubGroupHeatBath(
|
static void SubGroupHeatBath(
|
||||||
GridSerialRNG &sRNG, GridParallelRNG &pRNG,
|
GridSerialRNG &sRNG, GridParallelRNG &pRNG,
|
||||||
RealD beta, // coeff multiplying staple in action (with no 1/Nc)
|
RealD beta, // coeff multiplying staple in action (with no 1/Nc)
|
||||||
LatticeMatrix &link,
|
LatticeMatrix &link,
|
||||||
const LatticeMatrix &barestaple, // multiplied by action coeffs so th
|
const LatticeMatrix &barestaple, // multiplied by action coeffs so th
|
||||||
int su2_subgroup, int nheatbath, LatticeInteger &wheremask) {
|
int su2_subgroup, int nheatbath, LatticeInteger &wheremask) {
|
||||||
GridBase *grid = link._grid;
|
GridBase *grid = link._grid;
|
||||||
|
|
||||||
int ntrials = 0;
|
int ntrials = 0;
|
||||||
@ -293,7 +292,7 @@ class SU {
|
|||||||
|
|
||||||
// Subgroup manipulation in the lie algebra space
|
// Subgroup manipulation in the lie algebra space
|
||||||
LatticeSU2Matrix u(
|
LatticeSU2Matrix u(
|
||||||
grid); // Kennedy pendleton "u" real projected normalised Sigma
|
grid); // Kennedy pendleton "u" real projected normalised Sigma
|
||||||
LatticeSU2Matrix uinv(grid);
|
LatticeSU2Matrix uinv(grid);
|
||||||
LatticeSU2Matrix ua(grid); // a in pauli form
|
LatticeSU2Matrix ua(grid); // a in pauli form
|
||||||
LatticeSU2Matrix b(grid); // rotated matrix after hb
|
LatticeSU2Matrix b(grid); // rotated matrix after hb
|
||||||
@ -314,41 +313,41 @@ class SU {
|
|||||||
mask_false = 0;
|
mask_false = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
PLB 156 P393 (1985) (Kennedy and Pendleton)
|
PLB 156 P393 (1985) (Kennedy and Pendleton)
|
||||||
|
|
||||||
Note: absorb "beta" into the def of sigma compared to KP paper; staple
|
Note: absorb "beta" into the def of sigma compared to KP paper; staple
|
||||||
passed to this routine has "beta" already multiplied in
|
passed to this routine has "beta" already multiplied in
|
||||||
|
|
||||||
Action linear in links h and of form:
|
Action linear in links h and of form:
|
||||||
|
|
||||||
beta S = beta Sum_p (1 - 1/Nc Re Tr Plaq )
|
beta S = beta Sum_p (1 - 1/Nc Re Tr Plaq )
|
||||||
|
|
||||||
Writing Sigma = 1/Nc (beta Sigma') where sum over staples is "Sigma' "
|
Writing Sigma = 1/Nc (beta Sigma') where sum over staples is "Sigma' "
|
||||||
|
|
||||||
beta S = const - beta/Nc Re Tr h Sigma'
|
beta S = const - beta/Nc Re Tr h Sigma'
|
||||||
= const - Re Tr h Sigma
|
= const - Re Tr h Sigma
|
||||||
|
|
||||||
Decompose h and Sigma into (1, sigma_j) ; h_i real, h^2=1, Sigma_i complex
|
Decompose h and Sigma into (1, sigma_j) ; h_i real, h^2=1, Sigma_i complex
|
||||||
arbitrary.
|
arbitrary.
|
||||||
|
|
||||||
Tr h Sigma = h_i Sigma_j Tr (sigma_i sigma_j) = h_i Sigma_j 2 delta_ij
|
Tr h Sigma = h_i Sigma_j Tr (sigma_i sigma_j) = h_i Sigma_j 2 delta_ij
|
||||||
Re Tr h Sigma = 2 h_j Re Sigma_j
|
Re Tr h Sigma = 2 h_j Re Sigma_j
|
||||||
|
|
||||||
Normalised re Sigma_j = xi u_j
|
Normalised re Sigma_j = xi u_j
|
||||||
|
|
||||||
With u_j a unit vector and U can be in SU(2);
|
With u_j a unit vector and U can be in SU(2);
|
||||||
|
|
||||||
Re Tr h Sigma = 2 h_j Re Sigma_j = 2 xi (h.u)
|
Re Tr h Sigma = 2 h_j Re Sigma_j = 2 xi (h.u)
|
||||||
|
|
||||||
4xi^2 = Det [ Sig - Sig^dag + 1 Tr Sigdag]
|
4xi^2 = Det [ Sig - Sig^dag + 1 Tr Sigdag]
|
||||||
u = 1/2xi [ Sig - Sig^dag + 1 Tr Sigdag]
|
u = 1/2xi [ Sig - Sig^dag + 1 Tr Sigdag]
|
||||||
|
|
||||||
xi = sqrt(Det)/2;
|
xi = sqrt(Det)/2;
|
||||||
|
|
||||||
Write a= u h in SU(2); a has pauli decomp a_j;
|
Write a= u h in SU(2); a has pauli decomp a_j;
|
||||||
|
|
||||||
Note: Product b' xi is unvariant because scaling Sigma leaves
|
Note: Product b' xi is unvariant because scaling Sigma leaves
|
||||||
normalised vector "u" fixed; Can rescale Sigma so b' = 1.
|
normalised vector "u" fixed; Can rescale Sigma so b' = 1.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
@ -386,7 +385,7 @@ class SU {
|
|||||||
|
|
||||||
xi = 0.5 * sqrt(udet); // 4xi^2 = Det [ Sig - Sig^dag + 1 Tr Sigdag]
|
xi = 0.5 * sqrt(udet); // 4xi^2 = Det [ Sig - Sig^dag + 1 Tr Sigdag]
|
||||||
u = 0.5 * u *
|
u = 0.5 * u *
|
||||||
pow(xi, -1.0); // u = 1/2xi [ Sig - Sig^dag + 1 Tr Sigdag]
|
pow(xi, -1.0); // u = 1/2xi [ Sig - Sig^dag + 1 Tr Sigdag]
|
||||||
|
|
||||||
// Debug test for sanity
|
// Debug test for sanity
|
||||||
uinv = adj(u);
|
uinv = adj(u);
|
||||||
@ -394,36 +393,36 @@ class SU {
|
|||||||
assert(norm2(b) < 1.0e-4);
|
assert(norm2(b) < 1.0e-4);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Measure: Haar measure dh has d^4a delta(1-|a^2|)
|
Measure: Haar measure dh has d^4a delta(1-|a^2|)
|
||||||
In polars:
|
In polars:
|
||||||
da = da0 r^2 sin theta dr dtheta dphi delta( 1 - r^2 -a0^2)
|
da = da0 r^2 sin theta dr dtheta dphi delta( 1 - r^2 -a0^2)
|
||||||
= da0 r^2 sin theta dr dtheta dphi delta( (sqrt(1-a0^) - r)(sqrt(1-a0^) +
|
= da0 r^2 sin theta dr dtheta dphi delta( (sqrt(1-a0^) - r)(sqrt(1-a0^) +
|
||||||
r) )
|
r) )
|
||||||
= da0 r/2 sin theta dr dtheta dphi delta( (sqrt(1-a0^) - r) )
|
= da0 r/2 sin theta dr dtheta dphi delta( (sqrt(1-a0^) - r) )
|
||||||
|
|
||||||
Action factor Q(h) dh = e^-S[h] dh = e^{ xi Tr uh} dh // beta enters
|
Action factor Q(h) dh = e^-S[h] dh = e^{ xi Tr uh} dh // beta enters
|
||||||
through xi
|
through xi
|
||||||
= e^{2 xi (h.u)} dh
|
= e^{2 xi (h.u)} dh
|
||||||
= e^{2 xi h0u0}.e^{2 xi h1u1}.e^{2 xi
|
= e^{2 xi h0u0}.e^{2 xi h1u1}.e^{2 xi
|
||||||
h2u2}.e^{2 xi h3u3} dh
|
h2u2}.e^{2 xi h3u3} dh
|
||||||
|
|
||||||
Therefore for each site, take xi for that site
|
Therefore for each site, take xi for that site
|
||||||
i) generate |a0|<1 with dist
|
i) generate |a0|<1 with dist
|
||||||
(1-a0^2)^0.5 e^{2 xi a0 } da0
|
(1-a0^2)^0.5 e^{2 xi a0 } da0
|
||||||
|
|
||||||
Take alpha = 2 xi = 2 xi [ recall 2 beta/Nc unmod staple norm]; hence 2.0/Nc
|
Take alpha = 2 xi = 2 xi [ recall 2 beta/Nc unmod staple norm]; hence 2.0/Nc
|
||||||
factor in Chroma ]
|
factor in Chroma ]
|
||||||
A. Generate two uniformly distributed pseudo-random numbers R and R', R'',
|
A. Generate two uniformly distributed pseudo-random numbers R and R', R'',
|
||||||
R''' in the unit interval;
|
R''' in the unit interval;
|
||||||
B. Set X = -(ln R)/alpha, X' =-(ln R')/alpha;
|
B. Set X = -(ln R)/alpha, X' =-(ln R')/alpha;
|
||||||
C. Set C = cos^2(2pi R"), with R" another uniform random number in [0,1] ;
|
C. Set C = cos^2(2pi R"), with R" another uniform random number in [0,1] ;
|
||||||
D. Set A = XC;
|
D. Set A = XC;
|
||||||
E. Let d = X'+A;
|
E. Let d = X'+A;
|
||||||
F. If R'''^2 :> 1 - 0.5 d, go back to A;
|
F. If R'''^2 :> 1 - 0.5 d, go back to A;
|
||||||
G. Set a0 = 1 - d;
|
G. Set a0 = 1 - d;
|
||||||
|
|
||||||
Note that in step D setting B ~ X - A and using B in place of A in step E will
|
Note that in step D setting B ~ X - A and using B in place of A in step E will
|
||||||
generate a second independent a 0 value.
|
generate a second independent a 0 value.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////
|
||||||
@ -518,7 +517,7 @@ class SU {
|
|||||||
a[3] = a123mag * cos_theta;
|
a[3] = a123mag * cos_theta;
|
||||||
|
|
||||||
ua = toComplex(a[0]) * ident + toComplex(a[1]) * pauli1 +
|
ua = toComplex(a[0]) * ident + toComplex(a[1]) * pauli1 +
|
||||||
toComplex(a[2]) * pauli2 + toComplex(a[3]) * pauli3;
|
toComplex(a[2]) * pauli2 + toComplex(a[3]) * pauli3;
|
||||||
|
|
||||||
b = 1.0;
|
b = 1.0;
|
||||||
b = where(wheremask, uinv * ua, b);
|
b = where(wheremask, uinv * ua, b);
|
||||||
@ -616,7 +615,7 @@ class SU {
|
|||||||
|
|
||||||
typedef Lattice<vTComplexType> LatticeComplexType;
|
typedef Lattice<vTComplexType> LatticeComplexType;
|
||||||
typedef typename GridTypeMapper<
|
typedef typename GridTypeMapper<
|
||||||
typename LatticeMatrixType::vector_object>::scalar_object MatrixType;
|
typename LatticeMatrixType::vector_object>::scalar_object MatrixType;
|
||||||
|
|
||||||
LatticeComplexType ca(grid);
|
LatticeComplexType ca(grid);
|
||||||
LatticeMatrixType lie(grid);
|
LatticeMatrixType lie(grid);
|
||||||
@ -675,11 +674,11 @@ class SU {
|
|||||||
out += la;
|
out += la;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
add GaugeTrans
|
add GaugeTrans
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template<typename GaugeField,typename GaugeMat>
|
template<typename GaugeField,typename GaugeMat>
|
||||||
static void GaugeTransform( GaugeField &Umu, GaugeMat &g){
|
static void GaugeTransform( GaugeField &Umu, GaugeMat &g){
|
||||||
GridBase *grid = Umu._grid;
|
GridBase *grid = Umu._grid;
|
||||||
conformable(grid,g._grid);
|
conformable(grid,g._grid);
|
||||||
@ -694,7 +693,7 @@ template<typename GaugeField,typename GaugeMat>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
template<typename GaugeMat>
|
template<typename GaugeMat>
|
||||||
static void GaugeTransform( std::vector<GaugeMat> &U, GaugeMat &g){
|
static void GaugeTransform( std::vector<GaugeMat> &U, GaugeMat &g){
|
||||||
GridBase *grid = g._grid;
|
GridBase *grid = g._grid;
|
||||||
GaugeMat ag(grid); ag = adj(g);
|
GaugeMat ag(grid); ag = adj(g);
|
||||||
for(int mu=0;mu<Nd;mu++){
|
for(int mu=0;mu<Nd;mu++){
|
||||||
@ -793,6 +792,5 @@ typedef SU<5> SU5;
|
|||||||
|
|
||||||
typedef SU<Nc> FundamentalMatrices;
|
typedef SU<Nc> FundamentalMatrices;
|
||||||
|
|
||||||
}
|
NAMESPACE_END(Grid);
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user