19#ifndef VOTCA_XTP_DAVIDSONSOLVER_H
20#define VOTCA_XTP_DAVIDSONSOLVER_H
28#include <boost/format.hpp>
59 Eigen::ComputationInfo
info()
const {
return info_; }
64 template <
typename MatrixReplacement>
66 Index size_initial_guess = 0) {
71 std::chrono::time_point<std::chrono::system_clock> start =
72 std::chrono::system_clock::now();
73 Index op_size = A.rows();
79 if (size_initial_guess == 0) {
80 size_initial_guess = 2 * neigen;
86 this->
Adiag_ = A.diagonal();
92 <<
TimeStamp() <<
" iter\tSearch Space\tNorm" << std::flush;
109 }
else if (last_iter) {
117 restart(rep, proj, extension_size);
124 template <
typename MatrixReplacement>
126 const Eigen::MatrixXd &initial_guess) {
131 std::chrono::time_point<std::chrono::system_clock> start =
132 std::chrono::system_clock::now();
133 Index op_size = A.rows();
138 if (initial_guess.rows() != op_size) {
139 throw std::runtime_error(
140 "DavidsonSolver::solve initial_guess has wrong number of rows.");
142 if (initial_guess.cols() < neigen) {
143 throw std::runtime_error(
144 "DavidsonSolver::solve initial_guess has fewer columns than neigen.");
149 this->
Adiag_ = A.diagonal();
152 proj.
V = initial_guess;
154 throw std::runtime_error(
155 "DavidsonSolver::solve initial guess has fewer than neigen linearly "
156 "independent columns.");
164 <<
TimeStamp() <<
" iter\tSearch Space\tNorm" << std::flush;
181 }
else if (last_iter) {
189 restart(rep, proj, extension_size);
197 using ArrayXb = Eigen::Array<bool, Eigen::Dynamic, 1>;
216 Eigen::ComputationInfo
info_ = Eigen::ComputationInfo::NoConvergence;
224 return res.colwise().norm();
243 template <
typename MatrixReplacement>
248 proj.
AV = A * proj.
V;
249 proj.
T = proj.
V.transpose() * proj.
AV;
251 proj.
AAV = A * proj.
AV;
252 proj.
B = proj.
V.transpose() * proj.
AAV;
259 Index old_dim = proj.
AV.cols();
260 Index new_dim = proj.
V.cols();
261 Index nvec = new_dim - old_dim;
262 proj.
AV.conservativeResize(Eigen::NoChange, new_dim);
263 proj.
AV.rightCols(nvec) = A * proj.
V.rightCols(nvec);
265 proj.
T.conservativeResize(new_dim, new_dim);
266 proj.
T.rightCols(nvec) = proj.
V.transpose() * proj.
AV.rightCols(nvec);
269 proj.
T.bottomLeftCorner(nvec, old_dim) =
270 proj.
T.topRightCorner(old_dim, nvec).transpose();
273 proj.
T.bottomLeftCorner(nvec, old_dim) =
274 proj.
V.rightCols(nvec).transpose() * proj.
AV.leftCols(old_dim);
276 proj.
AAV.conservativeResize(Eigen::NoChange, new_dim);
277 proj.
AAV.rightCols(nvec) = A * proj.
AV.rightCols(nvec);
278 proj.
B.conservativeResize(new_dim, new_dim);
279 proj.
B.rightCols(nvec) = proj.
V.transpose() * proj.
AAV.rightCols(nvec);
280 proj.
B.bottomLeftCorner(nvec, old_dim) =
281 proj.
V.rightCols(nvec).transpose() * proj.
AAV.leftCols(old_dim);
287 Eigen::MatrixXd
qr(
const Eigen::MatrixXd &A)
const;
290 RitzEigenPair
getRitz(
const ProjectedSpace &proj)
const;
299 const std::chrono::time_point<std::chrono::system_clock> &start)
const;
316 const Eigen::VectorXd &Aqj)
const;
317 Eigen::VectorXd
dpr(
const Eigen::VectorXd &r,
double lambda)
const;
318 Eigen::VectorXd
olsen(
const Eigen::VectorXd &r,
const Eigen::VectorXd &x,
319 double lambda)
const;
322 Index size_initial_guess)
const;
329 void restart(
const RitzEigenPair &rep, ProjectedSpace &proj,
330 Index newtestvectors)
const;
Index getSizeUpdate(Index neigen) const
RitzEigenPair getRitzEigenPairs(const ProjectedSpace &proj) const
bool checkConvergence(const RitzEigenPair &rep, ProjectedSpace &proj, Index neigen) const
void restart(const RitzEigenPair &rep, ProjectedSpace &proj, Index newtestvectors) const
ProjectedSpace initProjectedSpace(Index neigen, Index size_initial_guess) const
Index orthogonalize(Eigen::MatrixXd &V, Index nupdate) const
void printOptions(Index operator_size) const
Eigen::MatrixXd eigenvectors_
ArrayXl argsort(const Eigen::VectorXd &V) const
DavidsonSolver(Logger &log)
Index extendProjection(const RitzEigenPair &rep, ProjectedSpace &proj) const
void set_max_search_space(Index N)
Eigen::VectorXd eigenvalues() const
void solve(const MatrixReplacement &A, Index neigen, Index size_initial_guess=0)
void solve(const MatrixReplacement &A, Index neigen, const Eigen::MatrixXd &initial_guess)
void set_iter_max(Index N)
void checkOptions(Index operator_size)
void set_matrix_type(std::string mt)
Eigen::MatrixXd setupInitialEigenvectors(Index size_initial_guess) const
void set_correction(std::string method)
Eigen::ComputationInfo info() const
void set_size_update(std::string update_size)
Index gramschmidt(Eigen::MatrixXd &A, Index nstart) const
RitzEigenPair getHarmonicRitz(const ProjectedSpace &proj) const
Index num_iterations() const
void set_tolerance(std::string tol)
Eigen::MatrixXd eigenvectors() const
Eigen::VectorXd dpr(const Eigen::VectorXd &r, double lambda) const
Eigen::VectorXd computeCorrectionVector(const Eigen::VectorXd &qj, double lambdaj, const Eigen::VectorXd &Aqj) const
Eigen::MatrixXd extract_vectors(const Eigen::MatrixXd &V, const ArrayXl &idx) const
void printTiming(const std::chrono::time_point< std::chrono::system_clock > &start) const
void storeEigenPairs(const RitzEigenPair &rep, Index neigen)
Eigen::Array< bool, Eigen::Dynamic, 1 > ArrayXb
RitzEigenPair getRitz(const ProjectedSpace &proj) const
void storeConvergedData(const RitzEigenPair &rep, Index neigen)
void updateProjection(const MatrixReplacement &A, ProjectedSpace &proj) const
Eigen::ComputationInfo info_
void printIterationData(const RitzEigenPair &rep, const ProjectedSpace &proj, Index neigen) const
Eigen::VectorXd olsen(const Eigen::VectorXd &r, const Eigen::VectorXd &x, double lambda) const
Eigen::VectorXd eigenvalues_
CORR davidson_correction_
Eigen::MatrixXd qr(const Eigen::MatrixXd &A) const
void storeNotConvergedData(const RitzEigenPair &rep, const ArrayXb &root_converged, Index neigen)
Logger is used for thread-safe output of messages.
Timestamp returns the current time as a string Example: cout << TimeStamp().
#define XTP_LOG(level, log)
Provides a means for comparing floating point numbers.
Index search_space() const
Eigen::ArrayXd res_norm() const
Eigen::Array< votca::Index, Eigen::Dynamic, 1 > ArrayXl