1032 Teuchos::BLAS<int,ScalarType>
blas;
1033 Teuchos::LAPACK<int,ScalarType> lapack;
1037 std::vector<int> index(1),
rindex(recycleBlocks_),
nindex(numBlocks_);
1038 for (
int i=0;
i<recycleBlocks_; ++
i) {
rindex[
i] =
i; }
1039 for (
int i=0;
i<numBlocks_; ++
i) {
nindex[
i] =
i; }
1048 setParameters(Teuchos::parameterList(*getValidParameters()));
1052 "Belos::RCGSolMgr::solve(): Linear problem is not a valid object.");
1054 "Belos::RCGSolMgr::solve(): Linear problem is not ready, setProblem() has not been called.");
1057 "Belos::RCGSolMgr::solve(): RCG does not support split preconditioning, only set left or right preconditioner.");
1061 if (problem_->getLeftPrec() != Teuchos::null) {
1062 precObj = Teuchos::rcp_const_cast<OP>(problem_->getLeftPrec());
1064 else if (problem_->getRightPrec() != Teuchos::null) {
1065 precObj = Teuchos::rcp_const_cast<OP>(problem_->getRightPrec());
1069 int numRHS2Solve = MVT::GetNumberVecs( *(problem_->getRHS()) );
1074 problem_->setLSIndex(
currIdx );
1077 ptrdiff_t dim = MVT::GetGlobalLength( *(problem_->getRHS()) );
1078 if (numBlocks_ >
dim) {
1079 numBlocks_ = Teuchos::asSafe<int>(
dim);
1080 params_->set(
"Num Blocks", numBlocks_);
1082 "Warning! Requested Krylov subspace dimension is larger than operator dimension!" << std::endl <<
1083 " The maximum number of blocks allowed for the Krylov subspace will be adjusted to " << numBlocks_ << std::endl;
1087 initializeStateStorage();
1090 Teuchos::ParameterList
plist;
1091 plist.set(
"Num Blocks",numBlocks_);
1092 plist.set(
"Recycled Blocks",recycleBlocks_);
1095 outputTest_->reset();
1102 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1103 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_,
rindex );
1109 if (
precObj != Teuchos::null ) {
1110 Teuchos::RCP<MV>
PCAU = MVT::CloneViewNonConst( *U1_,
rindex );
1121 Teuchos::RCP<RCGIter<ScalarType,MV,OP,DM> >
rcg_iter;
1126#ifdef BELOS_TEUCHOS_TIME_MONITOR
1127 Teuchos::TimeMonitor
slvtimer(*timerSolve_);
1133 if (printer_->isVerbosity(
Debug ) ) {
1134 if (existU_) printer_->print(
Debug,
"Using recycle space generated from previous call to solve()." );
1135 else printer_->print(
Debug,
"No recycle space exists." );
1142 rcg_iter->setSize( recycleBlocks_, numBlocks_ );
1145 outputTest_->resetNumCalls();
1154 problem_->computeCurrResVec( &*r_ );
1159 Teuchos::RCP<DM>
Utr = DMT::Create(recycleBlocks_,1);
1160 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1163 DMT::SyncHostToDevice(*LUUTAU_);
1164 DMT::Assign(*LUUTAU_,*UTAU_);
1165 DMT::SyncDeviceToHost( *LUUTAU_ );
1166 DMT::SyncDeviceToHost( *
Utr );
1168 lapack.GESV(recycleBlocks_, 1, DMT::GetRawHostPtr(*LUUTAU_), DMT::GetStride(*LUUTAU_),
1169 &(*ipiv_)[0], DMT::GetRawHostPtr(*
Utr), DMT::GetStride(*
Utr), &
info);
1171 "Belos::RCGSolMgr::solve(): LAPACK GESV failed to compute a solution.");
1172 DMT::SyncHostToDevice( *
Utr );
1175 MVT::MvTimesMatAddMv(
one, *
Utmp, *
Utr,
one, *problem_->getCurrLHSVec() );
1178 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_,
rindex );
1182 if (
precObj != Teuchos::null ) {
1183 OPT::Apply( *
precObj, *r_, *z_ );
1189 MVT::MvDot( *r_, *z_, *rTz_old_ );
1193 Teuchos::RCP<DM>
mu = DMT::Subview(*Delta_, recycleBlocks_, 1);
1194 Teuchos::RCP<const MV>
AUtmp = MVT::CloneView( *AU_,
rindex );
1197 DMT::SyncDeviceToHost( *Delta_ );
1200 lapack.GETRS(
TRANS, recycleBlocks_, 1, DMT::GetConstRawHostPtr(*LUUTAU_), DMT::GetStride(*LUUTAU_),
1201 &(*ipiv_)[0], DMT::GetRawHostPtr(*
mu), DMT::GetStride(*
mu), &
info );
1203 "Belos::RCGSolMgr::solve(): LAPACK GETRS failed to compute a solution.");
1204 DMT::SyncHostToDevice( *
mu );
1209 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1210 MVT::Assign(*z_,*
Ptmp);
1216 Teuchos::RCP<MV>
Ptmp = MVT::CloneViewNonConst( *P_, index );
1217 MVT::Assign(*z_,*
Ptmp);
1224 index.resize( numBlocks_+1 );
1225 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii; }
1226 newstate.P = MVT::CloneViewNonConst( *P_, index );
1257 if ( convTest_->getStatus() ==
Passed ) {
1266 else if ( maxIterTest_->getStatus() ==
Passed ) {
1277 else if (
rcg_iter->getCurSubspaceDim() ==
rcg_iter->getMaxSubspaceDim() ) {
1282 if (recycleBlocks_ > 0) {
1286 Teuchos::RCP<DM>
Ftmp = DMT::Subview( *F_, numBlocks_, numBlocks_ );
1287 Teuchos::RCP<DM>
Gtmp = DMT::Subview( *G_, numBlocks_, numBlocks_ );
1290 DMT::SyncDeviceToHost( *F_ );
1291 DMT::SyncDeviceToHost( *G_ );
1292 for (
int ii=0;
ii<numBlocks_;
ii++) {
1293 DMT::Value(*
Gtmp,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii]);
1295 DMT::Value(*
Gtmp,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1296 DMT::Value(*
Gtmp,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1300 DMT::SyncHostToDevice( *F_ );
1301 DMT::SyncHostToDevice( *G_ );
1304 DMT::SyncDeviceToHost( *Y_ );
1305 Teuchos::RCP<DM>
Ytmp = DMT::Subview( *Y_, numBlocks_, recycleBlocks_ );
1307 DMT::SyncHostToDevice( *Y_ );
1310 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_,
nindex );
1311 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1315 DMT::SyncDeviceToHost(*GY_);
1316 DMT::SyncDeviceToHost(*AU1TAU1_);
1317 DMT::SyncDeviceToHost(*FY_);
1318 DMT::SyncDeviceToHost(*AU1TU1_);
1321 Teuchos::RCP<DM>
GYtmp = DMT::Subview( *GY_, numBlocks_, recycleBlocks_ );
1323 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_, recycleBlocks_, numBlocks_,
1324 one, DMT::GetConstRawHostPtr(*
Gtmp), DMT::GetStride(*
Gtmp),
1325 DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1328 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_, numBlocks_,
1329 one, DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1330 DMT::GetConstRawHostPtr(*
GYtmp), DMT::GetStride(*
GYtmp),
1331 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1335 Teuchos::RCP<DM>
FYtmp = DMT::Subview( *FY_, numBlocks_, recycleBlocks_ );
1337 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_, recycleBlocks_, numBlocks_,
1338 one, DMT::GetConstRawHostPtr(*
Ftmp), DMT::GetStride(*
Ftmp),
1339 DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1342 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_, numBlocks_,
1343 one, DMT::GetConstRawHostPtr(*
Ytmp), DMT::GetStride(*
Ytmp),
1344 DMT::GetConstRawHostPtr(*
FYtmp), DMT::GetStride(*
FYtmp),
1345 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1347 DMT::SyncHostToDevice(*AU1TAU1_);
1348 DMT::SyncHostToDevice(*AU1TU1_);
1349 DMT::SyncHostToDevice(*AU1TAP_);
1351 Teuchos::RCP<DM>
AU1TAPtmp = DMT::Subview( *AU1TAP_, recycleBlocks_, 1 );
1355 DMT::SyncDeviceToHost( *AU1TAP_ );
1357 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1360 DMT::SyncHostToDevice(*AU1TAP_);
1374 DMT::Scale(*AU1TAP_,(*D_)[0]);
1376 DMT::PutScalar(*APTAP_,
zero);
1377 DMT::SyncDeviceToHost(*APTAP_);
1378 for (
int ii=0;
ii<numBlocks_;
ii++) {
1379 DMT::Value(*APTAP_,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii+1]);
1381 DMT::Value(*APTAP_,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1382 DMT::Value(*APTAP_,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1385 DMT::SyncHostToDevice(*APTAP_);
1388 DMT::PutScalar(*F_,
zero);
1389 Teuchos::RCP<DM>
F11 = DMT::Subview( *F_, recycleBlocks_, recycleBlocks_ );
1390 Teuchos::RCP<DM>
F22 = DMT::Subview( *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1391 DMT::Assign(*
F11,*AU1TU1_);
1392 DMT::SyncDeviceToHost(*F_);
1393 for(
int ii=0;
ii<numBlocks_;
ii++) {
1396 DMT::SyncHostToDevice(*F_);
1399 Teuchos::RCP<DM>
G11 = DMT::Subview( *G_, recycleBlocks_, recycleBlocks_ );
1400 Teuchos::RCP<DM>
G12 = DMT::Subview( *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1401 Teuchos::RCP<DM>
G21 = DMT::Subview( *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1402 Teuchos::RCP<DM>
G22 = DMT::Subview( *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1403 DMT::Assign(*
G11, *AU1TAU1_);
1404 DMT::Assign(*
G12, *AU1TAP_);
1405 DMT::Assign(*
G22, *APTAP_);
1406 DMT::SyncDeviceToHost( *G_ );
1408 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1409 for (
int jj=0;
jj<numBlocks_;++
jj)
1411 DMT::SyncHostToDevice( *G_ );
1414 getHarmonicVecs(*F_,*G_,*Y_);
1415 DMT::SyncHostToDevice( *Y_ );
1418 index.resize( numBlocks_ );
1419 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1420 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1421 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_,
rindex );
1422 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1423 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_,
rindex );
1424 Teuchos::RCP<const DM>
Y1 = DMT::SubviewConst( *Y_, recycleBlocks_, recycleBlocks_ );
1425 Teuchos::RCP<const DM>
Y2 = DMT::SubviewConst( *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1431 DMT::SyncDeviceToHost(*GY_);
1432 DMT::SyncDeviceToHost(*AU1TAU1_);
1436 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1437 recycleBlocks_, numBlocks_+recycleBlocks_,
1438 one, DMT::GetConstRawHostPtr(*G_), DMT::GetStride(*G_),
1439 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1440 zero, DMT::GetRawHostPtr(*GY_), DMT::GetStride(*GY_));
1442 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1443 numBlocks_+recycleBlocks_,
1444 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1445 DMT::GetConstRawHostPtr(*GY_), DMT::GetStride(*GY_),
1446 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1448 DMT::SyncHostToDevice(*GY_);
1449 DMT::SyncHostToDevice(*AU1TAU1_);
1453 DMT::PutScalar(*AU1TAP_,
zero);
1455 DMT::SyncDeviceToHost(*AU1TAP_);
1456 for (
int ii=0;
ii<recycleBlocks_; ++
ii) {
1457 DMT::Value(*AU1TAP_,
ii,0) = DMT::ValueConst(*Y_,numBlocks_+recycleBlocks_-1,
ii) *
alphatmp;
1459 DMT::SyncHostToDevice(*AU1TAP_);
1461 DMT::SyncDeviceToHost(*FY_);
1462 DMT::SyncDeviceToHost(*AU1TU1_);
1466 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1467 recycleBlocks_, numBlocks_+recycleBlocks_,
1468 one, DMT::GetConstRawHostPtr(*F_), DMT::GetStride(*F_),
1469 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1470 zero, DMT::GetRawHostPtr(*FY_), DMT::GetStride(*FY_));
1472 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1473 numBlocks_+recycleBlocks_,
1474 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1475 DMT::GetConstRawHostPtr(*FY_), DMT::GetStride(*FY_),
1476 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1478 DMT::SyncHostToDevice(*FY_);
1479 DMT::SyncHostToDevice(*AU1TU1_);
1482 lastp = numBlocks_+1;
1489 DMT::PutScalar(*APTAP_,
zero);
1490 DMT::SyncDeviceToHost(*APTAP_);
1491 for (
int ii=0;
ii<numBlocks_;
ii++) {
1492 DMT::Value(*APTAP_,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii]);
1494 DMT::Value(*APTAP_,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1495 DMT::Value(*APTAP_,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1498 DMT::SyncHostToDevice(*APTAP_);
1500 DMT::PutScalar(*L2_,
zero);
1501 DMT::SyncDeviceToHost(*L2_);
1502 for(
int ii=0;
ii<numBlocks_;
ii++) {
1503 DMT::Value(*L2_,
ii,
ii) = 1./(*Alpha_)[
ii];
1504 DMT::Value(*L2_,
ii+1,
ii) = -1./(*Alpha_)[
ii];
1506 DMT::SyncHostToDevice(*L2_);
1509 DMT::SyncDeviceToHost(*Delta_);
1510 DMT::SyncDeviceToHost(*DeltaL2_);
1511 DMT::SyncDeviceToHost(*AUTAP_);
1512 DMT::SyncDeviceToHost(*UTAU_);
1515 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, numBlocks_+1,
1516 one, DMT::GetConstRawHostPtr(*Delta_), DMT::GetStride(*Delta_),
1517 DMT::GetConstRawHostPtr(*L2_), DMT::GetStride(*L2_),
1518 zero, DMT::GetRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_));
1520 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, recycleBlocks_,
1521 one, DMT::GetConstRawHostPtr(*UTAU_), DMT::GetStride(*UTAU_),
1522 DMT::GetConstRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_),
1523 zero, DMT::GetRawHostPtr(*AUTAP_), DMT::GetStride(*AUTAP_));
1525 DMT::SyncHostToDevice(*DeltaL2_);
1526 DMT::SyncHostToDevice(*AUTAP_);
1529 DMT::PutScalar(*F_,
zero);
1530 Teuchos::RCP<DM>
F11 = DMT::Subview( *F_, recycleBlocks_, recycleBlocks_ );
1531 Teuchos::RCP<DM>
F22 = DMT::Subview( *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1532 DMT::Assign(*
F11,*UTAU_);
1533 DMT::SyncDeviceToHost(*F_);
1534 for(
int ii=0;
ii<numBlocks_;
ii++) {
1537 DMT::SyncHostToDevice(*F_);
1540 Teuchos::RCP<DM>
G11 = DMT::Subview( *G_, recycleBlocks_, recycleBlocks_ );
1541 Teuchos::RCP<DM>
G12 = DMT::Subview( *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1542 Teuchos::RCP<DM>
G21 = DMT::Subview( *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1543 Teuchos::RCP<DM>
G22 = DMT::Subview( *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1544 DMT::Assign(*
G11,*AUTAU_);
1545 DMT::Assign(*
G12,*AUTAP_);
1546 DMT::Assign(*
G22,*APTAP_);
1547 DMT::SyncDeviceToHost(*G_);
1549 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1550 for (
int jj=0;
jj<numBlocks_;++
jj)
1552 DMT::SyncHostToDevice(*G_);
1555 getHarmonicVecs(*F_,*G_,*Y_);
1556 DMT::SyncHostToDevice(*Y_);
1559 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1560 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_,
nindex );
1561 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_,
rindex );
1562 Teuchos::RCP<MV>
UY1tmp = MVT::CloneViewNonConst( *U1Y1_,
rindex );
1563 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1564 Teuchos::RCP<const DM>
Y1 = DMT::SubviewConst( *Y_, recycleBlocks_, recycleBlocks_ );
1565 Teuchos::RCP<const DM>
Y2 = DMT::SubviewConst( *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1571 DMT::SyncDeviceToHost(*GY_);
1572 DMT::SyncDeviceToHost(*AU1TAU1_);
1573 DMT::SyncDeviceToHost(*FY_);
1574 DMT::SyncDeviceToHost(*AU1TU1_);
1578 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1579 recycleBlocks_, numBlocks_+recycleBlocks_,
1580 one, DMT::GetConstRawHostPtr(*G_), DMT::GetStride(*G_),
1581 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1582 zero, DMT::GetRawHostPtr(*GY_), DMT::GetStride(*GY_));
1584 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1585 numBlocks_+recycleBlocks_,
1586 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1587 DMT::GetConstRawHostPtr(*GY_), DMT::GetStride(*GY_),
1588 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1592 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1593 recycleBlocks_, numBlocks_+recycleBlocks_,
1594 one, DMT::GetConstRawHostPtr(*F_), DMT::GetStride(*F_),
1595 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1596 zero, DMT::GetRawHostPtr(*FY_), DMT::GetStride(*FY_));
1598 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1599 numBlocks_+recycleBlocks_,
1600 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1601 DMT::GetConstRawHostPtr(*FY_), DMT::GetStride(*FY_),
1602 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1604 DMT::SyncHostToDevice(*GY_);
1605 DMT::SyncHostToDevice(*AU1TAU1_);
1606 DMT::SyncHostToDevice(*FY_);
1607 DMT::SyncHostToDevice(*AU1TU1_);
1610 DMT::Assign(*AU1TU_,*UTAU_);
1613 dold = (*D_)[numBlocks_-1];
1624 DMT::SyncDeviceToHost(*APTAP_);
1625 for (
int ii=0;
ii<numBlocks_;
ii++) {
1626 DMT::Value(*APTAP_,
ii,
ii) = ((*D_)[
ii] / (*Alpha_)[
ii])*(1 + (*Beta_)[
ii+1]);
1628 DMT::Value(*APTAP_,
ii-1,
ii) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1629 DMT::Value(*APTAP_,
ii,
ii-1) = -(*D_)[
ii]/(*Alpha_)[
ii-1];
1632 DMT::SyncHostToDevice(*APTAP_);
1634 DMT::SyncDeviceToHost(*L2_);
1635 for(
int ii=0;
ii<numBlocks_;
ii++) {
1636 DMT::Value(*L2_,
ii,
ii) = 1./(*Alpha_)[
ii];
1637 DMT::Value(*L2_,
ii+1,
ii) = -1./(*Alpha_)[
ii];
1639 DMT::SyncHostToDevice(*L2_);
1641 DMT::SyncDeviceToHost(*Delta_);
1642 DMT::SyncDeviceToHost(*DeltaL2_);
1643 DMT::SyncDeviceToHost(*AU1TUDeltaL2_);
1644 DMT::SyncDeviceToHost(*AU1TAP_);
1649 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, numBlocks_+1,
1650 one, DMT::GetConstRawHostPtr(*Delta_), DMT::GetStride(*Delta_),
1651 DMT::GetConstRawHostPtr(*L2_), DMT::GetStride(*L2_),
1652 zero, DMT::GetRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_));
1654 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, recycleBlocks_,
1655 one, DMT::GetConstRawHostPtr(*AU1TU_), DMT::GetStride(*AU1TU_),
1656 DMT::GetConstRawHostPtr(*DeltaL2_), DMT::GetStride(*DeltaL2_),
1657 zero, DMT::GetRawHostPtr(*AU1TUDeltaL2_), DMT::GetStride(*AU1TUDeltaL2_));
1659 DMT::SyncDeviceToHost( *Y_);
1660 Teuchos::RCP<const DM>
Y1 = DMT::SubviewConst( *Y_, recycleBlocks_, recycleBlocks_ );
1661 Teuchos::RCP<const DM>
Y2 = DMT::SubviewConst( *Y_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1664 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, numBlocks_, recycleBlocks_,
1665 one, DMT::GetConstRawHostPtr(*
Y1), DMT::GetStride(*
Y1),
1666 DMT::GetConstRawHostPtr(*AU1TUDeltaL2_), DMT::GetStride(*AU1TUDeltaL2_),
1667 zero, DMT::GetRawHostPtr(*AU1TAP_), DMT::GetStride(*AU1TAP_));
1669 for(
int ii=0;
ii<recycleBlocks_;
ii++) {
1670 DMT::Value(*AU1TAP_,
ii,0) += DMT::ValueConst(*
Y2,numBlocks_-1,
ii)*
val;
1672 DMT::SyncHostToDevice(*AU1TAP_);
1675 Teuchos::RCP<DM>
Y1TAU1TU = DMT::Subview( *GY_, recycleBlocks_, recycleBlocks_ );
1677 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_, recycleBlocks_,
1678 one, DMT::GetConstRawHostPtr(*
Y1), DMT::GetStride(*
Y1),
1679 DMT::GetConstRawHostPtr(*AU1TU_), DMT::GetStride(*AU1TU_),
1681 DMT::SyncHostToDevice(*GY_);
1685 DMT::PutScalar(*F_,
zero);
1686 Teuchos::RCP<DM>
F11 = DMT::Subview( *F_, recycleBlocks_, recycleBlocks_ );
1687 Teuchos::RCP<DM>
F22 = DMT::Subview( *F_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1688 DMT::Assign(*
F11,*AU1TU1_);
1689 DMT::SyncDeviceToHost(*F_);
1690 for(
int ii=0;
ii<numBlocks_;
ii++) {
1693 DMT::SyncHostToDevice(*F_);
1696 Teuchos::RCP<DM>
G11 = DMT::Subview( *G_, recycleBlocks_, recycleBlocks_ );
1697 Teuchos::RCP<DM>
G12 = DMT::Subview( *G_, recycleBlocks_, numBlocks_, 0, recycleBlocks_ );
1698 Teuchos::RCP<DM>
G21 = DMT::Subview( *G_, numBlocks_, recycleBlocks_, recycleBlocks_, 0 );
1699 Teuchos::RCP<DM>
G22 = DMT::Subview( *G_, numBlocks_, numBlocks_, recycleBlocks_, recycleBlocks_ );
1700 DMT::Assign(*
G11,*AU1TAU1_);
1701 DMT::Assign(*
G12,*AU1TAP_);
1702 DMT::Assign(*
G22,*APTAP_);
1703 DMT::SyncDeviceToHost(*G_);
1705 for (
int ii=0;
ii<recycleBlocks_;++
ii)
1706 for (
int jj=0;
jj<numBlocks_;++
jj)
1708 DMT::SyncHostToDevice(*G_);
1711 getHarmonicVecs(*F_,*G_,*Y_);
1712 DMT::SyncHostToDevice(*Y_);
1715 index.resize( numBlocks_ );
1716 for (
int ii=0;
ii<numBlocks_; ++
ii) { index[
ii] =
ii+1; }
1717 Teuchos::RCP<const MV>
Ptmp = MVT::CloneView( *P_, index );
1718 Teuchos::RCP<MV>
PY2tmp = MVT::CloneViewNonConst( *PY2_,
rindex );
1719 Teuchos::RCP<MV>
U1tmp = MVT::CloneViewNonConst( *U1_,
rindex );
1720 Teuchos::RCP<MV>
U1Y1tmp = MVT::CloneViewNonConst( *U1Y1_,
rindex );
1726 DMT::SyncDeviceToHost(*GY_);
1727 DMT::SyncDeviceToHost(*AU1TAU1_);
1728 DMT::SyncDeviceToHost(*FY_);
1729 DMT::SyncDeviceToHost(*AU1TU1_);
1733 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1734 recycleBlocks_, numBlocks_+recycleBlocks_,
1735 one, DMT::GetConstRawHostPtr(*G_), DMT::GetStride(*G_),
1736 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1737 zero, DMT::GetRawHostPtr(*GY_), DMT::GetStride(*GY_));
1739 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1740 numBlocks_+recycleBlocks_,
1741 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1742 DMT::GetConstRawHostPtr(*GY_), DMT::GetStride(*GY_),
1743 zero, DMT::GetRawHostPtr(*AU1TAU1_), DMT::GetStride(*AU1TAU1_));
1747 blas.GEMM( Teuchos::NO_TRANS, Teuchos::NO_TRANS, numBlocks_+recycleBlocks_,
1748 recycleBlocks_, numBlocks_+recycleBlocks_,
1749 one, DMT::GetConstRawHostPtr(*F_), DMT::GetStride(*F_),
1750 DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1751 zero, DMT::GetRawHostPtr(*FY_), DMT::GetStride(*FY_));
1753 blas.GEMM( Teuchos::TRANS, Teuchos::NO_TRANS, recycleBlocks_, recycleBlocks_,
1754 numBlocks_+recycleBlocks_,
1755 one, DMT::GetConstRawHostPtr(*Y_), DMT::GetStride(*Y_),
1756 DMT::GetConstRawHostPtr(*FY_), DMT::GetStride(*FY_),
1757 zero, DMT::GetRawHostPtr(*AU1TU1_), DMT::GetStride(*AU1TU1_));
1759 DMT::SyncHostToDevice(*GY_);
1760 DMT::SyncHostToDevice(*AU1TAU1_);
1761 DMT::SyncHostToDevice(*FY_);
1762 DMT::SyncHostToDevice(*AU1TU1_);
1765 dold = (*D_)[numBlocks_-1];
1768 lastp = numBlocks_+1;
1780 Teuchos::RCP<const MV>
Ptmp2 = MVT::CloneView( *P_, index );
1781 index[0] = 0; index[1] = 1;
1782 MVT::SetBlock(*
Ptmp2,index,*P_);
1789 Teuchos::RCP<DM>
mu1 = DMT::Subview( *Delta_, recycleBlocks_, 1, 0, 0 );
1790 Teuchos::RCP<DM>
mu2 = DMT::Subview( *Delta_, recycleBlocks_, 1, 0, numBlocks_ );
1796 index.resize( numBlocks_+1 );
1797 for (
int ii=0;
ii<(numBlocks_+1); ++
ii) { index[
ii] =
ii+1; }
1798 newstate.P = MVT::CloneViewNonConst( *P_, index );
1823 "Belos::RCGSolMgr::solve(): Invalid return from RCGIter::iterate().");
1829 achievedTol_ = MT::one();
1830 Teuchos::RCP<MV>
X = problem_->getLHS();
1831 MVT::MvInit( *
X, SCT::zero() );
1832 printer_->stream(
Warnings) <<
"Belos::RCGSolMgr::solve(): Warning! NaN has been detected!"
1836 catch (
const std::exception &
e) {
1838 printer_->stream(
Errors) <<
"Error! Caught std::exception in RCGIter::iterate() at iteration "
1839 <<
rcg_iter->getNumIters() << std::endl
1840 <<
e.what() << std::endl;
1846 problem_->setCurrLS();
1853 problem_->setLSIndex(
currIdx );
1862 MVT::SetBlock(*U1_,
rindex,*U_);
1883 Teuchos::RCP<const MV>
Utmp = MVT::CloneView( *U_,
rindex );
1884 Teuchos::RCP<MV>
AUtmp = MVT::CloneViewNonConst( *AU_,
rindex );
1890 if (
precObj != Teuchos::null ) {
1891 Teuchos::RCP<MV>
LeftPCAU = MVT::CloneViewNonConst( *U1_,
rindex );
1908#ifdef BELOS_TEUCHOS_TIME_MONITOR
1913 Teuchos::TimeMonitor::summarize( printer_->stream(
TimingDetails) );
1917 numIters_ = maxIterTest_->getNumIters();
1921 using Teuchos::rcp_dynamic_cast;
1928 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1929 "method returned NULL. Please report this bug to the Belos developers.");
1932 "Belos::RCGSolMgr::solve(): The convergence test's getTestValue() "
1933 "method returned a vector of length zero. Please report this bug to the "
1934 "Belos developers.");