mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Nearing well optimised state
This commit is contained in:
parent
ba40a3f763
commit
0afecfcae7
@ -135,8 +135,8 @@ public:
|
|||||||
CoarseVector Ctmp(_CoarseOperator.Grid());
|
CoarseVector Ctmp(_CoarseOperator.Grid());
|
||||||
CoarseVector Csol(_CoarseOperator.Grid());
|
CoarseVector Csol(_CoarseOperator.Grid());
|
||||||
|
|
||||||
ConjugateGradient<CoarseVector> CG(1.0e-3,1000,false);
|
ConjugateGradient<CoarseVector> CG(1.0e-3,100,false);
|
||||||
ConjugateGradient<FineField> fCG(1.0e-3,15,false);
|
ConjugateGradient<FineField> fCG(1.0e-3,10,false);
|
||||||
|
|
||||||
HermitianLinearOperator<CoarseOperator,CoarseVector> HermOp(_CoarseOperator);
|
HermitianLinearOperator<CoarseOperator,CoarseVector> HermOp(_CoarseOperator);
|
||||||
MdagMLinearOperator<CoarseOperator,CoarseVector> MdagMOp(_CoarseOperator);
|
MdagMLinearOperator<CoarseOperator,CoarseVector> MdagMOp(_CoarseOperator);
|
||||||
@ -165,7 +165,7 @@ public:
|
|||||||
|
|
||||||
_Aggregates.ProjectToSubspace (Csrc,tmp);
|
_Aggregates.ProjectToSubspace (Csrc,tmp);
|
||||||
HermOp.AdjOp(Csrc,Ctmp);// Normal equations
|
HermOp.AdjOp(Csrc,Ctmp);// Normal equations
|
||||||
Csol=Zero();
|
_Guess(Ctmp,Csol);
|
||||||
CG(MdagMOp,Ctmp,Csol);
|
CG(MdagMOp,Ctmp,Csol);
|
||||||
|
|
||||||
HermOp.Op(Csol,Ctmp);
|
HermOp.Op(Csol,Ctmp);
|
||||||
@ -274,9 +274,10 @@ public:
|
|||||||
|
|
||||||
CoarseVector Csrc(_CoarseOperator.Grid());
|
CoarseVector Csrc(_CoarseOperator.Grid());
|
||||||
CoarseVector Ctmp(_CoarseOperator.Grid());
|
CoarseVector Ctmp(_CoarseOperator.Grid());
|
||||||
|
CoarseVector Ctmp1(_CoarseOperator.Grid());
|
||||||
CoarseVector Csol(_CoarseOperator.Grid());
|
CoarseVector Csol(_CoarseOperator.Grid());
|
||||||
|
|
||||||
ConjugateGradient<CoarseVector> CG(3.0e-2,100000);
|
ConjugateGradient<CoarseVector> CG(5.0e-2,100000);
|
||||||
|
|
||||||
HermitianLinearOperator<CoarseOperator,CoarseVector> HermOp(_CoarseOperator);
|
HermitianLinearOperator<CoarseOperator,CoarseVector> HermOp(_CoarseOperator);
|
||||||
MdagMLinearOperator<CoarseOperator,CoarseVector> MdagMOp(_CoarseOperator);
|
MdagMLinearOperator<CoarseOperator,CoarseVector> MdagMOp(_CoarseOperator);
|
||||||
@ -323,10 +324,20 @@ public:
|
|||||||
_Aggregates.ProjectToSubspace (Csrc,vec1);
|
_Aggregates.ProjectToSubspace (Csrc,vec1);
|
||||||
std::cout<<GridLogMessage << "ProjectToSubspaceDone" <<std::endl;
|
std::cout<<GridLogMessage << "ProjectToSubspaceDone" <<std::endl;
|
||||||
|
|
||||||
HermOp.AdjOp(Csrc,Ctmp);// Normal equations // This appears to be zero.
|
HermOp.AdjOp(Csrc,Ctmp1);// Normal equations
|
||||||
|
|
||||||
|
_Guess(Ctmp1,Csol);
|
||||||
|
CG(MdagMOp,Ctmp1,Csol);
|
||||||
|
|
||||||
|
//////////////////////////////
|
||||||
|
// Recompute true residual
|
||||||
|
//////////////////////////////
|
||||||
|
MdagMOp.HermOp(Csol,Ctmp);
|
||||||
|
Ctmp = Ctmp1 - Ctmp; // r=Csrc - M^dagM sol // This is already computed inside CG
|
||||||
|
HermOp.AdjOp(Ctmp,Ctmp1);// Normal equations
|
||||||
|
_Guess(Ctmp1,Ctmp); // sol = sol' + MdagM^-1 (Csrc' - MdagM sol')
|
||||||
|
Csol = Csol + Ctmp;
|
||||||
|
|
||||||
_Guess(Ctmp,Csol);
|
|
||||||
CG(MdagMOp,Ctmp,Csol);
|
|
||||||
std::cout<<GridLogMessage << "PromoteFromSubspace" <<std::endl;
|
std::cout<<GridLogMessage << "PromoteFromSubspace" <<std::endl;
|
||||||
_Aggregates.PromoteFromSubspace(Csol,vec1); // Ass^{-1} [in - A Min]_s
|
_Aggregates.PromoteFromSubspace(Csol,vec1); // Ass^{-1} [in - A Min]_s
|
||||||
// Q = Q[in - A Min]
|
// Q = Q[in - A Min]
|
||||||
@ -452,36 +463,17 @@ int main (int argc, char ** argv)
|
|||||||
Subspace Aggregates(Coarse5d,FGrid,0);
|
Subspace Aggregates(Coarse5d,FGrid,0);
|
||||||
|
|
||||||
assert ( (nbasis & 0x1)==0);
|
assert ( (nbasis & 0x1)==0);
|
||||||
int nb=nbasis/2;
|
|
||||||
std::cout<<GridLogMessage << " nbasis/2 = "<<nb<<std::endl;
|
|
||||||
// Aggregates.CreateSubspace(RNG5,HermDefOp,nb);
|
|
||||||
// Aggregates.CreateSubspaceLanczos(RNG5,HermDefOp,nb);
|
|
||||||
|
|
||||||
double f_first = 0.03;
|
{
|
||||||
double f_div = 1.2;
|
int nb=nbasis/2;
|
||||||
std::vector<double> f_lo(nb);
|
std::cout<<GridLogMessage << " nbasis/2 = "<<nb<<std::endl;
|
||||||
f_lo[0] = f_first;
|
|
||||||
for(int b=1;b<nb;b++) {
|
Aggregates.CreateSubspaceChebyshev(RNG5,HermDefOp,nb,60.0,0.02,500,110);
|
||||||
f_lo[b] = f_lo[b-1]/f_div;
|
for(int n=0;n<nb;n++){
|
||||||
|
G5R5(Aggregates.subspace[n+nb],Aggregates.subspace[n]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
std::vector<int> f_ord(nb,200);
|
|
||||||
f_ord[0]=500;
|
|
||||||
|
|
||||||
Aggregates.CreateSubspaceChebyshev(RNG5,HermDefOp,nb,60.0,f_lo,f_ord);
|
|
||||||
for(int n=0;n<nb;n++){
|
|
||||||
G5R5(Aggregates.subspace[n+nb],Aggregates.subspace[n]);
|
|
||||||
// std::cout<<GridLogMessage<<n<<" subspace "<<norm2(Aggregates.subspace[n+nb])<<" "<<norm2(Aggregates.subspace[n]) <<std::endl;
|
|
||||||
}
|
|
||||||
// for(int n=0;n<nbasis;n++){
|
|
||||||
// std::cout<<GridLogMessage << "vec["<<n<<"] = "<<norm2(Aggregates.subspace[n]) <<std::endl;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// for(int i=0;i<nbasis;i++){
|
|
||||||
// result = Aggregates.subspace[i];
|
|
||||||
// Aggregates.subspace[i]=result+g5*result;
|
|
||||||
// }
|
|
||||||
result=Zero();
|
|
||||||
|
|
||||||
std::cout<<GridLogMessage << "**************************************************"<< std::endl;
|
std::cout<<GridLogMessage << "**************************************************"<< std::endl;
|
||||||
std::cout<<GridLogMessage << "Building coarse representation of Indef operator" <<std::endl;
|
std::cout<<GridLogMessage << "Building coarse representation of Indef operator" <<std::endl;
|
||||||
@ -490,10 +482,12 @@ int main (int argc, char ** argv)
|
|||||||
Gamma5R5HermitianLinearOperator<DomainWallFermionR,LatticeFermion> HermIndefOpDD(DdwfDD);
|
Gamma5R5HermitianLinearOperator<DomainWallFermionR,LatticeFermion> HermIndefOpDD(DdwfDD);
|
||||||
CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LDOp(*Coarse5d,1); // Hermitian matrix
|
CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LDOp(*Coarse5d,1); // Hermitian matrix
|
||||||
LDOp.CoarsenOperator(FGrid,HermIndefOp,Aggregates);
|
LDOp.CoarsenOperator(FGrid,HermIndefOp,Aggregates);
|
||||||
|
exit(0);
|
||||||
|
|
||||||
CoarseVector c_src (Coarse5d);
|
CoarseVector c_src (Coarse5d);
|
||||||
CoarseVector c_res (Coarse5d);
|
CoarseVector c_res (Coarse5d);
|
||||||
gaussian(CRNG,c_src);
|
gaussian(CRNG,c_src);
|
||||||
|
result=Zero();
|
||||||
c_res=Zero();
|
c_res=Zero();
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
@ -515,12 +509,12 @@ int main (int argc, char ** argv)
|
|||||||
|
|
||||||
double c_first = 0.2;
|
double c_first = 0.2;
|
||||||
double c_div = 1.2;
|
double c_div = 1.2;
|
||||||
std::vector<double> c_lo(nb);
|
std::vector<double> c_lo(nbasis/2);
|
||||||
c_lo[0] = c_first;
|
c_lo[0] = c_first;
|
||||||
for(int b=1;b<nb;b++) {
|
for(int b=1;b<nbasis/2;b++) {
|
||||||
c_lo[b] = c_lo[b-1]/c_div;
|
c_lo[b] = c_lo[b-1]/c_div;
|
||||||
}
|
}
|
||||||
std::vector<int> c_ord(nb,200);
|
std::vector<int> c_ord(nbasis/2,200);
|
||||||
c_ord[0]=500;
|
c_ord[0]=500;
|
||||||
|
|
||||||
#define RECURSIVE_MULTIGRID
|
#define RECURSIVE_MULTIGRID
|
||||||
@ -562,14 +556,15 @@ int main (int argc, char ** argv)
|
|||||||
std::cout<<GridLogMessage << " Running coarse grid Lanczos "<< std::endl;
|
std::cout<<GridLogMessage << " Running coarse grid Lanczos "<< std::endl;
|
||||||
std::cout<<GridLogMessage << "**************************************************"<< std::endl;
|
std::cout<<GridLogMessage << "**************************************************"<< std::endl;
|
||||||
MdagMLinearOperator<Level1Op,CoarseVector> IRLHermOp(LDOp);
|
MdagMLinearOperator<Level1Op,CoarseVector> IRLHermOp(LDOp);
|
||||||
Chebyshev<CoarseVector> IRLCheby(0.01,14,161);
|
Chebyshev<CoarseVector> IRLCheby(0.005,16.0,51);
|
||||||
|
// IRLCheby.InitLowPass(0.01,18.0,51);
|
||||||
FunctionHermOp<CoarseVector> IRLOpCheby(IRLCheby,IRLHermOp);
|
FunctionHermOp<CoarseVector> IRLOpCheby(IRLCheby,IRLHermOp);
|
||||||
PlainHermOp<CoarseVector> IRLOp (IRLHermOp);
|
PlainHermOp<CoarseVector> IRLOp (IRLHermOp);
|
||||||
|
|
||||||
int Nstop=32;
|
int Nstop=24;
|
||||||
int Nk=32;
|
int Nk=24;
|
||||||
int Nm=48;
|
int Nm=48;
|
||||||
ImplicitlyRestartedLanczos<CoarseVector> IRL(IRLOpCheby,IRLOp,Nstop,Nk,Nm,1.0e-4,20);
|
ImplicitlyRestartedLanczos<CoarseVector> IRL(IRLOpCheby,IRLOp,Nstop,Nk,Nm,1.0e-3,20);
|
||||||
int Nconv;
|
int Nconv;
|
||||||
std::vector<RealD> eval(Nm);
|
std::vector<RealD> eval(Nm);
|
||||||
std::vector<CoarseVector> evec(Nm,Coarse5d);
|
std::vector<CoarseVector> evec(Nm,Coarse5d);
|
||||||
|
Loading…
Reference in New Issue
Block a user