5 #include <qdp-lapack.h>
16 #define TEST_ALGORITHM
21 namespace LinOpSysSolverEigCGArrayEnv
28 multi1d<LatticeColorMatrix>,
29 multi1d<LatticeColorMatrix>
68 SystemSolverResults_t sysSolver(multi1d<T>&
psi,
const multi1d<T>&
chi,
69 const LinearOperatorArray<T>&
A,
70 const LinearOperatorArray<T>&
MdagM,
71 const SysSolverEigCGParams& invParam)
80 LinAlg::RitzPairsArray<T>& GoodEvecs =
83 multi1d<Double> lambda;
85 SystemSolverResults_t res;
89 if((GoodEvecs.Neig+invParam.Neig)<=invParam.Neig_max)
97 invParam.Neig, invParam.Nmax,
98 invParam.RsdCG, invParam.MaxCG);
104 GoodEvecs.AddVectors(lambda, evec,
MdagM.subset());
106 double Time = snoop.getTimeInSeconds();
107 QDPIO::cout<<
"GoodEvecs.Neig= "<<GoodEvecs.Neig<<std::endl;
113 Time += snoop.getTimeInSeconds();
116 LinAlg::Matrix<DComplex> Htmp(GoodEvecs.Neig);
119 char V =
'V';
char U =
'U';
120 QDPLapack::zheev(V,
U,Htmp.mat,lambda);
121 evec.resize(GoodEvecs.Neig,Ls);
124 for(
int k(0);
k<GoodEvecs.Neig;
k++){
125 GoodEvecs.eval[
k] = lambda[
k];
126 for(
int s=0;
s < Ls; ++
s)
128 for(
int j(0);
j<GoodEvecs.Neig;
j++)
129 for(
int s=0;
s < Ls; ++
s)
130 evec[
k][
s][
MdagM.subset()] += conj(Htmp(
k,
j))*GoodEvecs.evec[
j][
s];
135 Time += snoop.getTimeInSeconds();
136 QDPIO::cout <<
"Evec_Refinement: time = "
138 <<
" secs" << std::endl;
140 QDPIO::cout<<
"GoodEvecs.Neig= "<<GoodEvecs.Neig<<std::endl;
141 for(
int k(0);
k<GoodEvecs.Neig;
k++)
142 for(
int s=0;
s < Ls; ++
s)
143 GoodEvecs.evec[
k][
s][
MdagM.subset()] = evec[
k][
s];
146 #ifdef TEST_ALGORITHM
149 for(
int k(0);
k<GoodEvecs.Neig;
k++)
153 for(
int s=0;
s < Ls; ++
s)
154 Av[
s][
MdagM.subset()] -= GoodEvecs.eval[
k]*GoodEvecs.evec[
k][
s];
156 QDPIO::cout<<
"REFINE: error evec["<<
k<<
"] = "<<tt<<
" ";
157 QDPIO::cout<<
"--- eval ="<<GoodEvecs.eval[
k]<<
" ";
158 tt = sqrt(norm2(GoodEvecs.evec[
k],
MdagM.subset()));
159 QDPIO::cout<<
"--- rq ="<<real(rq)<<
" ";
160 QDPIO::cout<<
"--- norm = "<<tt<<std::endl;
169 if(invParam.vPrecCGvecs ==0){
177 invParam.RsdCGRestart[0],
183 invParam.vPrecCGvecStart,
184 invParam.vPrecCGvecStart+invParam.vPrecCGvecs,
190 QDPIO::cout<<
"Restart1: "<<std::endl;
194 if(invParam.vPrecCGvecs ==0)
207 invParam.vPrecCGvecStart,
208 invParam.vPrecCGvecStart+invParam.vPrecCGvecs,
215 SystemSolverResults_t res;
216 QDPIO::cerr<<
" OOOPS! EigCG does not work with DWF\n";
233 SystemSolverResults_t
Support class for fermion actions and linear operators.
Class for counted reference semantics.
Solve a M*psi=chi linear system by CG2 with eigenvectors.
SystemSolverResults_t operator()(multi1d< T > &psi, const multi1d< T > &chi) const
Solver the linear system.
Linear Operator to arrays.
void normGramSchmidt(multi1d< LatticeFermionF > &vec, int f, int t, const Subset &sub)
Gram-Schmidt with normalization.
Conjugate-Gradient algorithm with eigenstd::vector acceleration.
BinaryReturn< C1, C2, FnInnerProduct >::Type_t innerProduct(const QDPSubType< T1, C1 > &s1, const QDPType< T2, C2 > &s2)
SystemSolverResults_t InvEigCG2(const LinearOperatorArray< LatticeFermionF > &A, multi1d< LatticeFermionF > &x, const multi1d< LatticeFermionF > &b, multi1d< Double > &eval, multi2d< LatticeFermionF > &evec, int Neig, int Nmax, const Real &RsdCG, int MaxCG)
void SubSpaceMatrix(LinAlg::Matrix< DComplex > &H, const LinearOperatorArray< LatticeFermionF > &A, const multi2d< LatticeFermionF > &evec, int Nvecs)
SystemSolverResults_t vecPrecondCG(const LinearOperatorArray< LatticeFermionF > &A, multi1d< LatticeFermionF > &x, const multi1d< LatticeFermionF > &b, const multi1d< Double > &eval, const multi2d< LatticeFermionF > &evec, int startV, int endV, const Real &RsdCG, int MaxCG)
void InitGuess(const LinearOperatorArray< LatticeFermionF > &A, multi1d< LatticeFermionF > &x, const multi1d< LatticeFermionF > &b, const multi1d< Double > &eval, const multi2d< LatticeFermionF > &evec, int &n_count)
bool registerAll()
Register all the factories.
LinOpSystemSolverArray< LatticeFermion > * createFerm(XMLReader &xml_in, const std::string &path, Handle< FermState< LatticeFermion, multi1d< LatticeColorMatrix >, multi1d< LatticeColorMatrix > > > state, Handle< LinearOperatorArray< LatticeFermion > > A)
Callback function.
const std::string name("EIG_CG_INVERTER")
Name to be used.
static bool registered
Local registration flag.
Asqtad Staggered-Dirac operator.
multi1d< LatticeFermion > chi(Ncb)
const WilsonTypeFermAct< multi1d< LatticeFermion > > Handle< const ConnectState > state
multi1d< LatticeFermion > s(Ncb)
FloatingPoint< double > Double
Gram-Schmidt with normalization.
Params for EigCG inverter.
Holds return info from SystemSolver call.
Register linop system solvers that solve M*psi=chi.
Solve a M*psi=chi linear system array by EigCG2.
Factory for solving M*psi=chi where M is not hermitian or pos. def.
Handle< LinearOperator< T > > MdagM
multi1d< LatticeColorMatrix > U