7 #ifndef SYM_EIGS_SOLVER_H
8 #define SYM_EIGS_SOLVER_H
18 #include "LinAlg/UpperHessenbergQR.h"
19 #include "LinAlg/TridiagEigen.h"
20 #include "MatOp/DenseGenMatProd.h"
21 #include "MatOp/DenseSymShiftSolve.h"
137 template <
typename Scalar = double,
143 typedef arma::Mat<Scalar> Matrix;
144 typedef arma::Col<Scalar> Vector;
145 typedef arma::uvec BoolVector;
171 BoolVector ritz_conv;
179 inline void factorize_from(
int from_k,
int to_m,
const Vector &fk);
182 inline void restart(
int k);
185 inline int num_converged(Scalar tol);
188 inline int nev_adjusted(
int nconv);
191 inline void retrieve_ritzpair();
196 inline virtual void sort_ritzpair();
220 ncv(ncv_ > dim_n ? dim_n : ncv_),
223 prec(std::pow(std::numeric_limits<Scalar>::epsilon(), Scalar(2.0) / 3))
225 if(nev_ < 1 || nev_ > dim_n - 1)
226 throw std::invalid_argument(
"nev must satisfy 1 <= nev <= n - 1, n is the size of matrix");
228 if(ncv_ <= nev_ || ncv_ > dim_n)
229 throw std::invalid_argument(
"ncv must satisfy nev < ncv <= n, n is the size of matrix");
241 inline void init(Scalar *init_resid);
260 inline int compute(
int maxit = 1000, Scalar tol = 1e-10);
299 #include "SymEigsSolver_Impl.h"
423 template <
typename Scalar = double,
429 typedef arma::Col<Scalar> Vector;
434 inline void sort_ritzpair()
436 Vector ritz_val_org = Scalar(1.0) / this->ritz_val.head(this->nev) + sigma;
437 this->ritz_val.head(this->nev) = ritz_val_org;
460 SymEigsSolver<Scalar, SelectionRule, OpType>(op_, nev_, ncv_),
463 this->op->set_shift(sigma);
469 #endif // SYM_EIGS_SOLVER_H
SymEigsSolver(OpType *op_, int nev_, int ncv_)
SymEigsShiftSolver(OpType *op_, int nev_, int ncv_, Scalar sigma_)
int compute(int maxit=1000, Scalar tol=1e-10)