42 #ifndef ANASAZI_RTR_SOLMGR_HPP 43 #define ANASAZI_RTR_SOLMGR_HPP 68 #include <Teuchos_TimeMonitor.hpp> 69 #include <Teuchos_FancyOStream.hpp> 82 template<
class ScalarType,
class MV,
class OP>
88 typedef Teuchos::ScalarTraits<ScalarType> SCT;
89 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
90 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
113 Teuchos::ParameterList &pl );
132 Teuchos::Array<Teuchos::RCP<Teuchos::Time> >
getTimers()
const {
133 return Teuchos::tuple(_timerSolve);
159 Teuchos::RCP<Eigenproblem<ScalarType,MV,OP> > problem_;
164 MagnitudeType convtol_;
171 Teuchos::RCP<Teuchos::Time> _timerSolve;
172 Teuchos::RCP<BasicOutputManager<ScalarType> > printer_;
173 Teuchos::ParameterList pl_;
178 template<
class ScalarType,
class MV,
class OP>
181 Teuchos::ParameterList &pl ) :
185 convtol_(MT::prec()),
189 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
190 _timerSolve(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: RTRSolMgr::solve()")),
194 TEUCHOS_TEST_FOR_EXCEPTION(problem_ == Teuchos::null, std::invalid_argument,
"Problem not given to solver manager.");
195 TEUCHOS_TEST_FOR_EXCEPTION(!problem_->isProblemSet(), std::invalid_argument,
"Problem not set.");
196 TEUCHOS_TEST_FOR_EXCEPTION(!problem_->isHermitian(), std::invalid_argument,
"Problem not symmetric.");
197 TEUCHOS_TEST_FOR_EXCEPTION(problem_->getInitVec() == Teuchos::null,std::invalid_argument,
"Problem does not contain initial vectors to clone from.");
201 whch_ = pl_.get(
"Which",
"SR");
202 TEUCHOS_TEST_FOR_EXCEPTION(whch_ !=
"SR" && whch_ !=
"LR",
203 std::invalid_argument,
"Anasazi::RTRSolMgr: Invalid sorting string. RTR solvers compute only LR or SR.");
206 convtol_ = pl_.get(
"Convergence Tolerance",convtol_);
207 relconvtol_ = pl_.get(
"Relative Convergence Tolerance",relconvtol_);
208 strtmp = pl_.get(
"Convergence Norm",std::string(
"2"));
210 convNorm_ = RES_2NORM;
212 else if (strtmp ==
"M") {
213 convNorm_ = RES_ORTH;
216 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
217 "Anasazi::RTRSolMgr: Invalid Convergence Norm.");
222 maxIters_ = pl_.get(
"Maximum Iterations",maxIters_);
225 skinny_ = pl_.get(
"Skinny Solver",skinny_);
228 numICGS_ = pl_.get(
"Num ICGS",2);
231 std::string fntemplate =
"";
232 bool allProcs =
false;
233 if (pl_.isParameter(
"Output on all processors")) {
234 if (Teuchos::isParameterType<bool>(pl_,
"Output on all processors")) {
235 allProcs = pl_.get(
"Output on all processors",allProcs);
237 allProcs = ( Teuchos::getParameter<int>(pl_,
"Output on all processors") != 0 );
240 fntemplate = pl_.get(
"Output filename template",fntemplate);
245 MPI_Initialized(&mpiStarted);
246 if (mpiStarted) MPI_Comm_rank(MPI_COMM_WORLD, &MyPID);
251 if (fntemplate !=
"") {
252 std::ostringstream MyPIDstr;
256 while ( (pos = fntemplate.find(
"%d",start)) != -1 ) {
257 fntemplate.replace(pos,2,MyPIDstr.str());
261 Teuchos::RCP<ostream> osp;
262 if (fntemplate !=
"") {
263 osp = Teuchos::rcp(
new std::ofstream(fntemplate.c_str(),std::ios::out | std::ios::app) );
265 osp = Teuchos::rcpFromRef(std::cout);
266 std::cout <<
"Anasazi::RTRSolMgr::constructor(): Could not open file for write: " << fntemplate << std::endl;
270 osp = Teuchos::rcpFromRef(std::cout);
274 if (pl_.isParameter(
"Verbosity")) {
275 if (Teuchos::isParameterType<int>(pl_,
"Verbosity")) {
276 verbosity = pl_.get(
"Verbosity", verbosity);
278 verbosity = (int)Teuchos::getParameter<Anasazi::MsgType>(pl_,
"Verbosity");
293 template<
class ScalarType,
class MV,
class OP>
301 const int nev = problem_->getNEV();
307 Teuchos::RCP<Teuchos::FancyOStream>
308 out = Teuchos::getFancyOStream(Teuchos::rcpFromRef(printer_->stream(
Debug)));
309 out->setShowAllFrontMatter(
false).setShowProcRank(
true);
310 *out <<
"Entering Anasazi::RTRSolMgr::solve()\n";
320 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > maxtest;
321 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > ordertest;
322 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > combotest;
323 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > convtest;
329 maxtest = Teuchos::null;
337 Teuchos::Array<Teuchos::RCP<StatusTest<ScalarType,MV,OP> > > alltests;
338 alltests.push_back(ordertest);
339 if (maxtest != Teuchos::null) alltests.push_back(maxtest);
343 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP> > outputtest;
344 if ( printer_->isVerbosity(
Debug) ) {
353 Teuchos::RCP<ICGSOrthoManager<ScalarType,MV,OP> > ortho
359 bool leftMost =
true;
360 if (whch_ ==
"LR" || whch_ ==
"LM") {
363 pl_.set<
bool>(
"Leftmost",leftMost);
364 Teuchos::RCP<RTRBase<ScalarType,MV,OP> > rtr_solver;
365 if (skinny_ ==
false) {
374 Teuchos::RCP< const MV > probauxvecs = problem_->getAuxVecs();
375 if (probauxvecs != Teuchos::null) {
376 rtr_solver->setAuxVecs( Teuchos::tuple< Teuchos::RCP<const MV> >(probauxvecs) );
379 TEUCHOS_TEST_FOR_EXCEPTION(rtr_solver->getBlockSize() < problem_->getNEV(),std::logic_error,
380 "Anasazi::RTRSolMgr requires block size >= requested number of eigenvalues.");
383 Teuchos::RCP<MV> foundvecs;
384 std::vector<MagnitudeType> foundvals;
388 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 389 Teuchos::TimeMonitor slvtimer(*_timerSolve);
391 rtr_solver->iterate();
392 numIters_ = rtr_solver->getNumIters();
394 catch (
const std::exception &e) {
396 printer_->stream(
Anasazi::Errors) <<
"Exception: " << e.what() << endl;
399 problem_->setSolution(sol);
404 if (convtest->getStatus() ==
Passed || (maxtest != Teuchos::null && maxtest->getStatus() ==
Passed))
406 int num = convtest->howMany();
408 std::vector<int> ind = convtest->whichVecs();
412 foundvals.resize(num);
413 std::vector<Value<ScalarType> > all = rtr_solver->getRitzValues();
414 for (
int i=0; i<num; i++) {
415 foundvals[i] = all[ind[i]].realpart;
421 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Anasazi::RTRSolMgr::solve(): solver returned without satisfy status test.");
427 sol.
Evecs = foundvecs;
430 for (
int i=0; i<sol.
numVecs; i++) {
431 sol.
Evals[i].realpart = foundvals[i];
434 sol.
index.resize(numfound,0);
437 rtr_solver->currentStatus(printer_->stream(
FinalSummary));
440 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 442 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails ) );
447 problem_->setSolution(sol);
448 printer_->stream(
Debug) <<
"Returning " << sol.
numVecs <<
" eigenpairs to eigenproblem." << endl;
Pure virtual base class which describes the basic interface for a solver manager. ...
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
std::vector< Value< ScalarType > > Evals
The computed eigenvalues.
ResType
Enumerated type used to specify which residual norm used by residual norm status tests.
A special StatusTest for printing other status tests.
This class defines the interface required by an eigensolver and status test class to compute solution...
RTRSolMgr(const Teuchos::RCP< Eigenproblem< ScalarType, MV, OP > > &problem, Teuchos::ParameterList &pl)
Basic constructor for RTRSolMgr.
An implementation of the Anasazi::SortManager that performs a collection of common sorting techniques...
Virtual base class which defines basic traits for the operator type.
Teuchos::RCP< MV > Evecs
The computed eigenvectors.
An implementation of the Anasazi::GenOrthoManager that performs orthogonalization using iterated clas...
Status test for forming logical combinations of other status tests.
The Anasazi::SolverManager is a templated virtual base class that defines the basic interface that an...
int getNumIters() const
Get the iteration count for the most recent call to solve.
The Anasazi::RTRSolMgr provides a simple solver manager over the RTR eigensolver. For more informatio...
virtual ~RTRSolMgr()
Destructor.
Basic implementation of the Anasazi::SortManager class.
Namespace Anasazi contains the classes, structs, enums and utilities used by the Anasazi package...
A status test for testing the norm of the eigenvectors residuals along with a set of auxiliary eigenv...
const Eigenproblem< ScalarType, MV, OP > & getProblem() const
Return the eigenvalue problem.
int numVecs
The number of computed eigenpairs.
Basic output manager for sending information of select verbosity levels to the appropriate output str...
ReturnType solve()
This method performs possibly repeated calls to the underlying eigensolver's iterate() routine until ...
Teuchos::RCP< MV > Espace
An orthonormal basis for the computed eigenspace.
Anasazi's basic output manager for sending information of select verbosity levels to the appropriate ...
Abstract base class which defines the interface required by an eigensolver and status test class to c...
ReturnType
Enumerated type used to pass back information from a solver manager.
A status test for testing the norm of the eigenvectors residuals.
Traits class which defines basic operations on multivectors.
static Teuchos::RCP< MV > CloneCopy(const MV &mv)
Creates a new MV and copies contents of mv into the new vector (deep copy).
std::vector< int > index
An index into Evecs to allow compressed storage of eigenvectors for real, non-Hermitian problems...
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
Struct for storing an eigenproblem solution.
A status test for testing the number of iterations.
Status test for testing the number of iterations.
Special StatusTest for printing status tests.
A status test for testing the norm of the eigenvectors residuals along with a set of auxiliary eigenv...
Status test for forming logical combinations of other status tests.
Types and exceptions used within Anasazi solvers and interfaces.
A status test for testing the norm of the eigenvectors residuals.
Basic implementation of the Anasazi::OrthoManager class.
Class which provides internal utilities for the Anasazi solvers.