mirror of
https://github.com/paboyle/Grid.git
synced 2025-06-17 07:17:06 +01:00
Debugged set_fj,
to be fixed: BUG in imag()
This commit is contained in:
@ -6,10 +6,10 @@
|
||||
#ifndef GAUGE_CONFIG_
|
||||
#define GAUGE_CONFIG_
|
||||
|
||||
namespace Grid {
|
||||
|
||||
namespace QCD {
|
||||
|
||||
namespace Grid {
|
||||
|
||||
namespace QCD {
|
||||
|
||||
/*!
|
||||
@brief Smeared configuration container
|
||||
|
||||
@ -23,42 +23,43 @@ namespace Grid {
|
||||
*/
|
||||
template <class Gimpl>
|
||||
class SmearedConfiguration {
|
||||
public:
|
||||
INHERIT_GIMPL_TYPES(Gimpl) ;
|
||||
|
||||
private:
|
||||
const unsigned int smearingLevels;
|
||||
Smear_Stout<Gimpl> StoutSmearing;
|
||||
std::vector<GaugeField> SmearedSet;
|
||||
|
||||
public:
|
||||
INHERIT_GIMPL_TYPES(Gimpl) ;
|
||||
|
||||
private:
|
||||
const unsigned int smearingLevels;
|
||||
Smear_Stout<Gimpl> StoutSmearing;
|
||||
std::vector<GaugeField> SmearedSet;
|
||||
|
||||
// Member functions
|
||||
//====================================================================
|
||||
void fill_smearedSet(GaugeField& U){
|
||||
void fill_smearedSet(GaugeField& U){
|
||||
ThinLinks = &U; //attach the smearing routine to the field U
|
||||
|
||||
//check the pointer is not null
|
||||
if (ThinLinks==NULL)
|
||||
std::cout << GridLogError << "[SmearedConfiguration] Error in ThinLinks pointer\n";
|
||||
std::cout << GridLogError << "[SmearedConfiguration] Error in ThinLinks pointer\n";
|
||||
|
||||
if (smearingLevels > 0){
|
||||
std::cout<< GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n";
|
||||
GaugeField previous_u(ThinLinks->_grid);
|
||||
|
||||
previous_u = *ThinLinks;
|
||||
for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){
|
||||
StoutSmearing.smear(SmearedSet[smearLvl],previous_u);
|
||||
previous_u = SmearedSet[smearLvl];
|
||||
std::cout<< GridLogDebug << "[SmearedConfiguration] Filling SmearedSet\n";
|
||||
GaugeField previous_u(ThinLinks->_grid);
|
||||
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(previous_u);
|
||||
std::cout<< GridLogDebug << "[SmearedConfiguration] Plaq: " << impl_plaq<< std::endl;
|
||||
previous_u = *ThinLinks;
|
||||
for(int smearLvl = 0; smearLvl < smearingLevels; ++smearLvl){
|
||||
StoutSmearing.smear(SmearedSet[smearLvl],previous_u);
|
||||
previous_u = SmearedSet[smearLvl];
|
||||
|
||||
}
|
||||
// For debug purposes
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(previous_u);
|
||||
std::cout<< GridLogDebug << "[SmearedConfiguration] Plaq: " << impl_plaq<< std::endl;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
//====================================================================
|
||||
GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime,
|
||||
const GaugeField& GaugeK) const{
|
||||
GaugeField AnalyticSmearedForce(const GaugeField& SigmaKPrime,
|
||||
const GaugeField& GaugeK) const{
|
||||
GridBase *grid = GaugeK._grid;
|
||||
GaugeField C(grid), SigmaK(grid), iLambda(grid);
|
||||
GaugeLinkField iLambda_mu(grid);
|
||||
@ -69,27 +70,27 @@ namespace Grid {
|
||||
StoutSmearing.BaseSmear(C, GaugeK);
|
||||
|
||||
for (int mu = 0; mu < Nd; mu++){
|
||||
Cmu = peekLorentz( C,mu);
|
||||
GaugeKmu = peekLorentz(GaugeK,mu);
|
||||
SigmaKPrime_mu = peekLorentz(SigmaKPrime,mu);
|
||||
iQ = Ta(Cmu*adj(GaugeKmu));
|
||||
set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu);
|
||||
pokeLorentz(SigmaK, SigmaKPrime_mu*e_iQ + adj(Cmu)*iLambda_mu, mu);
|
||||
pokeLorentz(iLambda, iLambda_mu, mu);
|
||||
Cmu = peekLorentz( C,mu);
|
||||
GaugeKmu = peekLorentz(GaugeK,mu);
|
||||
SigmaKPrime_mu = peekLorentz(SigmaKPrime,mu);
|
||||
iQ = Ta(Cmu*adj(GaugeKmu));
|
||||
set_iLambda(iLambda_mu, e_iQ, iQ, SigmaKPrime_mu, GaugeKmu);
|
||||
pokeLorentz(SigmaK, SigmaKPrime_mu*e_iQ + adj(Cmu)*iLambda_mu, mu);
|
||||
pokeLorentz(iLambda, iLambda_mu, mu);
|
||||
}
|
||||
StoutSmearing.derivative(SigmaK, iLambda, GaugeK);// derivative of SmearBase
|
||||
return SigmaK;
|
||||
}
|
||||
}
|
||||
/*! @brief Returns smeared configuration at level 'Level' */
|
||||
const GaugeField& get_smeared_conf(int Level) const{
|
||||
const GaugeField& get_smeared_conf(int Level) const{
|
||||
return SmearedSet[Level];
|
||||
}
|
||||
}
|
||||
//====================================================================
|
||||
void set_iLambda(GaugeLinkField& iLambda,
|
||||
GaugeLinkField& e_iQ,
|
||||
const GaugeLinkField& iQ,
|
||||
const GaugeLinkField& Sigmap,
|
||||
const GaugeLinkField& GaugeK)const{
|
||||
void set_iLambda(GaugeLinkField& iLambda,
|
||||
GaugeLinkField& e_iQ,
|
||||
const GaugeLinkField& iQ,
|
||||
const GaugeLinkField& Sigmap,
|
||||
const GaugeLinkField& GaugeK)const{
|
||||
GridBase *grid = iQ._grid;
|
||||
GaugeLinkField iQ2(grid), iQ3(grid), B1(grid), B2(grid), USigmap(grid);
|
||||
GaugeLinkField unity(grid);
|
||||
@ -103,9 +104,9 @@ namespace Grid {
|
||||
LatticeComplex r01(grid), r11(grid), r21(grid), r02(grid), r12(grid);
|
||||
LatticeComplex r22(grid), tr1(grid), tr2(grid);
|
||||
LatticeComplex b10(grid), b11(grid), b12(grid), b20(grid), b21(grid), b22(grid);
|
||||
LatticeReal unitReal(grid);
|
||||
LatticeReal LatticeUnitReal(grid);
|
||||
|
||||
unitReal = 1.0;
|
||||
LatticeUnitReal = 1.0;
|
||||
|
||||
// Exponential
|
||||
iQ2 = iQ * iQ;
|
||||
@ -125,19 +126,19 @@ namespace Grid {
|
||||
e2iu = toComplex(cos(2.0*u)) + timesI(toComplex(sin(2.0*u)));
|
||||
|
||||
r01 = (toComplex(2.0*u) + timesI(toComplex(2.0*(u2-w2)))) * e2iu
|
||||
+ emiu * (toComplex(16.0*u*cosw + 2.0*u*(3.0*u2+w2)*xi0) +
|
||||
timesI(toComplex(-8.0*u2*cosw + 2.0*(9.0*u2+w2)*xi0)));
|
||||
+ emiu * (toComplex(16.0*u*cosw + 2.0*u*(3.0*u2+w2)*xi0) +
|
||||
timesI(toComplex(-8.0*u2*cosw + 2.0*(9.0*u2+w2)*xi0)));
|
||||
|
||||
r11 = (toComplex(2.0*unitReal) + timesI(toComplex(4.0*u)))* e2iu
|
||||
+ emiu * (toComplex(-2.0*cosw + (3.0*u2-w2)*xi0) +
|
||||
timesI(toComplex(2.0*u*cosw + 6.0*u*xi0)));
|
||||
r11 = (toComplex(2.0*LatticeUnitReal) + timesI(toComplex(4.0*u)))* e2iu
|
||||
+ emiu * (toComplex(-2.0*cosw + (3.0*u2-w2)*xi0) +
|
||||
timesI(toComplex(2.0*u*cosw + 6.0*u*xi0)));
|
||||
|
||||
r21 = timesI(toComplex(2.0*unitReal)) * e2iu
|
||||
+ emiu * (toComplex(-3.0*u*xi0) + timesI(toComplex(cosw - 3.0*xi0)));
|
||||
r21 = 2.0*timesI(e2iu)
|
||||
+ emiu * (toComplex(-3.0*u*xi0) + timesI(toComplex(cosw - 3.0*xi0)));
|
||||
|
||||
|
||||
r02 = -2.0 * e2iu + emiu * (toComplex(-8.0*u2*xi0) +
|
||||
timesI(toComplex(2.0*u*(cosw + xi0 + 3.0*u2*xi1))));
|
||||
timesI(toComplex(2.0*u*(cosw + xi0 + 3.0*u2*xi1))));
|
||||
|
||||
r12 = emiu * (toComplex(2.0*u*xi0) + timesI(toComplex(-cosw - xi0 + 3.0*u2*xi1)));
|
||||
|
||||
@ -172,34 +173,34 @@ namespace Grid {
|
||||
GaugeLinkField USQ = USigmap * timesMinusI(iQ);
|
||||
|
||||
GaugeLinkField iGamma = tr1 * timesMinusI(iQ) - tr2 * iQ2 +
|
||||
f1 * USigmap + f2 * QUS + f2 * USQ;
|
||||
f1 * USigmap + f2 * QUS + f2 * USQ;
|
||||
|
||||
iLambda = Ta(iGamma);
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
//====================================================================
|
||||
public:
|
||||
public:
|
||||
GaugeField* ThinLinks; /*!< @brief Pointer to the thin
|
||||
links configuration */
|
||||
|
||||
/*! @brief Standard constructor */
|
||||
SmearedConfiguration(GridCartesian * UGrid,
|
||||
unsigned int Nsmear,
|
||||
Smear_Stout<Gimpl>& Stout):
|
||||
SmearedConfiguration(GridCartesian * UGrid,
|
||||
unsigned int Nsmear,
|
||||
Smear_Stout<Gimpl>& Stout):
|
||||
smearingLevels(Nsmear),
|
||||
StoutSmearing(Stout),
|
||||
ThinLinks(NULL){
|
||||
for (unsigned int i=0; i< smearingLevels; ++i)
|
||||
SmearedSet.push_back(*(new GaugeField(UGrid)));
|
||||
StoutSmearing(Stout),
|
||||
ThinLinks(NULL){
|
||||
for (unsigned int i=0; i< smearingLevels; ++i)
|
||||
SmearedSet.push_back(*(new GaugeField(UGrid)));
|
||||
}
|
||||
|
||||
/*! For just thin links */
|
||||
SmearedConfiguration():
|
||||
SmearedConfiguration():
|
||||
smearingLevels(0),
|
||||
StoutSmearing(),
|
||||
SmearedSet(),
|
||||
ThinLinks(NULL){}
|
||||
StoutSmearing(),
|
||||
SmearedSet(),
|
||||
ThinLinks(NULL){}
|
||||
|
||||
|
||||
// attach the smeared routines to the thin links U and fill the smeared set
|
||||
@ -207,59 +208,59 @@ namespace Grid {
|
||||
|
||||
//====================================================================
|
||||
void smeared_force(GaugeField& SigmaTilde) const{
|
||||
if (smearingLevels > 0){
|
||||
if (smearingLevels > 0){
|
||||
GaugeField force = SigmaTilde;//actually = U*SigmaTilde
|
||||
GaugeLinkField tmp_mu(SigmaTilde._grid);
|
||||
|
||||
for (int mu = 0; mu < Nd; mu++){
|
||||
for (int mu = 0; mu < Nd; mu++){
|
||||
// to get SigmaTilde
|
||||
tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu);
|
||||
pokeLorentz(force, tmp_mu, mu);
|
||||
tmp_mu = adj(peekLorentz(SmearedSet[smearingLevels-1], mu)) * peekLorentz(force,mu);
|
||||
pokeLorentz(force, tmp_mu, mu);
|
||||
}
|
||||
for(int ismr = smearingLevels - 1; ismr > 0; --ismr)
|
||||
force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1));
|
||||
force = AnalyticSmearedForce(force,get_smeared_conf(ismr-1));
|
||||
|
||||
force = AnalyticSmearedForce(force,*ThinLinks);
|
||||
|
||||
for (int mu = 0; mu < Nd; mu++){
|
||||
tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu);
|
||||
pokeLorentz(SigmaTilde, tmp_mu, mu);
|
||||
tmp_mu = peekLorentz(*ThinLinks, mu) * peekLorentz(force, mu);
|
||||
pokeLorentz(SigmaTilde, tmp_mu, mu);
|
||||
}
|
||||
}// if smearingLevels = 0 do nothing
|
||||
}
|
||||
}
|
||||
//====================================================================
|
||||
|
||||
|
||||
GaugeField& get_SmearedU(){
|
||||
|
||||
GaugeField& get_SmearedU(){
|
||||
return SmearedSet[smearingLevels-1];
|
||||
}
|
||||
|
||||
GaugeField& get_U(bool smeared=false) {
|
||||
}
|
||||
|
||||
GaugeField& get_U(bool smeared=false) {
|
||||
// get the config, thin links by default
|
||||
if (smeared){
|
||||
if (smearingLevels){
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(SmearedSet[smearingLevels-1]);
|
||||
std::cout<< GridLogDebug << "getting U Plaq: " << impl_plaq<< std::endl;
|
||||
return get_SmearedU();
|
||||
|
||||
}
|
||||
else {
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(*ThinLinks);
|
||||
std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl;
|
||||
return *ThinLinks;
|
||||
}
|
||||
if (smearingLevels){
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(SmearedSet[smearingLevels-1]);
|
||||
std::cout<< GridLogDebug << "getting U Plaq: " << impl_plaq<< std::endl;
|
||||
return get_SmearedU();
|
||||
|
||||
}
|
||||
else {
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(*ThinLinks);
|
||||
std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl;
|
||||
return *ThinLinks;
|
||||
}
|
||||
}
|
||||
else{
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(*ThinLinks);
|
||||
std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl;
|
||||
return *ThinLinks;}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
RealD impl_plaq = WilsonLoops<Gimpl>::avgPlaquette(*ThinLinks);
|
||||
std::cout<< GridLogDebug << "getting Thin Plaq: " << impl_plaq<< std::endl;
|
||||
return *ThinLinks;}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user