10#ifndef ANASAZI_GENERALIZED_DAVIDSON_HPP
11#define ANASAZI_GENERALIZED_DAVIDSON_HPP
19#include "Teuchos_RCPDecl.hpp"
20#include "Teuchos_ParameterList.hpp"
21#include "Teuchos_SerialDenseMatrix.hpp"
22#include "Teuchos_SerialDenseVector.hpp"
23#include "Teuchos_Array.hpp"
24#include "Teuchos_BLAS.hpp"
25#include "Teuchos_LAPACK.hpp"
26#include "Teuchos_FancyOStream.hpp"
44template <
class ScalarType,
class MV>
59 RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >
VAV;
62 RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >
VBV;
65 RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >
S;
68 RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >
T;
71 RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >
Q;
74 RCP< Teuchos::SerialDenseMatrix<int,ScalarType> >
Z;
77 std::vector< Value<ScalarType> >
eVals;
80 BV(Teuchos::null),
VAV(Teuchos::null),
81 VBV(Teuchos::null),
S(Teuchos::null),
82 T(Teuchos::null),
Q(Teuchos::null),
83 Z(Teuchos::null),
eVals(0) {}
108template <
class ScalarType,
class MV,
class OP>
115 typedef Teuchos::ScalarTraits<ScalarType> ST;
116 typedef typename ST::magnitudeType MagnitudeType;
117 typedef Teuchos::ScalarTraits<MagnitudeType> MT;
146 Teuchos::ParameterList &pl);
184 if( !d_ritzVectorsValid )
185 computeRitzVectors();
199 if( !d_ritzIndexValid )
211 return d_expansionIndices;
222 std::vector<MagnitudeType>
getResNorms(
int numWanted);
255 RCP<StatusTest<ScalarType,MV,OP> >
getStatusTest()
const {
return d_tester; }
275 void setSize(
int blockSize,
int maxSubDim);
280 Teuchos::Array< RCP<const MV> >
getAuxVecs()
const {
return d_auxVecs; }
289 void setAuxVecs(
const Teuchos::Array< RCP<const MV> > &auxVecs );
314 void expandSearchSpace();
317 void applyOperators();
320 void updateProjections();
323 void solveProjectedEigenproblem();
326 void computeProjectedEigenvectors( Teuchos::SerialDenseMatrix<int,ScalarType> &X );
329 void scaleEigenvectors(
const Teuchos::SerialDenseMatrix<int,ScalarType> &X,
330 Teuchos::SerialDenseMatrix<int,ScalarType> &X_alpha,
331 Teuchos::SerialDenseMatrix<int,ScalarType> &X_beta );
334 void sortValues( std::vector<MagnitudeType> &realParts,
335 std::vector<MagnitudeType> &imagParts,
336 std::vector<int> &permVec,
340 void computeResidual();
343 void computeRitzIndex();
346 void computeRitzVectors();
349 RCP<Eigenproblem<ScalarType,MV,OP> > d_problem;
350 Teuchos::ParameterList d_pl;
359 int d_maxSubspaceDim;
362 std::string d_initType;
364 bool d_relativeConvergence;
367 RCP<OutputManager<ScalarType> > d_outputMan;
368 RCP<OrthoManager<ScalarType,MV> > d_orthoMan;
369 RCP<SortManager<MagnitudeType> > d_sortMan;
370 RCP<StatusTest<ScalarType,MV,OP> > d_tester;
373 std::vector< Value<ScalarType> > d_eigenvalues;
377 std::vector<MagnitudeType> d_resNorms;
383 RCP<MV> d_ritzVecSpace;
385 Teuchos::Array< RCP<const MV> > d_auxVecs;
388 RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > d_VAV;
389 RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > d_VBV;
390 RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > d_S;
391 RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > d_T;
392 RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > d_Q;
393 RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > d_Z;
396 std::vector<MagnitudeType> d_alphar;
397 std::vector<MagnitudeType> d_alphai;
398 std::vector<MagnitudeType> d_betar;
399 std::vector<int> d_ritzIndex;
400 std::vector<int> d_convergedIndices;
401 std::vector<int> d_expansionIndices;
414 std::string d_testSpace;
422 bool d_ritzIndexValid;
423 bool d_ritzVectorsValid;
430template <
class MagnitudeType,
class MV,
class OP>
431class GeneralizedDavidson<std::complex<MagnitudeType>,MV,OP>
435 typedef std::complex<MagnitudeType> ScalarType;
437 const RCP<Eigenproblem<ScalarType,MV,OP> > &problem,
438 const RCP<SortManager<MagnitudeType> > &sortman,
439 const RCP<OutputManager<ScalarType> > &outputman,
440 const RCP<StatusTest<ScalarType,MV,OP> > &tester,
441 const RCP<OrthoManager<ScalarType,MV> > &orthoman,
442 Teuchos::ParameterList &pl)
445 MagnitudeType::this_class_is_missing_a_specialization();
456template <
class ScalarType,
class MV,
class OP>
463 Teuchos::ParameterList &pl )
465 TEUCHOS_TEST_FOR_EXCEPTION( problem == Teuchos::null, std::invalid_argument,
"No Eigenproblem given to solver." );
466 TEUCHOS_TEST_FOR_EXCEPTION( outputman == Teuchos::null, std::invalid_argument,
"No OutputManager given to solver." );
467 TEUCHOS_TEST_FOR_EXCEPTION( orthoman == Teuchos::null, std::invalid_argument,
"No OrthoManager given to solver." );
468 TEUCHOS_TEST_FOR_EXCEPTION( sortman == Teuchos::null, std::invalid_argument,
"No SortManager given to solver." );
469 TEUCHOS_TEST_FOR_EXCEPTION( tester == Teuchos::null, std::invalid_argument,
"No StatusTest given to solver." );
470 TEUCHOS_TEST_FOR_EXCEPTION( !problem->isProblemSet(), std::invalid_argument,
"Problem has not been set." );
474 TEUCHOS_TEST_FOR_EXCEPTION( problem->getA()==Teuchos::null && problem->getOperator()==Teuchos::null,
475 std::invalid_argument,
"Either A or Operator must be non-null on Eigenproblem");
476 d_A = problem->getA()!=Teuchos::null ? problem->getA() : problem->getOperator();
477 d_B = problem->getM();
478 d_P = problem->getPrec();
480 d_outputMan = outputman;
482 d_orthoMan = orthoman;
485 d_NEV = d_problem->getNEV();
486 d_initType = d_pl.get<std::string>(
"Initial Guess",
"Random");
487 d_numToPrint = d_pl.get<
int>(
"Print Number of Ritz Values",-1);
488 d_useLeading = d_pl.get<
bool>(
"Use Leading Vectors",
false);
490 if( d_B != Teuchos::null )
495 if( d_P != Teuchos::null )
500 d_testSpace = d_pl.get<std::string>(
"Test Space",
"V");
501 TEUCHOS_TEST_FOR_EXCEPTION( d_testSpace!=
"V" && d_testSpace!=
"AV" && d_testSpace!=
"BV", std::invalid_argument,
502 "Anasazi::GeneralizedDavidson: Test Space must be V, AV, or BV" );
503 TEUCHOS_TEST_FOR_EXCEPTION( d_testSpace==
"V" ?
false : !d_haveB, std::invalid_argument,
504 "Anasazi::GeneralizedDavidson: Test Space must be V for standard eigenvalue problem" );
507 int blockSize = d_pl.get<
int>(
"Block Size",1);
508 int maxSubDim = d_pl.get<
int>(
"Maximum Subspace Dimension",3*d_NEV*blockSize);
510 d_maxSubspaceDim = -1;
511 setSize( blockSize, maxSubDim );
512 d_relativeConvergence = d_pl.get<
bool>(
"Relative Convergence Tolerance",
false);
515 TEUCHOS_TEST_FOR_EXCEPTION( d_blockSize <= 0, std::invalid_argument,
"Block size must be positive");
516 TEUCHOS_TEST_FOR_EXCEPTION( d_maxSubspaceDim <= 0, std::invalid_argument,
"Maximum Subspace Dimension must be positive" );
517 TEUCHOS_TEST_FOR_EXCEPTION( d_problem->getNEV()+2 > pl.get<
int>(
"Maximum Subspace Dimension"),
518 std::invalid_argument,
"Maximum Subspace Dimension must be strictly greater than NEV");
519 TEUCHOS_TEST_FOR_EXCEPTION( d_maxSubspaceDim > MVT::GetGlobalLength(*problem->getInitVec()),
520 std::invalid_argument,
"Maximum Subspace Dimension cannot exceed problem size");
526 d_ritzIndexValid =
false;
527 d_ritzVectorsValid =
false;
534template <
class ScalarType,
class MV,
class OP>
540 d_outputMan->stream(
Warnings) <<
"WARNING: GeneralizedDavidson::iterate called without first calling initialize" << std::endl;
541 d_outputMan->stream(
Warnings) <<
" Default initialization will be performed" << std::endl;
546 if( d_outputMan->isVerbosity(
Debug) )
548 currentStatus( d_outputMan->stream(
Debug) );
555 while( d_tester->getStatus() !=
Passed && d_curDim+d_expansionSize <= d_maxSubspaceDim )
565 solveProjectedEigenproblem();
570 int numToSort = std::max(d_blockSize,d_NEV);
571 numToSort = std::min(numToSort,d_curDim);
572 sortProblem( numToSort );
577 if( d_outputMan->isVerbosity(
Debug) )
579 currentStatus( d_outputMan->stream(
Debug) );
591template <
class ScalarType,
class MV,
class OP>
605 state.
eVals = getRitzValues();
612template <
class ScalarType,
class MV,
class OP>
615 setSize(blockSize,d_maxSubspaceDim);
621template <
class ScalarType,
class MV,
class OP>
624 if( blockSize != d_blockSize || maxSubDim != d_maxSubspaceDim )
626 d_blockSize = blockSize;
627 d_maxSubspaceDim = maxSubDim;
628 d_initialized =
false;
630 d_outputMan->stream(
Debug) <<
" >> Anasazi::GeneralizedDavidson: Allocating eigenproblem"
631 <<
" state with block size of " << d_blockSize
632 <<
" and maximum subspace dimension of " << d_maxSubspaceDim << std::endl;
635 d_alphar.resize(d_maxSubspaceDim);
636 d_alphai.resize(d_maxSubspaceDim);
637 d_betar.resize(d_maxSubspaceDim);
640 int msd = d_maxSubspaceDim;
643 RCP<const MV> initVec = d_problem->getInitVec();
646 d_V = MVT::Clone(*initVec, msd);
647 d_AV = MVT::Clone(*initVec, msd);
650 d_VAV = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(msd,msd) );
651 d_S = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(msd,msd) );
652 d_Q = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(msd,msd) );
653 d_Z = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(msd,msd) );
658 d_BV = MVT::Clone(*initVec, msd);
659 d_VBV = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(msd,msd) );
660 d_T = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(msd,msd) );
671 d_R = MVT::Clone(*initVec,std::max(d_blockSize,d_NEV)+1);
672 d_ritzVecSpace = MVT::Clone(*initVec,std::max(d_blockSize,d_NEV)+1);
687template <
class ScalarType,
class MV,
class OP>
692 d_curDim = (state.
curDim > 0 ? state.
curDim : d_blockSize );
694 d_outputMan->stream(
Debug) <<
" >> Anasazi::GeneralizedDavidson: Initializing state"
695 <<
" with subspace dimension " << d_curDim << std::endl;
698 std::vector<int> initInds(d_curDim);
699 for(
int i=0; i<d_curDim; ++i )
703 RCP<MV> V1 = MVT::CloneViewNonConst(*d_V,initInds);
706 bool reset_V =
false;;
707 if( state.
curDim > 0 && state.
V != Teuchos::null && MVT::GetNumberVecs(*state.
V) >= d_curDim )
710 MVT::SetBlock(*state.
V,initInds,*V1);
714 else if( MVT::GetNumberVecs(*d_problem->getInitVec()) < d_blockSize || d_initType ==
"Random" )
722 RCP<const MV> initVec = MVT::CloneView(*d_problem->getInitVec(),initInds);
723 MVT::SetBlock(*initVec,initInds,*V1);
730 int rank = d_orthoMan->projectAndNormalize( *V1, d_auxVecs );
731 TEUCHOS_TEST_FOR_EXCEPTION( rank < d_blockSize, std::logic_error,
732 "Anasazi::GeneralizedDavidson::initialize(): Error generating initial orthonormal basis" );
735 if( d_outputMan->isVerbosity(
Debug) )
737 d_outputMan->stream(
Debug) <<
" >> Anasazi::GeneralizedDavidson: Error in V^T V == I: "
738 << d_orthoMan->orthonormError( *V1 ) << std::endl;
742 RCP<MV> AV1 = MVT::CloneViewNonConst(*d_AV,initInds);
746 if( !reset_V && state.
AV != Teuchos::null && MVT::GetNumberVecs(*state.
AV) >= d_curDim )
748 if( state.
AV != d_AV )
749 MVT::SetBlock(*state.
AV,initInds,*AV1);
754 OPT::Apply( *d_A, *V1, *AV1 );
755 d_opApplies += MVT::GetNumberVecs( *V1 );
759 Teuchos::SerialDenseMatrix<int,ScalarType> VAV1( Teuchos::View, *d_VAV, d_curDim, d_curDim );
762 if( !reset_V && state.
VAV != Teuchos::null && state.
VAV->numRows() >= d_curDim && state.
VAV->numCols() >= d_curDim )
764 if( state.
VAV != d_VAV )
766 Teuchos::SerialDenseMatrix<int,ScalarType> state_VAV( Teuchos::View, *state.
VAV, d_curDim, d_curDim );
767 VAV1.assign( state_VAV );
773 if( d_testSpace ==
"V" )
775 MVT::MvTransMv( ST::one(), *V1, *AV1, VAV1 );
777 else if( d_testSpace ==
"AV" )
779 MVT::MvTransMv( ST::one(), *AV1, *AV1, VAV1 );
781 else if( d_testSpace ==
"BV" )
783 RCP<MV> BV1 = MVT::CloneViewNonConst(*d_BV,initInds);
784 MVT::MvTransMv( ST::one(), *BV1, *AV1, VAV1 );
791 RCP<MV> BV1 = MVT::CloneViewNonConst(*d_BV,initInds);
795 if( !reset_V && state.
BV != Teuchos::null && MVT::GetNumberVecs(*state.
BV) >= d_curDim )
797 if( state.
BV != d_BV )
798 MVT::SetBlock(*state.
BV,initInds,*BV1);
803 OPT::Apply( *d_B, *V1, *BV1 );
807 Teuchos::SerialDenseMatrix<int,ScalarType> VBV1( Teuchos::View, *d_VBV, d_curDim, d_curDim );
810 if( !reset_V && state.
VBV != Teuchos::null && state.
VBV->numRows() >= d_curDim && state.
VBV->numCols() >= d_curDim )
812 if( state.
VBV != d_VBV )
814 Teuchos::SerialDenseMatrix<int,ScalarType> state_VBV( Teuchos::View, *state.
VBV, d_curDim, d_curDim );
815 VBV1.assign( state_VBV );
821 if( d_testSpace ==
"V" )
823 MVT::MvTransMv( ST::one(), *V1, *BV1, VBV1 );
825 else if( d_testSpace ==
"AV" )
827 MVT::MvTransMv( ST::one(), *AV1, *BV1, VBV1 );
829 else if( d_testSpace ==
"BV" )
831 MVT::MvTransMv( ST::one(), *BV1, *BV1, VBV1 );
837 solveProjectedEigenproblem();
840 int numToSort = std::max(d_blockSize,d_NEV);
841 numToSort = std::min(numToSort,d_curDim);
842 sortProblem( numToSort );
848 d_initialized =
true;
854template <
class ScalarType,
class MV,
class OP>
864template <
class ScalarType,
class MV,
class OP>
865std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
868 return getResNorms(d_residualSize);
874template <
class ScalarType,
class MV,
class OP>
875std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
878 std::vector<int> resIndices(numWanted);
879 for(
int i=0; i<numWanted; ++i )
882 RCP<const MV> R_checked = MVT::CloneView( *d_R, resIndices );
884 std::vector<MagnitudeType> resNorms;
885 d_orthoMan->norm( *R_checked, resNorms );
893template <
class ScalarType,
class MV,
class OP>
896 std::vector< Value<ScalarType> > ritzValues;
897 for(
int ival=0; ival<d_curDim; ++ival )
900 thisVal.
realpart = d_alphar[ival] / d_betar[ival];
901 if( d_betar[ival] != MT::zero() )
902 thisVal.
imagpart = d_alphai[ival] / d_betar[ival];
906 ritzValues.push_back( thisVal );
921template <
class ScalarType,
class MV,
class OP>
923 const Teuchos::Array< RCP<const MV> > &auxVecs )
928 typename Teuchos::Array< RCP<const MV> >::const_iterator arrItr;
930 for( arrItr=auxVecs.begin(); arrItr!=auxVecs.end(); ++arrItr )
932 numAuxVecs += MVT::GetNumberVecs( *(*arrItr) );
935 d_initialized =
false;
941template <
class ScalarType,
class MV,
class OP>
945 std::vector<MagnitudeType> realRitz(d_curDim), imagRitz(d_curDim);
946 std::vector< Value<ScalarType> > ritzVals = getRitzValues();
947 for(
int i=0; i<d_curDim; ++i )
949 realRitz[i] = ritzVals[i].realpart;
950 imagRitz[i] = ritzVals[i].imagpart;
953 std::vector<int> permVec;
954 sortValues( realRitz, imagRitz, permVec, d_curDim );
956 std::vector<int> sel(d_curDim,0);
957 for(
int ii=0; ii<numWanted; ++ii )
958 sel[ permVec[ii] ]=1;
965 int work_size=10*d_maxSubspaceDim+16;
966 std::vector<ScalarType> work(work_size);
972 Teuchos::LAPACK<int,ScalarType> lapack;
973 lapack.TGSEN( ijob, wantq, wantz, &sel[0], d_curDim, d_S->values(), d_S->stride(), d_T->values(), d_T->stride(),
974 &d_alphar[0], &d_alphai[0], &d_betar[0], d_Q->values(), d_Q->stride(), d_Z->values(), d_Z->stride(),
975 &sdim, 0, 0, 0, &work[0], work_size, &iwork, iwork_size, &info );
977 d_ritzIndexValid =
false;
978 d_ritzVectorsValid =
false;
980 std::stringstream ss;
981 ss <<
"Anasazi::GeneralizedDavidson: TGSEN returned error code " << info << std::endl;
982 TEUCHOS_TEST_FOR_EXCEPTION( info<0, std::runtime_error, ss.str() );
988 d_outputMan->stream(
Warnings) <<
"WARNING: " << ss.str() << std::endl;
989 d_outputMan->stream(
Warnings) <<
" Problem may not be correctly sorted" << std::endl;
993 char getCondNum =
'N';
996 int work_size = d_curDim;
997 std::vector<ScalarType> work(work_size);
1002 Teuchos::LAPACK<int,ScalarType> lapack;
1003 lapack.TRSEN (getCondNum, getQ, &sel[0], d_curDim, d_S->values (),
1004 d_S->stride (), d_Z->values (), d_Z->stride (),
1005 &d_alphar[0], &d_alphai[0], &subDim, 0, 0, &work[0],
1006 work_size, &iwork, iwork_size, &info );
1008 std::fill( d_betar.begin(), d_betar.end(), ST::one() );
1010 d_ritzIndexValid =
false;
1011 d_ritzVectorsValid =
false;
1013 TEUCHOS_TEST_FOR_EXCEPTION(
1014 info < 0, std::runtime_error,
"Anasazi::GeneralizedDavidson::"
1015 "sortProblem: LAPACK routine TRSEN returned error code INFO = "
1016 << info <<
" < 0. This indicates that argument " << -info
1017 <<
" (counting starts with one) of TRSEN had an illegal value.");
1023 TEUCHOS_TEST_FOR_EXCEPTION(
1024 info == 1, std::runtime_error,
"Anasazi::GeneralizedDavidson::"
1025 "sortProblem: LAPACK routine TRSEN returned error code INFO = 1. "
1026 "This indicates that the reordering failed because some eigenvalues "
1027 "are too close to separate (the problem is very ill-conditioned).");
1029 TEUCHOS_TEST_FOR_EXCEPTION(
1030 info > 1, std::logic_error,
"Anasazi::GeneralizedDavidson::"
1031 "sortProblem: LAPACK routine TRSEN returned error code INFO = "
1032 << info <<
" > 1. This should not be possible. It may indicate an "
1033 "error either in LAPACK itself, or in Teuchos' LAPACK wrapper.");
1045template <
class ScalarType,
class MV,
class OP>
1050 std::vector<int> newIndices(d_expansionSize);
1051 for(
int i=0; i<d_expansionSize; ++i )
1053 newIndices[i] = d_curDim+i;
1057 std::vector<int> curIndices(d_curDim);
1058 for(
int i=0; i<d_curDim; ++i )
1062 RCP<MV> V_new = MVT::CloneViewNonConst( *d_V, newIndices);
1063 RCP<const MV> V_cur = MVT::CloneView( *d_V, curIndices);
1064 RCP<const MV> R_active = MVT::CloneView( *d_R, d_expansionIndices);
1069 OPT::Apply( *d_P, *R_active, *V_new );
1074 MVT::SetBlock( *R_active, newIndices, *d_V );
1078 Teuchos::Array< RCP<const MV> > against = d_auxVecs;
1079 against.push_back( V_cur );
1080 int rank = d_orthoMan->projectAndNormalize(*V_new,against);
1082 if( d_outputMan->isVerbosity(
Debug) )
1084 std::vector<int> allIndices(d_curDim+d_expansionSize);
1085 for(
int i=0; i<d_curDim+d_expansionSize; ++i )
1088 RCP<const MV> V_all = MVT::CloneView( *d_V, allIndices );
1090 d_outputMan->stream(
Debug) <<
" >> Anasazi::GeneralizedDavidson: Error in V^T V == I: "
1091 << d_orthoMan->orthonormError( *V_all ) << std::endl;
1094 TEUCHOS_TEST_FOR_EXCEPTION( rank != d_expansionSize, std::runtime_error,
1095 "Anasazi::GeneralizedDavidson::ExpandSearchSpace(): Orthonormalization of new vectors failed" );
1102template <
class ScalarType,
class MV,
class OP>
1103void GeneralizedDavidson<ScalarType,MV,OP>::applyOperators()
1106 std::vector<int> newIndices(d_expansionSize);
1107 for(
int i=0; i<d_expansionSize; ++i )
1108 newIndices[i] = d_curDim+i;
1111 RCP<const MV> V_new = MVT::CloneView( *d_V, newIndices );
1112 RCP<MV> AV_new = MVT::CloneViewNonConst( *d_AV, newIndices );
1115 OPT::Apply( *d_A, *V_new, *AV_new );
1116 d_opApplies += MVT::GetNumberVecs( *V_new );
1121 RCP<MV> BV_new = MVT::CloneViewNonConst( *d_BV, newIndices );
1122 OPT::Apply( *d_B, *V_new, *BV_new );
1129template <
class ScalarType,
class MV,
class OP>
1130void GeneralizedDavidson<ScalarType,MV,OP>::updateProjections()
1133 std::vector<int> newIndices(d_expansionSize);
1134 for(
int i=0; i<d_expansionSize; ++i )
1135 newIndices[i] = d_curDim+i;
1137 std::vector<int> curIndices(d_curDim);
1138 for(
int i=0; i<d_curDim; ++i )
1141 std::vector<int> allIndices(d_curDim+d_expansionSize);
1142 for(
int i=0; i<d_curDim+d_expansionSize; ++i )
1146 RCP<const MV> W_new, W_all;
1147 if( d_testSpace ==
"V" )
1149 W_new = MVT::CloneView(*d_V, newIndices );
1150 W_all = MVT::CloneView(*d_V, allIndices );
1152 else if( d_testSpace ==
"AV" )
1154 W_new = MVT::CloneView(*d_AV, newIndices );
1155 W_all = MVT::CloneView(*d_AV, allIndices );
1157 else if( d_testSpace ==
"BV" )
1159 W_new = MVT::CloneView(*d_BV, newIndices );
1160 W_all = MVT::CloneView(*d_BV, allIndices );
1164 RCP<const MV> AV_new = MVT::CloneView(*d_AV, newIndices);
1165 RCP<const MV> AV_current = MVT::CloneView(*d_AV, curIndices);
1168 Teuchos::SerialDenseMatrix<int,ScalarType> VAV_lastrow( Teuchos::View, *d_VAV, d_expansionSize, d_curDim, d_curDim, 0 );
1169 MVT::MvTransMv( ST::one(), *W_new, *AV_current, VAV_lastrow );
1172 Teuchos::SerialDenseMatrix<int,ScalarType> VAV_lastcol( Teuchos::View, *d_VAV, d_curDim+d_expansionSize, d_expansionSize, 0, d_curDim );
1173 MVT::MvTransMv( ST::one(), *W_all, *AV_new, VAV_lastcol );
1178 RCP<const MV> BV_new = MVT::CloneView(*d_BV, newIndices);
1179 RCP<const MV> BV_current = MVT::CloneView(*d_BV, curIndices);
1182 Teuchos::SerialDenseMatrix<int,ScalarType> VBV_lastrow( Teuchos::View, *d_VBV, d_expansionSize, d_curDim, d_curDim, 0 );
1183 MVT::MvTransMv( ST::one(), *W_new, *BV_current, VBV_lastrow );
1186 Teuchos::SerialDenseMatrix<int,ScalarType> VBV_lastcol( Teuchos::View, *d_VBV, d_curDim+d_expansionSize, d_expansionSize, 0, d_curDim );
1187 MVT::MvTransMv( ST::one(), *W_all, *BV_new, VBV_lastcol );
1191 d_curDim += d_expansionSize;
1193 d_ritzIndexValid =
false;
1194 d_ritzVectorsValid =
false;
1200template <
class ScalarType,
class MV,
class OP>
1201void GeneralizedDavidson<ScalarType,MV,OP>::solveProjectedEigenproblem()
1208 d_S->assign(*d_VAV);
1209 d_T->assign(*d_VBV);
1212 char leftVecs =
'V';
1213 char rightVecs =
'V';
1214 char sortVals =
'N';
1217 Teuchos::LAPACK<int,ScalarType> lapack;
1221 std::vector<ScalarType> work(1);
1222 lapack.GGES( leftVecs, rightVecs, sortVals, NULL, d_curDim, d_S->values(), d_S->stride(),
1223 d_T->values(), d_T->stride(), &sdim, &d_alphar[0], &d_alphai[0], &d_betar[0],
1224 d_Q->values(), d_Q->stride(), d_Z->values(), d_Z->stride(), &work[0], work_size, 0, &info );
1226 work_size = work[0];
1227 work.resize(work_size);
1228 lapack.GGES( leftVecs, rightVecs, sortVals, NULL, d_curDim, d_S->values(), d_S->stride(),
1229 d_T->values(), d_T->stride(), &sdim, &d_alphar[0], &d_alphai[0], &d_betar[0],
1230 d_Q->values(), d_Q->stride(), d_Z->values(), d_Z->stride(), &work[0], work_size, 0, &info );
1232 d_ritzIndexValid =
false;
1233 d_ritzVectorsValid =
false;
1235 std::stringstream ss;
1236 ss <<
"Anasazi::GeneralizedDavidson: GGES returned error code " << info << std::endl;
1237 TEUCHOS_TEST_FOR_EXCEPTION( info!=0, std::runtime_error, ss.str() );
1243 d_S->assign(*d_VAV);
1248 int work_size = 3*d_curDim;
1249 std::vector<ScalarType> work(work_size);
1252 Teuchos::LAPACK<int,ScalarType> lapack;
1253 lapack.GEES( vecs, d_curDim, d_S->values(), d_S->stride(), &sdim, &d_alphar[0], &d_alphai[0],
1254 d_Z->values(), d_Z->stride(), &work[0], work_size, 0, 0, &info);
1256 std::fill( d_betar.begin(), d_betar.end(), ST::one() );
1258 d_ritzIndexValid =
false;
1259 d_ritzVectorsValid =
false;
1261 std::stringstream ss;
1262 ss <<
"Anasazi::GeneralizedDavidson: GEES returned error code " << info << std::endl;
1263 TEUCHOS_TEST_FOR_EXCEPTION( info!=0, std::runtime_error, ss.str() );
1275template <
class ScalarType,
class MV,
class OP>
1276void GeneralizedDavidson<ScalarType,MV,OP>::computeRitzIndex()
1278 if( d_ritzIndexValid )
1281 d_ritzIndex.resize( d_curDim );
1283 while( i < d_curDim )
1285 if( d_alphai[i] == ST::zero() )
1293 d_ritzIndex[i+1] = -1;
1297 d_ritzIndexValid =
true;
1308template <
class ScalarType,
class MV,
class OP>
1309void GeneralizedDavidson<ScalarType,MV,OP>::computeRitzVectors()
1311 if( d_ritzVectorsValid )
1318 std::vector<int> checkedIndices(d_residualSize);
1319 for(
int ii=0; ii<d_residualSize; ++ii )
1320 checkedIndices[ii] = ii;
1323 Teuchos::SerialDenseMatrix<int,ScalarType> X(Teuchos::Copy,*d_Z,d_curDim,d_curDim);
1324 computeProjectedEigenvectors( X );
1327 Teuchos::SerialDenseMatrix<int,ScalarType> X_wanted(Teuchos::View,X,d_curDim,d_residualSize);
1330 d_ritzVecs = MVT::CloneViewNonConst( *d_ritzVecSpace, checkedIndices );
1332 std::vector<int> curIndices(d_curDim);
1333 for(
int i=0; i<d_curDim; ++i )
1336 RCP<const MV> V_current = MVT::CloneView( *d_V, curIndices );
1339 MVT::MvTimesMatAddMv(ST::one(),*V_current,X_wanted,ST::zero(),*d_ritzVecs);
1342 std::vector<MagnitudeType> scale(d_residualSize);
1343 MVT::MvNorm( *d_ritzVecs, scale );
1344 Teuchos::LAPACK<int,ScalarType> lapack;
1345 for(
int i=0; i<d_residualSize; ++i )
1347 if( d_ritzIndex[i] == 0 )
1349 scale[i] = 1.0/scale[i];
1351 else if( d_ritzIndex[i] == 1 )
1353 MagnitudeType nrm = lapack.LAPY2(scale[i],scale[i+1]);
1355 scale[i+1] = 1.0/nrm;
1358 MVT::MvScale( *d_ritzVecs, scale );
1360 d_ritzVectorsValid =
true;
1367template <
class ScalarType,
class MV,
class OP>
1368void GeneralizedDavidson<ScalarType,MV,OP>::sortValues( std::vector<MagnitudeType> &realParts,
1369 std::vector<MagnitudeType> &imagParts,
1370 std::vector<int> &permVec,
1375 TEUCHOS_TEST_FOR_EXCEPTION( (
int) realParts.size()<N, std::runtime_error,
1376 "Anasazi::GeneralizedDavidson::SortValues: Number of requested sorted values greater than vector length." );
1377 TEUCHOS_TEST_FOR_EXCEPTION( (
int) imagParts.size()<N, std::runtime_error,
1378 "Anasazi::GeneralizedDavidson::SortValues: Number of requested sorted values greater than vector length." );
1380 RCP< std::vector<int> > rcpPermVec = Teuchos::rcpFromRef(permVec);
1382 d_sortMan->sort( realParts, imagParts, rcpPermVec, N );
1384 d_ritzIndexValid =
false;
1385 d_ritzVectorsValid =
false;
1399template <
class ScalarType,
class MV,
class OP>
1400void GeneralizedDavidson<ScalarType,MV,OP>::computeProjectedEigenvectors(
1401 Teuchos::SerialDenseMatrix<int,ScalarType> &X )
1403 int N = X.numRows();
1406 Teuchos::SerialDenseMatrix<int,ScalarType> S(Teuchos::Copy, *d_S, N, N);
1407 Teuchos::SerialDenseMatrix<int,ScalarType> T(Teuchos::Copy, *d_T, N, N);
1408 Teuchos::SerialDenseMatrix<int,ScalarType> VL(Teuchos::Copy, *d_Q, N, N);
1410 char whichVecs =
'R';
1412 int work_size = 6*d_maxSubspaceDim;
1413 std::vector<ScalarType> work(work_size,ST::zero());
1417 Teuchos::LAPACK<int,ScalarType> lapack;
1418 lapack.TGEVC( whichVecs, howMany, 0, N, S.values(), S.stride(), T.values(), T.stride(),
1419 VL.values(), VL.stride(), X.values(), X.stride(), N, &M, &work[0], &info );
1421 std::stringstream ss;
1422 ss <<
"Anasazi::GeneralizedDavidson: TGEVC returned error code " << info << std::endl;
1423 TEUCHOS_TEST_FOR_EXCEPTION( info!=0, std::runtime_error, ss.str() );
1427 Teuchos::SerialDenseMatrix<int,ScalarType> S(Teuchos::Copy, *d_S, N, N);
1428 Teuchos::SerialDenseMatrix<int,ScalarType> VL(Teuchos::Copy, *d_Z, N, N);
1430 char whichVecs =
'R';
1433 std::vector<ScalarType> work(3*N);
1437 Teuchos::LAPACK<int,ScalarType> lapack;
1439 lapack.TREVC( whichVecs, howMany, &sel, N, S.values(), S.stride(), VL.values(), VL.stride(),
1440 X.values(), X.stride(), N, &m, &work[0], &info );
1442 std::stringstream ss;
1443 ss <<
"Anasazi::GeneralizedDavidson: TREVC returned error code " << info << std::endl;
1444 TEUCHOS_TEST_FOR_EXCEPTION( info!=0, std::runtime_error, ss.str() );
1451template <
class ScalarType,
class MV,
class OP>
1452void GeneralizedDavidson<ScalarType,MV,OP>::scaleEigenvectors(
1453 const Teuchos::SerialDenseMatrix<int,ScalarType> &X,
1454 Teuchos::SerialDenseMatrix<int,ScalarType> &X_alpha,
1455 Teuchos::SerialDenseMatrix<int,ScalarType> &X_beta )
1457 int Nr = X.numRows();
1458 int Nc = X.numCols();
1460 TEUCHOS_TEST_FOR_EXCEPTION( Nr>d_curDim, std::logic_error,
1461 "Anasazi::GeneralizedDavidson::ScaleEigenvectors: Matrix size exceeds current dimension");
1462 TEUCHOS_TEST_FOR_EXCEPTION( Nc>d_curDim, std::logic_error,
1463 "Anasazi::GeneralizedDavidson::ScaleEigenvectors: Matrix size exceeds current dimension");
1464 TEUCHOS_TEST_FOR_EXCEPTION( X_alpha.numRows()!=Nr, std::logic_error,
1465 "Anasazi::GeneralizedDavidson::ScaleEigenvectors: number of rows in Xalpha does not match X");
1466 TEUCHOS_TEST_FOR_EXCEPTION( X_alpha.numCols()!=Nc, std::logic_error,
1467 "Anasazi::GeneralizedDavidson::ScaleEigenvectors: number of cols in Xalpha does not match X");
1468 TEUCHOS_TEST_FOR_EXCEPTION( X_beta.numRows()!=Nr, std::logic_error,
1469 "Anasazi::GeneralizedDavidson::ScaleEigenvectors: number of rows in Xbeta does not match X");
1470 TEUCHOS_TEST_FOR_EXCEPTION( X_beta.numCols()!=Nc, std::logic_error,
1471 "Anasazi::GeneralizedDavidson::ScaleEigenvectors: number of cols in Xbeta does not match X");
1475 Teuchos::SerialDenseMatrix<int,ScalarType> Alpha(Nc,Nc,
true);
1476 Teuchos::SerialDenseMatrix<int,ScalarType> Beta(Nc,Nc,
true);
1480 for(
int i=0; i<Nc; ++i )
1482 if( d_ritzIndex[i] == 0 )
1484 Alpha(i,i) = d_alphar[i];
1485 Beta(i,i) = d_betar[i];
1487 else if( d_ritzIndex[i] == 1 )
1489 Alpha(i,i) = d_alphar[i];
1490 Alpha(i,i+1) = d_alphai[i];
1491 Beta(i,i) = d_betar[i];
1495 Alpha(i,i-1) = d_alphai[i];
1496 Alpha(i,i) = d_alphar[i];
1497 Beta(i,i) = d_betar[i];
1504 err = X_alpha.multiply( Teuchos::NO_TRANS, Teuchos::NO_TRANS, ST::one(), X, Alpha, ST::zero() );
1505 std::stringstream astream;
1506 astream <<
"GeneralizedDavidson::ScaleEigenvectors: multiply returned error code " << err;
1507 TEUCHOS_TEST_FOR_EXCEPTION( err!=0, std::runtime_error, astream.str() );
1510 err = X_beta.multiply( Teuchos::NO_TRANS, Teuchos::NO_TRANS, ST::one(), X, Beta, ST::zero() );
1511 std::stringstream bstream;
1512 bstream <<
"GeneralizedDavidson::ScaleEigenvectors: multiply returned error code " << err;
1513 TEUCHOS_TEST_FOR_EXCEPTION( err!=0, std::runtime_error, bstream.str() );
1519template <
class ScalarType,
class MV,
class OP>
1520void GeneralizedDavidson<ScalarType,MV,OP>::computeResidual()
1525 d_residualSize = std::max( d_blockSize, d_NEV );
1526 if( d_curDim < d_residualSize )
1528 d_residualSize = d_curDim;
1530 else if( d_ritzIndex[d_residualSize-1] == 1 )
1536 std::vector<int> residualIndices(d_residualSize);
1537 for(
int i=0; i<d_residualSize; ++i )
1538 residualIndices[i] = i;
1541 Teuchos::SerialDenseMatrix<int,ScalarType> X(Teuchos::Copy,*d_Z,d_curDim,d_curDim);
1544 computeProjectedEigenvectors( X );
1547 Teuchos::SerialDenseMatrix<int,ScalarType> X_alpha(d_curDim,d_residualSize);
1548 Teuchos::SerialDenseMatrix<int,ScalarType> X_beta(d_curDim,d_residualSize);
1551 Teuchos::SerialDenseMatrix<int,ScalarType> X_wanted(Teuchos::View, X, d_curDim, d_residualSize);
1554 scaleEigenvectors( X_wanted, X_alpha, X_beta );
1557 RCP<MV> R_active = MVT::CloneViewNonConst( *d_R, residualIndices );
1560 std::vector<int> activeIndices(d_curDim);
1561 for(
int i=0; i<d_curDim; ++i )
1565 RCP<const MV> AV_active = MVT::CloneView( *d_AV, activeIndices );
1566 MVT::MvTimesMatAddMv(ST::one(),*AV_active, X_beta, ST::zero(),*R_active);
1570 RCP<const MV> BV_active = MVT::CloneView( *d_BV, activeIndices );
1571 MVT::MvTimesMatAddMv(ST::one(),*BV_active, X_alpha,-ST::one(), *R_active);
1575 RCP<const MV> V_active = MVT::CloneView( *d_V, activeIndices );
1576 MVT::MvTimesMatAddMv(ST::one(),*V_active, X_alpha,-ST::one(), *R_active);
1591 Teuchos::LAPACK<int,ScalarType> lapack;
1592 Teuchos::BLAS<int,ScalarType> blas;
1593 std::vector<MagnitudeType> resScaling(d_residualSize);
1594 for(
int icol=0; icol<d_residualSize; ++icol )
1596 if( d_ritzIndex[icol] == 0 )
1598 MagnitudeType Xnrm = blas.NRM2( d_curDim, X_wanted[icol], 1);
1599 MagnitudeType ABscaling = d_relativeConvergence ? d_alphar[icol] : d_betar[icol];
1600 resScaling[icol] = MT::one() / (Xnrm * ABscaling);
1602 else if( d_ritzIndex[icol] == 1 )
1604 MagnitudeType Xnrm1 = blas.NRM2( d_curDim, X_wanted[icol], 1 );
1605 MagnitudeType Xnrm2 = blas.NRM2( d_curDim, X_wanted[icol+1], 1 );
1606 MagnitudeType Xnrm = lapack.LAPY2(Xnrm1,Xnrm2);
1607 MagnitudeType ABscaling = d_relativeConvergence ? lapack.LAPY2(d_alphar[icol],d_alphai[icol])
1609 resScaling[icol] = MT::one() / (Xnrm * ABscaling);
1610 resScaling[icol+1] = MT::one() / (Xnrm * ABscaling);
1613 MVT::MvScale( *R_active, resScaling );
1616 d_resNorms.resize(d_residualSize);
1617 MVT::MvNorm(*R_active,d_resNorms);
1624 for(
int i=0; i<d_residualSize; ++i )
1626 if( d_ritzIndex[i] == 1 )
1628 MagnitudeType nrm = lapack.LAPY2(d_resNorms[i],d_resNorms[i+1]);
1629 d_resNorms[i] = nrm;
1630 d_resNorms[i+1] = nrm;
1635 d_tester->checkStatus(
this);
1638 if( d_useLeading || d_blockSize >= d_NEV )
1640 d_expansionSize=d_blockSize;
1641 if( d_ritzIndex[d_blockSize-1]==1 )
1644 d_expansionIndices.resize(d_expansionSize);
1645 for(
int i=0; i<d_expansionSize; ++i )
1646 d_expansionIndices[i] = i;
1650 std::vector<int> convergedVectors = d_tester->whichVecs();
1654 for( startVec=0; startVec<d_residualSize; ++startVec )
1656 if( std::find(convergedVectors.begin(),convergedVectors.end(),startVec)==convergedVectors.end() )
1662 int endVec = startVec + d_blockSize - 1;
1663 if( endVec > (d_residualSize-1) )
1665 endVec = d_residualSize-1;
1666 startVec = d_residualSize-d_blockSize;
1670 if( d_ritzIndex[startVec]==-1 )
1676 if( d_ritzIndex[endVec]==1 )
1679 d_expansionSize = 1+endVec-startVec;
1680 d_expansionIndices.resize(d_expansionSize);
1681 for(
int i=0; i<d_expansionSize; ++i )
1682 d_expansionIndices[i] = startVec+i;
1689template <
class ScalarType,
class MV,
class OP>
1694 myout.setf(std::ios::scientific, std::ios::floatfield);
1697 myout <<
"================================================================================" << endl;
1699 myout <<
" GeneralizedDavidson Solver Solver Status" << endl;
1701 myout <<
"The solver is "<<(d_initialized ?
"initialized." :
"not initialized.") << endl;
1702 myout <<
"The number of iterations performed is " << d_iteration << endl;
1703 myout <<
"The number of operator applies performed is " << d_opApplies << endl;
1704 myout <<
"The block size is " << d_expansionSize << endl;
1705 myout <<
"The current basis size is " << d_curDim << endl;
1706 myout <<
"The number of requested eigenvalues is " << d_NEV << endl;
1707 myout <<
"The number of converged values is " << d_tester->howMany() << endl;
1710 myout.setf(std::ios_base::right, std::ios_base::adjustfield);
1714 myout <<
"CURRENT RITZ VALUES" << endl;
1716 myout << std::setw(24) <<
"Ritz Value"
1717 << std::setw(30) <<
"Residual Norm" << endl;
1718 myout <<
"--------------------------------------------------------------------------------" << endl;
1719 if( d_residualSize > 0 )
1721 std::vector<MagnitudeType> realRitz(d_curDim), imagRitz(d_curDim);
1722 std::vector< Value<ScalarType> > ritzVals = getRitzValues();
1723 for(
int i=0; i<d_curDim; ++i )
1725 realRitz[i] = ritzVals[i].realpart;
1726 imagRitz[i] = ritzVals[i].imagpart;
1728 std::vector<int> permvec;
1729 sortValues( realRitz, imagRitz, permvec, d_curDim );
1731 int numToPrint = std::max( d_numToPrint, d_NEV );
1732 numToPrint = std::min( d_curDim, numToPrint );
1739 if( d_ritzIndex[permvec[numToPrint-1]] != 0 )
1743 while( i<numToPrint )
1745 if( imagRitz[i] == ST::zero() )
1747 myout << std::setw(15) << realRitz[i];
1748 myout <<
" + i" << std::setw(15) << ST::magnitude( imagRitz[i] );
1749 if( i < d_residualSize )
1750 myout << std::setw(20) << d_resNorms[permvec[i]] << endl;
1752 myout <<
" Not Computed" << endl;
1759 myout << std::setw(15) << realRitz[i];
1760 myout <<
" + i" << std::setw(15) << ST::magnitude( imagRitz[i] );
1761 if( i < d_residualSize )
1762 myout << std::setw(20) << d_resNorms[permvec[i]] << endl;
1764 myout <<
" Not Computed" << endl;
1767 myout << std::setw(15) << realRitz[i];
1768 myout <<
" - i" << std::setw(15) << ST::magnitude( imagRitz[i] );
1769 if( i < d_residualSize )
1770 myout << std::setw(20) << d_resNorms[permvec[i]] << endl;
1772 myout <<
" Not Computed" << endl;
1780 myout << std::setw(20) <<
"[ NONE COMPUTED ]" << endl;
1784 myout <<
"================================================================================" << endl;
Anasazi header file which uses auto-configuration information to include necessary C++ headers.
Abstract base class which defines the interface required by an eigensolver and status test class to c...
Pure virtual base class which describes the basic interface to the iterative eigensolver.
Templated virtual class for providing orthogonalization/orthonormalization methods.
Abstract class definition for Anasazi Output Managers.
Virtual base class which defines the interface between an eigensolver and a class whose job is the so...
Declaration and definition of Anasazi::StatusTest.
Types and exceptions used within Anasazi solvers and interfaces.
This class defines the interface required by an eigensolver and status test class to compute solution...
The Eigensolver is a templated virtual base class that defines the basic interface that any eigensolv...
Solves eigenvalue problem using generalized Davidson method.
void sortProblem(int numWanted)
int getCurSubspaceDim() const
Get current subspace dimension.
RCP< StatusTest< ScalarType, MV, OP > > getStatusTest() const
Get status test.
const Eigenproblem< ScalarType, MV, OP > & getProblem() const
Get eigenproblem.
void setStatusTest(RCP< StatusTest< ScalarType, MV, OP > > tester)
Set status test.
void currentStatus(std::ostream &myout)
Print current status of solver.
int getMaxSubspaceDim() const
Get maximum subspace dimension.
std::vector< MagnitudeType > getResNorms()
Get the current residual norms (w.r.t. norm defined by OrthoManager)
std::vector< int > getBlockIndex() const
Get indices of current block.
std::vector< int > getRitzIndex()
Get the current Ritz index vector.
GeneralizedDavidson(const RCP< Eigenproblem< ScalarType, MV, OP > > &problem, const RCP< SortManager< MagnitudeType > > &sortman, const RCP< OutputManager< ScalarType > > &outputman, const RCP< StatusTest< ScalarType, MV, OP > > &tester, const RCP< OrthoManager< ScalarType, MV > > &orthoman, Teuchos::ParameterList &pl)
Constructor.
void initialize()
Initialize the eigenvalue problem.
GeneralizedDavidsonState< ScalarType, MV > getState()
Get the current state of the eigensolver.
bool isInitialized() const
Query if the solver is in an initialized state.
void setAuxVecs(const Teuchos::Array< RCP< const MV > > &auxVecs)
Set auxilliary vectors.
std::vector< Value< ScalarType > > getRitzValues()
Get the current Ritz values.
int getNumIters() const
Get number of iterations.
std::vector< MagnitudeType > getRes2Norms()
Get the current residual norms (2-norm)
void resetNumIters()
Reset the number of iterations.
RCP< const MV > getRitzVectors()
Get the current Ritz vectors.
int getBlockSize() const
Get block size.
Teuchos::Array< RCP< const MV > > getAuxVecs() const
Get the auxilliary vectors.
void iterate()
Solves the eigenvalue problem.
std::vector< MagnitudeType > getRitzRes2Norms()
Get the current Ritz residual norms (2-norm)
void setSize(int blockSize, int maxSubDim)
Set problem size.
void setBlockSize(int blockSize)
Set block size.
Traits class which defines basic operations on multivectors.
Virtual base class which defines basic traits for the operator type.
Anasazi's templated virtual class for providing routines for orthogonalization and orthonormalization...
Output managers remove the need for the eigensolver to know any information about the required output...
Anasazi's templated pure virtual class for managing the sorting of approximate eigenvalues computed b...
Common interface of stopping criteria for Anasazi's solvers.
Namespace Anasazi contains the classes, structs, enums and utilities used by the Anasazi package.
Structure to contain pointers to GeneralizedDavidson state variables.
RCP< MV > AV
Image of V under A.
RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > T
Right quasi upper triangular matrix from QZ decomposition of (VAV,VBV)
RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > VAV
Projection of A onto V.
RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Q
Left generalized Schur vectors from QZ decomposition of (VAV,VBV)
int curDim
The current subspace dimension.
std::vector< Value< ScalarType > > eVals
Vector of generalized eigenvalues.
RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > VBV
Projection of B onto V.
RCP< MV > BV
Image of V under B.
RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > Z
Right generalized Schur vectors from QZ decomposition of (VAV,VBV)
RCP< MV > V
Orthonormal basis for search subspace.
RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > S
Left quasi upper triangular matrix from QZ decomposition of (VAV,VBV)
This struct is used for storing eigenvalues and Ritz values, as a pair of real values.
Teuchos::ScalarTraits< ScalarType >::magnitudeType imagpart
The imaginary component of the eigenvalue.
Teuchos::ScalarTraits< ScalarType >::magnitudeType realpart
The real component of the eigenvalue.