mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 15:55:37 +00:00
Added more verbose log output to GeneralEvenOddRatioRationalPseudoFermionAction
In GeneralEvenOddRatioRationalPseudoFermionAction, setting the bounds check frequency to 0 now disables the check
This commit is contained in:
parent
ba5dc670a5
commit
220ad5e3ee
@ -84,6 +84,7 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
PhiEven(_NumOp.FermionRedBlackGrid()),
|
PhiEven(_NumOp.FermionRedBlackGrid()),
|
||||||
param(p)
|
param(p)
|
||||||
{
|
{
|
||||||
|
std::cout<<GridLogMessage << action_name() << " initialize: starting" << std::endl;
|
||||||
AlgRemez remez(param.lo,param.hi,param.precision);
|
AlgRemez remez(param.lo,param.hi,param.precision);
|
||||||
|
|
||||||
int inv_pow = param.inv_pow;
|
int inv_pow = param.inv_pow;
|
||||||
@ -100,6 +101,7 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
remez.generateApprox(param.degree,1,_2_inv_pow);
|
remez.generateApprox(param.degree,1,_2_inv_pow);
|
||||||
ApproxHalfPower.Init(remez,param.tolerance,false);
|
ApproxHalfPower.Init(remez,param.tolerance,false);
|
||||||
ApproxNegHalfPower.Init(remez,param.tolerance,true);
|
ApproxNegHalfPower.Init(remez,param.tolerance,true);
|
||||||
|
std::cout<<GridLogMessage << action_name() << " initialize: complete" << std::endl;
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual std::string action_name(){return "GeneralEvenOddRatioRationalPseudoFermionAction";}
|
virtual std::string action_name(){return "GeneralEvenOddRatioRationalPseudoFermionAction";}
|
||||||
@ -132,6 +134,7 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
//
|
//
|
||||||
// So eta should be of width sig = 1/sqrt(2).
|
// So eta should be of width sig = 1/sqrt(2).
|
||||||
|
|
||||||
|
std::cout<<GridLogMessage << action_name() << " refresh: starting" << std::endl;
|
||||||
RealD scale = std::sqrt(0.5);
|
RealD scale = std::sqrt(0.5);
|
||||||
|
|
||||||
FermionField eta(NumOp.FermionGrid());
|
FermionField eta(NumOp.FermionGrid());
|
||||||
@ -149,11 +152,13 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
|
|
||||||
|
|
||||||
// MdagM^1/(2*inv_pow) eta
|
// MdagM^1/(2*inv_pow) eta
|
||||||
|
std::cout<<GridLogMessage << action_name() << " refresh: doing (M^dag M)^{1/" << 2*param.inv_pow << "} eta" << std::endl;
|
||||||
SchurDifferentiableOperator<Impl> MdagM(DenOp);
|
SchurDifferentiableOperator<Impl> MdagM(DenOp);
|
||||||
ConjugateGradientMultiShift<FermionField> msCG_M(param.MaxIter,ApproxHalfPower);
|
ConjugateGradientMultiShift<FermionField> msCG_M(param.MaxIter,ApproxHalfPower);
|
||||||
msCG_M(MdagM,etaOdd,tmp);
|
msCG_M(MdagM,etaOdd,tmp);
|
||||||
|
|
||||||
// VdagV^-1/(2*inv_pow) MdagM^1/(2*inv_pow) eta
|
// VdagV^-1/(2*inv_pow) MdagM^1/(2*inv_pow) eta
|
||||||
|
std::cout<<GridLogMessage << action_name() << " refresh: doing (V^dag V)^{-1/" << 2*param.inv_pow << "} ( (M^dag M)^{1/" << 2*param.inv_pow << "} eta)" << std::endl;
|
||||||
SchurDifferentiableOperator<Impl> VdagV(NumOp);
|
SchurDifferentiableOperator<Impl> VdagV(NumOp);
|
||||||
ConjugateGradientMultiShift<FermionField> msCG_V(param.MaxIter,ApproxNegHalfPower);
|
ConjugateGradientMultiShift<FermionField> msCG_V(param.MaxIter,ApproxNegHalfPower);
|
||||||
msCG_V(VdagV,tmp,PhiOdd);
|
msCG_V(VdagV,tmp,PhiOdd);
|
||||||
@ -161,14 +166,14 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
assert(NumOp.ConstEE() == 1);
|
assert(NumOp.ConstEE() == 1);
|
||||||
assert(DenOp.ConstEE() == 1);
|
assert(DenOp.ConstEE() == 1);
|
||||||
PhiEven = Zero();
|
PhiEven = Zero();
|
||||||
|
std::cout<<GridLogMessage << action_name() << " refresh: starting" << std::endl;
|
||||||
};
|
};
|
||||||
|
|
||||||
//////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////
|
||||||
// S_f = chi^dag* P(V^dag*V)/Q(V^dag*V)* N(M^dag*M)/D(M^dag*M)* P(V^dag*V)/Q(V^dag*V)* chi
|
// S_f = chi^dag* P(V^dag*V)/Q(V^dag*V)* N(M^dag*M)/D(M^dag*M)* P(V^dag*V)/Q(V^dag*V)* chi
|
||||||
//////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////
|
||||||
virtual RealD S(const GaugeField &U) {
|
virtual RealD S(const GaugeField &U) {
|
||||||
|
std::cout<<GridLogMessage << action_name() << " compute action: starting" << std::endl;
|
||||||
NumOp.ImportGauge(U);
|
NumOp.ImportGauge(U);
|
||||||
DenOp.ImportGauge(U);
|
DenOp.ImportGauge(U);
|
||||||
|
|
||||||
@ -176,26 +181,29 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
FermionField Y(NumOp.FermionRedBlackGrid());
|
FermionField Y(NumOp.FermionRedBlackGrid());
|
||||||
|
|
||||||
// VdagV^1/(2*inv_pow) Phi
|
// VdagV^1/(2*inv_pow) Phi
|
||||||
|
std::cout<<GridLogMessage << action_name() << " compute action: doing (V^dag V)^{1/" << 2*param.inv_pow << "} Phi" << std::endl;
|
||||||
SchurDifferentiableOperator<Impl> VdagV(NumOp);
|
SchurDifferentiableOperator<Impl> VdagV(NumOp);
|
||||||
ConjugateGradientMultiShift<FermionField> msCG_V(param.MaxIter,ApproxHalfPower);
|
ConjugateGradientMultiShift<FermionField> msCG_V(param.MaxIter,ApproxHalfPower);
|
||||||
msCG_V(VdagV,PhiOdd,X);
|
msCG_V(VdagV,PhiOdd,X);
|
||||||
|
|
||||||
// MdagM^-1/(2*inv_pow) VdagV^1/(2*inv_pow) Phi
|
// MdagM^-1/(2*inv_pow) VdagV^1/(2*inv_pow) Phi
|
||||||
|
std::cout<<GridLogMessage << action_name() << " compute action: doing (M^dag M)^{-1/" << 2*param.inv_pow << "} ( (V^dag V)^{1/" << 2*param.inv_pow << "} Phi)" << std::endl;
|
||||||
SchurDifferentiableOperator<Impl> MdagM(DenOp);
|
SchurDifferentiableOperator<Impl> MdagM(DenOp);
|
||||||
ConjugateGradientMultiShift<FermionField> msCG_M(param.MaxIter,ApproxNegHalfPower);
|
ConjugateGradientMultiShift<FermionField> msCG_M(param.MaxIter,ApproxNegHalfPower);
|
||||||
msCG_M(MdagM,X,Y);
|
msCG_M(MdagM,X,Y);
|
||||||
|
|
||||||
// Randomly apply rational bounds checks.
|
// Randomly apply rational bounds checks.
|
||||||
if ( (rand()%param.BoundsCheckFreq)==0 ) {
|
if ( param.BoundsCheckFreq != 0 && (rand()%param.BoundsCheckFreq)==0 ) {
|
||||||
|
std::cout<<GridLogMessage << action_name() << " compute action: doing bounds check" << std::endl;
|
||||||
FermionField gauss(NumOp.FermionRedBlackGrid());
|
FermionField gauss(NumOp.FermionRedBlackGrid());
|
||||||
gauss = PhiOdd;
|
gauss = PhiOdd;
|
||||||
HighBoundCheck(MdagM,gauss,param.hi);
|
HighBoundCheck(MdagM,gauss,param.hi);
|
||||||
|
|
||||||
InversePowerBoundsCheck(param.inv_pow,param.MaxIter,param.tolerance*100,MdagM,gauss,ApproxNegPower);
|
InversePowerBoundsCheck(param.inv_pow,param.MaxIter,param.tolerance*100,MdagM,gauss,ApproxNegPower);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Phidag VdagV^1/(2*inv_pow) MdagM^-1/(2*inv_pow) MdagM^-1/(2*inv_pow) VdagV^1/(2*inv_pow) Phi
|
// Phidag VdagV^1/(2*inv_pow) MdagM^-1/(2*inv_pow) MdagM^-1/(2*inv_pow) VdagV^1/(2*inv_pow) Phi
|
||||||
RealD action = norm2(Y);
|
RealD action = norm2(Y);
|
||||||
|
std::cout<<GridLogMessage << action_name() << " compute action: complete" << std::endl;
|
||||||
|
|
||||||
return action;
|
return action;
|
||||||
};
|
};
|
||||||
@ -231,7 +239,7 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
//
|
//
|
||||||
|
|
||||||
virtual void deriv(const GaugeField &U,GaugeField & dSdU) {
|
virtual void deriv(const GaugeField &U,GaugeField & dSdU) {
|
||||||
|
std::cout<<GridLogMessage << action_name() << " deriv: starting" << std::endl;
|
||||||
const int n_f = ApproxNegPower.poles.size();
|
const int n_f = ApproxNegPower.poles.size();
|
||||||
const int n_pv = ApproxHalfPower.poles.size();
|
const int n_pv = ApproxHalfPower.poles.size();
|
||||||
|
|
||||||
@ -255,8 +263,11 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
ConjugateGradientMultiShift<FermionField> msCG_V(param.MaxIter,ApproxHalfPower);
|
ConjugateGradientMultiShift<FermionField> msCG_V(param.MaxIter,ApproxHalfPower);
|
||||||
ConjugateGradientMultiShift<FermionField> msCG_M(param.MaxIter,ApproxNegPower);
|
ConjugateGradientMultiShift<FermionField> msCG_M(param.MaxIter,ApproxNegPower);
|
||||||
|
|
||||||
|
std::cout<<GridLogMessage << action_name() << " deriv: doing (V^dag V)^{1/" << 2*param.inv_pow << "} Phi" << std::endl;
|
||||||
msCG_V(VdagV,PhiOdd,MpvPhi_k,MpvPhi);
|
msCG_V(VdagV,PhiOdd,MpvPhi_k,MpvPhi);
|
||||||
|
std::cout<<GridLogMessage << action_name() << " deriv: doing (M^dag M)^{-1/" << param.inv_pow << "} ( (V^dag V)^{1/" << 2*param.inv_pow << "} Phi)" << std::endl;
|
||||||
msCG_M(MdagM,MpvPhi,MfMpvPhi_k,MfMpvPhi);
|
msCG_M(MdagM,MpvPhi,MfMpvPhi_k,MfMpvPhi);
|
||||||
|
std::cout<<GridLogMessage << action_name() << " deriv: doing (V^dag V)^{1/" << 2*param.inv_pow << "} ( (M^dag M)^{-1/" << param.inv_pow << "} (V^dag V)^{1/" << 2*param.inv_pow << "} Phi)" << std::endl;
|
||||||
msCG_V(VdagV,MfMpvPhi,MpvMfMpvPhi_k,MpvMfMpvPhi);
|
msCG_V(VdagV,MfMpvPhi,MpvMfMpvPhi_k,MpvMfMpvPhi);
|
||||||
|
|
||||||
RealD ak;
|
RealD ak;
|
||||||
@ -271,6 +282,7 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
// -ak MpvPhi_k^dag [ dV^dag V + V^dag dV ] MpvMfMpvPhi_k (3)
|
// -ak MpvPhi_k^dag [ dV^dag V + V^dag dV ] MpvMfMpvPhi_k (3)
|
||||||
|
|
||||||
//(1)
|
//(1)
|
||||||
|
std::cout<<GridLogMessage << action_name() << " deriv: doing dS/dU part (1)" << std::endl;
|
||||||
for(int k=0;k<n_f;k++){
|
for(int k=0;k<n_f;k++){
|
||||||
ak = ApproxNegPower.residues[k];
|
ak = ApproxNegPower.residues[k];
|
||||||
MdagM.Mpc(MfMpvPhi_k[k],Y);
|
MdagM.Mpc(MfMpvPhi_k[k],Y);
|
||||||
@ -280,6 +292,7 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
|
|
||||||
//(2)
|
//(2)
|
||||||
//(3)
|
//(3)
|
||||||
|
std::cout<<GridLogMessage << action_name() << " deriv: doing dS/dU part (2)+(3)" << std::endl;
|
||||||
for(int k=0;k<n_pv;k++){
|
for(int k=0;k<n_pv;k++){
|
||||||
|
|
||||||
ak = ApproxHalfPower.residues[k];
|
ak = ApproxHalfPower.residues[k];
|
||||||
@ -295,7 +308,7 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
}
|
}
|
||||||
|
|
||||||
//dSdU = Ta(dSdU);
|
//dSdU = Ta(dSdU);
|
||||||
|
std::cout<<GridLogMessage << action_name() << " deriv: complete" << std::endl;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user