Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

eigensolver/anasaziES.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 #include "anasaziHelper.h"
00004 #include "eigensolver/eigens.hh"
00005 #include "operator.hh"
00006 #include "anasaziHelper.h"
00007 #include "AnasaziBasicEigenproblem.hpp"
00008 #include <AnasaziSolverManager.hpp>
00009 #include <Teuchos_ParameterList.hpp>
00010 
00011 namespace concepts {
00012 
00013 template <class ScalarT>
00014 class AnasaziES : public eigensolver::EigenSolver<ScalarT> {
00015 public:
00016   enum State {INIT_PHASE, CONFIGURED_PHASE, SOLVED_PHASE};
00017   enum SolverType {BLOCK_KRYLOV_SCHUR, BLOCK_DAVIDSON, LOBPCG, RTR};
00018 
00019   typedef Anasazi::MultiVec<ScalarT> MV; // abstract base
00020   typedef Anasazi::Operator<ScalarT> OP; // abstract base
00021   typedef AnasaziMV<ScalarT> MV_C; // concrete implementation 
00022   typedef AnasaziOp<ScalarT> OP_C; // concrete implementation 
00023   typedef Anasazi::MultiVecTraits<ScalarT, MV> MVT;
00024 
00025   AnasaziES(SolverType solverType,
00026       concepts::Operator<ScalarT>& A
00027       );
00028 
00029   ~AnasaziES() {
00030 
00031   }
00032 
00033   void setM(concepts::Operator<ScalarT>& M) {
00034     assert(phase_ == INIT_PHASE);
00035     myProblem_->setM(Teuchos::rcp( new OP_C(Teuchos::rcp(&M, false) ) ));
00036   }
00037 
00038   void setHermitian(bool isHermite) {
00039     assert(phase_ == INIT_PHASE);
00040     myProblem_->setHermitian(isHermite);
00041   }
00042 
00044   void setBlockSize(int blocksize = 1) {
00045     myPL_.set( "Block Size", blocksize );
00046     int dim = A_->getOp().dimX();
00047      
00048     Teuchos::RCP<MV> ivec = Teuchos::rcp( new MV_C(dim,blocksize) );
00049     ivec->MvRandom();
00050     myProblem_->setInitVec(ivec);
00051   }
00052 
00053   void setNEV(int nev=3) {
00054     assert(phase_ == INIT_PHASE);
00055     myProblem_->setNEV(nev);
00056   }
00057 
00063   bool setProblem();
00064 
00065   int solve();
00066 
00067   /*
00068    Specify the verbosity level.  Options include:
00069    Anasazi::Errors 
00070      This option is always set
00071    Anasazi::Warnings 
00072      Warnings (less severe than errors)
00073    Anasazi::IterationDetails 
00074      Details at each iteration, such as the current eigenvalues
00075    Anasazi::OrthoDetails 
00076      Details about orthogonality
00077    Anasazi::TimingDetails
00078      A summary of the timing info for the solve() routine
00079    Anasazi::FinalSummary 
00080      A final summary 
00081    Anasazi::Debug 
00082      Debugging information
00083      */
00084   void setVerbosity(int verbosity = Anasazi::Errors) {
00085     assert(phase_ == INIT_PHASE);
00086     myPL_.set( "Verbosity", verbosity );
00087   }
00088 
00090   void setOrthogonalization(std::string mode = "SVQB") {
00091     assert(phase_ == INIT_PHASE);
00092     myPL_.set( "Orthogonalization", mode );
00093   }
00094 
00095   /*
00096    Choose which eigenvalues to compute.
00097    Choices are:
00098    LM - target the largest magnitude  [default]
00099    SM - target the smallest magnitude 
00100    LR - target the largest real 
00101    SR - target the smallest real 
00102    LI - target the largest imaginary
00103    SI - target the smallest imaginary
00104    */
00105   void setMode(std::string mode = "LM") {
00106     assert(phase_ == INIT_PHASE);
00107     myPL_.set( "Which", mode );
00108   }
00109 
00113   void setNumBlocks(int numBlocks) {
00114     assert(phase_ == INIT_PHASE);
00115     myPL_.set( "Num Blocks", numBlocks);
00116   }
00117 
00118   void setMaxRestarts(int maxRestarts = 100) {
00119     assert(phase_ == INIT_PHASE);
00120     myPL_.set( "Maximum Restarts", maxRestarts );
00121   }
00122 
00126   void setConvTol(double tolerance) {
00127     assert(phase_ == INIT_PHASE);
00128     myPL_.set( "Convergence Tolerance",  tolerance);
00129   }
00130 
00135   void setRelConvTol(bool rct) {
00136     assert(phase_ == INIT_PHASE);
00137     myPL_.set( "Relative Convergence Tolerance",  rct);
00138   }
00139 
00142   void setConvergenceNorm(std::string norm = "2") {
00143     assert(phase_ == INIT_PHASE);
00144     myPL_.set( "Convergence Norm", norm );
00145   }
00146 
00150   void setMaxLocked(int val) {
00151     assert(phase_ == INIT_PHASE);
00152     myPL_.set( "Max Locked", val);
00153   }
00154 
00156   virtual const concepts::Array<ScalarT>& getEV() {
00157     if(phase_ != SOLVED_PHASE) {
00158       int res = solve();
00159       assert(res == 0);
00160     }
00161 
00162     return evs_;
00163   }
00164 
00166   virtual const concepts::Array<concepts::Vector<ScalarT>*>& getEF() 
00167   {
00168     if(phase_ != SOLVED_PHASE) {
00169       int res = solve();
00170       assert(res == 0);
00171     }
00172 
00173     return efs_;
00174   }
00175 
00177   virtual uint converged() const 
00178   {
00179     if(phase_ != SOLVED_PHASE)
00180       return 0;
00181 
00182     const Anasazi::Eigensolution<ScalarT, MV>& sol = myProblem_->getSolution();
00183     return sol.numVecs;
00184   }
00185 
00187   virtual uint iterations() const {
00188      if(phase_ != SOLVED_PHASE)
00189       return -1;
00190 
00191     return solver_->getNumIters();
00192   }
00193 
00194   Teuchos::RCP< Anasazi::BasicEigenproblem<ScalarT, MV, OP> > getProblem()
00195   {
00196     return myProblem_;
00197   }
00198 
00199 public: 
00200   virtual std::ostream& info(std::ostream& os) const {
00201      return os << "AnasaziES() in state " << (int)phase_;
00202   }
00203 
00204 private:
00205   Teuchos::RCP<OP_C> A_;
00206   Teuchos::RCP< Anasazi::BasicEigenproblem<ScalarT, MV, OP> > myProblem_;
00207 
00208   Teuchos::ParameterList myPL_;
00209 
00210   Teuchos::RCP< Anasazi::SolverManager<ScalarT, MV, OP> > solver_;
00211   
00212   concepts::Array<ScalarT> evs_;
00213   concepts::Array<concepts::Vector<ScalarT>*> efs_;
00214 
00215   State phase_;
00216   SolverType solverType_;
00217 };
00218 
00219 }

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)