947#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
948 Teuchos::TimeMonitor inittimer( *timerInit_ );
951 std::vector<int> bsind(blockSize_);
952 for (
int i=0; i<blockSize_; i++) bsind[i] = i;
976 if (newstate.
X != Teuchos::null) {
977 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
X) != MVT::GetGlobalLength(*X_),
978 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): vector length of newstate.X not correct." );
980 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
X) < blockSize_,
981 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.X must have at least block size vectors.");
984 MVT::SetBlock(*newstate.
X,bsind,*X_);
988 if (newstate.
MX != Teuchos::null) {
989 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
MX) != MVT::GetGlobalLength(*MX_),
990 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): vector length of newstate.MX not correct." );
992 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
MX) < blockSize_,
993 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.MX must have at least block size vectors.");
994 MVT::SetBlock(*newstate.
MX,bsind,*MX_);
999#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1000 Teuchos::TimeMonitor lcltimer( *timerMOp_ );
1002 OPT::Apply(*MOp_,*X_,*MX_);
1003 count_ApplyM_ += blockSize_;
1006 newstate.
R = Teuchos::null;
1011 if (newstate.
KX != Teuchos::null) {
1012 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
KX) != MVT::GetGlobalLength(*KX_),
1013 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): vector length of newstate.KX not correct." );
1015 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
KX) < blockSize_,
1016 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.KX must have at least block size vectors.");
1017 MVT::SetBlock(*newstate.
KX,bsind,*KX_);
1022#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1023 Teuchos::TimeMonitor lcltimer( *timerOp_ );
1025 OPT::Apply(*Op_,*X_,*KX_);
1026 count_ApplyOp_ += blockSize_;
1029 newstate.
R = Teuchos::null;
1037 newstate.
P = Teuchos::null;
1038 newstate.
KP = Teuchos::null;
1039 newstate.
MP = Teuchos::null;
1040 newstate.
R = Teuchos::null;
1041 newstate.
T = Teuchos::null;
1044 Teuchos::RCP<const MV> ivec = problem_->getInitVec();
1045 TEUCHOS_TEST_FOR_EXCEPTION(ivec == Teuchos::null,std::logic_error,
1046 "Anasazi::LOBPCG::initialize(): Eigenproblem did not specify initial vectors to clone from.");
1048 int initSize = MVT::GetNumberVecs(*ivec);
1049 if (initSize > blockSize_) {
1051 initSize = blockSize_;
1052 std::vector<int> ind(blockSize_);
1053 for (
int i=0; i<blockSize_; i++) ind[i] = i;
1054 ivec = MVT::CloneView(*ivec,ind);
1059 std::vector<int> ind(initSize);
1060 for (
int i=0; i<initSize; i++) ind[i] = i;
1061 MVT::SetBlock(*ivec,ind,*X_);
1064 if (blockSize_ > initSize) {
1065 std::vector<int> ind(blockSize_ - initSize);
1066 for (
int i=0; i<blockSize_ - initSize; i++) ind[i] = initSize + i;
1067 Teuchos::RCP<MV> rX = MVT::CloneViewNonConst(*X_,ind);
1074#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1075 Teuchos::TimeMonitor lcltimer( *timerMOp_ );
1077 OPT::Apply(*MOp_,*X_,*MX_);
1078 count_ApplyM_ += blockSize_;
1082 if (numAuxVecs_ > 0) {
1083#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1084 Teuchos::TimeMonitor lcltimer( *timerOrtho_ );
1086 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > > dummy;
1087 int rank = orthman_->projectAndNormalizeMat(*X_,auxVecs_,dummy,Teuchos::null,MX_);
1089 "Anasazi::LOBPCG::initialize(): Couldn't generate initial basis of full rank.");
1092#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1093 Teuchos::TimeMonitor lcltimer( *timerOrtho_ );
1095 int rank = orthman_->normalizeMat(*X_,Teuchos::null,MX_);
1097 "Anasazi::LOBPCG::initialize(): Couldn't generate initial basis of full rank.");
1102#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1103 Teuchos::TimeMonitor lcltimer( *timerOp_ );
1105 OPT::Apply(*Op_,*X_,*KX_);
1106 count_ApplyOp_ += blockSize_;
1114 theta_.resize(3*blockSize_,NANVAL);
1115 if (newstate.
T != Teuchos::null) {
1116 TEUCHOS_TEST_FOR_EXCEPTION( (
signed int)(newstate.
T->size()) < blockSize_,
1117 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.T must contain at least block size Ritz values.");
1118 for (
int i=0; i<blockSize_; i++) {
1119 theta_[i] = (*newstate.
T)[i];
1121 nevLocal_ = blockSize_;
1125 Teuchos::SerialDenseMatrix<int,ScalarType> KK(blockSize_,blockSize_),
1126 MM(blockSize_,blockSize_),
1127 S(blockSize_,blockSize_);
1129#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1130 Teuchos::TimeMonitor lcltimer( *timerLocalProj_ );
1133 MVT::MvTransMv(ONE,*X_,*KX_,KK);
1135 MVT::MvTransMv(ONE,*X_,*MX_,MM);
1136 nevLocal_ = blockSize_;
1141#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1142 Teuchos::TimeMonitor lcltimer( *timerDS_ );
1144 Utils::directSolver(blockSize_, KK, Teuchos::rcpFromRef(MM), S, theta_, nevLocal_, 1);
1146 "Anasazi::LOBPCG::initialize(): Initial Ritz analysis did not produce enough Ritz pairs to initialize algorithm.");
1152#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1153 Teuchos::TimeMonitor lcltimer( *timerSort_ );
1156 std::vector<int> order(blockSize_);
1159 sm_->sort(theta_, Teuchos::rcpFromRef(order), blockSize_);
1162 Utils::permuteVectors(order,S);
1167#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1168 Teuchos::TimeMonitor lcltimer( *timerLocalUpdate_ );
1171 MVT::MvAddMv( ONE, *X_, ZERO, *X_, *R_ );
1172 MVT::MvTimesMatAddMv( ONE, *R_, S, ZERO, *X_ );
1174 MVT::MvAddMv( ONE, *KX_, ZERO, *KX_, *R_ );
1175 MVT::MvTimesMatAddMv( ONE, *R_, S, ZERO, *KX_ );
1178 MVT::MvAddMv( ONE, *MX_, ZERO, *MX_, *R_ );
1179 MVT::MvTimesMatAddMv( ONE, *R_, S, ZERO, *MX_ );
1187 if (newstate.
R != Teuchos::null) {
1188 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
R) != MVT::GetGlobalLength(*R_),
1189 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): vector length of newstate.R not correct." );
1190 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
R) < blockSize_,
1191 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.R must have blockSize number of vectors." );
1192 MVT::SetBlock(*newstate.
R,bsind,*R_);
1195#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1196 Teuchos::TimeMonitor lcltimer( *timerCompRes_ );
1199 MVT::MvAddMv(ZERO,*KX_,ONE,*KX_,*R_);
1200 Teuchos::SerialDenseMatrix<int,ScalarType> T(blockSize_,blockSize_);
1201 for (
int i=0; i<blockSize_; i++) T(i,i) = theta_[i];
1202 MVT::MvTimesMatAddMv(-ONE,*MX_,T,ONE,*R_);
1206 Rnorms_current_ =
false;
1207 R2norms_current_ =
false;
1210 if (newstate.
P != Teuchos::null) {
1211 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
P) < blockSize_ ,
1212 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.P must have blockSize number of vectors." );
1213 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
P) != MVT::GetGlobalLength(*P_),
1214 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): vector length of newstate.P not correct." );
1218 MVT::SetBlock(*newstate.
P,bsind,*P_);
1221 if (newstate.
KP != Teuchos::null) {
1222 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
KP) < blockSize_,
1223 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.KP must have blockSize number of vectors." );
1224 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
KP) != MVT::GetGlobalLength(*KP_),
1225 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): vector length of newstate.KP not correct." );
1226 MVT::SetBlock(*newstate.
KP,bsind,*KP_);
1229#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1230 Teuchos::TimeMonitor lcltimer( *timerOp_ );
1232 OPT::Apply(*Op_,*P_,*KP_);
1233 count_ApplyOp_ += blockSize_;
1238 if (newstate.
MP != Teuchos::null) {
1239 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetNumberVecs(*newstate.
MP) < blockSize_,
1240 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): newstate.MP must have blockSize number of vectors." );
1241 TEUCHOS_TEST_FOR_EXCEPTION( MVT::GetGlobalLength(*newstate.
MP) != MVT::GetGlobalLength(*MP_),
1242 std::invalid_argument,
"Anasazi::LOBPCG::initialize(newstate): vector length of newstate.MP not correct." );
1243 MVT::SetBlock(*newstate.
MP,bsind,*MP_);
1246#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1247 Teuchos::TimeMonitor lcltimer( *timerMOp_ );
1249 OPT::Apply(*MOp_,*P_,*MP_);
1250 count_ApplyM_ += blockSize_;
1259 initialized_ =
true;
1261 if (om_->isVerbosity(
Debug ) ) {
1272 om_->print(
Debug, accuracyCheck(chk,
": after initialize()") );
1323 if (initialized_ ==
false) {
1329 const int oneBlock = blockSize_;
1330 const int twoBlocks = 2*blockSize_;
1331 const int threeBlocks = 3*blockSize_;
1333 std::vector<int> indblock1(blockSize_), indblock2(blockSize_), indblock3(blockSize_);
1334 for (
int i=0; i<blockSize_; i++) {
1336 indblock2[i] = i + blockSize_;
1337 indblock3[i] = i + 2*blockSize_;
1345 Teuchos::SerialDenseMatrix<int,ScalarType> KK( threeBlocks, threeBlocks ),
1346 MM( threeBlocks, threeBlocks ),
1347 S( threeBlocks, threeBlocks );
1349 while (tester_->checkStatus(
this) !=
Passed) {
1352 if (om_->isVerbosity(
Debug)) {
1353 currentStatus( om_->stream(
Debug) );
1363 if (Prec_ != Teuchos::null) {
1364#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1365 Teuchos::TimeMonitor lcltimer( *timerPrec_ );
1367 OPT::Apply( *Prec_, *R_, *H_ );
1368 count_ApplyPrec_ += blockSize_;
1371 MVT::MvAddMv(ONE,*R_,ZERO,*R_,*H_);
1376#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1377 Teuchos::TimeMonitor lcltimer( *timerMOp_ );
1379 OPT::Apply( *MOp_, *H_, *MH_);
1380 count_ApplyM_ += blockSize_;
1385 Teuchos::Array<Teuchos::RCP<const MV> > Q;
1396#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1397 Teuchos::TimeMonitor lcltimer( *timerOrtho_ );
1399 Teuchos::Array<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > > dummyC =
1400 Teuchos::tuple<Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > >(Teuchos::null);
1401 int rank = orthman_->projectAndNormalizeMat(*H_,Q,dummyC,Teuchos::null,MH_);
1404 "Anasazi::LOBPCG::iterate(): unable to compute orthonormal basis for H.");
1407 if (om_->isVerbosity(
Debug ) ) {
1411 om_->print(
Debug, accuracyCheck(chk,
": after ortho H") );
1417 om_->print(
OrthoDetails, accuracyCheck(chk,
": after ortho H") );
1422#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1423 Teuchos::TimeMonitor lcltimer( *timerOp_ );
1425 OPT::Apply( *Op_, *H_, *KH_);
1426 count_ApplyOp_ += blockSize_;
1430 nevLocal_ = threeBlocks;
1433 nevLocal_ = twoBlocks;
1455 KX_ = Teuchos::null;
1456 MX_ = Teuchos::null;
1458 KH_ = Teuchos::null;
1459 MH_ = Teuchos::null;
1461 KP_ = Teuchos::null;
1462 MP_ = Teuchos::null;
1463 Teuchos::RCP<const MV> cX, cH, cXHP, cHP, cK_XHP, cK_HP, cM_XHP, cM_HP, cP, cK_P, cM_P;
1465 cX = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(V_),indblock1);
1466 cH = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(V_),indblock2);
1468 std::vector<int> indXHP(nevLocal_);
1469 for (
int i=0; i<nevLocal_; i++) {
1472 cXHP = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(V_),indXHP);
1473 cK_XHP = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(KV_),indXHP);
1475 cM_XHP = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(MV_),indXHP);
1481 std::vector<int> indHP(nevLocal_-blockSize_);
1482 for (
int i=blockSize_; i<nevLocal_; i++) {
1483 indHP[i-blockSize_] = i;
1485 cHP = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(V_),indHP);
1486 cK_HP = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(KV_),indHP);
1488 cM_HP = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(MV_),indHP);
1494 if (nevLocal_ == threeBlocks) {
1495 cP = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(V_),indblock3);
1496 cK_P = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(KV_),indblock3);
1498 cM_P = MVT::CloneView(*Teuchos::rcp_implicit_cast<const MV>(MV_),indblock3);
1520 Teuchos::SerialDenseMatrix<int,ScalarType>
1521 K1(Teuchos::View,KK,blockSize_,nevLocal_ ,0*blockSize_,0*blockSize_),
1522 K2(Teuchos::View,KK,blockSize_,nevLocal_-1*blockSize_,1*blockSize_,1*blockSize_),
1523 K3(Teuchos::View,KK,blockSize_,nevLocal_-2*blockSize_,2*blockSize_,2*blockSize_),
1524 M1(Teuchos::View,MM,blockSize_,nevLocal_ ,0*blockSize_,0*blockSize_),
1525 M2(Teuchos::View,MM,blockSize_,nevLocal_-1*blockSize_,1*blockSize_,1*blockSize_),
1526 M3(Teuchos::View,MM,blockSize_,nevLocal_-2*blockSize_,2*blockSize_,2*blockSize_);
1528#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1529 Teuchos::TimeMonitor lcltimer( *timerLocalProj_ );
1531 MVT::MvTransMv( ONE, *cX, *cK_XHP, K1 );
1532 MVT::MvTransMv( ONE, *cX, *cM_XHP, M1 );
1533 MVT::MvTransMv( ONE, *cH, *cK_HP , K2 );
1534 MVT::MvTransMv( ONE, *cH, *cM_HP , M2 );
1535 if (nevLocal_ == threeBlocks) {
1536 MVT::MvTransMv( ONE, *cP, *cK_P, K3 );
1537 MVT::MvTransMv( ONE, *cP, *cM_P, M3 );
1547 cK_P = Teuchos::null;
1548 cM_P = Teuchos::null;
1549 if (fullOrtho_ ==
true) {
1550 cHP = Teuchos::null;
1551 cK_HP = Teuchos::null;
1552 cM_HP = Teuchos::null;
1561 Teuchos::SerialDenseMatrix<int,ScalarType> lclKK(Teuchos::View,KK,nevLocal_,nevLocal_),
1562 lclMM(Teuchos::View,MM,nevLocal_,nevLocal_),
1563 lclS(Teuchos::View, S,nevLocal_,nevLocal_);
1565#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1566 Teuchos::TimeMonitor lcltimer( *timerDS_ );
1568 int localSize = nevLocal_;
1569 Utils::directSolver(localSize, lclKK, Teuchos::rcpFromRef(lclMM), lclS, theta_, nevLocal_, 0);
1578 if (nevLocal_ != localSize) {
1581 cXHP = Teuchos::null;
1582 cK_XHP = Teuchos::null;
1583 cM_XHP = Teuchos::null;
1584 cHP = Teuchos::null;
1585 cK_HP = Teuchos::null;
1586 cM_HP = Teuchos::null;
1590 "Anasazi::LOBPCG::iterate(): indefiniteness detected in projected mass matrix." );
1597 Teuchos::LAPACK<int,ScalarType> lapack;
1598 Teuchos::BLAS<int,ScalarType> blas;
1600#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1601 Teuchos::TimeMonitor lcltimer( *timerSort_ );
1604 std::vector<int> order(nevLocal_);
1607 sm_->sort(theta_, Teuchos::rcpFromRef(order), nevLocal_);
1610 Utils::permuteVectors(order,lclS);
1622 Teuchos::RCP<Teuchos::SerialDenseMatrix<int,ScalarType> > CX, CP;
1633 Teuchos::SerialDenseMatrix<int,ScalarType> C(nevLocal_,twoBlocks),
1634 MMC(nevLocal_,twoBlocks),
1635 CMMC(twoBlocks ,twoBlocks);
1638 for (
int j=0; j<oneBlock; j++) {
1639 for (
int i=0; i<oneBlock; i++) {
1643 C(i,j+oneBlock) = ZERO;
1647 for (
int j=0; j<oneBlock; j++) {
1648 for (
int i=oneBlock; i<twoBlocks; i++) {
1652 C(i,j+oneBlock) = lclS(i,j);
1656 if (nevLocal_ == threeBlocks) {
1657 for (
int j=0; j<oneBlock; j++) {
1658 for (
int i=twoBlocks; i<threeBlocks; i++) {
1662 C(i,j+oneBlock) = lclS(i,j);
1670 teuchosret = MMC.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,ONE,lclMM,C,ZERO);
1671 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
1672 "Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1674 teuchosret = CMMC.multiply(Teuchos::CONJ_TRANS,Teuchos::NO_TRANS,ONE,C,MMC,ZERO);
1675 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
1676 "Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1682 lapack.POTRF(
'U',twoBlocks,CMMC.values(),CMMC.stride(),&info);
1686 Teuchos::SerialDenseMatrix<int,ScalarType> K22(Teuchos::View,KK,blockSize_,blockSize_,1*blockSize_,1*blockSize_);
1687 Teuchos::SerialDenseMatrix<int,ScalarType> K22_trans( K22, Teuchos::CONJ_TRANS );
1689 MagnitudeType symNorm = K22_trans.normOne();
1690 MagnitudeType tol = SCT::magnitude(SCT::squareroot(SCT::eps()));
1692 cXHP = Teuchos::null;
1693 cHP = Teuchos::null;
1694 cK_XHP = Teuchos::null;
1695 cK_HP = Teuchos::null;
1696 cM_XHP = Teuchos::null;
1697 cM_HP = Teuchos::null;
1700 std::string errMsg =
"Anasazi::LOBPCG::iterate(): Cholesky factorization failed during full orthogonalization.";
1701 if ( symNorm < tol )
1707 errMsg +=
" Check the operator A (or K), it may not be Hermitian!";
1713 blas.TRSM(Teuchos::RIGHT_SIDE,Teuchos::UPPER_TRI,Teuchos::NO_TRANS,Teuchos::NON_UNIT_DIAG,
1714 nevLocal_,twoBlocks,ONE,CMMC.values(),CMMC.stride(),C.values(),C.stride());
1716 CX = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(Teuchos::Copy,C,nevLocal_,oneBlock,0,0) );
1718 CP = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(Teuchos::Copy,C,nevLocal_,oneBlock,0,oneBlock) );
1721 if (om_->isVerbosity(
Debug ) ) {
1722 Teuchos::SerialDenseMatrix<int,ScalarType> tmp1(nevLocal_,oneBlock),
1723 tmp2(oneBlock,oneBlock);
1726 std::stringstream os;
1728 os.setf(std::ios::scientific, std::ios::floatfield);
1730 os <<
" Checking Full Ortho: iteration " << iter_ << std::endl;
1734 teuchosret = tmp1.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,ONE,lclMM,*CX,ZERO);
1735 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
1736 "Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1738 teuchosret = tmp2.multiply(Teuchos::CONJ_TRANS,Teuchos::NO_TRANS,ONE,*CX,tmp1,ZERO);
1739 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
1740 "Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1742 for (
int i=0; i<oneBlock; i++) tmp2(i,i) -= ONE;
1743 tmp = tmp2.normFrobenius();
1744 os <<
" >> Error in CX^H MM CX == I : " << tmp << std::endl;
1748 teuchosret = tmp1.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,ONE,lclMM,*CP,ZERO);
1749 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
1750 "Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1752 teuchosret = tmp2.multiply(Teuchos::CONJ_TRANS,Teuchos::NO_TRANS,ONE,*CP,tmp1,ZERO);
1753 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
1754 "Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1756 for (
int i=0; i<oneBlock; i++) tmp2(i,i) -= ONE;
1757 tmp = tmp2.normFrobenius();
1758 os <<
" >> Error in CP^H MM CP == I : " << tmp << std::endl;
1762 teuchosret = tmp1.multiply(Teuchos::NO_TRANS,Teuchos::NO_TRANS,ONE,lclMM,*CP,ZERO);
1763 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
"Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1765 teuchosret = tmp2.multiply(Teuchos::CONJ_TRANS,Teuchos::NO_TRANS,ONE,*CX,tmp1,ZERO);
1766 TEUCHOS_TEST_FOR_EXCEPTION(teuchosret != 0,std::logic_error,
"Anasazi::LOBPCG::iterate(): Logic error calling SerialDenseMatrix::multiply");
1768 tmp = tmp2.normFrobenius();
1769 os <<
" >> Error in CX^H MM CP == 0 : " << tmp << std::endl;
1772 om_->print(
Debug,os.str());
1787 CX = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(Teuchos::Copy,lclS,nevLocal_ ,oneBlock,0 ,0) );
1788 CP = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>(Teuchos::Copy,lclS,nevLocal_-oneBlock,oneBlock,oneBlock,0) );
1797#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1798 Teuchos::TimeMonitor lcltimer( *timerLocalUpdate_ );
1826 MVT::MvTimesMatAddMv(ONE,*cXHP,*CX,ZERO,*tmpmvec_);
1827 MVT::MvTimesMatAddMv(ONE,*cXHP,*CP,ZERO,*R_);
1828 cXHP = Teuchos::null;
1829 MVT::SetBlock(*tmpmvec_,indblock1,*V_);
1830 MVT::SetBlock(*R_ ,indblock3,*V_);
1832 MVT::MvTimesMatAddMv(ONE,*cK_XHP,*CX,ZERO,*tmpmvec_);
1833 MVT::MvTimesMatAddMv(ONE,*cK_XHP,*CP,ZERO,*R_);
1834 cK_XHP = Teuchos::null;
1835 MVT::SetBlock(*tmpmvec_,indblock1,*KV_);
1836 MVT::SetBlock(*R_ ,indblock3,*KV_);
1839 MVT::MvTimesMatAddMv(ONE,*cM_XHP,*CX,ZERO,*tmpmvec_);
1840 MVT::MvTimesMatAddMv(ONE,*cM_XHP,*CP,ZERO,*R_);
1841 cM_XHP = Teuchos::null;
1842 MVT::SetBlock(*tmpmvec_,indblock1,*MV_);
1843 MVT::SetBlock(*R_ ,indblock3,*MV_);
1846 cM_XHP = Teuchos::null;
1851 MVT::MvTimesMatAddMv(ONE,*cXHP,*CX,ZERO,*R_);
1852 cXHP = Teuchos::null;
1853 MVT::SetBlock(*R_,indblock1,*V_);
1854 MVT::MvTimesMatAddMv(ONE,*cHP,*CP,ZERO,*R_);
1855 cHP = Teuchos::null;
1856 MVT::SetBlock(*R_,indblock3,*V_);
1858 MVT::MvTimesMatAddMv(ONE,*cK_XHP,*CX,ZERO,*R_);
1859 cK_XHP = Teuchos::null;
1860 MVT::SetBlock(*R_,indblock1,*KV_);
1861 MVT::MvTimesMatAddMv(ONE,*cK_HP,*CP,ZERO,*R_);
1862 cK_HP = Teuchos::null;
1863 MVT::SetBlock(*R_,indblock3,*KV_);
1866 MVT::MvTimesMatAddMv(ONE,*cM_XHP,*CX,ZERO,*R_);
1867 cM_XHP = Teuchos::null;
1868 MVT::SetBlock(*R_,indblock1,*MV_);
1869 MVT::MvTimesMatAddMv(ONE,*cM_HP,*CP,ZERO,*R_);
1870 cM_HP = Teuchos::null;
1871 MVT::SetBlock(*R_,indblock3,*MV_);
1874 cM_XHP = Teuchos::null;
1875 cM_HP = Teuchos::null;
1889 TEUCHOS_TEST_FOR_EXCEPTION( cXHP != Teuchos::null || cK_XHP != Teuchos::null || cM_XHP != Teuchos::null
1890 || cHP != Teuchos::null || cK_HP != Teuchos::null || cM_HP != Teuchos::null
1891 || cP != Teuchos::null || cK_P != Teuchos::null || cM_P != Teuchos::null,
1893 "Anasazi::BlockKrylovSchur::iterate(): const views were not all cleared! Something went wrong!" );
1902#ifdef ANASAZI_TEUCHOS_TIME_MONITOR
1903 Teuchos::TimeMonitor lcltimer( *timerCompRes_ );
1905 MVT::MvAddMv( ONE, *KX_, ZERO, *KX_, *R_ );
1906 Teuchos::SerialDenseMatrix<int,ScalarType> T( blockSize_, blockSize_ );
1907 for (
int i = 0; i < blockSize_; i++) {
1910 MVT::MvTimesMatAddMv( -ONE, *MX_, T, ONE, *R_ );
1914 Rnorms_current_ =
false;
1915 R2norms_current_ =
false;
1918 if (om_->isVerbosity(
Debug ) ) {
1928 om_->print(
Debug, accuracyCheck(chk,
": after local update") );
1935 om_->print(
OrthoDetails, accuracyCheck(chk,
": after local update") );