14 #ifndef ANASAZI_RTRBASE_HPP
15 #define ANASAZI_RTRBASE_HPP
91 template <
class ScalarType,
class MV>
107 RTRState() :
X(Teuchos::null),
AX(Teuchos::null),
BX(Teuchos::null),
108 R(Teuchos::null),
T(Teuchos::null),
rho(0) {};
169 template <
class ScalarType,
class MV,
class OP>
187 const std::string &solverLabel,
bool skinnySolver
316 std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
getResNorms();
324 std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
getRes2Norms();
331 std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
getRitzRes2Norms();
423 const MagnitudeType ONE;
424 const MagnitudeType ZERO;
425 const MagnitudeType NANVAL;
426 typedef typename std::vector<MagnitudeType>::iterator vecMTiter;
427 typedef typename std::vector<ScalarType>::iterator vecSTiter;
432 bool checkX, checkAX, checkBX;
433 bool checkEta, checkAEta, checkBEta;
434 bool checkR, checkQ, checkBR;
435 bool checkZ, checkPBX;
436 CheckList() : checkX(false),checkAX(false),checkBX(false),
437 checkEta(false),checkAEta(false),checkBEta(false),
438 checkR(false),checkQ(false),checkBR(false),
439 checkZ(false), checkPBX(false) {};
444 std::string accuracyCheck(
const CheckList &chk,
const std::string &where)
const;
446 virtual void solveTRSubproblem() = 0;
466 bool hasBOp_, hasPrec_, olsenPrec_;
472 timerLocalProj_, timerDS_,
473 timerLocalUpdate_, timerCompRes_,
474 timerOrtho_, timerInit_;
479 int counterAOp_, counterBOp_, counterPrec_;
545 delta_, Adelta_, Bdelta_, Hdelta_,
557 std::vector<MagnitudeType> theta_, Rnorms_, R2norms_, ritz2norms_;
560 bool Rnorms_current_, R2norms_current_;
563 MagnitudeType conv_kappa_, conv_theta_;
575 template <
class ScalarType,
class MV,
class OP>
583 const std::string &solverLabel,
bool skinnySolver
585 ONE(Teuchos::ScalarTraits<MagnitudeType>::one()),
586 ZERO(Teuchos::ScalarTraits<MagnitudeType>::zero()),
587 NANVAL(Teuchos::ScalarTraits<MagnitudeType>::nan()),
594 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
595 timerAOp_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Operation A*x")),
596 timerBOp_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Operation B*x")),
597 timerPrec_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Operation Prec*x")),
598 timerSort_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Sorting eigenvalues")),
599 timerLocalProj_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Local projection")),
600 timerDS_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Direct solve")),
601 timerLocalUpdate_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Local update")),
602 timerCompRes_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Computing residuals")),
603 timerOrtho_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Orthogonalization")),
604 timerInit_(Teuchos::TimeMonitor::getNewTimer(
"Anasazi: "+solverLabel+
"::Initialization")),
613 isSkinny_(skinnySolver),
615 auxVecs_( Teuchos::Array<Teuchos::RCP<const MV> >(0) ),
618 Rnorms_current_(false),
619 R2norms_current_(false),
626 "Anasazi::RTRBase::constructor: user passed null problem pointer.");
628 "Anasazi::RTRBase::constructor: user passed null sort manager pointer.");
630 "Anasazi::RTRBase::constructor: user passed null output manager pointer.");
632 "Anasazi::RTRBase::constructor: user passed null status test pointer.");
634 "Anasazi::RTRBase::constructor: user passed null orthogonalization manager pointer.");
636 "Anasazi::RTRBase::constructor: problem is not set.");
638 "Anasazi::RTRBase::constructor: problem is not Hermitian.");
641 AOp_ = problem_->getOperator();
643 "Anasazi::RTRBase::constructor: problem provides no A matrix.");
644 BOp_ = problem_->getM();
645 Prec_ = problem_->getPrec();
646 hasBOp_ = (BOp_ != Teuchos::null);
647 hasPrec_ = (Prec_ != Teuchos::null);
648 olsenPrec_ = params.
get<
bool>(
"Olsen Prec",
true);
651 "Anasazi::RTRBase::constructor: orthogonalization manager must use mass matrix for inner product.");
654 int bs = params.
get(
"Block Size", problem_->getNEV());
658 leftMost_ = params.
get(
"Leftmost",leftMost_);
660 conv_kappa_ = params.
get(
"Kappa Convergence",conv_kappa_);
662 "Anasazi::RTRBase::constructor: kappa must be in (0,1).");
663 conv_theta_ = params.
get(
"Theta Convergence",conv_theta_);
665 "Anasazi::RTRBase::constructor: theta must be strictly postitive.");
671 template <
class ScalarType,
class MV,
class OP>
675 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
689 if (blockSize_ > 0) {
693 tmp = problem_->getInitVec();
695 "Anasazi::RTRBase::setBlockSize(): Eigenproblem did not specify initial vectors to clone from");
699 "Anasazi::RTRBase::setBlockSize was passed a non-positive block size");
702 if (blockSize == blockSize_) {
721 if (blockSize > blockSize_)
726 std::vector<int> indQ(numAuxVecs_);
727 for (
int i=0; i<numAuxVecs_; i++) indQ[i] = i;
730 "Anasazi::RTRBase::setSize(): logic error. Please contact Anasazi team.");
732 if (numAuxVecs_ > 0) Q = MVT::CloneView(*V_,indQ);
733 V_ = MVT::Clone(*tmp,numAuxVecs_ + blockSize);
734 if (numAuxVecs_ > 0) MVT::SetBlock(*Q,indQ,*V_);
737 if (numAuxVecs_ > 0) Q = MVT::CloneView(*BV_,indQ);
738 BV_ = MVT::Clone(*tmp,numAuxVecs_ + blockSize);
739 if (numAuxVecs_ > 0) MVT::SetBlock(*Q,indQ,*BV_);
745 if (hasPrec_ && olsenPrec_) {
746 if (numAuxVecs_ > 0) Q = MVT::CloneView(*PBV_,indQ);
747 PBV_ = MVT::Clone(*tmp,numAuxVecs_ + blockSize);
748 if (numAuxVecs_ > 0) MVT::SetBlock(*Q,indQ,*PBV_);
754 std::vector<int> indV(numAuxVecs_+blockSize);
755 for (
int i=0; i<numAuxVecs_+blockSize; i++) indV[i] = i;
757 V_ = MVT::CloneCopy(*V_,indV);
760 BV_ = MVT::CloneCopy(*BV_,indV);
766 if (hasPrec_ && olsenPrec_) {
767 PBV_ = MVT::CloneCopy(*PBV_,indV);
771 if (blockSize < blockSize_) {
773 blockSize_ = blockSize;
775 theta_.resize(blockSize_);
776 ritz2norms_.resize(blockSize_);
777 Rnorms_.resize(blockSize_);
778 R2norms_.resize(blockSize_);
782 std::vector<int> ind(blockSize_);
783 for (
int i=0; i<blockSize_; i++) ind[i] = i;
791 R_ = MVT::CloneCopy(*R_ ,ind);
792 eta_ = MVT::CloneCopy(*eta_ ,ind);
793 delta_ = MVT::CloneCopy(*delta_ ,ind);
794 Hdelta_ = MVT::CloneCopy(*Hdelta_,ind);
796 AX_ = MVT::CloneCopy(*AX_ ,ind);
797 Aeta_ = MVT::CloneCopy(*Aeta_ ,ind);
798 Adelta_ = MVT::CloneCopy(*Adelta_,ind);
802 Aeta_ = Teuchos::null;
803 Adelta_ = Teuchos::null;
808 Beta_ = MVT::CloneCopy(*Beta_,ind);
809 Bdelta_ = MVT::CloneCopy(*Bdelta_,ind);
812 Beta_ = Teuchos::null;
813 Bdelta_ = Teuchos::null;
823 if (hasPrec_ || isSkinny_) {
824 Z_ = MVT::Clone(*V_,blockSize_);
836 eta_ = Teuchos::null;
837 Aeta_ = Teuchos::null;
838 delta_ = Teuchos::null;
839 Adelta_ = Teuchos::null;
840 Hdelta_ = Teuchos::null;
841 Beta_ = Teuchos::null;
842 Bdelta_ = Teuchos::null;
845 R_ = MVT::Clone(*tmp,blockSize_);
846 eta_ = MVT::Clone(*tmp,blockSize_);
847 delta_ = MVT::Clone(*tmp,blockSize_);
848 Hdelta_ = MVT::Clone(*tmp,blockSize_);
850 AX_ = MVT::Clone(*tmp,blockSize_);
851 Aeta_ = MVT::Clone(*tmp,blockSize_);
852 Adelta_ = MVT::Clone(*tmp,blockSize_);
857 Beta_ = MVT::Clone(*tmp,blockSize_);
858 Bdelta_ = MVT::Clone(*tmp,blockSize_);
868 if (hasPrec_ || isSkinny_) {
869 Z_ = MVT::Clone(*tmp,blockSize_);
878 initialized_ =
false;
881 theta_.resize(blockSize,NANVAL);
882 ritz2norms_.resize(blockSize,NANVAL);
883 Rnorms_.resize(blockSize,NANVAL);
884 R2norms_.resize(blockSize,NANVAL);
889 eta_ = Teuchos::null;
890 Aeta_ = Teuchos::null;
891 delta_ = Teuchos::null;
892 Adelta_ = Teuchos::null;
893 Hdelta_ = Teuchos::null;
894 Beta_ = Teuchos::null;
895 Bdelta_ = Teuchos::null;
899 R_ = MVT::Clone(*tmp,blockSize);
900 eta_ = MVT::Clone(*tmp,blockSize);
901 delta_ = MVT::Clone(*tmp,blockSize);
902 Hdelta_ = MVT::Clone(*tmp,blockSize);
904 AX_ = MVT::Clone(*tmp,blockSize);
905 Aeta_ = MVT::Clone(*tmp,blockSize);
906 Adelta_ = MVT::Clone(*tmp,blockSize);
911 Beta_ = MVT::Clone(*tmp,blockSize);
912 Bdelta_ = MVT::Clone(*tmp,blockSize);
919 if (hasPrec_ || isSkinny_) {
920 Z_ = MVT::Clone(*tmp,blockSize);
925 blockSize_ = blockSize;
931 std::vector<int> indX(blockSize_);
932 for (
int i=0; i<blockSize_; i++) indX[i] = numAuxVecs_+i;
933 X_ = MVT::CloneView(*V_,indX);
935 BX_ = MVT::CloneView(*BV_,indX);
946 template <
class ScalarType,
class MV,
class OP>
949 "Anasazi::RTRBase::setStatusTest() was passed a null StatusTest.");
956 template <
class ScalarType,
class MV,
class OP>
964 template <
class ScalarType,
class MV,
class OP>
970 auxVecs_.reserve(auxvecs.size());
973 for (tarcpmv v=auxvecs.begin(); v != auxvecs.end(); ++v) {
974 numAuxVecs_ += MVT::GetNumberVecs(**v);
978 if (numAuxVecs_ > 0 && initialized_) {
979 initialized_ =
false;
988 PBV_ = Teuchos::null;
991 if (numAuxVecs_ > 0) {
992 V_ = MVT::Clone(*R_,numAuxVecs_ + blockSize_);
994 for (tarcpmv v=auxvecs.begin(); v != auxvecs.end(); ++v) {
995 std::vector<int> ind(MVT::GetNumberVecs(**v));
996 for (
size_t j=0; j<ind.size(); j++) ind[j] = numsofar++;
997 MVT::SetBlock(**v,ind,*V_);
998 auxVecs_.push_back(MVT::CloneView(*Teuchos::rcp_static_cast<const MV>(V_),ind));
1001 "Anasazi::RTRBase::setAuxVecs(): Logic error. Please contact Anasazi team.");
1004 BV_ = MVT::Clone(*R_,numAuxVecs_ + blockSize_);
1005 OPT::Apply(*BOp_,*V_,*BV_);
1010 if (hasPrec_ && olsenPrec_) {
1011 PBV_ = MVT::Clone(*R_,numAuxVecs_ + blockSize_);
1012 OPT::Apply(*Prec_,*BV_,*V_);
1017 if (om_->isVerbosity(
Debug ) ) {
1021 om_->print(
Debug, accuracyCheck(chk,
"in setAuxVecs()") );
1038 template <
class ScalarType,
class MV,
class OP>
1047 BX_ = Teuchos::null;
1050 std::vector<int> ind(blockSize_);
1051 for (
int i=0; i<blockSize_; ++i) ind[i] = numAuxVecs_+i;
1052 X = MVT::CloneViewNonConst(*V_,ind);
1054 BX = MVT::CloneViewNonConst(*BV_,ind);
1061 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1065 std::vector<int> bsind(blockSize_);
1066 for (
int i=0; i<blockSize_; i++) bsind[i] = i;
1085 if (newstate.
X != Teuchos::null) {
1087 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): vector length of newstate.X not correct." );
1090 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): newstate.X must have at least block size vectors.");
1093 MVT::SetBlock(*newstate.
X,bsind,*X);
1102 if (newstate.
AX != Teuchos::null) {
1104 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): vector length of newstate.AX not correct." );
1107 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): newstate.AX must have at least block size vectors.");
1108 MVT::SetBlock(*newstate.
AX,bsind,*AX_);
1112 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1115 OPT::Apply(*AOp_,*X,*AX_);
1116 counterAOp_ += blockSize_;
1119 newstate.
R = Teuchos::null;
1125 if (newstate.
BX != Teuchos::null) {
1127 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): vector length of newstate.BX not correct." );
1130 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): newstate.BX must have at least block size vectors.");
1131 MVT::SetBlock(*newstate.
BX,bsind,*BX);
1135 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1138 OPT::Apply(*BOp_,*X,*BX);
1139 counterBOp_ += blockSize_;
1142 newstate.
R = Teuchos::null;
1147 TEUCHOS_TEST_FOR_EXCEPTION(BX != X, std::logic_error,
"Anasazi::RTRBase::initialize(): solver invariant not satisfied (BX==X).");
1155 newstate.
R = Teuchos::null;
1156 newstate.
T = Teuchos::null;
1161 "Anasazi::RTRBase::initialize(): Eigenproblem did not specify initial vectors to clone from.");
1163 int initSize = MVT::GetNumberVecs(*ivec);
1164 if (initSize > blockSize_) {
1166 initSize = blockSize_;
1167 std::vector<int> ind(blockSize_);
1168 for (
int i=0; i<blockSize_; i++) ind[i] = i;
1169 ivec = MVT::CloneView(*ivec,ind);
1174 std::vector<int> ind(initSize);
1175 for (
int i=0; i<initSize; i++) ind[i] = i;
1176 MVT::SetBlock(*ivec,ind,*X);
1179 if (blockSize_ > initSize) {
1180 std::vector<int> ind(blockSize_ - initSize);
1181 for (
int i=0; i<blockSize_ - initSize; i++) ind[i] = initSize + i;
1189 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1192 OPT::Apply(*BOp_,*X,*BX);
1193 counterBOp_ += blockSize_;
1197 TEUCHOS_TEST_FOR_EXCEPTION(BX != X, std::logic_error,
"Anasazi::RTRBase::initialize(): solver invariant not satisfied (BX==X).");
1201 if (numAuxVecs_ > 0) {
1202 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1206 int rank = orthman_->projectAndNormalizeMat(*X,auxVecs_,dummyC,Teuchos::null,BX);
1208 "Anasazi::RTRBase::initialize(): Couldn't generate initial basis of full rank.");
1211 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1214 int rank = orthman_->normalizeMat(*X,Teuchos::null,BX);
1216 "Anasazi::RTRBase::initialize(): Couldn't generate initial basis of full rank.");
1224 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1227 OPT::Apply(*AOp_,*X,*AX_);
1228 counterAOp_ += blockSize_;
1235 if (newstate.
T != Teuchos::null) {
1237 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): newstate.T must contain at least block size Ritz values.");
1238 for (
int i=0; i<blockSize_; i++) {
1239 theta_[i] = (*newstate.
T)[i];
1245 BB(blockSize_,blockSize_),
1246 S(blockSize_,blockSize_);
1249 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1252 MVT::MvTransMv(ONE,*X,*AX_,AA);
1254 MVT::MvTransMv(ONE,*X,*BX,BB);
1257 nevLocal_ = blockSize_;
1263 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1266 ret = Utils::directSolver(blockSize_,AA,Teuchos::rcpFromRef(BB),S,theta_,nevLocal_,1);
1269 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1272 ret = Utils::directSolver(blockSize_,AA,Teuchos::null,S,theta_,nevLocal_,10);
1275 "Anasazi::RTRBase::initialize(): failure solving projected eigenproblem after retraction. LAPACK returns " << ret);
1281 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1285 std::vector<int> order(blockSize_);
1288 sm_->sort(theta_, Teuchos::rcpFromRef(order), blockSize_);
1291 Utils::permuteVectors(order,S);
1302 TEUCHOS_TEST_FOR_EXCEPTION(info != 0, std::logic_error,
"Anasazi::RTRBase::initialize(): Logic error calling SerialDenseMatrix::multiply.");
1307 for (
int i=0; i<blockSize_; i++) {
1308 blas.
SCAL(blockSize_,theta_[i],RR[i],1);
1311 TEUCHOS_TEST_FOR_EXCEPTION(info != 0, std::logic_error,
"Anasazi::RTRBase::initialize(): Logic error calling SerialDenseMatrix::multiply.");
1312 for (
int i=0; i<blockSize_; i++) {
1313 ritz2norms_[i] = blas.
NRM2(blockSize_,RR[i],1);
1321 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1325 MVT::MvAddMv( ONE, *X, ZERO, *X, *R_ );
1326 MVT::MvTimesMatAddMv( ONE, *R_, S, ZERO, *X );
1328 MVT::MvAddMv( ONE, *AX_, ZERO, *AX_, *R_ );
1329 MVT::MvTimesMatAddMv( ONE, *R_, S, ZERO, *AX_ );
1332 MVT::MvAddMv( ONE, *BX, ZERO, *BX, *R_ );
1333 MVT::MvTimesMatAddMv( ONE, *R_, S, ZERO, *BX );
1342 std::vector<int> ind(blockSize_);
1343 for (
int i=0; i<blockSize_; ++i) ind[i] = numAuxVecs_+i;
1344 this->X_ = MVT::CloneView(static_cast<const MV&>(*V_),ind);
1346 this->BX_ = MVT::CloneView(static_cast<const MV&>(*BV_),ind);
1349 this->BX_ = this->X_;
1355 fx_ = std::accumulate(theta_.begin(),theta_.end(),ZERO);
1358 if (newstate.
R != Teuchos::null) {
1360 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): newstate.R must have blockSize number of vectors." );
1362 std::invalid_argument,
"Anasazi::RTRBase::initialize(newstate): vector length of newstate.R not correct." );
1363 MVT::SetBlock(*newstate.
R,bsind,*R_);
1366 #ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1370 MVT::MvAddMv(ZERO,*AX_,ONE,*AX_,*R_);
1373 for (
int i=0; i<blockSize_; i++) T(i,i) = theta_[i];
1374 MVT::MvTimesMatAddMv(-ONE,*BX_,T,ONE,*R_);
1378 Rnorms_current_ =
false;
1379 R2norms_current_ =
false;
1384 AX_ = Teuchos::null;
1388 initialized_ =
true;
1390 if (om_->isVerbosity(
Debug ) ) {
1398 om_->print(
Debug, accuracyCheck(chk,
"after initialize()") );
1402 template <
class ScalarType,
class MV,
class OP>
1414 template <
class ScalarType,
class MV,
class OP>
1415 std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
1417 if (Rnorms_current_ ==
false) {
1419 orthman_->norm(*R_,Rnorms_);
1420 Rnorms_current_ =
true;
1428 template <
class ScalarType,
class MV,
class OP>
1429 std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
1431 if (R2norms_current_ ==
false) {
1433 MVT::MvNorm(*R_,R2norms_);
1434 R2norms_current_ =
true;
1466 template <
class ScalarType,
class MV,
class OP>
1469 using std::setprecision;
1470 using std::scientific;
1473 std::stringstream os;
1476 os <<
" Debugging checks: " << where << endl;
1479 if (chk.checkX && initialized_) {
1480 tmp = orthman_->orthonormError(*X_);
1481 os <<
" >> Error in X^H B X == I : " << scientific << setprecision(10) << tmp << endl;
1482 for (Array_size_type i=0; i<auxVecs_.size(); i++) {
1483 tmp = orthman_->orthogError(*X_,*auxVecs_[i]);
1484 os <<
" >> Error in X^H B Q[" << i <<
"] == 0 : " << scientific << setprecision(10) << tmp << endl;
1487 if (chk.checkAX && !isSkinny_ && initialized_) {
1488 tmp = Utils::errorEquality(*X_, *AX_, AOp_);
1489 os <<
" >> Error in AX == A*X : " << scientific << setprecision(10) << tmp << endl;
1491 if (chk.checkBX && hasBOp_ && initialized_) {
1493 OPT::Apply(*BOp_,*this->X_,*BX);
1494 tmp = Utils::errorEquality(*BX, *BX_);
1495 os <<
" >> Error in BX == B*X : " << scientific << setprecision(10) << tmp << endl;
1499 if (chk.checkEta && initialized_) {
1500 tmp = orthman_->orthogError(*X_,*eta_);
1501 os <<
" >> Error in X^H B Eta == 0 : " << scientific << setprecision(10) << tmp << endl;
1502 for (Array_size_type i=0; i<auxVecs_.size(); i++) {
1503 tmp = orthman_->orthogError(*eta_,*auxVecs_[i]);
1504 os <<
" >> Error in Eta^H B Q[" << i <<
"]==0 : " << scientific << setprecision(10) << tmp << endl;
1507 if (chk.checkAEta && !isSkinny_ && initialized_) {
1508 tmp = Utils::errorEquality(*eta_, *Aeta_, AOp_);
1509 os <<
" >> Error in AEta == A*Eta : " << scientific << setprecision(10) << tmp << endl;
1511 if (chk.checkBEta && !isSkinny_ && hasBOp_ && initialized_) {
1512 tmp = Utils::errorEquality(*eta_, *Beta_, BOp_);
1513 os <<
" >> Error in BEta == B*Eta : " << scientific << setprecision(10) << tmp << endl;
1517 if (chk.checkR && initialized_) {
1519 MVT::MvTransMv(ONE,*X_,*R_,xTx);
1520 tmp = xTx.normFrobenius();
1521 os <<
" >> Error in X^H R == 0 : " << scientific << setprecision(10) << tmp << endl;
1526 if (chk.checkBR && hasBOp_ && initialized_) {
1528 MVT::MvTransMv(ONE,*BX_,*R_,xTx);
1529 tmp = xTx.normFrobenius();
1530 os <<
" >> Error in X^H B R == 0 : " << scientific << setprecision(10) << tmp << endl;
1534 if (chk.checkZ && initialized_) {
1536 MVT::MvTransMv(ONE,*BX_,*Z_,xTx);
1537 tmp = xTx.normFrobenius();
1538 os <<
" >> Error in X^H B Z == 0 : " << scientific << setprecision(10) << tmp << endl;
1543 for (Array_size_type i=0; i<auxVecs_.size(); i++) {
1544 tmp = orthman_->orthonormError(*auxVecs_[i]);
1545 os <<
" >> Error in Q[" << i <<
"]^H B Q[" << i <<
"]==I: " << scientific << setprecision(10) << tmp << endl;
1546 for (Array_size_type j=i+1; j<auxVecs_.size(); j++) {
1547 tmp = orthman_->orthogError(*auxVecs_[i],*auxVecs_[j]);
1548 os <<
" >> Error in Q[" << i <<
"]^H B Q[" << j <<
"]==0: " << scientific << setprecision(10) << tmp << endl;
1559 template <
class ScalarType,
class MV,
class OP>
1563 using std::setprecision;
1564 using std::scientific;
1569 os <<
"================================================================================" << endl;
1571 os <<
" RTRBase Solver Status" << endl;
1573 os <<
"The solver is "<<(initialized_ ?
"initialized." :
"not initialized.") << endl;
1574 os <<
"The number of iterations performed is " << iter_ << endl;
1575 os <<
"The current block size is " << blockSize_ << endl;
1576 os <<
"The number of auxiliary vectors is " << numAuxVecs_ << endl;
1577 os <<
"The number of operations A*x is " << counterAOp_ << endl;
1578 os <<
"The number of operations B*x is " << counterBOp_ << endl;
1579 os <<
"The number of operations Prec*x is " << counterPrec_ << endl;
1580 os <<
"The most recent rho was " << scientific << setprecision(10) << rho_ << endl;
1581 os <<
"The current value of f(x) is " << scientific << setprecision(10) << fx_ << endl;
1585 os <<
"CURRENT EIGENVALUE ESTIMATES "<<endl;
1586 os << setw(20) <<
"Eigenvalue"
1587 << setw(20) <<
"Residual(B)"
1588 << setw(20) <<
"Residual(2)"
1590 os <<
"--------------------------------------------------------------------------------"<<endl;
1591 for (
int i=0; i<blockSize_; i++) {
1592 os << scientific << setprecision(10) << setw(20) << theta_[i];
1593 if (Rnorms_current_) os << scientific << setprecision(10) << setw(20) << Rnorms_[i];
1594 else os << scientific << setprecision(10) << setw(20) <<
"not current";
1595 if (R2norms_current_) os << scientific << setprecision(10) << setw(20) << R2norms_[i];
1596 else os << scientific << setprecision(10) << setw(20) <<
"not current";
1600 os <<
"================================================================================" << endl;
1607 template <
class ScalarType,
class MV,
class OP>
1611 std::vector<MagnitudeType> d(MVT::GetNumberVecs(xi));
1613 MagnitudeType ret = 0;
1614 for (vecMTiter i=d.begin(); i != d.end(); ++i) {
1623 template <
class ScalarType,
class MV,
class OP>
1625 RTRBase<ScalarType,MV,OP>::ginner(
const MV &xi,
const MV &zeta)
const
1627 std::vector<ScalarType> d(MVT::GetNumberVecs(xi));
1628 MVT::MvDot(xi,zeta,d);
1629 return SCT::real(std::accumulate(d.begin(),d.end(),SCT::zero()));
1635 template <
class ScalarType,
class MV,
class OP>
1636 void RTRBase<ScalarType,MV,OP>::ginnersep(
1641 for (vecMTiter i=d.begin(); i != d.end(); ++i) {
1649 template <
class ScalarType,
class MV,
class OP>
1650 void RTRBase<ScalarType,MV,OP>::ginnersep(
1651 const MV &xi,
const MV &zeta,
1654 std::vector<ScalarType> dC(MVT::GetNumberVecs(xi));
1655 MVT::MvDot(xi,zeta,dC);
1656 vecMTiter iR=d.begin();
1657 vecSTiter iS=dC.begin();
1658 for (; iR != d.end(); iR++, iS++) {
1659 (*iR) = SCT::real(*iS);
1663 template <
class ScalarType,
class MV,
class OP>
1668 template <
class ScalarType,
class MV,
class OP>
1673 template <
class ScalarType,
class MV,
class OP>
1678 template <
class ScalarType,
class MV,
class OP>
1683 template <
class ScalarType,
class MV,
class OP>
1686 if (!initialized_)
return 0;
1690 template <
class ScalarType,
class MV,
class OP>
1691 std::vector<typename Teuchos::ScalarTraits<ScalarType>::magnitudeType>
1694 std::vector<MagnitudeType> ret = ritz2norms_;
1695 ret.resize(nevLocal_);
1699 template <
class ScalarType,
class MV,
class OP>
1700 std::vector<Value<ScalarType> >
1703 std::vector<Value<ScalarType> > ret(nevLocal_);
1704 for (
int i=0; i<nevLocal_; i++) {
1705 ret[i].realpart = theta_[i];
1706 ret[i].imagpart = ZERO;
1711 template <
class ScalarType,
class MV,
class OP>
1718 template <
class ScalarType,
class MV,
class OP>
1724 template <
class ScalarType,
class MV,
class OP>
1730 template <
class ScalarType,
class MV,
class OP>
1740 state.
BX = Teuchos::null;
1744 state.
T =
Teuchos::rcp(
new std::vector<MagnitudeType>(theta_));
1748 template <
class ScalarType,
class MV,
class OP>
1751 return initialized_;
1754 template <
class ScalarType,
class MV,
class OP>
1757 std::vector<int> ret(nevLocal_,0);
1764 #endif // ANASAZI_RTRBASE_HPP
RTROrthoFailure is thrown when an orthogonalization attempt fails.
int getBlockSize() const
Get the blocksize to be used by the iterative solver in solving this eigenproblem.
int getCurSubspaceDim() const
Get the dimension of the search subspace used to generate the current eigenvectors and eigenvalues...
void resetNumIters()
Reset the iteration count.
std::vector< Value< ScalarType > > getRitzValues()
Get the Ritz values from the previous iteration.
Structure to contain pointers to RTR state variables.
virtual void currentStatus(std::ostream &os)
This method requests that the solver print out its current status to screen.
Teuchos::RCP< const MV > AX
The image of the current eigenvectors under A, or Teuchos::null is we implement a skinny solver...
This class defines the interface required by an eigensolver and status test class to compute solution...
Teuchos::RCP< const MV > BX
The image of the current eigenvectors under B, or Teuchos::null if B was not specified.
Declaration of basic traits for the multivector type.
T & get(const std::string &name, T def_value)
int multiply(ETransp transa, ETransp transb, ScalarType alpha, const SerialDenseMatrix< OrdinalType, ScalarType > &A, const SerialDenseMatrix< OrdinalType, ScalarType > &B, ScalarType beta)
Teuchos::RCP< const MV > getRitzVectors()
Get the Ritz vectors from the previous iteration.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > getRitzRes2Norms()
Get the 2-norms of the Ritz residuals.
This class is an abstract base class for Implicit Riemannian Trust-Region based eigensolvers. The class provides the interfaces shared by the IRTR solvers (e.g., getState() and initialize()) as well as the shared implementations (e.g., inner products).
Virtual base class which defines basic traits for the operator type.
int getMaxSubspaceDim() const
Get the maximum dimension allocated for the search subspace. For RTR, this always returns getBlockSiz...
std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > getRes2Norms()
Get the current residual 2-norms.
Templated virtual class for providing orthogonalization/orthonormalization methods with matrix-based ...
virtual void iterate()=0
This method performs RTR iterations until the status test indicates the need to stop or an error occu...
ScalarTraits< ScalarType >::magnitudeType NRM2(const OrdinalType &n, const ScalarType *x, const OrdinalType &incx) const
Teuchos::RCP< const MV > X
The current eigenvectors.
An exception class parent to all Anasazi exceptions.
void setStatusTest(Teuchos::RCP< StatusTest< ScalarType, MV, OP > > test)
Set a new StatusTest for the solver.
Pure virtual base class which describes the basic interface to the iterative eigensolver.
virtual ~RTRBase()
RTRBase destructor
Anasazi's templated, static class providing utilities for the solvers.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Output managers remove the need for the eigensolver to know any information about the required output...
void setBlockSize(int blockSize)
Set the blocksize to be used by the iterative solver in solving this eigenproblem.
int putScalar(const ScalarType value=Teuchos::ScalarTraits< ScalarType >::zero())
std::vector< int > getRitzIndex()
Get the index used for extracting Ritz vectors from getRitzVectors().
Traits class which defines basic operations on multivectors.
Virtual base class which defines basic traits for the operator type.
Teuchos::Array< Teuchos::RCP< const MV > > getAuxVecs() const
Get the current auxiliary vectors.
bool isInitialized() const
Indicates whether the solver has been initialized or not.
void resize(size_type new_size, const value_type &x=value_type())
RTRInitFailure is thrown when the RTR solver is unable to generate an initial iterate in the RTRBase:...
Teuchos::ScalarTraits< ScalarType >::magnitudeType rho
The current rho value. This is only valid if the debugging level of verbosity is enabled.
std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > getResNorms()
Get the current residual norms.
int getNumIters() const
Get the current iteration count.
Teuchos::RCP< const std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > > T
The current Ritz values.
Teuchos::RCP< const MV > R
The current residual vectors.
void setAuxVecs(const Teuchos::Array< Teuchos::RCP< const MV > > &auxvecs)
Set the auxiliary vectors for the solver.
void SCAL(const OrdinalType &n, const ScalarType &alpha, ScalarType *x, const OrdinalType &incx) const
Types and exceptions used within Anasazi solvers and interfaces.
void initialize()
Initialize the solver with the initial vectors from the eigenproblem or random data.
const Eigenproblem< ScalarType, MV, OP > & getProblem() const
Get a constant reference to the eigenvalue problem.
Anasazi's templated pure virtual class for managing the sorting of approximate eigenvalues computed b...
RTRState< ScalarType, MV > getState() const
Get the current state of the eigensolver.
Common interface of stopping criteria for Anasazi's solvers.
RTRRitzFailure is thrown when the RTR solver is unable to continue a call to RTRBase::iterate() due t...
SerialDenseMatrix< OrdinalType, ScalarType > & assign(const SerialDenseMatrix< OrdinalType, ScalarType > &Source)
The Eigensolver is a templated virtual base class that defines the basic interface that any eigensolv...
RTRBase(const Teuchos::RCP< Eigenproblem< ScalarType, MV, OP > > &problem, const Teuchos::RCP< SortManager< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > > &sorter, const Teuchos::RCP< OutputManager< ScalarType > > &printer, const Teuchos::RCP< StatusTest< ScalarType, MV, OP > > &tester, const Teuchos::RCP< GenOrthoManager< ScalarType, MV, OP > > &ortho, Teuchos::ParameterList ¶ms, const std::string &solverLabel, bool skinnySolver)
RTRBase constructor with eigenproblem, solver utilities, and parameter list of solver options...
Teuchos::RCP< StatusTest< ScalarType, MV, OP > > getStatusTest() const
Get the current StatusTest used by the solver.
Class which provides internal utilities for the Anasazi solvers.