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;
160 <<
TimeStamp() <<
" iter\tSearch Space\tNorm" << std::flush;
177 }
else if (last_iter) {
185 restart(rep, proj, extension_size);
193 using ArrayXb = Eigen::Array<bool, Eigen::Dynamic, 1>;
212 Eigen::ComputationInfo
info_ = Eigen::ComputationInfo::NoConvergence;
220 return res.colwise().norm();
239 template <
typename MatrixReplacement>
244 proj.
AV = A * proj.
V;
245 proj.
T = proj.
V.transpose() * proj.
AV;
247 proj.
AAV = A * proj.
AV;
248 proj.
B = proj.
V.transpose() * proj.
AAV;
255 Index old_dim = proj.
AV.cols();
256 Index new_dim = proj.
V.cols();
257 Index nvec = new_dim - old_dim;
258 proj.
AV.conservativeResize(Eigen::NoChange, new_dim);
259 proj.
AV.rightCols(nvec) = A * proj.
V.rightCols(nvec);
261 proj.
T.conservativeResize(new_dim, new_dim);
262 proj.
T.rightCols(nvec) = proj.
V.transpose() * proj.
AV.rightCols(nvec);
265 proj.
T.bottomLeftCorner(nvec, old_dim) =
266 proj.
T.topRightCorner(old_dim, nvec).transpose();
269 proj.
T.bottomLeftCorner(nvec, old_dim) =
270 proj.
V.rightCols(nvec).transpose() * proj.
AV.leftCols(old_dim);
272 proj.
AAV.conservativeResize(Eigen::NoChange, new_dim);
273 proj.
AAV.rightCols(nvec) = A * proj.
AV.rightCols(nvec);
274 proj.
B.conservativeResize(new_dim, new_dim);
275 proj.
B.rightCols(nvec) = proj.
V.transpose() * proj.
AAV.rightCols(nvec);
276 proj.
B.bottomLeftCorner(nvec, old_dim) =
277 proj.
V.rightCols(nvec).transpose() * proj.
AAV.leftCols(old_dim);
283 Eigen::MatrixXd
qr(
const Eigen::MatrixXd &A)
const;
286 RitzEigenPair
getRitz(
const ProjectedSpace &proj)
const;
295 const std::chrono::time_point<std::chrono::system_clock> &start)
const;
312 const Eigen::VectorXd &Aqj)
const;
313 Eigen::VectorXd
dpr(
const Eigen::VectorXd &r,
double lambda)
const;
314 Eigen::VectorXd
olsen(
const Eigen::VectorXd &r,
const Eigen::VectorXd &x,
315 double lambda)
const;
318 Index size_initial_guess)
const;
325 void restart(
const RitzEigenPair &rep, ProjectedSpace &proj,
326 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
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)
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
void gramschmidt(Eigen::MatrixXd &A, Index nstart) 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 orthogonalize(Eigen::MatrixXd &V, Index nupdate) const
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