1030 Teuchos::LAPACK<int,ScalarType> lapack;
1031 std::vector<int> index(recycleBlocks_);
1042 setParameters(Teuchos::parameterList(*getValidParameters()));
1046 "Belos::RCGSolMgr::solve(): Linear problem is not a valid object.");
1048 "Belos::RCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
1051 "Belos::RCGSolMgr::solve(): RCG does not support split preconditioning, only set left or right preconditioner.");
1055 if (problem_->getLeftPrec() != Teuchos::null) {
1056 precObj = Teuchos::rcp_const_cast<OP>(problem_->getLeftPrec());
1058 else if (problem_->getRightPrec() != Teuchos::null) {
1059 precObj = Teuchos::rcp_const_cast<OP>(problem_->getRightPrec());
1063 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
1068 problem_->setLSIndex(
currIdx );
1071 ptrdiff_t dim = MVT::GetGlobalLength( *(problem_->getRHS()) );
1072 if (numBlocks_ >
dim) {
1073 numBlocks_ = Teuchos::asSafe<int>(
dim);
1074 params_->set(
"Num Blocks", numBlocks_);
1076 "Warning! Requested Krylov subspace dimension is larger than operator dimension!" << std::endl <<
1077 " The maximum number of blocks allowed for the Krylov subspace will be adjusted to " << numBlocks_ << std::endl;
1081 initializeStateStorage();
1084 Teuchos::ParameterList
plist;
1085 plist.set(
"Num Blocks",numBlocks_);
1086 plist.set(
"Recycled Blocks",recycleBlocks_);
1089 outputTest_->reset();
1096 index.resize(recycleBlocks_);
1097 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1098 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1099 index.resize(recycleBlocks_);
1100 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1101 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_, index );
1105 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1108 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1109 if (
precObj != Teuchos::null ) {
1110 index.resize(recycleBlocks_);
1111 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1112 index.resize(recycleBlocks_);
1113 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1114 Teuchos::RCP<MV>
PCAU = MVT::CloneViewNonConst( *U1_, index );
1125 Teuchos::RCP<RCGIter<ScalarType,MV,OP> >
rcg_iter;
1130#ifdef BELOS_TEUCHOS_TIME_MONITOR
1131 Teuchos::TimeMonitor
slvtimer(*timerSolve_);
1137 if (printer_->isVerbosity(
Debug ) ) {
1138 if (existU_) printer_->print(
Debug,
"Using recycle space generated from previous call to solve()." );
1139 else printer_->print(
Debug,
"No recycle space exists." );
1146 rcg_iter->setSize( recycleBlocks_, numBlocks_ );
1149 outputTest_->resetNumCalls();
1158 problem_->computeCurrResVec( &*r_ );
1163 Teuchos::SerialDenseMatrix<int,ScalarType>
Utr(recycleBlocks_,1);
1164 index.resize(recycleBlocks_);
1165 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1166 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1168 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1169 Teuchos::SerialDenseMatrix<int,ScalarType>
LUUTAUtmp( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ );
1174 "Belos::RCGSolMgr::solve(): LAPACK GESV failed to compute a solution.");
1177 MVT::MvTimesMatAddMv(
one, *
Utmp,
Utr,
one, *problem_->getCurrLHSVec() );
1180 index.resize(recycleBlocks_);
1181 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1182 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_, index );
1186 if (
precObj != Teuchos::null ) {
1187 OPT::Apply( *
precObj, *r_, *z_ );
1193 MVT::MvTransMv(
one, *r_, *z_, *rTz_old_ );
1197 Teuchos::SerialDenseMatrix<int,ScalarType>
mu( Teuchos::View, *Delta_, recycleBlocks_, 1);
1198 index.resize(recycleBlocks_);
1199 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1200 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_, index );
1202 Teuchos::SerialDenseMatrix<int,ScalarType>
LUUTAUtmp( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ );
1207 "Belos::RCGSolMgr::solve(): LAPACK GETRS failed to compute a solution.");
1211 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1218 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1226 index.resize( numBlocks_+1 );
1227 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii; }
1228 newstate.P = MVT::CloneViewNonConst( *P_, index );
1229 index.resize( recycleBlocks_ );
1230 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1231 newstate.U = MVT::CloneViewNonConst( *U_, index );
1232 index.resize( recycleBlocks_ );
1233 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1234 newstate.AU = MVT::CloneViewNonConst( *AU_, index );
1235 newstate.Alpha = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Alpha_, numBlocks_, 1 ) );
1236 newstate.Beta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Beta_, numBlocks_, 1 ) );
1237 newstate.D = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *D_, numBlocks_, 1 ) );
1238 newstate.Delta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_, 0, 1 ) );
1239 newstate.LUUTAU = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ ) );
1262 if ( convTest_->getStatus() ==
Passed ) {
1271 else if ( maxIterTest_->getStatus() ==
Passed ) {
1282 else if (
rcg_iter->getCurSubspaceDim() ==
rcg_iter->getMaxSubspaceDim() ) {
1287 if (recycleBlocks_ > 0) {
1291 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, numBlocks_, numBlocks_ );
1292 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, numBlocks_, numBlocks_ );
1293 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1294 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1295 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_, 1 );
1298 for (
int ii=0;
ii<numBlocks_;
ii++) {
1308 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, numBlocks_, recycleBlocks_ );
1312 index.resize( numBlocks_ );
1313 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii; }
1314 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1315 index.resize( recycleBlocks_ );
1316 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1317 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1323 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, numBlocks_, recycleBlocks_ );
1325 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1329 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, numBlocks_, recycleBlocks_ );
1331 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1334 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, 1 );
1339 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1355 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1356 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, numBlocks_ );
1359 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1360 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_+1, 1 );
1361 Teuchos::SerialDenseMatrix<int,ScalarType>
APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1363 for (
int ii=0;
ii<numBlocks_;
ii++) {
1372 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1373 Teuchos::SerialDenseMatrix<int,ScalarType>
F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1374 Teuchos::SerialDenseMatrix<int,ScalarType>
F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1375 Teuchos::SerialDenseMatrix<int,ScalarType>
F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1376 Teuchos::SerialDenseMatrix<int,ScalarType>
F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1377 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1382 for(
int ii=0;
ii<numBlocks_;
ii++) {
1387 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1388 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1389 Teuchos::SerialDenseMatrix<int,ScalarType>
G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1390 Teuchos::SerialDenseMatrix<int,ScalarType>
G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1391 Teuchos::SerialDenseMatrix<int,ScalarType>
G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1392 Teuchos::SerialDenseMatrix<int,ScalarType>
G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1396 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1397 for (
int jj=0;
jj<numBlocks_;++
jj)
1402 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1406 index.resize( numBlocks_ );
1407 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1408 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1409 index.resize( recycleBlocks_ );
1410 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1411 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1412 Teuchos::SerialDenseMatrix<int,ScalarType>
Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1413 index.resize( recycleBlocks_ );
1414 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1415 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1416 index.resize( recycleBlocks_ );
1417 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1418 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1419 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1427 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1435 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1440 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1446 lastp = numBlocks_+1;
1453 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1454 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_, 1 );
1455 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1456 Teuchos::SerialDenseMatrix<int,ScalarType>
APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1458 for (
int ii=0;
ii<numBlocks_;
ii++) {
1466 Teuchos::SerialDenseMatrix<int,ScalarType>
L2tmp( Teuchos::View, *L2_, numBlocks_+1, numBlocks_ );
1468 for(
int ii=0;
ii<numBlocks_;
ii++) {
1474 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAPtmp( Teuchos::View, *AUTAP_, recycleBlocks_, numBlocks_ );
1475 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1476 Teuchos::SerialDenseMatrix<int,ScalarType>
Deltatmp( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_+1 );
1477 Teuchos::SerialDenseMatrix<int,ScalarType>
DeltaL2tmp( Teuchos::View, *DeltaL2_, recycleBlocks_, numBlocks_ );
1482 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1483 Teuchos::SerialDenseMatrix<int,ScalarType>
F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1484 Teuchos::SerialDenseMatrix<int,ScalarType>
F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1485 Teuchos::SerialDenseMatrix<int,ScalarType>
F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1486 Teuchos::SerialDenseMatrix<int,ScalarType>
F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1491 for(
int ii=0;
ii<numBlocks_;
ii++) {
1496 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1497 Teuchos::SerialDenseMatrix<int,ScalarType>
G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1498 Teuchos::SerialDenseMatrix<int,ScalarType>
G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1499 Teuchos::SerialDenseMatrix<int,ScalarType>
G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1500 Teuchos::SerialDenseMatrix<int,ScalarType>
G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1501 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1505 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1506 for (
int jj=0;
jj<numBlocks_;++
jj)
1511 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1515 index.resize( recycleBlocks_ );
1516 for (
int ii=0;
ii<(recycleBlocks_); ++
ii) { index[
ii] =
ii; }
1517 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1518 index.resize( numBlocks_ );
1519 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii; }
1520 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1521 index.resize( recycleBlocks_ );
1522 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1523 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1524 Teuchos::SerialDenseMatrix<int,ScalarType>
Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1525 index.resize( recycleBlocks_ );
1526 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1527 Teuchos::RCP<MV>
UY1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1528 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1529 index.resize( recycleBlocks_ );
1530 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1531 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1539 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1541 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1545 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1547 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1551 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TUtmp( Teuchos::View, *AU1TU_, recycleBlocks_, recycleBlocks_ );
1555 dold =
Dtmp(numBlocks_-1,0);
1565 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1566 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_+1, 1 );
1567 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1568 Teuchos::SerialDenseMatrix<int,ScalarType>
APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1569 for (
int ii=0;
ii<numBlocks_;
ii++) {
1577 Teuchos::SerialDenseMatrix<int,ScalarType>
L2tmp( Teuchos::View, *L2_, numBlocks_+1, numBlocks_ );
1578 for(
int ii=0;
ii<numBlocks_;
ii++) {
1585 Teuchos::SerialDenseMatrix<int,ScalarType>
DeltaL2( Teuchos::View, *DeltaL2_, recycleBlocks_, numBlocks_ );
1586 Teuchos::SerialDenseMatrix<int,ScalarType>
Deltatmp( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_+1 );
1588 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TUDeltaL2( Teuchos::View, *AU1TUDeltaL2_, recycleBlocks_, numBlocks_ );
1589 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TUtmp( Teuchos::View, *AU1TU_, recycleBlocks_, recycleBlocks_ );
1591 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1592 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, numBlocks_ );
1595 Teuchos::SerialDenseMatrix<int,ScalarType>
Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1597 for(
int ii=0;
ii<recycleBlocks_;
ii++) {
1602 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1TAU1TU( Teuchos::View, *GY_, recycleBlocks_, recycleBlocks_ );
1607 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1608 Teuchos::SerialDenseMatrix<int,ScalarType>
F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1609 Teuchos::SerialDenseMatrix<int,ScalarType>
F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1610 Teuchos::SerialDenseMatrix<int,ScalarType>
F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1611 Teuchos::SerialDenseMatrix<int,ScalarType>
F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1612 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1614 for(
int ii=0;
ii<numBlocks_;
ii++) {
1619 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1620 Teuchos::SerialDenseMatrix<int,ScalarType>
G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1621 Teuchos::SerialDenseMatrix<int,ScalarType>
G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1622 Teuchos::SerialDenseMatrix<int,ScalarType>
G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1623 Teuchos::SerialDenseMatrix<int,ScalarType>
G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1624 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1628 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1629 for (
int jj=0;
jj<numBlocks_;++
jj)
1634 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1638 index.resize( numBlocks_ );
1639 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1640 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1641 index.resize( recycleBlocks_ );
1642 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1643 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1644 index.resize( recycleBlocks_ );
1645 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1646 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1647 index.resize( recycleBlocks_ );
1648 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1649 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1657 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1662 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1667 dold =
Dtmp(numBlocks_-1,0);
1670 lastp = numBlocks_+1;
1682 Teuchos::RCP<const MV>
Ptmp2 = MVT::CloneView( *P_, index );
1683 index[0] = 0; index[1] = 1;
1684 MVT::SetBlock(*
Ptmp2,index,*P_);
1687 (*Beta_)(0,0) = (*Beta_)(
lastBeta,0);
1691 Teuchos::SerialDenseMatrix<int,ScalarType>
mu1( Teuchos::View, *Delta_, recycleBlocks_, 1, 0, 0 );
1692 Teuchos::SerialDenseMatrix<int,ScalarType>
mu2( Teuchos::View, *Delta_, recycleBlocks_, 1, 0, numBlocks_ );
1698 index.resize( numBlocks_+1 );
1699 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii+1; }
1700 newstate.P = MVT::CloneViewNonConst( *P_, index );
1703 newstate.Beta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Beta_, numBlocks_, 1, 1, 0 ) );
1706 newstate.Delta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_, 0, 1 ) );
1726 "Belos::RCGSolMgr::solve(): Invalid return from RCGIter::iterate().");
1732 achievedTol_ = MT::one();
1733 Teuchos::RCP<MV>
X = problem_->getLHS();
1734 MVT::MvInit( *
X, SCT::zero() );
1735 printer_->stream(
Warnings) <<
"Belos::RCGSolMgr::solve(): Warning! NaN has been detected!"
1739 catch (
const std::exception &
e) {
1741 printer_->stream(
Errors) <<
"Error! Caught std::exception in RCGIter::iterate() at iteration "
1742 <<
rcg_iter->getNumIters() << std::endl
1743 <<
e.what() << std::endl;
1749 problem_->setCurrLS();
1756 problem_->setLSIndex(
currIdx );
1765 index.resize(recycleBlocks_);
1766 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1767 MVT::SetBlock(*U1_,index,*U_);
1787 index.resize(recycleBlocks_);
1788 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1789 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1790 index.resize(recycleBlocks_);
1791 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1792 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_, index );
1796 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1799 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1800 if (
precObj != Teuchos::null ) {
1801 index.resize(recycleBlocks_);
1802 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1803 index.resize(recycleBlocks_);
1804 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1805 Teuchos::RCP<MV>
LeftPCAU = MVT::CloneViewNonConst( *U1_, index );
1822#ifdef BELOS_TEUCHOS_TIME_MONITOR
1827 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails) );
1831 numIters_ = maxIterTest_->getNumIters();
1835 using Teuchos::rcp_dynamic_cast;
1842 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1843 "method returned NULL. Please report this bug to the Belos developers.");
1846 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1847 "method returned a vector of length zero. Please report this bug to the "
1848 "Belos developers.");