42 #ifndef ANASAZI_BLOCK_KRYLOV_SCHUR_SOLMGR_HPP 43 #define ANASAZI_BLOCK_KRYLOV_SCHUR_SOLMGR_HPP 65 #include "Teuchos_BLAS.hpp" 66 #include "Teuchos_LAPACK.hpp" 67 #include "Teuchos_TimeMonitor.hpp" 152 template<
class ScalarType,
class MV,
class OP>
158 typedef Teuchos::ScalarTraits<ScalarType> SCT;
159 typedef typename Teuchos::ScalarTraits<ScalarType>::magnitudeType MagnitudeType;
160 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
185 Teuchos::ParameterList &pl );
207 std::vector<Value<ScalarType> > ret( _ritzValues );
217 Teuchos::Array<Teuchos::RCP<Teuchos::Time> >
getTimers()
const {
218 return Teuchos::tuple(_timerSolve, _timerRestarting);
261 Teuchos::RCP<Eigenproblem<ScalarType,MV,OP> > _problem;
262 Teuchos::RCP<SortManager<MagnitudeType> > _sort;
264 std::string _whch, _ortho;
265 MagnitudeType _ortho_kappa;
267 MagnitudeType _convtol;
269 bool _relconvtol,_conjSplit;
270 int _blockSize, _numBlocks, _stepSize, _nevBlocks, _xtra_nevBlocks;
273 bool _inSituRestart, _dynXtraNev;
275 std::vector<Value<ScalarType> > _ritzValues;
278 Teuchos::RCP<Teuchos::Time> _timerSolve, _timerRestarting;
280 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > globalTest_;
281 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > debugTest_;
287 template<
class ScalarType,
class MV,
class OP>
290 Teuchos::ParameterList &pl ) :
306 _inSituRestart(false),
309 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
310 ,_timerSolve(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: BlockKrylovSchurSolMgr::solve()")),
311 _timerRestarting(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: BlockKrylovSchurSolMgr restarting"))
314 TEUCHOS_TEST_FOR_EXCEPTION(_problem == Teuchos::null, std::invalid_argument,
"Problem not given to solver manager.");
315 TEUCHOS_TEST_FOR_EXCEPTION(!_problem->isProblemSet(), std::invalid_argument,
"Problem not set.");
316 TEUCHOS_TEST_FOR_EXCEPTION(_problem->getInitVec() == Teuchos::null, std::invalid_argument,
"Problem does not contain initial vectors to clone from.");
318 const int nev = _problem->getNEV();
321 _convtol = pl.get(
"Convergence Tolerance",MT::prec());
322 _relconvtol = pl.get(
"Relative Convergence Tolerance",_relconvtol);
325 _maxRestarts = pl.get(
"Maximum Restarts",_maxRestarts);
328 _blockSize = pl.get(
"Block Size",1);
329 TEUCHOS_TEST_FOR_EXCEPTION(_blockSize <= 0, std::invalid_argument,
330 "Anasazi::BlockKrylovSchurSolMgr: \"Block Size\" must be strictly positive.");
333 _xtra_nevBlocks = pl.get(
"Extra NEV Blocks",0);
334 if (nev%_blockSize) {
335 _nevBlocks = nev/_blockSize + 1;
337 _nevBlocks = nev/_blockSize;
343 if (pl.isParameter(
"Dynamic Extra NEV")) {
344 if (Teuchos::isParameterType<bool>(pl,
"Dynamic Extra NEV")) {
345 _dynXtraNev = pl.get(
"Dynamic Extra NEV",_dynXtraNev);
347 _dynXtraNev = ( Teuchos::getParameter<int>(pl,
"Dynamic Extra NEV") != 0 );
351 _numBlocks = pl.get(
"Num Blocks",3*_nevBlocks);
352 TEUCHOS_TEST_FOR_EXCEPTION(_numBlocks <= _nevBlocks, std::invalid_argument,
353 "Anasazi::BlockKrylovSchurSolMgr: \"Num Blocks\" must be strictly positive and large enough to compute the requested eigenvalues.");
355 TEUCHOS_TEST_FOR_EXCEPTION(static_cast<ptrdiff_t>(_numBlocks)*_blockSize >
MVT::GetGlobalLength(*_problem->getInitVec()),
356 std::invalid_argument,
357 "Anasazi::BlockKrylovSchurSolMgr: Potentially impossible orthogonality requests. Reduce basis size.");
361 _stepSize = pl.get(
"Step Size", (_maxRestarts+1)*(_numBlocks+1));
363 _stepSize = pl.get(
"Step Size", _numBlocks+1);
365 TEUCHOS_TEST_FOR_EXCEPTION(_stepSize < 1, std::invalid_argument,
366 "Anasazi::BlockKrylovSchurSolMgr: \"Step Size\" must be strictly positive.");
369 if (pl.isParameter(
"Sort Manager")) {
370 _sort = Teuchos::getParameter<Teuchos::RCP<Anasazi::SortManager<MagnitudeType> > >(pl,
"Sort Manager");
373 _whch = pl.get(
"Which",_whch);
374 TEUCHOS_TEST_FOR_EXCEPTION(_whch !=
"SM" && _whch !=
"LM" && _whch !=
"SR" && _whch !=
"LR" && _whch !=
"SI" && _whch !=
"LI",
375 std::invalid_argument,
"Invalid sorting string.");
380 _ortho = pl.get(
"Orthogonalization",_ortho);
381 if (_ortho !=
"DGKS" && _ortho !=
"SVQB") {
386 _ortho_kappa = pl.get(
"Orthogonalization Constant",_ortho_kappa);
389 if (pl.isParameter(
"Verbosity")) {
390 if (Teuchos::isParameterType<int>(pl,
"Verbosity")) {
391 _verbosity = pl.get(
"Verbosity", _verbosity);
393 _verbosity = (int)Teuchos::getParameter<Anasazi::MsgType>(pl,
"Verbosity");
398 if (pl.isParameter(
"In Situ Restarting")) {
399 if (Teuchos::isParameterType<bool>(pl,
"In Situ Restarting")) {
400 _inSituRestart = pl.get(
"In Situ Restarting",_inSituRestart);
402 _inSituRestart = ( Teuchos::getParameter<int>(pl,
"In Situ Restarting") != 0 );
406 _printNum = pl.get<
int>(
"Print Number of Ritz Values",-1);
411 template<
class ScalarType,
class MV,
class OP>
415 const int nev = _problem->getNEV();
416 ScalarType one = Teuchos::ScalarTraits<ScalarType>::one();
417 ScalarType zero = Teuchos::ScalarTraits<ScalarType>::zero();
419 Teuchos::BLAS<int,ScalarType> blas;
420 Teuchos::LAPACK<int,ScalarType> lapack;
431 Teuchos::RCP<StatusTest<ScalarType,MV,OP> > convtest;
432 if (globalTest_ == Teuchos::null) {
436 convtest = globalTest_;
438 Teuchos::RCP<StatusTestWithOrdering<ScalarType,MV,OP> > ordertest
441 Teuchos::Array<Teuchos::RCP<StatusTest<ScalarType,MV,OP> > > alltests;
442 alltests.push_back(ordertest);
444 if (debugTest_ != Teuchos::null) alltests.push_back(debugTest_);
446 Teuchos::RCP<StatusTestCombo<ScalarType,MV,OP> > combotest
449 Teuchos::RCP<StatusTestOutput<ScalarType,MV,OP> > outputtest;
450 if ( printer->isVerbosity(
Debug) ) {
459 Teuchos::RCP<OrthoManager<ScalarType,MV> > ortho;
460 if (_ortho==
"SVQB") {
462 }
else if (_ortho==
"DGKS") {
463 if (_ortho_kappa <= 0) {
470 TEUCHOS_TEST_FOR_EXCEPTION(_ortho!=
"SVQB"&&_ortho!=
"DGKS",std::logic_error,
"Anasazi::BlockKrylovSchurSolMgr::solve(): Invalid orthogonalization type.");
475 Teuchos::ParameterList plist;
476 plist.set(
"Block Size",_blockSize);
477 plist.set(
"Num Blocks",_numBlocks);
478 plist.set(
"Step Size",_stepSize);
479 if (_printNum == -1) {
480 plist.set(
"Print Number of Ritz Values",_nevBlocks*_blockSize);
483 plist.set(
"Print Number of Ritz Values",_printNum);
488 Teuchos::RCP<BlockKrylovSchur<ScalarType,MV,OP> > bks_solver
491 Teuchos::RCP< const MV > probauxvecs = _problem->getAuxVecs();
492 if (probauxvecs != Teuchos::null) {
493 bks_solver->setAuxVecs( Teuchos::tuple< Teuchos::RCP<const MV> >(probauxvecs) );
503 int maxXtraBlocks = 0;
504 if ( _dynXtraNev ) maxXtraBlocks = ( ( bks_solver->getMaxSubspaceDim() - nev ) / _blockSize ) / 2;
506 Teuchos::RCP<MV> workMV;
507 if (_maxRestarts > 0) {
508 if (_inSituRestart==
true) {
510 workMV =
MVT::Clone( *_problem->getInitVec(), 1 );
513 if (_problem->isHermitian()) {
514 workMV =
MVT::Clone( *_problem->getInitVec(), (_nevBlocks+maxXtraBlocks)*_blockSize + _blockSize );
517 workMV =
MVT::Clone( *_problem->getInitVec(), (_nevBlocks+maxXtraBlocks)*_blockSize + 1 + _blockSize );
521 workMV = Teuchos::null;
527 _problem->setSolution(sol);
530 int cur_nevBlocks = 0;
534 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 535 Teuchos::TimeMonitor slvtimer(*_timerSolve);
541 bks_solver->iterate();
548 if ( ordertest->getStatus() ==
Passed ) {
566 else if ( (bks_solver->getCurSubspaceDim() == bks_solver->getMaxSubspaceDim()) ||
567 (!_problem->isHermitian() && !_conjSplit && (bks_solver->getCurSubspaceDim()+1 == bks_solver->getMaxSubspaceDim())) ) {
570 if (!bks_solver->isSchurCurrent()) {
571 bks_solver->computeSchurForm(
true );
574 outputtest->checkStatus( &*bks_solver );
578 if ( numRestarts >= _maxRestarts || ordertest->getStatus() ==
Passed) {
583 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 584 Teuchos::TimeMonitor restimer(*_timerRestarting);
588 int numConv = ordertest->howMany();
589 cur_nevBlocks = _nevBlocks*_blockSize;
592 int moreNevBlocks = std::min( maxXtraBlocks, std::max( numConv/_blockSize, _xtra_nevBlocks) );
594 cur_nevBlocks += moreNevBlocks * _blockSize;
595 else if ( _xtra_nevBlocks )
596 cur_nevBlocks += _xtra_nevBlocks * _blockSize;
604 printer->stream(
Debug) <<
" Performing restart number " << numRestarts <<
" of " << _maxRestarts << std::endl << std::endl;
605 printer->stream(
Debug) <<
" - Current NEV blocks is " << cur_nevBlocks <<
", the minimum is " << _nevBlocks*_blockSize << std::endl;
608 _ritzValues = bks_solver->getRitzValues();
614 int curDim = oldState.
curDim;
617 std::vector<int> ritzIndex = bks_solver->getRitzIndex();
618 if (ritzIndex[cur_nevBlocks-1]==1) {
627 if (_problem->isHermitian() && _conjSplit)
630 <<
" Eigenproblem is Hermitian, complex eigenvalues have been detected, and eigenvalues of interest split a conjugate pair!!!" 632 <<
" Block Krylov-Schur eigensolver cannot guarantee correct behavior in this situation, please turn Hermitian flag off!!!" 639 Teuchos::SerialDenseMatrix<int,ScalarType> Qnev(Teuchos::View, *(oldState.
Q), curDim, cur_nevBlocks);
642 std::vector<int> curind( curDim );
643 for (
int i=0; i<curDim; i++) { curind[i] = i; }
644 Teuchos::RCP<const MV> basistemp =
MVT::CloneView( *(oldState.
V), curind );
654 Teuchos::RCP<MV> newF;
655 if (_inSituRestart) {
658 Teuchos::RCP<MV> solverbasis = Teuchos::rcp_const_cast<MV>(oldState.
V);
659 Teuchos::SerialDenseMatrix<int,ScalarType> copyQnev(Teuchos::Copy, Qnev);
662 std::vector<ScalarType> tau(cur_nevBlocks), work(cur_nevBlocks);
664 lapack.GEQRF(curDim,cur_nevBlocks,copyQnev.values(),copyQnev.stride(),&tau[0],&work[0],work.size(),&info);
665 TEUCHOS_TEST_FOR_EXCEPTION(info != 0,std::logic_error,
666 "Anasazi::BlockKrylovSchurSolMgr::solve(): error calling GEQRF during restarting.");
668 std::vector<ScalarType> d(cur_nevBlocks);
669 for (
int j=0; j<copyQnev.numCols(); j++) {
670 d[j] = copyQnev(j,j);
672 if (printer->isVerbosity(
Debug)) {
673 Teuchos::SerialDenseMatrix<int,ScalarType> R(Teuchos::Copy,copyQnev,cur_nevBlocks,cur_nevBlocks);
674 for (
int j=0; j<R.numCols(); j++) {
675 R(j,j) = SCT::magnitude(R(j,j)) - 1.0;
676 for (
int i=j+1; i<R.numRows(); i++) {
680 printer->stream(
Debug) <<
"||Triangular factor of Su - I||: " << R.normFrobenius() << std::endl;
686 curind.resize(curDim);
687 for (
int i=0; i<curDim; i++) curind[i] = i;
690 msutils::applyHouse(cur_nevBlocks,*oldV,copyQnev,tau,workMV);
694 curind.resize(cur_nevBlocks);
695 for (
int i=0; i<cur_nevBlocks; i++) { curind[i] = i; }
701 curind.resize(_blockSize);
702 for (
int i=0; i<_blockSize; i++) { curind[i] = cur_nevBlocks + i; }
707 curind.resize(cur_nevBlocks);
708 for (
int i=0; i<cur_nevBlocks; i++) { curind[i] = i; }
712 tmp_newV = Teuchos::null;
714 curind.resize(_blockSize);
715 for (
int i=0; i<_blockSize; i++) { curind[i] = cur_nevBlocks + i; }
720 curind.resize(_blockSize);
721 for (
int i=0; i<_blockSize; i++) { curind[i] = curDim + i; }
723 for (
int i=0; i<_blockSize; i++) { curind[i] = i; }
725 newF = Teuchos::null;
731 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > newH =
732 Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(Teuchos::Copy, *(oldState.
S), cur_nevBlocks+_blockSize, cur_nevBlocks) );
735 Teuchos::SerialDenseMatrix<int,ScalarType> oldB(Teuchos::View, *(oldState.
H), _blockSize, _blockSize, curDim, curDim-_blockSize);
738 Teuchos::SerialDenseMatrix<int,ScalarType> subQ(Teuchos::View, *(oldState.
Q), _blockSize, cur_nevBlocks, curDim-_blockSize);
741 Teuchos::SerialDenseMatrix<int,ScalarType> newB(Teuchos::View, *newH, _blockSize, cur_nevBlocks, cur_nevBlocks);
744 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, _blockSize, cur_nevBlocks, _blockSize, one,
745 oldB.values(), oldB.stride(), subQ.values(), subQ.stride(), zero, newB.values(), newB.stride() );
751 if (_inSituRestart) {
752 newstate.
V = oldState.
V;
757 newstate.
curDim = cur_nevBlocks;
758 bks_solver->initialize(newstate);
768 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
"Anasazi::BlockKrylovSchurSolMgr::solve(): Invalid return from bks_solver::iterate().");
773 <<
"Anasazi::BlockKrylovSchurSolMgr::solve() caught unexpected exception from Anasazi::BlockKrylovSchur::iterate() at iteration " << bks_solver->getNumIters() << std::endl
774 << err.what() << std::endl
775 <<
"Anasazi::BlockKrylovSchurSolMgr::solve() returning Unconverged with no solutions." << std::endl;
782 workMV = Teuchos::null;
785 _ritzValues = bks_solver->getRitzValues();
787 sol.
numVecs = ordertest->howMany();
788 printer->stream(
Debug) <<
"ordertest->howMany() : " << sol.
numVecs << std::endl;
789 std::vector<int> whichVecs = ordertest->whichVecs();
795 std::vector<int> tmpIndex = bks_solver->getRitzIndex();
796 for (
int i=0; i<(int)_ritzValues.size(); ++i) {
797 printer->stream(
Debug) << _ritzValues[i].realpart <<
" + i " << _ritzValues[i].imagpart <<
", Index = " << tmpIndex[i] << std::endl;
799 printer->stream(
Debug) <<
"Number of converged eigenpairs (before) = " << sol.
numVecs << std::endl;
800 for (
int i=0; i<sol.
numVecs; ++i) {
801 printer->stream(
Debug) <<
"whichVecs[" << i <<
"] = " << whichVecs[i] <<
", tmpIndex[" << whichVecs[i] <<
"] = " << tmpIndex[whichVecs[i]] << std::endl;
803 if (tmpIndex[whichVecs[sol.
numVecs-1]]==1) {
804 printer->stream(
Debug) <<
"There is a conjugate pair on the boundary, resizing sol.numVecs" << std::endl;
805 whichVecs.push_back(whichVecs[sol.
numVecs-1]+1);
807 for (
int i=0; i<sol.
numVecs; ++i) {
808 printer->stream(
Debug) <<
"whichVecs[" << i <<
"] = " << whichVecs[i] <<
", tmpIndex[" << whichVecs[i] <<
"] = " << tmpIndex[whichVecs[i]] << std::endl;
812 bool keepMore =
false;
814 printer->stream(
Debug) <<
"Number of converged eigenpairs (after) = " << sol.
numVecs << std::endl;
815 printer->stream(
Debug) <<
"whichVecs[sol.numVecs-1] > sol.numVecs-1 : " << whichVecs[sol.
numVecs-1] <<
" > " << sol.
numVecs-1 << std::endl;
818 numEvecs = whichVecs[sol.
numVecs-1]+1;
819 printer->stream(
Debug) <<
"keepMore = true; numEvecs = " << numEvecs << std::endl;
823 bks_solver->setNumRitzVectors(numEvecs);
824 bks_solver->computeRitzVectors();
830 sol.
index = bks_solver->getRitzIndex();
831 sol.
Evals = bks_solver->getRitzValues();
842 std::vector<Anasazi::Value<ScalarType> > tmpEvals = bks_solver->getRitzValues();
843 for (
int vec_i=0; vec_i<sol.
numVecs; ++vec_i) {
844 sol.
index[vec_i] = tmpIndex[whichVecs[vec_i]];
845 sol.
Evals[vec_i] = tmpEvals[whichVecs[vec_i]];
856 bks_solver->currentStatus(printer->stream(
FinalSummary));
859 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR 861 Teuchos::TimeMonitor::summarize( printer->stream(
TimingDetails ) );
865 _problem->setSolution(sol);
866 printer->stream(
Debug) <<
"Returning " << sol.
numVecs <<
" eigenpairs to eigenproblem." << std::endl;
869 _numIters = bks_solver->getNumIters();
878 template <
class ScalarType,
class MV,
class OP>
883 globalTest_ = global;
886 template <
class ScalarType,
class MV,
class OP>
887 const Teuchos::RCP< StatusTest<ScalarType,MV,OP> > &
893 template <
class ScalarType,
class MV,
class OP>
901 template <
class ScalarType,
class MV,
class OP>
902 const Teuchos::RCP< StatusTest<ScalarType,MV,OP> > &
static ptrdiff_t GetGlobalLength(const MV &mv)
Return the number of rows in the given multivector mv.
Pure virtual base class which describes the basic interface for a solver manager. ...
Teuchos::RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > H
The current Hessenberg matrix.
std::vector< Value< ScalarType > > Evals
The computed eigenvalues.
static void MvTimesMatAddMv(const ScalarType alpha, const MV &A, const Teuchos::SerialDenseMatrix< int, ScalarType > &B, const ScalarType beta, MV &mv)
Update mv with .
A special StatusTest for printing other status tests.
This class defines the interface required by an eigensolver and status test class to compute solution...
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.
ReturnType solve()
This method performs possibly repeated calls to the underlying eigensolver's iterate() routine until ...
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...
void setDebugStatusTest(const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &debug)
Set the status test for debugging.
Basic implementation of the Anasazi::SortManager class.
An implementation of the Anasazi::MatOrthoManager that performs orthogonalization using the SVQB iter...
Structure to contain pointers to BlockKrylovSchur state variables.
virtual ~BlockKrylovSchurSolMgr()
Destructor.
An exception class parent to all Anasazi exceptions.
const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > & getDebugStatusTest() const
Get the status test for debugging.
The Anasazi::BlockKrylovSchurSolMgr provides a flexible solver manager over the BlockKrylovSchur eige...
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...
Anasazi's templated, static class providing utilities for the solvers.
int numVecs
The number of computed eigenpairs.
void setGlobalStatusTest(const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &global)
Set the status test defining global convergence.
BlockKrylovSchurSolMgr(const Teuchos::RCP< Eigenproblem< ScalarType, MV, OP > > &problem, Teuchos::ParameterList &pl)
Basic constructor for BlockKrylovSchurSolMgr.
Basic output manager for sending information of select verbosity levels to the appropriate output str...
Teuchos::RCP< MV > Espace
An orthonormal basis for the computed eigenspace.
Teuchos::Array< Teuchos::RCP< Teuchos::Time > > getTimers() const
Return the timers for this object.
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...
static void MvScale(MV &mv, const ScalarType alpha)
Scale each element of the vectors in mv with alpha.
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
Orthogonalization manager based on the SVQB technique described in "A Block Orthogonalization Procedu...
static Teuchos::RCP< MV > CloneViewNonConst(MV &mv, const std::vector< int > &index)
Creates a new MV that shares the selected contents of mv (shallow copy).
Struct for storing an eigenproblem solution.
static Teuchos::RCP< const MV > CloneView(const MV &mv, const std::vector< int > &index)
Creates a new const MV that shares the selected contents of mv (shallow copy).
static void SetBlock(const MV &A, const std::vector< int > &index, MV &mv)
Copy the vectors in A to a set of vectors in mv indicated by the indices given in index...
const Eigenproblem< ScalarType, MV, OP > & getProblem() const
Return the eigenvalue problem.
std::vector< Value< ScalarType > > getRitzValues() const
Return the Ritz values from the most recent solve.
Teuchos::RCP< const MulVec > V
The current Krylov basis.
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.
An implementation of the Anasazi::MatOrthoManager that performs orthogonalization using (potentially)...
Types and exceptions used within Anasazi solvers and interfaces.
int getNumIters() const
Get the iteration count for the most recent call to solve().
Teuchos::RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > Q
The current Schur vectors of the valid part of H.
Implementation of a block Krylov-Schur eigensolver.
This class implements the block Krylov-Schur iteration, for solving linear eigenvalue problems...
int curDim
The current dimension of the reduction.
Common interface of stopping criteria for Anasazi's solvers.
A status test for testing the norm of the eigenvectors residuals.
Basic implementation of the Anasazi::OrthoManager class.
Teuchos::RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > S
The current Schur form reduction of the valid part of H.
const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > & getGlobalStatusTest() const
Get the status test defining global convergence.
static Teuchos::RCP< MV > Clone(const MV &mv, const int numvecs)
Creates a new empty MV containing numvecs columns.
Class which provides internal utilities for the Anasazi solvers.