1050 Teuchos::BLAS<int,ScalarType>
blas;
1051 Teuchos::LAPACK<int,ScalarType> lapack;
1055 std::vector<int> index(1),
rindex(recycleBlocks_),
nindex(numBlocks_);
1056 for (
int i=0;
i<recycleBlocks_; ++
i) {
rindex[
i] =
i; }
1057 for (
int i=0;
i<numBlocks_; ++
i) {
nindex[
i] =
i; }
1066 setParameters(Teuchos::parameterList(*getValidParameters()));
1070 "Belos::RCGSolMgr::solve(): Linear problem is not a valid object.");
1072 "Belos::RCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
1075 "Belos::RCGSolMgr::solve(): RCG does not support split preconditioning, only set left or right preconditioner.");
1079 if (problem_->getLeftPrec() != Teuchos::null) {
1080 precObj = Teuchos::rcp_const_cast<OP>(problem_->getLeftPrec());
1082 else if (problem_->getRightPrec() != Teuchos::null) {
1083 precObj = Teuchos::rcp_const_cast<OP>(problem_->getRightPrec());
1087 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
1092 problem_->setLSIndex(
currIdx );
1095 ptrdiff_t dim = MVT::GetGlobalLength( *(problem_->getRHS()) );
1096 if (numBlocks_ >
dim) {
1097 numBlocks_ = Teuchos::asSafe<int>(
dim);
1098 params_->set(
"Num Blocks", numBlocks_);
1100 "Warning! Requested Krylov subspace dimension is larger than operator dimension!" << std::endl <<
1101 " The maximum number of blocks allowed for the Krylov subspace will be adjusted to " << numBlocks_ << std::endl;
1105 initializeStateStorage();
1108 Teuchos::ParameterList
plist;
1109 plist.set(
"Num Blocks",numBlocks_);
1110 plist.set(
"Recycled Blocks",recycleBlocks_);
1113 outputTest_->reset();
1120 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1121 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_,
rindex );
1127 if (
precObj != Teuchos::null ) {
1128 Teuchos::RCP<MV>
PCAU = MVT::CloneViewNonConst( *U1_,
rindex );
1139 Teuchos::RCP<RCGIter<ScalarType,MV,OP,DM> >
rcg_iter;
1144#ifdef BELOS_TEUCHOS_TIME_MONITOR
1145 Teuchos::TimeMonitor
slvtimer(*timerSolve_);
1151 if (printer_->isVerbosity(
Debug ) ) {
1152 if (existU_) printer_->print(
Debug,
"Using recycle space generated from previous call to solve()." );
1153 else printer_->print(
Debug,
"No recycle space exists." );
1160 rcg_iter->setSize( recycleBlocks_, numBlocks_ );
1163 outputTest_->resetNumCalls();
1172 problem_->computeCurrResVec( &*r_ );
1177 Teuchos::RCP<DM>
Utr = DMT::Create(recycleBlocks_,1);
1178 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1181 DMT::SyncHostToDevice(*LUUTAU_);
1182 DMT::Assign(*LUUTAU_,*UTAU_);
1183 DMT::SyncDeviceToHost( *LUUTAU_ );
1184 DMT::SyncDeviceToHost( *
Utr );
1186 lapack.GESV(recycleBlocks_, 1, DMT::GetRawHostPtr(*LUUTAU_), DMT::GetStride(*LUUTAU_),
1187 &(*ipiv_)[0], DMT::GetRawHostPtr(*
Utr), DMT::GetStride(*
Utr), &
info);
1189 "Belos::RCGSolMgr::solve(): LAPACK GESV failed to compute a solution.");
1190 DMT::SyncHostToDevice( *
Utr );
1193 MVT::MvTimesMatAddMv(
one, *
Utmp, *
Utr,
one, *problem_->getCurrLHSVec() );
1196 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_,
rindex );
1200 if (
precObj != Teuchos::null ) {
1201 OPT::Apply( *
precObj, *r_, *z_ );
1207 MVT::MvDot( *r_, *z_, *rTz_old_ );
1211 Teuchos::RCP<DM>
mu = DMT::Subview(*Delta_, recycleBlocks_, 1);
1212 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_,
rindex );
1215 DMT::SyncDeviceToHost( *Delta_ );
1218 lapack.GETRS(
TRANS, recycleBlocks_, 1, DMT::GetConstRawHostPtr(*LUUTAU_), DMT::GetStride(*LUUTAU_),
1219 &(*ipiv_)[0], DMT::GetRawHostPtr(*
mu), DMT::GetStride(*
mu), &
info );
1221 "Belos::RCGSolMgr::solve(): LAPACK GETRS failed to compute a solution.");
1222 DMT::SyncHostToDevice( *
mu );
1227 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1228 MVT::Assign(*z_,*
Ptmp);
1234 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1235 MVT::Assign(*z_,*
Ptmp);
1242 index.resize( numBlocks_+1 );
1243 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii; }
1244 newstate.P = MVT::CloneViewNonConst( *P_, index );
1275 if ( convTest_->getStatus() ==
Passed ) {
1284 else if ( maxIterTest_->getStatus() ==
Passed ) {
1295 else if (
rcg_iter->getCurSubspaceDim() ==
rcg_iter->getMaxSubspaceDim() ) {
1300 if (recycleBlocks_ > 0) {
1304 Teuchos::RCP<DM>
Ftmp = DMT::Subview( *F_, numBlocks_, numBlocks_ );
1305 Teuchos::RCP<DM>
Gtmp = DMT::Subview( *G_, numBlocks_, numBlocks_ );
1308 DMT::SyncDeviceToHost( *F_ );
1309 DMT::SyncDeviceToHost( *G_ );
1310 for (
int ii=0;
ii<numBlocks_;
ii++) {
1311 DMT::Value(*
Gtmp,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii]);
1313 DMT::Value(*
Gtmp,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1314 DMT::Value(*
Gtmp,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1318 DMT::SyncHostToDevice( *F_ );
1319 DMT::SyncHostToDevice( *G_ );
1322 DMT::SyncDeviceToHost( *Y_ );
1323 Teuchos::RCP<DM>
Ytmp = DMT::Subview( *Y_, numBlocks_, recycleBlocks_ );
1325 DMT::SyncHostToDevice( *Y_ );
1328 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_,
nindex );
1329 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1333 DMT::SyncDeviceToHost(*GY_);
1334 DMT::SyncDeviceToHost(*AU1TAU1_);
1335 DMT::SyncDeviceToHost(*FY_);
1336 DMT::SyncDeviceToHost(*AU1TU1_);
1339 Teuchos::RCP<DM>
GYtmp = DMT::Subview( *GY_, numBlocks_, recycleBlocks_ );
1341 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_, recycleBlocks_, numBlocks_,
1342 one, DMT::GetConstRawHostPtr(*
Gtmp), DMT::GetStride(*
Gtmp),
1343 DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1346 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_, numBlocks_,
1347 one, DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1348 DMT::GetConstRawHostPtr(*
GYtmp), DMT::GetStride(*
GYtmp),
1349 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1353 Teuchos::RCP<DM>
FYtmp = DMT::Subview( *FY_, numBlocks_, recycleBlocks_ );
1355 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_, recycleBlocks_, numBlocks_,
1356 one, DMT::GetConstRawHostPtr(*
Ftmp), DMT::GetStride(*
Ftmp),
1357 DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1360 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_, numBlocks_,
1361 one, DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1362 DMT::GetConstRawHostPtr(*
FYtmp), DMT::GetStride(*
FYtmp),
1363 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1365 DMT::SyncHostToDevice(*AU1TAU1_);
1366 DMT::SyncHostToDevice(*AU1TU1_);
1367 DMT::SyncHostToDevice(*AU1TAP_);
1369 Teuchos::RCP<DM>
AU1TAPtmp = DMT::Subview( *AU1TAP_, recycleBlocks_, 1 );
1373 DMT::SyncDeviceToHost( *AU1TAP_ );
1375 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1378 DMT::SyncHostToDevice(*AU1TAP_);
1392 DMT::Scale(*AU1TAP_,(*D_)[0]);
1394 DMT::PutScalar(*APTAP_,
zero);
1395 DMT::SyncDeviceToHost(*APTAP_);
1396 for (
int ii=0;
ii<numBlocks_;
ii++) {
1397 DMT::Value(*APTAP_,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii+1]);
1399 DMT::Value(*APTAP_,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1400 DMT::Value(*APTAP_,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1403 DMT::SyncHostToDevice(*APTAP_);
1406 DMT::PutScalar(*F_,
zero);
1407 Teuchos::RCP<DM>
F11 = DMT::Subview( *F_, recycleBlocks_, recycleBlocks_ );
1408 Teuchos::RCP<DM>
F22 = DMT::Subview( *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1409 DMT::Assign(*
F11,*AU1TU1_);
1410 DMT::SyncDeviceToHost(*F_);
1411 for(
int ii=0;
ii<numBlocks_;
ii++) {
1414 DMT::SyncHostToDevice(*F_);
1417 Teuchos::RCP<DM>
G11 = DMT::Subview( *G_, recycleBlocks_, recycleBlocks_ );
1418 Teuchos::RCP<DM>
G12 = DMT::Subview( *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1419 Teuchos::RCP<DM>
G21 = DMT::Subview( *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1420 Teuchos::RCP<DM>
G22 = DMT::Subview( *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1421 DMT::Assign(*
G11, *AU1TAU1_);
1422 DMT::Assign(*
G12, *AU1TAP_);
1423 DMT::Assign(*
G22, *APTAP_);
1424 DMT::SyncDeviceToHost( *G_ );
1426 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1427 for (
int jj=0;
jj<numBlocks_;++
jj)
1429 DMT::SyncHostToDevice( *G_ );
1432 getHarmonicVecs(*F_,*G_,*Y_);
1433 DMT::SyncHostToDevice( *Y_ );
1436 index.resize( numBlocks_ );
1437 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1438 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1439 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_,
rindex );
1440 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1441 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_,
rindex );
1442 Teuchos::RCP<const DM>
Y1 = DMT::SubviewConst( *Y_, recycleBlocks_, recycleBlocks_ );
1443 Teuchos::RCP<const DM>
Y2 = DMT::SubviewConst( *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1449 DMT::SyncDeviceToHost(*GY_);
1450 DMT::SyncDeviceToHost(*AU1TAU1_);
1454 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1455 recycleBlocks_, numBlocks_+recycleBlocks_,
1456 one, DMT::GetConstRawHostPtr(*G_), DMT::GetStride(*G_),
1457 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1458 zero, DMT::GetRawHostPtr(*GY_), DMT::GetStride(*GY_));
1460 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1461 numBlocks_+recycleBlocks_,
1462 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1463 DMT::GetConstRawHostPtr(*GY_), DMT::GetStride(*GY_),
1464 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1466 DMT::SyncHostToDevice(*GY_);
1467 DMT::SyncHostToDevice(*AU1TAU1_);
1471 DMT::PutScalar(*AU1TAP_,
zero);
1473 DMT::SyncDeviceToHost(*AU1TAP_);
1474 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1475 DMT::Value(*AU1TAP_,
ii,0) = DMT::ValueConst(*Y_,numBlocks_+recycleBlocks_-1,
ii) *
alphatmp;
1477 DMT::SyncHostToDevice(*AU1TAP_);
1479 DMT::SyncDeviceToHost(*FY_);
1480 DMT::SyncDeviceToHost(*AU1TU1_);
1484 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1485 recycleBlocks_, numBlocks_+recycleBlocks_,
1486 one, DMT::GetConstRawHostPtr(*F_), DMT::GetStride(*F_),
1487 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1488 zero, DMT::GetRawHostPtr(*FY_), DMT::GetStride(*FY_));
1490 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1491 numBlocks_+recycleBlocks_,
1492 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1493 DMT::GetConstRawHostPtr(*FY_), DMT::GetStride(*FY_),
1494 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1496 DMT::SyncHostToDevice(*FY_);
1497 DMT::SyncHostToDevice(*AU1TU1_);
1500 lastp = numBlocks_+1;
1507 DMT::PutScalar(*APTAP_,
zero);
1508 DMT::SyncDeviceToHost(*APTAP_);
1509 for (
int ii=0;
ii<numBlocks_;
ii++) {
1510 DMT::Value(*APTAP_,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii]);
1512 DMT::Value(*APTAP_,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1513 DMT::Value(*APTAP_,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1516 DMT::SyncHostToDevice(*APTAP_);
1518 DMT::PutScalar(*L2_,
zero);
1519 DMT::SyncDeviceToHost(*L2_);
1520 for(
int ii=0;
ii<numBlocks_;
ii++) {
1521 DMT::Value(*L2_,
ii,
ii) = 1./(*Alpha_)[
ii];
1522 DMT::Value(*L2_,
ii+1,
ii) = -1./(*Alpha_)[
ii];
1524 DMT::SyncHostToDevice(*L2_);
1527 DMT::SyncDeviceToHost(*Delta_);
1528 DMT::SyncDeviceToHost(*DeltaL2_);
1529 DMT::SyncDeviceToHost(*AUTAP_);
1530 DMT::SyncDeviceToHost(*UTAU_);
1533 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, numBlocks_+1,
1534 one, DMT::GetConstRawHostPtr(*Delta_), DMT::GetStride(*Delta_),
1535 DMT::GetConstRawHostPtr(*L2_), DMT::GetStride(*L2_),
1536 zero, DMT::GetRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_));
1538 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, recycleBlocks_,
1539 one, DMT::GetConstRawHostPtr(*UTAU_), DMT::GetStride(*UTAU_),
1540 DMT::GetConstRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_),
1541 zero, DMT::GetRawHostPtr(*AUTAP_), DMT::GetStride(*AUTAP_));
1543 DMT::SyncHostToDevice(*DeltaL2_);
1544 DMT::SyncHostToDevice(*AUTAP_);
1547 DMT::PutScalar(*F_,
zero);
1548 Teuchos::RCP<DM>
F11 = DMT::Subview( *F_, recycleBlocks_, recycleBlocks_ );
1549 Teuchos::RCP<DM>
F22 = DMT::Subview( *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1550 DMT::Assign(*
F11,*UTAU_);
1551 DMT::SyncDeviceToHost(*F_);
1552 for(
int ii=0;
ii<numBlocks_;
ii++) {
1555 DMT::SyncHostToDevice(*F_);
1558 Teuchos::RCP<DM>
G11 = DMT::Subview( *G_, recycleBlocks_, recycleBlocks_ );
1559 Teuchos::RCP<DM>
G12 = DMT::Subview( *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1560 Teuchos::RCP<DM>
G21 = DMT::Subview( *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1561 Teuchos::RCP<DM>
G22 = DMT::Subview( *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1562 DMT::Assign(*
G11,*AUTAU_);
1563 DMT::Assign(*
G12,*AUTAP_);
1564 DMT::Assign(*
G22,*APTAP_);
1565 DMT::SyncDeviceToHost(*G_);
1567 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1568 for (
int jj=0;
jj<numBlocks_;++
jj)
1570 DMT::SyncHostToDevice(*G_);
1573 getHarmonicVecs(*F_,*G_,*Y_);
1574 DMT::SyncHostToDevice(*Y_);
1577 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1578 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_,
nindex );
1579 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_,
rindex );
1580 Teuchos::RCP<MV>
UY1tmp = MVT::CloneViewNonConst( *U1Y1_,
rindex );
1581 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1582 Teuchos::RCP<const DM>
Y1 = DMT::SubviewConst( *Y_, recycleBlocks_, recycleBlocks_ );
1583 Teuchos::RCP<const DM>
Y2 = DMT::SubviewConst( *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1589 DMT::SyncDeviceToHost(*GY_);
1590 DMT::SyncDeviceToHost(*AU1TAU1_);
1591 DMT::SyncDeviceToHost(*FY_);
1592 DMT::SyncDeviceToHost(*AU1TU1_);
1596 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1597 recycleBlocks_, numBlocks_+recycleBlocks_,
1598 one, DMT::GetConstRawHostPtr(*G_), DMT::GetStride(*G_),
1599 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1600 zero, DMT::GetRawHostPtr(*GY_), DMT::GetStride(*GY_));
1602 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1603 numBlocks_+recycleBlocks_,
1604 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1605 DMT::GetConstRawHostPtr(*GY_), DMT::GetStride(*GY_),
1606 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1610 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1611 recycleBlocks_, numBlocks_+recycleBlocks_,
1612 one, DMT::GetConstRawHostPtr(*F_), DMT::GetStride(*F_),
1613 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1614 zero, DMT::GetRawHostPtr(*FY_), DMT::GetStride(*FY_));
1616 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1617 numBlocks_+recycleBlocks_,
1618 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1619 DMT::GetConstRawHostPtr(*FY_), DMT::GetStride(*FY_),
1620 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1622 DMT::SyncHostToDevice(*GY_);
1623 DMT::SyncHostToDevice(*AU1TAU1_);
1624 DMT::SyncHostToDevice(*FY_);
1625 DMT::SyncHostToDevice(*AU1TU1_);
1628 DMT::Assign(*AU1TU_,*UTAU_);
1631 dold = (*D_)[numBlocks_-1];
1642 DMT::SyncDeviceToHost(*APTAP_);
1643 for (
int ii=0;
ii<numBlocks_;
ii++) {
1644 DMT::Value(*APTAP_,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii+1]);
1646 DMT::Value(*APTAP_,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1647 DMT::Value(*APTAP_,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1650 DMT::SyncHostToDevice(*APTAP_);
1652 DMT::SyncDeviceToHost(*L2_);
1653 for(
int ii=0;
ii<numBlocks_;
ii++) {
1654 DMT::Value(*L2_,
ii,
ii) = 1./(*Alpha_)[
ii];
1655 DMT::Value(*L2_,
ii+1,
ii) = -1./(*Alpha_)[
ii];
1657 DMT::SyncHostToDevice(*L2_);
1659 DMT::SyncDeviceToHost(*Delta_);
1660 DMT::SyncDeviceToHost(*DeltaL2_);
1661 DMT::SyncDeviceToHost(*AU1TUDeltaL2_);
1662 DMT::SyncDeviceToHost(*AU1TAP_);
1667 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, numBlocks_+1,
1668 one, DMT::GetConstRawHostPtr(*Delta_), DMT::GetStride(*Delta_),
1669 DMT::GetConstRawHostPtr(*L2_), DMT::GetStride(*L2_),
1670 zero, DMT::GetRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_));
1672 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, recycleBlocks_,
1673 one, DMT::GetConstRawHostPtr(*AU1TU_), DMT::GetStride(*AU1TU_),
1674 DMT::GetConstRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_),
1675 zero, DMT::GetRawHostPtr(*AU1TUDeltaL2_), DMT::GetStride(*AU1TUDeltaL2_));
1677 DMT::SyncDeviceToHost( *Y_);
1678 Teuchos::RCP<const DM>
Y1 = DMT::SubviewConst( *Y_, recycleBlocks_, recycleBlocks_ );
1679 Teuchos::RCP<const DM>
Y2 = DMT::SubviewConst( *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1682 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, recycleBlocks_,
1683 one, DMT::GetConstRawHostPtr(*
Y1), DMT::GetStride(*
Y1),
1684 DMT::GetConstRawHostPtr(*AU1TUDeltaL2_), DMT::GetStride(*AU1TUDeltaL2_),
1685 zero, DMT::GetRawHostPtr(*AU1TAP_), DMT::GetStride(*AU1TAP_));
1687 for(
int ii=0;
ii<recycleBlocks_;
ii++) {
1688 DMT::Value(*AU1TAP_,
ii,0) += DMT::ValueConst(*
Y2,numBlocks_-1,
ii)*
val;
1690 DMT::SyncHostToDevice(*AU1TAP_);
1693 Teuchos::RCP<DM>
Y1TAU1TU = DMT::Subview( *GY_, recycleBlocks_, recycleBlocks_ );
1695 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_, recycleBlocks_,
1696 one, DMT::GetConstRawHostPtr(*
Y1), DMT::GetStride(*
Y1),
1697 DMT::GetConstRawHostPtr(*AU1TU_), DMT::GetStride(*AU1TU_),
1699 DMT::SyncHostToDevice(*GY_);
1703 DMT::PutScalar(*F_,
zero);
1704 Teuchos::RCP<DM>
F11 = DMT::Subview( *F_, recycleBlocks_, recycleBlocks_ );
1705 Teuchos::RCP<DM>
F22 = DMT::Subview( *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1706 DMT::Assign(*
F11,*AU1TU1_);
1707 DMT::SyncDeviceToHost(*F_);
1708 for(
int ii=0;
ii<numBlocks_;
ii++) {
1711 DMT::SyncHostToDevice(*F_);
1714 Teuchos::RCP<DM>
G11 = DMT::Subview( *G_, recycleBlocks_, recycleBlocks_ );
1715 Teuchos::RCP<DM>
G12 = DMT::Subview( *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1716 Teuchos::RCP<DM>
G21 = DMT::Subview( *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1717 Teuchos::RCP<DM>
G22 = DMT::Subview( *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1718 DMT::Assign(*
G11,*AU1TAU1_);
1719 DMT::Assign(*
G12,*AU1TAP_);
1720 DMT::Assign(*
G22,*APTAP_);
1721 DMT::SyncDeviceToHost(*G_);
1723 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1724 for (
int jj=0;
jj<numBlocks_;++
jj)
1726 DMT::SyncHostToDevice(*G_);
1729 getHarmonicVecs(*F_,*G_,*Y_);
1730 DMT::SyncHostToDevice(*Y_);
1733 index.resize( numBlocks_ );
1734 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1735 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1736 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_,
rindex );
1737 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1738 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_,
rindex );
1744 DMT::SyncDeviceToHost(*GY_);
1745 DMT::SyncDeviceToHost(*AU1TAU1_);
1746 DMT::SyncDeviceToHost(*FY_);
1747 DMT::SyncDeviceToHost(*AU1TU1_);
1751 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1752 recycleBlocks_, numBlocks_+recycleBlocks_,
1753 one, DMT::GetConstRawHostPtr(*G_), DMT::GetStride(*G_),
1754 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1755 zero, DMT::GetRawHostPtr(*GY_), DMT::GetStride(*GY_));
1757 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1758 numBlocks_+recycleBlocks_,
1759 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1760 DMT::GetConstRawHostPtr(*GY_), DMT::GetStride(*GY_),
1761 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1765 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1766 recycleBlocks_, numBlocks_+recycleBlocks_,
1767 one, DMT::GetConstRawHostPtr(*F_), DMT::GetStride(*F_),
1768 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1769 zero, DMT::GetRawHostPtr(*FY_), DMT::GetStride(*FY_));
1771 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1772 numBlocks_+recycleBlocks_,
1773 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1774 DMT::GetConstRawHostPtr(*FY_), DMT::GetStride(*FY_),
1775 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1777 DMT::SyncHostToDevice(*GY_);
1778 DMT::SyncHostToDevice(*AU1TAU1_);
1779 DMT::SyncHostToDevice(*FY_);
1780 DMT::SyncHostToDevice(*AU1TU1_);
1783 dold = (*D_)[numBlocks_-1];
1786 lastp = numBlocks_+1;
1798 Teuchos::RCP<const MV>
Ptmp2 = MVT::CloneView( *P_, index );
1799 index[0] = 0; index[1] = 1;
1800 MVT::SetBlock(*
Ptmp2,index,*P_);
1807 Teuchos::RCP<DM>
mu1 = DMT::Subview( *Delta_, recycleBlocks_, 1, 0, 0 );
1808 Teuchos::RCP<DM>
mu2 = DMT::Subview( *Delta_, recycleBlocks_, 1, 0, numBlocks_ );
1814 index.resize( numBlocks_+1 );
1815 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii+1; }
1816 newstate.P = MVT::CloneViewNonConst( *P_, index );
1837 else if (Teuchos::nonnull(debugStatusTest_) &&
1838 debugStatusTest_->getStatus() ==
Passed) {
1853 "Belos::RCGSolMgr::solve(): Invalid return from RCGIter::iterate().");
1859 achievedTol_ = MT::one();
1860 Teuchos::RCP<MV>
X = problem_->getLHS();
1861 MVT::MvInit( *
X, SCT::zero() );
1862 printer_->stream(
Warnings) <<
"Belos::RCGSolMgr::solve(): Warning! NaN has been detected!"
1866 catch (
const std::exception &
e) {
1868 printer_->stream(
Errors) <<
"Error! Caught std::exception in RCGIter::iterate() at iteration "
1869 <<
rcg_iter->getNumIters() << std::endl
1870 <<
e.what() << std::endl;
1876 problem_->setCurrLS();
1883 problem_->setLSIndex(
currIdx );
1892 MVT::SetBlock(*U1_,
rindex,*U_);
1913 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1914 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_,
rindex );
1920 if (
precObj != Teuchos::null ) {
1921 Teuchos::RCP<MV>
LeftPCAU = MVT::CloneViewNonConst( *U1_,
rindex );
1938#ifdef BELOS_TEUCHOS_TIME_MONITOR
1943 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails) );
1947 numIters_ = maxIterTest_->getNumIters();
1951 using Teuchos::rcp_dynamic_cast;
1958 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1959 "method returned NULL. Please report this bug to the Belos developers.");
1962 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1963 "method returned a vector of length zero. Please report this bug to the "
1964 "Belos developers.");