1029 Teuchos::LAPACK<int,ScalarType> lapack;
1030 std::vector<int> index(recycleBlocks_);
1041 setParameters(Teuchos::parameterList(*getValidParameters()));
1045 "Belos::RCGSolMgr::solve(): Linear problem is not a valid object.");
1047 "Belos::RCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
1050 "Belos::RCGSolMgr::solve(): RCG does not support split preconditioning, only set left or right preconditioner.");
1054 if (problem_->getLeftPrec() != Teuchos::null) {
1055 precObj = Teuchos::rcp_const_cast<OP>(problem_->getLeftPrec());
1057 else if (problem_->getRightPrec() != Teuchos::null) {
1058 precObj = Teuchos::rcp_const_cast<OP>(problem_->getRightPrec());
1062 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
1067 problem_->setLSIndex(
currIdx );
1070 ptrdiff_t dim = MVT::GetGlobalLength( *(problem_->getRHS()) );
1071 if (numBlocks_ >
dim) {
1072 numBlocks_ = Teuchos::asSafe<int>(
dim);
1073 params_->set(
"Num Blocks", numBlocks_);
1075 "Warning! Requested Krylov subspace dimension is larger than operator dimension!" << std::endl <<
1076 " The maximum number of blocks allowed for the Krylov subspace will be adjusted to " << numBlocks_ << std::endl;
1080 initializeStateStorage();
1083 Teuchos::ParameterList
plist;
1084 plist.set(
"Num Blocks",numBlocks_);
1085 plist.set(
"Recycled Blocks",recycleBlocks_);
1088 outputTest_->reset();
1095 index.resize(recycleBlocks_);
1096 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1097 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1098 index.resize(recycleBlocks_);
1099 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1100 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_, index );
1104 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1107 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1108 if (
precObj != Teuchos::null ) {
1109 index.resize(recycleBlocks_);
1110 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1111 index.resize(recycleBlocks_);
1112 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1113 Teuchos::RCP<MV>
PCAU = MVT::CloneViewNonConst( *U1_, index );
1124 Teuchos::RCP<RCGIter<ScalarType,MV,OP> >
rcg_iter;
1129#ifdef BELOS_TEUCHOS_TIME_MONITOR
1130 Teuchos::TimeMonitor
slvtimer(*timerSolve_);
1136 if (printer_->isVerbosity(
Debug ) ) {
1137 if (existU_) printer_->print(
Debug,
"Using recycle space generated from previous call to solve()." );
1138 else printer_->print(
Debug,
"No recycle space exists." );
1145 rcg_iter->setSize( recycleBlocks_, numBlocks_ );
1148 outputTest_->resetNumCalls();
1157 problem_->computeCurrResVec( &*r_ );
1162 Teuchos::SerialDenseMatrix<int,ScalarType>
Utr(recycleBlocks_,1);
1163 index.resize(recycleBlocks_);
1164 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1165 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1167 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1168 Teuchos::SerialDenseMatrix<int,ScalarType>
LUUTAUtmp( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ );
1173 "Belos::RCGSolMgr::solve(): LAPACK GESV failed to compute a solution.");
1176 MVT::MvTimesMatAddMv(
one, *
Utmp,
Utr,
one, *problem_->getCurrLHSVec() );
1179 index.resize(recycleBlocks_);
1180 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1181 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_, index );
1185 if (
precObj != Teuchos::null ) {
1186 OPT::Apply( *
precObj, *r_, *z_ );
1192 MVT::MvTransMv(
one, *r_, *z_, *rTz_old_ );
1196 Teuchos::SerialDenseMatrix<int,ScalarType>
mu( Teuchos::View, *Delta_, recycleBlocks_, 1);
1197 index.resize(recycleBlocks_);
1198 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1199 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_, index );
1201 Teuchos::SerialDenseMatrix<int,ScalarType>
LUUTAUtmp( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ );
1206 "Belos::RCGSolMgr::solve(): LAPACK GETRS failed to compute a solution.");
1210 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1217 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1225 index.resize( numBlocks_+1 );
1226 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii; }
1227 newstate.P = MVT::CloneViewNonConst( *P_, index );
1228 index.resize( recycleBlocks_ );
1229 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1230 newstate.U = MVT::CloneViewNonConst( *U_, index );
1231 index.resize( recycleBlocks_ );
1232 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1233 newstate.AU = MVT::CloneViewNonConst( *AU_, index );
1234 newstate.Alpha = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Alpha_, numBlocks_, 1 ) );
1235 newstate.Beta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Beta_, numBlocks_, 1 ) );
1236 newstate.D = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *D_, numBlocks_, 1 ) );
1237 newstate.Delta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_, 0, 1 ) );
1238 newstate.LUUTAU = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *LUUTAU_, recycleBlocks_, recycleBlocks_ ) );
1261 if ( convTest_->getStatus() ==
Passed ) {
1270 else if ( maxIterTest_->getStatus() ==
Passed ) {
1280 else if (
rcg_iter->getCurSubspaceDim() ==
rcg_iter->getMaxSubspaceDim() ) {
1285 if (recycleBlocks_ > 0) {
1289 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, numBlocks_, numBlocks_ );
1290 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, numBlocks_, numBlocks_ );
1291 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1292 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1293 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_, 1 );
1296 for (
int ii=0;
ii<numBlocks_;
ii++) {
1306 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, numBlocks_, recycleBlocks_ );
1310 index.resize( numBlocks_ );
1311 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii; }
1312 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1313 index.resize( recycleBlocks_ );
1314 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1315 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1321 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, numBlocks_, recycleBlocks_ );
1323 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1327 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, numBlocks_, recycleBlocks_ );
1329 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1332 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, 1 );
1337 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1353 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1354 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, numBlocks_ );
1357 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1358 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_+1, 1 );
1359 Teuchos::SerialDenseMatrix<int,ScalarType>
APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1361 for (
int ii=0;
ii<numBlocks_;
ii++) {
1370 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1371 Teuchos::SerialDenseMatrix<int,ScalarType>
F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1372 Teuchos::SerialDenseMatrix<int,ScalarType>
F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1373 Teuchos::SerialDenseMatrix<int,ScalarType>
F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1374 Teuchos::SerialDenseMatrix<int,ScalarType>
F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1375 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1380 for(
int ii=0;
ii<numBlocks_;
ii++) {
1385 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1386 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1387 Teuchos::SerialDenseMatrix<int,ScalarType>
G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1388 Teuchos::SerialDenseMatrix<int,ScalarType>
G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1389 Teuchos::SerialDenseMatrix<int,ScalarType>
G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1390 Teuchos::SerialDenseMatrix<int,ScalarType>
G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1394 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1395 for (
int jj=0;
jj<numBlocks_;++
jj)
1400 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1404 index.resize( numBlocks_ );
1405 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1406 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1407 index.resize( recycleBlocks_ );
1408 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1409 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1410 Teuchos::SerialDenseMatrix<int,ScalarType>
Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1411 index.resize( recycleBlocks_ );
1412 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1413 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1414 index.resize( recycleBlocks_ );
1415 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1416 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1417 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1425 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1433 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1438 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1444 lastp = numBlocks_+1;
1451 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1452 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_, 1 );
1453 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1454 Teuchos::SerialDenseMatrix<int,ScalarType>
APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1456 for (
int ii=0;
ii<numBlocks_;
ii++) {
1464 Teuchos::SerialDenseMatrix<int,ScalarType>
L2tmp( Teuchos::View, *L2_, numBlocks_+1, numBlocks_ );
1466 for(
int ii=0;
ii<numBlocks_;
ii++) {
1472 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAPtmp( Teuchos::View, *AUTAP_, recycleBlocks_, numBlocks_ );
1473 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1474 Teuchos::SerialDenseMatrix<int,ScalarType>
Deltatmp( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_+1 );
1475 Teuchos::SerialDenseMatrix<int,ScalarType>
DeltaL2tmp( Teuchos::View, *DeltaL2_, recycleBlocks_, numBlocks_ );
1480 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1481 Teuchos::SerialDenseMatrix<int,ScalarType>
F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1482 Teuchos::SerialDenseMatrix<int,ScalarType>
F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1483 Teuchos::SerialDenseMatrix<int,ScalarType>
F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1484 Teuchos::SerialDenseMatrix<int,ScalarType>
F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1489 for(
int ii=0;
ii<numBlocks_;
ii++) {
1494 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1495 Teuchos::SerialDenseMatrix<int,ScalarType>
G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1496 Teuchos::SerialDenseMatrix<int,ScalarType>
G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1497 Teuchos::SerialDenseMatrix<int,ScalarType>
G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1498 Teuchos::SerialDenseMatrix<int,ScalarType>
G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1499 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1503 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1504 for (
int jj=0;
jj<numBlocks_;++
jj)
1509 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1513 index.resize( recycleBlocks_ );
1514 for (
int ii=0;
ii<(recycleBlocks_); ++
ii) { index[
ii] =
ii; }
1515 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1516 index.resize( numBlocks_ );
1517 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii; }
1518 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1519 index.resize( recycleBlocks_ );
1520 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1521 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1522 Teuchos::SerialDenseMatrix<int,ScalarType>
Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1523 index.resize( recycleBlocks_ );
1524 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1525 Teuchos::RCP<MV>
UY1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1526 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1527 index.resize( recycleBlocks_ );
1528 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1529 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1537 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1539 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1543 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1545 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1549 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TUtmp( Teuchos::View, *AU1TU_, recycleBlocks_, recycleBlocks_ );
1553 dold =
Dtmp(numBlocks_-1,0);
1563 Teuchos::SerialDenseMatrix<int,ScalarType>
Alphatmp( Teuchos::View, *Alpha_, numBlocks_, 1 );
1564 Teuchos::SerialDenseMatrix<int,ScalarType>
Betatmp( Teuchos::View, *Beta_, numBlocks_+1, 1 );
1565 Teuchos::SerialDenseMatrix<int,ScalarType>
Dtmp( Teuchos::View, *D_, numBlocks_, 1 );
1566 Teuchos::SerialDenseMatrix<int,ScalarType>
APTAPtmp( Teuchos::View, *APTAP_, numBlocks_, numBlocks_ );
1567 for (
int ii=0;
ii<numBlocks_;
ii++) {
1575 Teuchos::SerialDenseMatrix<int,ScalarType>
L2tmp( Teuchos::View, *L2_, numBlocks_+1, numBlocks_ );
1576 for(
int ii=0;
ii<numBlocks_;
ii++) {
1583 Teuchos::SerialDenseMatrix<int,ScalarType>
DeltaL2( Teuchos::View, *DeltaL2_, recycleBlocks_, numBlocks_ );
1584 Teuchos::SerialDenseMatrix<int,ScalarType>
Deltatmp( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_+1 );
1586 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TUDeltaL2( Teuchos::View, *AU1TUDeltaL2_, recycleBlocks_, numBlocks_ );
1587 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TUtmp( Teuchos::View, *AU1TU_, recycleBlocks_, recycleBlocks_ );
1589 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1( Teuchos::View, *Y_, recycleBlocks_, recycleBlocks_ );
1590 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAPtmp( Teuchos::View, *AU1TAP_, recycleBlocks_, numBlocks_ );
1593 Teuchos::SerialDenseMatrix<int,ScalarType>
Y2( Teuchos::View, *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1595 for(
int ii=0;
ii<recycleBlocks_;
ii++) {
1600 Teuchos::SerialDenseMatrix<int,ScalarType>
Y1TAU1TU( Teuchos::View, *GY_, recycleBlocks_, recycleBlocks_ );
1605 Teuchos::SerialDenseMatrix<int,ScalarType>
Ftmp( Teuchos::View, *F_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1606 Teuchos::SerialDenseMatrix<int,ScalarType>
F11( Teuchos::View, *F_, recycleBlocks_, recycleBlocks_ );
1607 Teuchos::SerialDenseMatrix<int,ScalarType>
F12( Teuchos::View, *F_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1608 Teuchos::SerialDenseMatrix<int,ScalarType>
F21( Teuchos::View, *F_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1609 Teuchos::SerialDenseMatrix<int,ScalarType>
F22( Teuchos::View, *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1610 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TU1tmp( Teuchos::View, *AU1TU1_, recycleBlocks_, recycleBlocks_ );
1612 for(
int ii=0;
ii<numBlocks_;
ii++) {
1617 Teuchos::SerialDenseMatrix<int,ScalarType>
Gtmp( Teuchos::View, *G_, (numBlocks_+recycleBlocks_), (numBlocks_+recycleBlocks_) );
1618 Teuchos::SerialDenseMatrix<int,ScalarType>
G11( Teuchos::View, *G_, recycleBlocks_, recycleBlocks_ );
1619 Teuchos::SerialDenseMatrix<int,ScalarType>
G12( Teuchos::View, *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1620 Teuchos::SerialDenseMatrix<int,ScalarType>
G21( Teuchos::View, *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1621 Teuchos::SerialDenseMatrix<int,ScalarType>
G22( Teuchos::View, *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1622 Teuchos::SerialDenseMatrix<int,ScalarType>
AU1TAU1tmp( Teuchos::View, *AU1TAU1_, recycleBlocks_, recycleBlocks_ );
1626 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1627 for (
int jj=0;
jj<numBlocks_;++
jj)
1632 Teuchos::SerialDenseMatrix<int,ScalarType>
Ytmp( Teuchos::View, *Y_, (recycleBlocks_+numBlocks_), recycleBlocks_ );
1636 index.resize( numBlocks_ );
1637 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1638 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1639 index.resize( recycleBlocks_ );
1640 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1641 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_, index );
1642 index.resize( recycleBlocks_ );
1643 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1644 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_, index );
1645 index.resize( recycleBlocks_ );
1646 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1647 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_, index );
1655 Teuchos::SerialDenseMatrix<int,ScalarType>
GYtmp( Teuchos::View, *GY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1660 Teuchos::SerialDenseMatrix<int,ScalarType>
FYtmp( Teuchos::View, *FY_, (numBlocks_+recycleBlocks_), recycleBlocks_ );
1665 dold =
Dtmp(numBlocks_-1,0);
1668 lastp = numBlocks_+1;
1680 Teuchos::RCP<const MV>
Ptmp2 = MVT::CloneView( *P_, index );
1681 index[0] = 0; index[1] = 1;
1682 MVT::SetBlock(*
Ptmp2,index,*P_);
1685 (*Beta_)(0,0) = (*Beta_)(
lastBeta,0);
1689 Teuchos::SerialDenseMatrix<int,ScalarType>
mu1( Teuchos::View, *Delta_, recycleBlocks_, 1, 0, 0 );
1690 Teuchos::SerialDenseMatrix<int,ScalarType>
mu2( Teuchos::View, *Delta_, recycleBlocks_, 1, 0, numBlocks_ );
1696 index.resize( numBlocks_+1 );
1697 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii+1; }
1698 newstate.P = MVT::CloneViewNonConst( *P_, index );
1701 newstate.Beta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Beta_, numBlocks_, 1, 1, 0 ) );
1704 newstate.Delta = Teuchos::rcp(
new Teuchos::SerialDenseMatrix<int,ScalarType>( Teuchos::View, *Delta_, recycleBlocks_, numBlocks_, 0, 1 ) );
1723 "Belos::RCGSolMgr::solve(): Invalid return from RCGIter::iterate().");
1728 achievedTol_ = MT::one();
1729 Teuchos::RCP<MV>
X = problem_->getLHS();
1730 MVT::MvInit( *
X, SCT::zero() );
1731 printer_->stream(
Warnings) <<
"Belos::RCGSolMgr::solve(): Warning! NaN has been detected!"
1735 catch (
const std::exception &
e) {
1736 printer_->stream(
Errors) <<
"Error! Caught std::exception in RCGIter::iterate() at iteration "
1737 <<
rcg_iter->getNumIters() << std::endl
1738 <<
e.what() << std::endl;
1744 problem_->setCurrLS();
1751 problem_->setLSIndex(
currIdx );
1760 index.resize(recycleBlocks_);
1761 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1762 MVT::SetBlock(*U1_,index,*U_);
1782 index.resize(recycleBlocks_);
1783 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1784 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_, index );
1785 index.resize(recycleBlocks_);
1786 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1787 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_, index );
1791 Teuchos::SerialDenseMatrix<int,ScalarType>
UTAUtmp( Teuchos::View, *UTAU_, recycleBlocks_, recycleBlocks_ );
1794 Teuchos::SerialDenseMatrix<int,ScalarType>
AUTAUtmp( Teuchos::View, *AUTAU_, recycleBlocks_, recycleBlocks_ );
1795 if (
precObj != Teuchos::null ) {
1796 index.resize(recycleBlocks_);
1797 for (
int i=0;
i<recycleBlocks_; ++
i) { index[
i] =
i; }
1798 index.resize(recycleBlocks_);
1799 for (
int ii=0;
ii<recycleBlocks_; ++
ii) { index[
ii] =
ii; }
1800 Teuchos::RCP<MV>
LeftPCAU = MVT::CloneViewNonConst( *U1_, index );
1817#ifdef BELOS_TEUCHOS_TIME_MONITOR
1822 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails) );
1826 numIters_ = maxIterTest_->getNumIters();
1830 using Teuchos::rcp_dynamic_cast;
1837 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1838 "method returned NULL. Please report this bug to the Belos developers.");
1841 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1842 "method returned a vector of length zero. Please report this bug to the "
1843 "Belos developers.");