35 #ifndef ANASAZI_TRACEMIN_DAVIDSON_SOLMGR_HPP 36 #define ANASAZI_TRACEMIN_DAVIDSON_SOLMGR_HPP 96 template<
class ScalarType,
class MV,
class OP>
102 typedef Teuchos::ScalarTraits<ScalarType> SCT;
103 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
104 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
136 Teuchos::ParameterList &pl );
145 return (solver->getCurSubspaceDim() == solver->getMaxSubspaceDim());
152 Teuchos::RCP< TraceMinBase<ScalarType,MV,OP> > createSolver(
153 const Teuchos::RCP<
SortManager<
typename Teuchos::ScalarTraits<ScalarType>::magnitudeType> > &sorter,
156 Teuchos::ParameterList &plist)
165 template<
class ScalarType,
class MV,
class OP>
170 maxRestarts_ = pl.get(
"Maximum Restarts", 50);
171 TEUCHOS_TEST_FOR_EXCEPTION(maxRestarts_ <= 0, std::invalid_argument,
172 "Anasazi::TraceMinDavidsonSolMgr::constructor(): \"Maximum Restarts\" must be strictly positive.");
174 this->useHarmonic_ = pl.get(
"Use Harmonic Ritz Values",
false);
176 TEUCHOS_TEST_FOR_EXCEPTION(this->useHarmonic_ && problem->getM() != Teuchos::null, std::invalid_argument,
"Anasazi::TraceMinDavidsonSolMgr::constructor(): Harmonic Ritz values do not currently work with generalized eigenvalue problems. Please disable \"Use Harmonic Ritz Values\".");
179 this->blockSize_ = pl.get(
"Block Size", 1);
180 TEUCHOS_TEST_FOR_EXCEPTION(this->blockSize_ <= 0, std::invalid_argument,
181 "Anasazi::TraceMinDavidsonSolMgr::constructor(): \"Block Size\" must be strictly positive.");
183 this->numRestartBlocks_ = (int)std::ceil(this->problem_->getNEV() / this->blockSize_);
184 this->numRestartBlocks_ = pl.get(
"Num Restart Blocks", this->numRestartBlocks_);
185 TEUCHOS_TEST_FOR_EXCEPTION(this->numRestartBlocks_ <= 0, std::invalid_argument,
186 "Anasazi::TraceMinDavidsonSolMgr::constructor(): \"Num Restart Blocks\" must be strictly positive.");
188 this->numBlocks_ = pl.get(
"Num Blocks", 3*this->numRestartBlocks_);
189 TEUCHOS_TEST_FOR_EXCEPTION(this->numBlocks_ <= 1, std::invalid_argument,
190 "Anasazi::TraceMinDavidsonSolMgr::constructor(): \"Num Blocks\" must be greater than 1. If you only wish to use one block, please use TraceMinSolMgr instead of TraceMinDavidsonSolMgr.");
192 TEUCHOS_TEST_FOR_EXCEPTION(this->numRestartBlocks_ >= this->numBlocks_, std::invalid_argument,
193 "Anasazi::TraceMinDavidsonSolMgr::constructor(): \"Num Blocks\" must be strictly greater than \"Num Restart Blocks\".");
195 std::stringstream ss;
196 ss <<
"Anasazi::TraceMinDavidsonSolMgr::constructor(): Potentially impossible orthogonality requests. Reduce basis size (" <<
static_cast<ptrdiff_t
>(this->numBlocks_)*this->blockSize_ <<
") or locking size (" << this->maxLocked_ <<
") because " << static_cast<ptrdiff_t>(this->numBlocks_) <<
"*" << this->blockSize_ <<
" + " << this->maxLocked_ <<
" > " <<
MVT::GetGlobalLength(*this->problem_->getInitVec()) <<
".";
197 TEUCHOS_TEST_FOR_EXCEPTION(static_cast<ptrdiff_t>(this->numBlocks_)*this->blockSize_ + this->maxLocked_ >
MVT::GetGlobalLength(*this->problem_->getInitVec()),
198 std::invalid_argument, ss.str());
200 TEUCHOS_TEST_FOR_EXCEPTION(this->maxLocked_ + this->blockSize_ < this->problem_->getNEV(), std::invalid_argument,
201 "Anasazi::TraceMinDavidsonSolMgr: Not enough storage space for requested number of eigenpairs.");
207 template <
class ScalarType,
class MV,
class OP>
210 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 211 Teuchos::TimeMonitor restimer(*this->_timerRestarting);
214 if ( numRestarts >= maxRestarts_ ) {
219 this->printer_->stream(
IterationDetails) <<
" Performing restart number " << numRestarts <<
" of " << maxRestarts_ << std::endl << std::endl;
221 TraceMinBaseState<ScalarType,MV> oldstate = solver->getState();
222 TraceMinBaseState<ScalarType,MV> newstate;
223 int newdim = this->numRestartBlocks_*this->blockSize_;
224 std::vector<int> indToCopy(newdim);
225 for(
int i=0; i<newdim; i++) indToCopy[i] = i;
229 if(this->useHarmonic_)
231 newstate.V = MVT::CloneView(*solver->getRitzVectors(),indToCopy);
232 newstate.curDim = newdim;
237 this->copyPartOfState (oldstate, newstate, indToCopy);
241 newstate.NEV = oldstate.NEV;
242 solver->initialize(newstate);
static ptrdiff_t GetGlobalLength(const MV &mv)
Return the number of rows in the given multivector mv.
This class defines the interface required by an eigensolver and status test class to compute solution...
Virtual base class which defines basic traits for the operator type.
TraceMinDavidsonSolMgr(const Teuchos::RCP< Eigenproblem< ScalarType, MV, OP > > &problem, Teuchos::ParameterList &pl)
Basic constructor for TraceMinDavidsonSolMgr.
The Anasazi::TraceMinBaseSolMgr provides an abstract base class for the TraceMin series of solver man...
Namespace Anasazi contains the classes, structs, enums and utilities used by the Anasazi package...
Anasazi's templated virtual class for providing routines for orthogonalization and orthonormalization...
Traits class which defines basic operations on multivectors.
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
The Anasazi::TraceMinBaseSolMgr provides an abstract base class for the TraceMin series of solver man...
The Anasazi::TraceMinDavidsonSolMgr provides a flexible solver manager over the TraceMinDavidson eige...
This class implements a TraceMin-Davidson iteration for solving symmetric generalized eigenvalue prob...
Implementation of the TraceMin-Davidson method.
This is an abstract base class for the trace minimization eigensolvers.
Anasazi's templated pure virtual class for managing the sorting of approximate eigenvalues computed b...
Common interface of stopping criteria for Anasazi's solvers.