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;
00020 typedef Anasazi::Operator<ScalarT> OP;
00021 typedef AnasaziMV<ScalarT> MV_C;
00022 typedef AnasaziOp<ScalarT> OP_C;
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
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
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
00097
00098
00099
00100
00101
00102
00103
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 }