mirror of
https://github.com/paboyle/Grid.git
synced 2024-11-10 07:55:35 +00:00
Patches for beginnings of an overlap multigrid
This commit is contained in:
parent
a0d4f832cf
commit
b4a6dbfa65
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <algorithms/SparseMatrix.h>
|
#include <algorithms/SparseMatrix.h>
|
||||||
#include <algorithms/LinearOperator.h>
|
#include <algorithms/LinearOperator.h>
|
||||||
#include <algorithms/CoarsenedMatrix.h>
|
|
||||||
|
|
||||||
#include <algorithms/approx/Zolotarev.h>
|
#include <algorithms/approx/Zolotarev.h>
|
||||||
#include <algorithms/approx/Chebyshev.h>
|
#include <algorithms/approx/Chebyshev.h>
|
||||||
@ -17,6 +16,9 @@
|
|||||||
|
|
||||||
#include <algorithms/iterative/ConjugateGradientMultiShift.h>
|
#include <algorithms/iterative/ConjugateGradientMultiShift.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include <algorithms/CoarsenedMatrix.h>
|
||||||
|
|
||||||
// Eigen/lanczos
|
// Eigen/lanczos
|
||||||
// EigCg
|
// EigCg
|
||||||
// MCR
|
// MCR
|
||||||
|
@ -12,9 +12,6 @@ namespace Grid {
|
|||||||
std::vector<int> directions ;
|
std::vector<int> directions ;
|
||||||
std::vector<int> displacements;
|
std::vector<int> displacements;
|
||||||
|
|
||||||
// FIXME -- don't like xposing the operator directions
|
|
||||||
// as different to the geometrical dirs
|
|
||||||
// Also don't like special casing five dim.. should pass an object in template
|
|
||||||
Geometry(int _d) {
|
Geometry(int _d) {
|
||||||
|
|
||||||
int base = (_d==5) ? 1:0;
|
int base = (_d==5) ? 1:0;
|
||||||
@ -64,6 +61,99 @@ namespace Grid {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<class Fobj,class CComplex,int nbasis>
|
||||||
|
class Aggregation {
|
||||||
|
public:
|
||||||
|
typedef iVector<CComplex,nbasis > siteVector;
|
||||||
|
typedef Lattice<siteVector> CoarseVector;
|
||||||
|
typedef Lattice<iMatrix<CComplex,nbasis > > CoarseMatrix;
|
||||||
|
|
||||||
|
typedef Lattice< CComplex > CoarseScalar; // used for inner products on fine field
|
||||||
|
typedef Lattice<Fobj > FineField;
|
||||||
|
|
||||||
|
GridBase *CoarseGrid;
|
||||||
|
GridBase *FineGrid;
|
||||||
|
std::vector<Lattice<Fobj> > subspace;
|
||||||
|
|
||||||
|
Aggregation(GridBase *_CoarseGrid,GridBase *_FineGrid) :
|
||||||
|
CoarseGrid(_CoarseGrid),
|
||||||
|
FineGrid(_FineGrid),
|
||||||
|
subspace(nbasis,_FineGrid)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
void Orthogonalise(void){
|
||||||
|
CoarseScalar InnerProd(CoarseGrid);
|
||||||
|
blockOrthogonalise(InnerProd,subspace);
|
||||||
|
#if 1
|
||||||
|
// CheckOrthogonal();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
void CheckOrthogonal(void){
|
||||||
|
CoarseVector iProj(CoarseGrid);
|
||||||
|
CoarseVector eProj(CoarseGrid);
|
||||||
|
Lattice<CComplex> pokey(CoarseGrid);
|
||||||
|
|
||||||
|
|
||||||
|
for(int i=0;i<nbasis;i++){
|
||||||
|
blockProject(iProj,subspace[i],subspace);
|
||||||
|
|
||||||
|
eProj=zero;
|
||||||
|
for(int ss=0;ss<CoarseGrid->oSites();ss++){
|
||||||
|
eProj._odata[ss](i)=CComplex(1.0);
|
||||||
|
}
|
||||||
|
eProj=eProj - iProj;
|
||||||
|
std::cout<<"Orthog check error "<<i<<" " << norm2(eProj)<<std::endl;
|
||||||
|
}
|
||||||
|
std::cout <<"CheckOrthog done"<<std::endl;
|
||||||
|
}
|
||||||
|
void ProjectToSubspace(CoarseVector &CoarseVec,const FineField &FineVec){
|
||||||
|
blockProject(CoarseVec,FineVec,subspace);
|
||||||
|
}
|
||||||
|
void PromoteFromSubspace(const CoarseVector &CoarseVec,FineField &FineVec){
|
||||||
|
blockPromote(CoarseVec,FineVec,subspace);
|
||||||
|
}
|
||||||
|
void CreateSubspaceRandom(GridParallelRNG &RNG){
|
||||||
|
for(int i=0;i<nbasis;i++){
|
||||||
|
random(RNG,subspace[i]);
|
||||||
|
std::cout<<" norm subspace["<<i<<"] "<<norm2(subspace[i])<<std::endl;
|
||||||
|
}
|
||||||
|
Orthogonalise();
|
||||||
|
}
|
||||||
|
virtual void CreateSubspace(GridParallelRNG &RNG,LinearOperatorBase<FineField> &hermop) {
|
||||||
|
|
||||||
|
RealD scale;
|
||||||
|
|
||||||
|
ConjugateGradient<FineField> CG(1.0e-4,10000);
|
||||||
|
FineField noise(FineGrid);
|
||||||
|
FineField Mn(FineGrid);
|
||||||
|
|
||||||
|
for(int b=0;b<nbasis;b++){
|
||||||
|
|
||||||
|
gaussian(RNG,noise);
|
||||||
|
scale = std::pow(norm2(noise),-0.5);
|
||||||
|
noise=noise*scale;
|
||||||
|
|
||||||
|
hermop.Op(noise,Mn); std::cout << "Noise "<<b<<" nMdagMn "<<norm2(Mn)<< " "<< norm2(noise)<<std::endl;
|
||||||
|
for(int i=0;i<2;i++){
|
||||||
|
|
||||||
|
CG(hermop,noise,subspace[b]);
|
||||||
|
|
||||||
|
noise = subspace[b];
|
||||||
|
scale = std::pow(norm2(noise),-0.5);
|
||||||
|
noise=noise*scale;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
hermop.Op(noise,Mn); std::cout << "filtered "<<b<<" <s|MdagM|s> "<<norm2(Mn)<< " "<< norm2(noise)<<std::endl;
|
||||||
|
subspace[b] = noise;
|
||||||
|
}
|
||||||
|
|
||||||
|
Orthogonalise();
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
// Fine Object == (per site) type of fine field
|
// Fine Object == (per site) type of fine field
|
||||||
// nbasis == number of deflation vectors
|
// nbasis == number of deflation vectors
|
||||||
template<class Fobj,class CComplex,int nbasis>
|
template<class Fobj,class CComplex,int nbasis>
|
||||||
@ -145,7 +235,8 @@ namespace Grid {
|
|||||||
comm_buf.resize(Stencil._unified_buffer_size);
|
comm_buf.resize(Stencil._unified_buffer_size);
|
||||||
};
|
};
|
||||||
|
|
||||||
void CoarsenOperator(GridBase *FineGrid,LinearOperatorBase<Lattice<Fobj> > &linop,std::vector<Lattice<Fobj> > & subspace){
|
void CoarsenOperator(GridBase *FineGrid,LinearOperatorBase<Lattice<Fobj> > &linop,
|
||||||
|
Aggregation<Fobj,CComplex,nbasis> & Subspace){
|
||||||
|
|
||||||
FineField iblock(FineGrid); // contributions from within this block
|
FineField iblock(FineGrid); // contributions from within this block
|
||||||
FineField oblock(FineGrid); // contributions from outwith this block
|
FineField oblock(FineGrid); // contributions from outwith this block
|
||||||
@ -162,8 +253,11 @@ namespace Grid {
|
|||||||
CoarseScalar InnerProd(Grid());
|
CoarseScalar InnerProd(Grid());
|
||||||
|
|
||||||
// Orthogonalise the subblocks over the basis
|
// Orthogonalise the subblocks over the basis
|
||||||
blockOrthogonalise(InnerProd,subspace);
|
blockOrthogonalise(InnerProd,Subspace.subspace);
|
||||||
blockProject(iProj,subspace[0],subspace);
|
//Subspace.Orthogonalise();
|
||||||
|
// Subspace.CheckOrthogonal();
|
||||||
|
//Subspace.Orthogonalise();
|
||||||
|
// Subspace.CheckOrthogonal();
|
||||||
|
|
||||||
// Compute the matrix elements of linop between this orthonormal
|
// Compute the matrix elements of linop between this orthonormal
|
||||||
// set of vectors.
|
// set of vectors.
|
||||||
@ -177,7 +271,7 @@ namespace Grid {
|
|||||||
assert(self_stencil!=-1);
|
assert(self_stencil!=-1);
|
||||||
|
|
||||||
for(int i=0;i<nbasis;i++){
|
for(int i=0;i<nbasis;i++){
|
||||||
phi=subspace[i];
|
phi=Subspace.subspace[i];
|
||||||
for(int p=0;p<geom.npoint;p++){
|
for(int p=0;p<geom.npoint;p++){
|
||||||
|
|
||||||
int dir = geom.directions[p];
|
int dir = geom.directions[p];
|
||||||
@ -210,8 +304,10 @@ namespace Grid {
|
|||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
blockProject(iProj,iblock,subspace);
|
Subspace.ProjectToSubspace(iProj,iblock);
|
||||||
blockProject(oProj,oblock,subspace);
|
Subspace.ProjectToSubspace(oProj,oblock);
|
||||||
|
// blockProject(iProj,iblock,Subspace.subspace);
|
||||||
|
// blockProject(oProj,oblock,Subspace.subspace);
|
||||||
for(int ss=0;ss<Grid()->oSites();ss++){
|
for(int ss=0;ss<Grid()->oSites();ss++){
|
||||||
for(int j=0;j<nbasis;j++){
|
for(int j=0;j<nbasis;j++){
|
||||||
if( disp!= 0 ) {
|
if( disp!= 0 ) {
|
||||||
@ -234,19 +330,19 @@ namespace Grid {
|
|||||||
}
|
}
|
||||||
std::cout<< " picking by block0 "<< self_stencil <<std::endl;
|
std::cout<< " picking by block0 "<< self_stencil <<std::endl;
|
||||||
|
|
||||||
phi=subspace[0];
|
phi=Subspace.subspace[0];
|
||||||
std::vector<int> bc(FineGrid->_ndimension,0);
|
std::vector<int> bc(FineGrid->_ndimension,0);
|
||||||
|
|
||||||
blockPick(Grid(),phi,tmp,bc); // Pick out a block
|
blockPick(Grid(),phi,tmp,bc); // Pick out a block
|
||||||
linop.Op(tmp,Mphi); // Apply big dop
|
linop.Op(tmp,Mphi); // Apply big dop
|
||||||
blockProject(iProj,Mphi,subspace); // project it and print it
|
blockProject(iProj,Mphi,Subspace.subspace); // project it and print it
|
||||||
std::cout<< " Computed matrix elements from block zero only "<<std::endl;
|
std::cout<< " Computed matrix elements from block zero only "<<std::endl;
|
||||||
std::cout<< iProj <<std::endl;
|
std::cout<< iProj <<std::endl;
|
||||||
std::cout<<"Computed Coarse Operator"<<std::endl;
|
std::cout<<"Computed Coarse Operator"<<std::endl;
|
||||||
#endif
|
#endif
|
||||||
// AssertHermitian();
|
|
||||||
// ForceHermitian();
|
// ForceHermitian();
|
||||||
// ForceDiagonal();
|
AssertHermitian();
|
||||||
|
// ForceDiagonal();
|
||||||
}
|
}
|
||||||
void ForceDiagonal(void) {
|
void ForceDiagonal(void) {
|
||||||
|
|
||||||
@ -263,7 +359,7 @@ namespace Grid {
|
|||||||
|
|
||||||
Complex one(1.0);
|
Complex one(1.0);
|
||||||
|
|
||||||
iMatrix<Complex,nbasis> ident; ident=one;
|
iMatrix<CComplex,nbasis> ident; ident=one;
|
||||||
|
|
||||||
val = val*adj(val);
|
val = val*adj(val);
|
||||||
val = val + 1.0;
|
val = val + 1.0;
|
||||||
@ -279,7 +375,7 @@ namespace Grid {
|
|||||||
int dd=d+1;
|
int dd=d+1;
|
||||||
A[2*d] = adj(Cshift(A[2*d+1],dd,1));
|
A[2*d] = adj(Cshift(A[2*d+1],dd,1));
|
||||||
}
|
}
|
||||||
A[8] = 0.5*(A[8] + adj(A[8]));
|
// A[8] = 0.5*(A[8] + adj(A[8]));
|
||||||
}
|
}
|
||||||
void AssertHermitian(void) {
|
void AssertHermitian(void) {
|
||||||
CoarseMatrix AA (Grid());
|
CoarseMatrix AA (Grid());
|
||||||
|
@ -15,7 +15,7 @@ public:
|
|||||||
Integer MaxIterations;
|
Integer MaxIterations;
|
||||||
int verbose;
|
int verbose;
|
||||||
ConjugateGradient(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) {
|
ConjugateGradient(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) {
|
||||||
verbose=1;
|
verbose=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -58,7 +58,7 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << std::setprecision(4)<< "ConjugateGradient: k=0 residual "<<cp<<" rsq"<<rsq<<std::endl;
|
if(verbose) std::cout << std::setprecision(4)<< "ConjugateGradient: k=0 residual "<<cp<<" rsq"<<rsq<<std::endl;
|
||||||
|
|
||||||
int k;
|
int k;
|
||||||
for (k=1;k<=MaxIterations;k++){
|
for (k=1;k<=MaxIterations;k++){
|
||||||
@ -69,23 +69,29 @@ public:
|
|||||||
|
|
||||||
RealD qqck = norm2(mmp);
|
RealD qqck = norm2(mmp);
|
||||||
ComplexD dck = innerProduct(p,mmp);
|
ComplexD dck = innerProduct(p,mmp);
|
||||||
// if (verbose) std::cout <<std::setprecision(4)<< "ConjugateGradient: d,qq "<<d<< " "<<qq <<" qqcheck "<< qqck<< " dck "<< dck<<std::endl;
|
if (verbose) std::cout <<std::setprecision(4)<< "ConjugateGradient: d,qq "<<d<< " "<<qq <<" qqcheck "<< qqck<< " dck "<< dck<<std::endl;
|
||||||
|
|
||||||
a = c/d;
|
a = c/d;
|
||||||
b_pred = a*(a*qq-d)/c;
|
b_pred = a*(a*qq-d)/c;
|
||||||
|
|
||||||
|
|
||||||
// if (verbose) std::cout <<std::setprecision(4)<< "ConjugateGradient: a,bp "<<a<< " "<<b_pred <<std::endl;
|
if (verbose) std::cout <<std::setprecision(4)<< "ConjugateGradient: a,bp "<<a<< " "<<b_pred <<std::endl;
|
||||||
cp = axpy_norm(r,-a,mmp,r);
|
cp = axpy_norm(r,-a,mmp,r);
|
||||||
b = cp/c;
|
b = cp/c;
|
||||||
// std::cout <<std::setprecision(4)<< "ConjugateGradient: cp,b "<<cp<< " "<<b <<std::endl;
|
if (verbose) std::cout <<std::setprecision(4)<< "ConjugateGradient: cp,b "<<cp<< " "<<b <<std::endl;
|
||||||
|
|
||||||
// Fuse these loops ; should be really easy
|
// Fuse these loops ; should be really easy
|
||||||
psi= a*p+psi;
|
psi= a*p+psi;
|
||||||
p = p*b+r;
|
p = p*b+r;
|
||||||
|
|
||||||
if (verbose) std::cout<<"ConjugateGradient: Iteration " <<k<<" residual "<<cp<< " target"<< rsq<<std::endl;
|
if (verbose) std::cout<<"ConjugateGradient: Iteration " <<k<<" residual "<<cp<< " target"<< rsq<<std::endl;
|
||||||
|
|
||||||
|
if (0) {
|
||||||
|
Field tmp(src._grid);
|
||||||
|
Linop.HermOpAndNorm(psi,tmp,qqck,qqck);
|
||||||
|
tmp=tmp-src;
|
||||||
|
std::cout<<"ConjugateGradient: true residual is "<< norm2(tmp);
|
||||||
|
}
|
||||||
// Stopping condition
|
// Stopping condition
|
||||||
if ( cp <= rsq ) {
|
if ( cp <= rsq ) {
|
||||||
|
|
||||||
@ -98,9 +104,10 @@ public:
|
|||||||
RealD resnorm = sqrt(norm2(p));
|
RealD resnorm = sqrt(norm2(p));
|
||||||
RealD true_residual = resnorm/srcnorm;
|
RealD true_residual = resnorm/srcnorm;
|
||||||
|
|
||||||
std::cout<<"ConjugateGradient: Converged on iteration " <<k<<" residual "<<cp<< " target"<< rsq<<std::endl;
|
std::cout<<"ConjugateGradient: Converged on iteration " <<k
|
||||||
std::cout<<"ConjugateGradient: true residual is "<<true_residual<<" sol "<<psinorm<<" src "<<srcnorm<<std::endl;
|
<<" computed residual "<<sqrt(cp/ssq)
|
||||||
std::cout<<"ConjugateGradient: target residual was "<<Tolerance<<std::endl;
|
<<" true residual "<<true_residual
|
||||||
|
<<" target "<<Tolerance<<std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ namespace Grid {
|
|||||||
int verbose;
|
int verbose;
|
||||||
|
|
||||||
ConjugateResidual(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) {
|
ConjugateResidual(RealD tol,Integer maxit) : Tolerance(tol), MaxIterations(maxit) {
|
||||||
verbose=1;
|
verbose=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
void operator() (LinearOperatorBase<Field> &Linop,const Field &src, Field &psi){
|
void operator() (LinearOperatorBase<Field> &Linop,const Field &src, Field &psi){
|
||||||
@ -37,8 +37,8 @@ namespace Grid {
|
|||||||
Linop.HermOpAndNorm(p,Ap,pAp,pAAp);
|
Linop.HermOpAndNorm(p,Ap,pAp,pAAp);
|
||||||
Linop.HermOpAndNorm(r,Ar,rAr,rAAr);
|
Linop.HermOpAndNorm(r,Ar,rAr,rAAr);
|
||||||
|
|
||||||
std::cout << "pAp, pAAp"<< pAp<<" "<<pAAp<<std::endl;
|
if(verbose) std::cout << "pAp, pAAp"<< pAp<<" "<<pAAp<<std::endl;
|
||||||
std::cout << "rAr, rAAr"<< rAr<<" "<<rAAr<<std::endl;
|
if(verbose) std::cout << "rAr, rAAr"<< rAr<<" "<<rAAr<<std::endl;
|
||||||
|
|
||||||
cp =norm2(r);
|
cp =norm2(r);
|
||||||
ssq=norm2(src);
|
ssq=norm2(src);
|
||||||
@ -63,15 +63,16 @@ namespace Grid {
|
|||||||
axpy(p,b,p,r);
|
axpy(p,b,p,r);
|
||||||
pAAp=axpy_norm(Ap,b,Ap,Ar);
|
pAAp=axpy_norm(Ap,b,Ap,Ar);
|
||||||
|
|
||||||
std::cout<<"ConjugateResidual: iteration " <<k<<" residual "<<cp<< " target"<< rsq<<std::endl;
|
if(verbose) std::cout<<"ConjugateResidual: iteration " <<k<<" residual "<<cp<< " target"<< rsq<<std::endl;
|
||||||
|
|
||||||
if(cp<rsq) {
|
if(cp<rsq) {
|
||||||
Linop.HermOp(psi,Ap);
|
Linop.HermOp(psi,Ap);
|
||||||
axpy(r,-1.0,src,Ap);
|
axpy(r,-1.0,src,Ap);
|
||||||
RealD true_resid = norm2(r);
|
RealD true_resid = norm2(r);
|
||||||
std::cout<<"ConjugateResidual: Converged on iteration " <<k<<" residual "<<cp<< " target"<< rsq<<std::endl;
|
std::cout<<"ConjugateResidual: Converged on iteration " <<k
|
||||||
std::cout<<"ConjugateResidual: true residual is "<<true_resid<<std::endl;
|
<< " computed residual "<<sqrt(cp/ssq)
|
||||||
std::cout<<"ConjugateResidual: target residual was "<<Tolerance <<std::endl;
|
<< " true residual "<<true_resid
|
||||||
|
<< " target " <<Tolerance <<std::endl;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ GRID_DEF_UNOP(toReal,UnaryToReal);
|
|||||||
GRID_DEF_UNOP(toComplex,UnaryToComplex);
|
GRID_DEF_UNOP(toComplex,UnaryToComplex);
|
||||||
GRID_DEF_UNOP(abs ,UnaryAbs); //abs overloaded in cmath C++98; DON'T do the abs-fabs-dabs-labs thing
|
GRID_DEF_UNOP(abs ,UnaryAbs); //abs overloaded in cmath C++98; DON'T do the abs-fabs-dabs-labs thing
|
||||||
GRID_DEF_UNOP(sqrt ,UnarySqrt);
|
GRID_DEF_UNOP(sqrt ,UnarySqrt);
|
||||||
GRID_DEF_UNOP(rsqrt,UnarySqrt);
|
GRID_DEF_UNOP(rsqrt,UnaryRsqrt);
|
||||||
GRID_DEF_UNOP(sin ,UnarySin);
|
GRID_DEF_UNOP(sin ,UnarySin);
|
||||||
GRID_DEF_UNOP(cos ,UnaryCos);
|
GRID_DEF_UNOP(cos ,UnaryCos);
|
||||||
GRID_DEF_UNOP(log ,UnaryLog);
|
GRID_DEF_UNOP(log ,UnaryLog);
|
||||||
|
@ -168,7 +168,7 @@ inline void blockNormalise(Lattice<CComplex> &ip,Lattice<vobj> &fineX)
|
|||||||
GridBase *coarse = ip._grid;
|
GridBase *coarse = ip._grid;
|
||||||
Lattice<vobj> zz(fineX._grid); zz=zero;
|
Lattice<vobj> zz(fineX._grid); zz=zero;
|
||||||
blockInnerProduct(ip,fineX,fineX);
|
blockInnerProduct(ip,fineX,fineX);
|
||||||
ip = rsqrt(ip);
|
ip = pow(ip,-0.5);
|
||||||
blockZAXPY(fineX,ip,fineX,zz);
|
blockZAXPY(fineX,ip,fineX,zz);
|
||||||
}
|
}
|
||||||
// useful in multigrid project;
|
// useful in multigrid project;
|
||||||
|
@ -522,22 +522,66 @@ Note that in step D setting B ~ X - A and using B in place of A in step E will g
|
|||||||
}
|
}
|
||||||
|
|
||||||
// reunitarise??
|
// reunitarise??
|
||||||
|
static void LieRandomize(GridParallelRNG &pRNG,LatticeMatrix &out,double scale=1.0){
|
||||||
|
GridBase *grid = out._grid;
|
||||||
|
LatticeComplex ca (grid);
|
||||||
|
LatticeMatrix lie(grid);
|
||||||
|
LatticeMatrix la (grid);
|
||||||
|
Complex ci(0.0,scale);
|
||||||
|
Matrix ta;
|
||||||
|
|
||||||
|
lie=zero;
|
||||||
|
for(int a=0;a<generators();a++){
|
||||||
|
|
||||||
|
random(pRNG,ca); ca=real(ca)-0.5;
|
||||||
|
generator(a,ta);
|
||||||
|
|
||||||
|
la=ci*ca*ta;
|
||||||
|
|
||||||
|
lie = lie+la; // e^{i la ta}
|
||||||
|
}
|
||||||
|
taExp(lie,out);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void HotConfiguration(GridParallelRNG &pRNG,LatticeGaugeField &out){
|
||||||
|
LatticeMatrix Umu(out._grid);
|
||||||
|
for(int mu=0;mu<Nd;mu++){
|
||||||
|
LieRandomize(pRNG,Umu,1.0);
|
||||||
|
pokeLorentz(out,Umu,mu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void TepidConfiguration(GridParallelRNG &pRNG,LatticeGaugeField &out){
|
||||||
|
LatticeMatrix Umu(out._grid);
|
||||||
|
for(int mu=0;mu<Nd;mu++){
|
||||||
|
LieRandomize(pRNG,Umu,0.01);
|
||||||
|
pokeLorentz(out,Umu,mu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void ColdConfiguration(GridParallelRNG &pRNG,LatticeGaugeField &out){
|
||||||
|
LatticeMatrix Umu(out._grid);
|
||||||
|
Umu=1.0;
|
||||||
|
for(int mu=0;mu<Nd;mu++){
|
||||||
|
pokeLorentz(out,Umu,mu);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void taProj( const LatticeMatrix &in, LatticeMatrix &out){
|
static void taProj( const LatticeMatrix &in, LatticeMatrix &out){
|
||||||
out = Ta(in);
|
out = Ta(in);
|
||||||
}
|
}
|
||||||
static void taExp( const LatticeMatrix &x, LatticeMatrix &ex){
|
static void taExp( const LatticeMatrix &x, LatticeMatrix &ex){
|
||||||
LatticeMatrix xn = x;
|
|
||||||
|
|
||||||
|
LatticeMatrix xn(x._grid);
|
||||||
RealD nfac = 1.0;
|
RealD nfac = 1.0;
|
||||||
ex = 1+x; // 1+x
|
|
||||||
|
xn = x;
|
||||||
|
ex =xn+Complex(1.0); // 1+x
|
||||||
|
|
||||||
// Do a 12th order exponentiation
|
// Do a 12th order exponentiation
|
||||||
for(int i= 2; i <= 12; ++i)
|
for(int i=2; i <= 12; ++i)
|
||||||
{
|
{
|
||||||
nfac = nfac/i;
|
nfac = nfac/RealD(i); //1/2, 1/2.3 ...
|
||||||
xn = xn * x; // x2, x3,x4....
|
xn = xn * x; // x2, x3,x4....
|
||||||
ex += xn*nfac;// x2/2!, x3/3!....
|
ex = ex+ xn*nfac;// x2/2!, x3/3!....
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,20 +83,27 @@ int main (int argc, char ** argv)
|
|||||||
std::cout<<"Error "<<norm2(err)<<std::endl;
|
std::cout<<"Error "<<norm2(err)<<std::endl;
|
||||||
|
|
||||||
const int nbasis = 2;
|
const int nbasis = 2;
|
||||||
std::vector<LatticeFermion> subspace(nbasis,FGrid);
|
|
||||||
LatticeFermion prom(FGrid);
|
LatticeFermion prom(FGrid);
|
||||||
|
|
||||||
for(int b=0;b<nbasis;b++){
|
std::vector<LatticeFermion> subspace(nbasis,FGrid);
|
||||||
random(RNG5,subspace[b]);
|
|
||||||
}
|
std::cout<<"Calling Aggregation class" <<std::endl;
|
||||||
std::cout << "Computed randoms"<< std::endl;
|
|
||||||
|
MdagMLinearOperator<DomainWallFermion,LatticeFermion> HermDefOp(Ddwf);
|
||||||
|
typedef Aggregation<vSpinColourVector,vTComplex,nbasis> Subspace;
|
||||||
|
Subspace Aggregates(Coarse5d,FGrid);
|
||||||
|
Aggregates.CreateSubspaceRandom(RNG5);
|
||||||
|
|
||||||
|
subspace=Aggregates.subspace;
|
||||||
|
|
||||||
|
std::cout << "Called aggregation class"<< std::endl;
|
||||||
|
|
||||||
typedef CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LittleDiracOperator;
|
typedef CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LittleDiracOperator;
|
||||||
typedef LittleDiracOperator::CoarseVector CoarseVector;
|
typedef LittleDiracOperator::CoarseVector CoarseVector;
|
||||||
|
|
||||||
LittleDiracOperator LittleDiracOp(*Coarse5d);
|
LittleDiracOperator LittleDiracOp(*Coarse5d);
|
||||||
|
|
||||||
LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,subspace);
|
LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,Aggregates);
|
||||||
|
|
||||||
CoarseVector c_src (Coarse5d);
|
CoarseVector c_src (Coarse5d);
|
||||||
CoarseVector c_res (Coarse5d);
|
CoarseVector c_res (Coarse5d);
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
#include <Grid.h>
|
#include <Grid.h>
|
||||||
|
#include <qcd/utils/WilsonLoops.h>
|
||||||
|
#include <qcd/utils/SUn.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace Grid;
|
using namespace Grid;
|
||||||
@ -59,67 +61,84 @@ int main (int argc, char ** argv)
|
|||||||
LatticeFermion ref(FGrid); ref=zero;
|
LatticeFermion ref(FGrid); ref=zero;
|
||||||
LatticeFermion tmp(FGrid);
|
LatticeFermion tmp(FGrid);
|
||||||
LatticeFermion err(FGrid);
|
LatticeFermion err(FGrid);
|
||||||
LatticeGaugeField Umu(UGrid); gaussian(RNG4,Umu);
|
LatticeGaugeField Umu(UGrid);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//gaussian(RNG4,Umu);
|
||||||
//random(RNG4,Umu);
|
//random(RNG4,Umu);
|
||||||
|
|
||||||
NerscField header;
|
NerscField header;
|
||||||
std::string file("./ckpoint_lat.400");
|
std::string file("./ckpoint_lat.400");
|
||||||
readNerscConfiguration(Umu,header,file);
|
readNerscConfiguration(Umu,header,file);
|
||||||
|
// SU3::ColdConfiguration(RNG4,Umu);
|
||||||
|
// SU3::TepidConfiguration(RNG4,Umu);
|
||||||
|
// SU3::HotConfiguration(RNG4,Umu);
|
||||||
|
// Umu=zero;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
LatticeColourMatrix U(UGrid);
|
LatticeColourMatrix U(UGrid);
|
||||||
U=zero;
|
|
||||||
for(int nn=0;nn<Nd;nn++){
|
for(int nn=0;nn<Nd;nn++){
|
||||||
if (nn>2) {
|
U=peekIndex<LorentzIndex>(Umu,nn);
|
||||||
pokeIndex<LorentzIndex>(Umu,U,nn);
|
U=U*adj(U)-1.0;
|
||||||
}
|
std::cout<<"SU3 test "<<norm2(U)<<std::endl;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
RealD mass=0.1;
|
RealD mass=0.1;
|
||||||
RealD M5=1.0;
|
RealD M5=1.5;
|
||||||
|
|
||||||
DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
|
DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
|
||||||
Gamma5R5HermitianLinearOperator<DomainWallFermion,LatticeFermion> HermIndefOp(Ddwf);
|
Gamma5R5HermitianLinearOperator<DomainWallFermion,LatticeFermion> HermIndefOp(Ddwf);
|
||||||
|
|
||||||
const int nbasis = 8;
|
const int nbasis = 8;
|
||||||
|
|
||||||
|
#if 0
|
||||||
std::vector<LatticeFermion> subspace(nbasis,FGrid);
|
std::vector<LatticeFermion> subspace(nbasis,FGrid);
|
||||||
LatticeFermion noise(FGrid);
|
LatticeFermion noise(FGrid);
|
||||||
LatticeFermion ms(FGrid);
|
LatticeFermion ms(FGrid);
|
||||||
for(int b=0;b<nbasis;b++){
|
for(int b=0;b<nbasis;b++){
|
||||||
Gamma g5(Gamma::Gamma5);
|
|
||||||
gaussian(RNG5,noise);
|
gaussian(RNG5,noise);
|
||||||
RealD scale = pow(norm2(noise),-0.5);
|
RealD scale = pow(norm2(noise),-0.5);
|
||||||
noise=noise*scale;
|
noise=noise*scale;
|
||||||
|
|
||||||
HermIndefOp.HermOp(noise,ms); std::cout << "Noise "<<b<<" Ms "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
HermIndefOp.Op(noise,ms); std::cout << "Noise "<<b<<" Ms "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
||||||
|
|
||||||
|
|
||||||
// filter(HermIndefOp,noise,subspace[b]);
|
// filter(HermIndefOp,noise,subspace[b]);
|
||||||
// inverse iteration
|
// inverse iteration
|
||||||
MdagMLinearOperator<DomainWallFermion,LatticeFermion> HermDefOp(Ddwf);
|
MdagMLinearOperator<DomainWallFermion,LatticeFermion> HermDefOp(Ddwf);
|
||||||
ConjugateGradient<LatticeFermion> CG(1.0e-5,10000);
|
ConjugateGradient<LatticeFermion> CG(1.0e-4,10000);
|
||||||
|
|
||||||
for(int i=0;i<4;i++){
|
for(int i=0;i<1;i++){
|
||||||
|
|
||||||
CG(HermDefOp,noise,subspace[b]);
|
CG(HermDefOp,noise,subspace[b]);
|
||||||
noise = subspace[b];
|
noise = subspace[b];
|
||||||
|
|
||||||
scale = pow(norm2(noise),-0.5);
|
scale = pow(norm2(noise),-0.5);
|
||||||
noise=noise*scale;
|
noise=noise*scale;
|
||||||
HermDefOp.HermOp(noise,ms); std::cout << "filt "<<b<<" <u|H|u> "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
HermDefOp.Op(noise,ms); std::cout << "filt "<<b<<" <u|H|u> "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
subspace[b] = noise;
|
subspace[b] = noise;
|
||||||
HermIndefOp.HermOp(subspace[b],ms); std::cout << "Filtered "<<b<<" Ms "<<norm2(ms)<< " "<<norm2(subspace[b]) <<std::endl;
|
HermIndefOp.Op(subspace[b],ms); std::cout << "Filtered "<<b<<" Ms "<<norm2(ms)<< " "<<norm2(subspace[b]) <<std::endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
std::cout << "Computed randoms"<< std::endl;
|
std::cout << "Computed randoms"<< std::endl;
|
||||||
|
#else
|
||||||
|
std::cout<<"Calling Aggregation class" <<std::endl;
|
||||||
|
MdagMLinearOperator<DomainWallFermion,LatticeFermion> HermDefOp(Ddwf);
|
||||||
|
typedef Aggregation<vSpinColourVector,vTComplex,nbasis> Subspace;
|
||||||
|
Subspace Aggregates(Coarse5d,FGrid);
|
||||||
|
Aggregates.CreateSubspace(RNG5,HermDefOp);
|
||||||
|
std::cout << "Called aggregation class"<< std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LittleDiracOperator;
|
typedef CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LittleDiracOperator;
|
||||||
typedef LittleDiracOperator::CoarseVector CoarseVector;
|
typedef LittleDiracOperator::CoarseVector CoarseVector;
|
||||||
|
|
||||||
LittleDiracOperator LittleDiracOp(*Coarse5d);
|
LittleDiracOperator LittleDiracOp(*Coarse5d);
|
||||||
LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,subspace);
|
LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,Aggregates);
|
||||||
|
|
||||||
CoarseVector c_src (Coarse5d);
|
CoarseVector c_src (Coarse5d);
|
||||||
CoarseVector c_res (Coarse5d);
|
CoarseVector c_res (Coarse5d);
|
||||||
@ -128,7 +147,7 @@ int main (int argc, char ** argv)
|
|||||||
|
|
||||||
std::cout << "Solving CG on coarse space "<< std::endl;
|
std::cout << "Solving CG on coarse space "<< std::endl;
|
||||||
MdagMLinearOperator<LittleDiracOperator,CoarseVector> PosdefLdop(LittleDiracOp);
|
MdagMLinearOperator<LittleDiracOperator,CoarseVector> PosdefLdop(LittleDiracOp);
|
||||||
ConjugateGradient<CoarseVector> CG(1.0e-8,10000);
|
ConjugateGradient<CoarseVector> CG(1.0e-6,10000);
|
||||||
CG(PosdefLdop,c_src,c_res);
|
CG(PosdefLdop,c_src,c_res);
|
||||||
|
|
||||||
std::cout << "Done "<< std::endl;
|
std::cout << "Done "<< std::endl;
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
#include <Grid.h>
|
#include <Grid.h>
|
||||||
|
#include <qcd/utils/WilsonLoops.h>
|
||||||
|
#include <qcd/utils/SUn.h>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace Grid;
|
using namespace Grid;
|
||||||
@ -59,67 +61,100 @@ int main (int argc, char ** argv)
|
|||||||
LatticeFermion ref(FGrid); ref=zero;
|
LatticeFermion ref(FGrid); ref=zero;
|
||||||
LatticeFermion tmp(FGrid);
|
LatticeFermion tmp(FGrid);
|
||||||
LatticeFermion err(FGrid);
|
LatticeFermion err(FGrid);
|
||||||
LatticeGaugeField Umu(UGrid); gaussian(RNG4,Umu);
|
LatticeGaugeField Umu(UGrid);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//gaussian(RNG4,Umu);
|
||||||
//random(RNG4,Umu);
|
//random(RNG4,Umu);
|
||||||
NerscField header;
|
|
||||||
std::string file("./ckpoint_lat.4000");
|
|
||||||
readNerscConfiguration(Umu,header,file);
|
|
||||||
|
|
||||||
RealD mass=0.01;
|
NerscField header;
|
||||||
RealD M5=1.8;
|
std::string file("./ckpoint_lat.400");
|
||||||
|
readNerscConfiguration(Umu,header,file);
|
||||||
|
// SU3::ColdConfiguration(RNG4,Umu);
|
||||||
|
// SU3::TepidConfiguration(RNG4,Umu);
|
||||||
|
// SU3::HotConfiguration(RNG4,Umu);
|
||||||
|
// Umu=zero;
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
LatticeColourMatrix U(UGrid);
|
||||||
|
for(int nn=0;nn<Nd;nn++){
|
||||||
|
U=peekIndex<LorentzIndex>(Umu,nn);
|
||||||
|
U=U*adj(U)-1.0;
|
||||||
|
std::cout<<"SU3 test "<<norm2(U)<<std::endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
RealD mass=0.1;
|
||||||
|
RealD M5=1.5;
|
||||||
|
|
||||||
DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
|
DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
|
||||||
Gamma5R5HermitianLinearOperator<DomainWallFermion,LatticeFermion> HermIndefOp(Ddwf);
|
Gamma5R5HermitianLinearOperator<DomainWallFermion,LatticeFermion> HermIndefOp(Ddwf);
|
||||||
|
|
||||||
const int nbasis = 8;
|
const int nbasis = 8;
|
||||||
|
|
||||||
|
#if 0
|
||||||
std::vector<LatticeFermion> subspace(nbasis,FGrid);
|
std::vector<LatticeFermion> subspace(nbasis,FGrid);
|
||||||
LatticeFermion noise(FGrid);
|
LatticeFermion noise(FGrid);
|
||||||
LatticeFermion ms(FGrid);
|
LatticeFermion ms(FGrid);
|
||||||
for(int b=0;b<nbasis;b++){
|
for(int b=0;b<nbasis;b++){
|
||||||
Gamma g5(Gamma::Gamma5);
|
|
||||||
gaussian(RNG5,noise);
|
gaussian(RNG5,noise);
|
||||||
RealD scale = pow(norm2(noise),-0.5);
|
RealD scale = pow(norm2(noise),-0.5);
|
||||||
noise=noise*scale;
|
noise=noise*scale;
|
||||||
|
|
||||||
HermIndefOp.HermOp(noise,ms); std::cout << "Noise "<<b<<" Ms "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
HermIndefOp.Op(noise,ms); std::cout << "Noise "<<b<<" Ms "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
||||||
|
|
||||||
|
|
||||||
// filter(HermIndefOp,noise,subspace[b]);
|
// filter(HermIndefOp,noise,subspace[b]);
|
||||||
// inverse iteration
|
// inverse iteration
|
||||||
MdagMLinearOperator<DomainWallFermion,LatticeFermion> HermDefOp(Ddwf);
|
MdagMLinearOperator<DomainWallFermion,LatticeFermion> HermDefOp(Ddwf);
|
||||||
ConjugateGradient<LatticeFermion> CG(1.0e-4,10000);
|
ConjugateGradient<LatticeFermion> CG(1.0e-4,10000);
|
||||||
|
|
||||||
for(int i=0;i<4;i++){
|
for(int i=0;i<1;i++){
|
||||||
|
|
||||||
CG(HermDefOp,noise,subspace[b]);
|
CG(HermDefOp,noise,subspace[b]);
|
||||||
noise = subspace[b];
|
noise = subspace[b];
|
||||||
|
|
||||||
scale = pow(norm2(noise),-0.5);
|
scale = pow(norm2(noise),-0.5);
|
||||||
noise=noise*scale;
|
noise=noise*scale;
|
||||||
HermDefOp.HermOp(noise,ms); std::cout << "filt "<<b<<" <u|H|u> "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
HermDefOp.Op(noise,ms); std::cout << "filt "<<b<<" <u|H|u> "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
subspace[b] = noise;
|
subspace[b] = noise;
|
||||||
HermIndefOp.HermOp(subspace[b],ms); std::cout << "Filtered "<<b<<" Ms "<<norm2(ms)<< " "<<norm2(subspace[b]) <<std::endl;
|
HermIndefOp.Op(subspace[b],ms); std::cout << "Filtered "<<b<<" Ms "<<norm2(ms)<< " "<<norm2(subspace[b]) <<std::endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
std::cout << "Computed randoms"<< std::endl;
|
std::cout << "Computed randoms"<< std::endl;
|
||||||
|
#else
|
||||||
|
std::cout<<"Calling Aggregation class" <<std::endl;
|
||||||
|
MdagMLinearOperator<DomainWallFermion,LatticeFermion> HermDefOp(Ddwf);
|
||||||
|
typedef Aggregation<vSpinColourVector,vTComplex,nbasis> Subspace;
|
||||||
|
Subspace Aggregates(Coarse5d,FGrid);
|
||||||
|
Aggregates.CreateSubspace(RNG5,HermDefOp);
|
||||||
|
std::cout << "Called aggregation class"<< std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
typedef CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LittleDiracOperator;
|
typedef CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LittleDiracOperator;
|
||||||
typedef LittleDiracOperator::CoarseVector CoarseVector;
|
typedef LittleDiracOperator::CoarseVector CoarseVector;
|
||||||
|
|
||||||
LittleDiracOperator LittleDiracOp(*Coarse5d);
|
LittleDiracOperator LittleDiracOp(*Coarse5d);
|
||||||
LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,subspace);
|
LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,Aggregates);
|
||||||
|
|
||||||
CoarseVector c_src (Coarse5d);
|
CoarseVector c_src (Coarse5d);
|
||||||
CoarseVector c_res (Coarse5d);
|
CoarseVector c_res (Coarse5d);
|
||||||
gaussian(CRNG,c_src);
|
gaussian(CRNG,c_src);
|
||||||
c_res=zero;
|
c_res=zero;
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "Solving CG on coarse space "<< std::endl;
|
||||||
|
MdagMLinearOperator<LittleDiracOperator,CoarseVector> PosdefLdop(LittleDiracOp);
|
||||||
|
ConjugateGradient<CoarseVector> CG(1.0e-6,10000);
|
||||||
|
CG(PosdefLdop,c_src,c_res);
|
||||||
|
|
||||||
|
|
||||||
std::cout << "Solving MCR on coarse space "<< std::endl;
|
std::cout << "Solving MCR on coarse space "<< std::endl;
|
||||||
HermitianLinearOperator<LittleDiracOperator,CoarseVector> HermIndefLdop(LittleDiracOp);
|
HermitianLinearOperator<LittleDiracOperator,CoarseVector> HermIndefLdop(LittleDiracOp);
|
||||||
ConjugateResidual<CoarseVector> MCR(1.0e-8,10000);
|
ConjugateResidual<CoarseVector> MCR(1.0e-6,10000);
|
||||||
MCR(HermIndefLdop,c_src,c_res);
|
MCR(HermIndefLdop,c_src,c_res);
|
||||||
|
|
||||||
std::cout << "Done "<< std::endl;
|
std::cout << "Done "<< std::endl;
|
||||||
|
@ -1,124 +0,0 @@
|
|||||||
#include <Grid.h>
|
|
||||||
|
|
||||||
using namespace std;
|
|
||||||
using namespace Grid;
|
|
||||||
using namespace Grid::QCD;
|
|
||||||
|
|
||||||
|
|
||||||
template<class d>
|
|
||||||
struct scal {
|
|
||||||
d internal;
|
|
||||||
};
|
|
||||||
|
|
||||||
Gamma::GammaMatrix Gmu [] = {
|
|
||||||
Gamma::GammaX,
|
|
||||||
Gamma::GammaY,
|
|
||||||
Gamma::GammaZ,
|
|
||||||
Gamma::GammaT
|
|
||||||
};
|
|
||||||
|
|
||||||
double lowpass(double x)
|
|
||||||
{
|
|
||||||
return pow(x*x,-2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main (int argc, char ** argv)
|
|
||||||
{
|
|
||||||
Grid_init(&argc,&argv);
|
|
||||||
|
|
||||||
Chebyshev<LatticeFermion> filter(-120.0, 120.0,256, lowpass);
|
|
||||||
ofstream csv(std::string("filter.dat"),std::ios::out|std::ios::trunc);
|
|
||||||
filter.csv(csv);
|
|
||||||
csv.close();
|
|
||||||
|
|
||||||
const int Ls=8;
|
|
||||||
|
|
||||||
GridCartesian * UGrid = SpaceTimeGrid::makeFourDimGrid(GridDefaultLatt(), GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi());
|
|
||||||
GridRedBlackCartesian * UrbGrid = SpaceTimeGrid::makeFourDimRedBlackGrid(UGrid);
|
|
||||||
|
|
||||||
GridCartesian * FGrid = SpaceTimeGrid::makeFiveDimGrid(Ls,UGrid);
|
|
||||||
GridRedBlackCartesian * FrbGrid = SpaceTimeGrid::makeFiveDimRedBlackGrid(Ls,UGrid);
|
|
||||||
|
|
||||||
// Construct a coarsened grid
|
|
||||||
std::vector<int> clatt = GridDefaultLatt();
|
|
||||||
for(int d=0;d<clatt.size();d++){
|
|
||||||
clatt[d] = clatt[d]/2;
|
|
||||||
}
|
|
||||||
GridCartesian *Coarse4d = SpaceTimeGrid::makeFourDimGrid(clatt, GridDefaultSimd(Nd,vComplexF::Nsimd()),GridDefaultMpi());;
|
|
||||||
GridCartesian *Coarse5d = SpaceTimeGrid::makeFiveDimGrid(1,Coarse4d);
|
|
||||||
|
|
||||||
std::vector<int> seeds4({1,2,3,4});
|
|
||||||
std::vector<int> seeds5({5,6,7,8});
|
|
||||||
std::vector<int> cseeds({5,6,7,8});
|
|
||||||
GridParallelRNG RNG5(FGrid); RNG5.SeedFixedIntegers(seeds5);
|
|
||||||
GridParallelRNG RNG4(UGrid); RNG4.SeedFixedIntegers(seeds4);
|
|
||||||
GridParallelRNG CRNG(Coarse5d);CRNG.SeedFixedIntegers(cseeds);
|
|
||||||
|
|
||||||
LatticeFermion src(FGrid); gaussian(RNG5,src);
|
|
||||||
LatticeFermion result(FGrid); result=zero;
|
|
||||||
LatticeFermion ref(FGrid); ref=zero;
|
|
||||||
LatticeFermion tmp(FGrid);
|
|
||||||
LatticeFermion err(FGrid);
|
|
||||||
LatticeGaugeField Umu(UGrid); gaussian(RNG4,Umu);
|
|
||||||
|
|
||||||
|
|
||||||
//random(RNG4,Umu);
|
|
||||||
NerscField header;
|
|
||||||
std::string file("./ckpoint_lat.400");
|
|
||||||
readNerscConfiguration(Umu,header,file);
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
LatticeColourMatrix U(UGrid);
|
|
||||||
Complex cone(1.0,0.0);
|
|
||||||
for(int nn=0;nn<Nd;nn++){
|
|
||||||
if (nn==3) {
|
|
||||||
U=zero; std::cout << "zeroing gauge field in dir "<<nn<<std::endl;
|
|
||||||
// else { U[nn]= cone;std::cout << "unit gauge field in dir "<<nn<<std::endl; }
|
|
||||||
pokeIndex<LorentzIndex>(Umu,U,nn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
RealD mass=0.5;
|
|
||||||
RealD M5=1.8;
|
|
||||||
|
|
||||||
DomainWallFermion Ddwf(Umu,*FGrid,*FrbGrid,*UGrid,*UrbGrid,mass,M5);
|
|
||||||
Gamma5R5HermitianLinearOperator<DomainWallFermion,LatticeFermion> HermIndefOp(Ddwf);
|
|
||||||
|
|
||||||
const int nbasis = 8;
|
|
||||||
std::vector<LatticeFermion> subspace(nbasis,FGrid);
|
|
||||||
LatticeFermion noise(FGrid);
|
|
||||||
LatticeFermion ms(FGrid);
|
|
||||||
for(int b=0;b<nbasis;b++){
|
|
||||||
Gamma g5(Gamma::Gamma5);
|
|
||||||
gaussian(RNG5,noise);
|
|
||||||
RealD scale = pow(norm2(noise),-0.5);
|
|
||||||
noise=noise*scale;
|
|
||||||
|
|
||||||
HermIndefOp.HermOp(noise,ms); std::cout << "Noise "<<b<<" Ms "<<norm2(ms)<< " "<< norm2(noise)<<std::endl;
|
|
||||||
|
|
||||||
filter(HermIndefOp,noise,subspace[b]);
|
|
||||||
scale = pow(norm2(subspace[b]),-0.5);
|
|
||||||
subspace[b]=subspace[b]*scale;
|
|
||||||
HermIndefOp.HermOp(subspace[b],ms); std::cout << "Filtered "<<b<<" Ms "<<norm2(ms)<< " "<<norm2(subspace[b]) <<std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Computed randoms"<< std::endl;
|
|
||||||
|
|
||||||
typedef CoarsenedMatrix<vSpinColourVector,vTComplex,nbasis> LittleDiracOperator;
|
|
||||||
typedef LittleDiracOperator::CoarseVector CoarseVector;
|
|
||||||
|
|
||||||
LittleDiracOperator LittleDiracOp(*Coarse5d);
|
|
||||||
LittleDiracOp.CoarsenOperator(FGrid,HermIndefOp,subspace);
|
|
||||||
|
|
||||||
CoarseVector c_src (Coarse5d);
|
|
||||||
CoarseVector c_res (Coarse5d);
|
|
||||||
gaussian(CRNG,c_src);
|
|
||||||
c_res=zero;
|
|
||||||
|
|
||||||
std::cout << "Solving MCR on coarse space "<< std::endl;
|
|
||||||
HermitianLinearOperator<LittleDiracOperator,CoarseVector> HermIndefLdop(LittleDiracOp);
|
|
||||||
ConjugateResidual<CoarseVector> MCR(1.0e-8,10000);
|
|
||||||
MCR(HermIndefLdop,c_src,c_res);
|
|
||||||
|
|
||||||
std::cout << "Done "<< std::endl;
|
|
||||||
Grid_finalize();
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user