MUQ  0.4.3
LOBPCG.h
Go to the documentation of this file.
1 #ifndef LOBPCG_H
2 #define LOBPCG_H
3 
4 
7 
8 #include <boost/property_tree/ptree_fwd.hpp>
9 #include <Eigen/Core>
10 
11 namespace muq{
12 namespace Modeling{
13 
21  {
22  public:
23 
33  LOBPCG(int numEigsIn,
34  double eigRelTolIn=0.0,
35  double eigAbsTolIn=0.0,
36  int blockSizeIn=-1,
37  double solverTolIn=-1,
38  int maxItsIn=-1,
39  int verbosityIn=0);
40 
53  LOBPCG(boost::property_tree::ptree const& options);
54 
55  virtual ~LOBPCG() = default;
56 
64  LOBPCG& compute(std::shared_ptr<LinearOperator> const& A,
65  std::shared_ptr<LinearOperator> B=nullptr,
66  std::shared_ptr<LinearOperator> M=nullptr){return compute(A,Eigen::MatrixXd(),B,M);};
67 
75  LOBPCG& compute(std::shared_ptr<LinearOperator> const& A,
76  Eigen::MatrixXd const& constMat,
77  std::shared_ptr<LinearOperator> B = nullptr,
78  std::shared_ptr<LinearOperator> M = nullptr);
79 
80 
83  void InitializeVectors(Eigen::MatrixXd const& vecs);
84 
90  LOBPCG& reset(int dim);
91 
92  private:
93 
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);
101 
103  class Orthonormalizer{
104  public:
105  Orthonormalizer(std::shared_ptr<LinearOperator> const& Bin) : B(Bin){};
106 
107  bool ComputeInPlace(Eigen::Ref<Eigen::MatrixXd> V);
108  bool ComputeInPlace(Eigen::Ref<Eigen::MatrixXd> V, Eigen::Ref<const Eigen::MatrixXd> const& BVin);
109 
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);
112 
113  Eigen::MatrixXd InverseVBV() const;
114  Eigen::MatrixXd const& GetBV() const{return BV;};
115  Eigen::MatrixXd& GetBV(){return BV;};
116 
117  int vDim;
118  std::shared_ptr<LinearOperator> B;
119  Eigen::MatrixXd BV;
120  Eigen::MatrixXd VBV_Chol;
121  };
122 
123  class Constraints{
124  public:
125  Constraints(std::shared_ptr<LinearOperator> const& B,
126  Eigen::Ref<const Eigen::MatrixXd> const& constVec);
127 
128  void ApplyInPlace(Eigen::Ref<Eigen::MatrixXd> x);
129 
130  int size() const{return BY.cols();};
131 
132  private:
133  Eigen::MatrixXd BY;
134  Eigen::Ref<const Eigen::MatrixXd> const& Y;
135  Eigen::LLT<Eigen::MatrixXd> YBY_llt;
136 
137  }; // class LOBPCG::Constraints
138 
140  int numEigs;
141 
143  int blockSize;
144 
146  double solverTol;
147 
149  double eigRelTol, eigAbsTol;
150 
152  int maxIts;
153 
155  int verbosity;
156 
157  //Eigen::VectorXd eigVals;
158  //Eigen::MatrixXd eigVecs;
159 
160  //std::shared_ptr<LinearOperator> A, B, M;
161  double Anorm, Bnorm;
162 
163  }; // class LOBPCG
164 }
165 }
166 
167 
168 
169 #endif // LOBPCG_H
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...
Definition: LOBPCG.h:21
LOBPCG & compute(std::shared_ptr< LinearOperator > const &A, std::shared_ptr< LinearOperator > B=nullptr, std::shared_ptr< LinearOperator > M=nullptr)
Definition: LOBPCG.h:64
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)
Definition: LOBPCG.cpp:10