00001 // jdbsym eigensolver 00002 00003 #ifndef jdbsym_hh 00004 #define jdbsym_hh 00005 00006 #include "eigens.hh" 00007 00008 namespace concepts { 00009 // forward declaration 00010 template<typename F> 00011 class Operator; 00012 template<typename F> 00013 class SolverFabric; 00014 } // namespace concepts 00015 00016 namespace eigensolver { 00017 00018 using concepts::Real; 00019 00020 // **************************************************************** JdbSym ** 00021 00045 class JdbSym : public EigenSolver<Real> { 00046 public: 00073 JdbSym(concepts::Operator<Real>& stiff, concepts::Operator<Real>& mass, 00074 Real tol, uint maxit = 150, Real tau = 0.0, uint jdtype = 1, 00075 uint kmax = 1, concepts::SolverFabric<Real>* fabric = 0, 00076 const concepts::Array<concepts::Vector<Real>*>* start = 0); 00077 virtual ~JdbSym(); 00078 virtual const concepts::Array<Real>& getEV(); 00079 virtual const concepts::Array<concepts::Vector<Real>*>& getEF(); 00080 virtual uint iterations() const { return (uint)it_; } 00081 virtual uint converged() const { return (uint)k_conv_; } 00082 protected: 00083 virtual std::ostream& info(std::ostream& os) const; 00084 private: 00088 void compute_(); 00090 bool computed_; 00092 concepts::Operator<Real>& stiff_; 00096 concepts::Operator<Real>& mass_; 00098 Real tol_; 00100 uint maxit_; 00102 Real tau_; 00104 const uint jdtype_; 00106 uint kmax_; 00108 int it_; 00110 int k_conv_; 00111 00113 concepts::Array<Real> lambda_; 00115 concepts::Array<Real> eigenvectors_; 00117 concepts::Array<concepts::Vector<Real>*> ev_; 00118 00120 uint stiffCounter_, massCounter_; 00121 00122 concepts::SolverFabric<Real>* fabric_; 00123 const concepts::Array<concepts::Vector<Real>*>* start_; 00124 00126 static int jdbsymLock_; 00127 }; 00128 00129 } 00130 00131 #endif // jdbsym_hh