8 #include <boost/property_tree/ptree_fwd.hpp>
34 double eigRelTolIn=0.0,
35 double eigAbsTolIn=0.0,
37 double solverTolIn=-1,
53 LOBPCG(boost::property_tree::ptree
const& options);
65 std::shared_ptr<LinearOperator>
B=
nullptr,
66 std::shared_ptr<LinearOperator>
M=
nullptr){
return compute(
A,Eigen::MatrixXd(),
B,
M);};
76 Eigen::MatrixXd
const& constMat,
77 std::shared_ptr<LinearOperator>
B =
nullptr,
78 std::shared_ptr<LinearOperator>
M =
nullptr);
83 void InitializeVectors(Eigen::MatrixXd
const& vecs);
96 std::pair<Eigen::VectorXd, Eigen::MatrixXd> ComputeBlock(std::shared_ptr<LinearOperator>
const&
A,
97 Eigen::Ref<const Eigen::MatrixXd>
const& X0,
98 Eigen::Ref<const Eigen::MatrixXd>
const& constMat,
99 std::shared_ptr<LinearOperator>
B,
100 std::shared_ptr<LinearOperator>
M);
103 class Orthonormalizer{
105 Orthonormalizer(std::shared_ptr<LinearOperator>
const& Bin) :
B(Bin){};
107 bool ComputeInPlace(Eigen::Ref<Eigen::MatrixXd> V);
108 bool ComputeInPlace(Eigen::Ref<Eigen::MatrixXd> V, Eigen::Ref<const Eigen::MatrixXd>
const& BVin);
110 Eigen::MatrixXd Compute(Eigen::Ref<const Eigen::MatrixXd>
const& V);
111 Eigen::MatrixXd Compute(Eigen::Ref<const Eigen::MatrixXd>
const& V, Eigen::Ref<const Eigen::MatrixXd>
const& BVin);
113 Eigen::MatrixXd InverseVBV()
const;
114 Eigen::MatrixXd
const& GetBV()
const{
return BV;};
115 Eigen::MatrixXd& GetBV(){
return BV;};
118 std::shared_ptr<LinearOperator>
B;
120 Eigen::MatrixXd VBV_Chol;
125 Constraints(std::shared_ptr<LinearOperator>
const&
B,
126 Eigen::Ref<const Eigen::MatrixXd>
const& constVec);
128 void ApplyInPlace(Eigen::Ref<Eigen::MatrixXd> x);
130 int size()
const{
return BY.cols();};
134 Eigen::Ref<const Eigen::MatrixXd>
const& Y;
135 Eigen::LLT<Eigen::MatrixXd> YBY_llt;
149 double eigRelTol, eigAbsTol;
Abstract base class for operator based generalized eigenvalue solvers.
std::shared_ptr< LinearOperator > A
std::shared_ptr< LinearOperator > M
std::shared_ptr< LinearOperator > B
The Locally Optimal Block Preconditioned Conjugate Gradient Method (LOBPCG) method for matrix-free co...
LOBPCG & compute(std::shared_ptr< LinearOperator > const &A, std::shared_ptr< LinearOperator > B=nullptr, std::shared_ptr< LinearOperator > M=nullptr)
virtual ~LOBPCG()=default
LOBPCG(int numEigsIn, double eigRelTolIn=0.0, double eigAbsTolIn=0.0, int blockSizeIn=-1, double solverTolIn=-1, int maxItsIn=-1, int verbosityIn=0)