47 #ifndef BELOS_ICGS_ORTHOMANAGER_HPP
48 #define BELOS_ICGS_ORTHOMANAGER_HPP
65 #include "Teuchos_ParameterListAcceptorDefaultBase.hpp"
66 #ifdef BELOS_TEUCHOS_TIME_MONITOR
68 #endif // BELOS_TEUCHOS_TIME_MONITOR
73 template<
class ScalarType,
class MV,
class OP>
77 template<
class ScalarType,
class MV,
class OP>
80 template<
class ScalarType,
class MV,
class OP>
103 max_ortho_steps_( max_ortho_steps ),
105 sing_tol_( sing_tol ),
108 #ifdef BELOS_TEUCHOS_TIME_MONITOR
109 std::stringstream ss;
110 ss << label_ +
": ICGS[" << max_ortho_steps_ <<
"]";
112 std::string orthoLabel = ss.str() +
": Orthogonalization";
115 std::string updateLabel = ss.str() +
": Ortho (Update)";
118 std::string normLabel = ss.str() +
": Ortho (Norm)";
121 std::string ipLabel = ss.str() +
": Ortho (Inner Product)";
128 const std::string& label =
"Belos",
138 #ifdef BELOS_TEUCHOS_TIME_MONITOR
139 std::stringstream ss;
140 ss << label_ +
": ICGS[" << max_ortho_steps_ <<
"]";
142 std::string orthoLabel = ss.str() +
": Orthogonalization";
145 std::string updateLabel = ss.str() +
": Ortho (Update)";
148 std::string normLabel = ss.str() +
": Ortho (Norm)";
151 std::string ipLabel = ss.str() +
": Ortho (Inner Product)";
168 using Teuchos::parameterList;
172 RCP<ParameterList> params;
174 params = parameterList (*defaultParams);
189 int maxNumOrthogPasses;
190 MagnitudeType blkTol;
191 MagnitudeType singTol;
194 maxNumOrthogPasses = params->
get<
int> (
"maxNumOrthogPasses");
195 }
catch (InvalidParameterName&) {
196 maxNumOrthogPasses = defaultParams->get<
int> (
"maxNumOrthogPasses");
197 params->set (
"maxNumOrthogPasses", maxNumOrthogPasses);
208 blkTol = params->get<MagnitudeType> (
"blkTol");
209 }
catch (InvalidParameterName&) {
211 blkTol = params->get<MagnitudeType> (
"depTol");
214 params->remove (
"depTol");
215 }
catch (InvalidParameterName&) {
216 blkTol = defaultParams->get<MagnitudeType> (
"blkTol");
218 params->set (
"blkTol", blkTol);
222 singTol = params->get<MagnitudeType> (
"singTol");
223 }
catch (InvalidParameterName&) {
224 singTol = defaultParams->get<MagnitudeType> (
"singTol");
225 params->set (
"singTol", singTol);
228 max_ortho_steps_ = maxNumOrthogPasses;
238 if (defaultParams_.
is_null()) {
239 defaultParams_ = Belos::getICGSDefaultParameters<ScalarType, MV, OP>();
242 return defaultParams_;
256 using Teuchos::parameterList;
261 RCP<ParameterList> params = parameterList (*defaultParams);
282 params->
set (
"blkTol", blk_tol);
296 params->
set (
"singTol", sing_tol);
298 sing_tol_ = sing_tol;
481 void setLabel(
const std::string& label);
485 const std::string&
getLabel()
const {
return label_; }
511 int max_ortho_steps_;
513 MagnitudeType blk_tol_;
515 MagnitudeType sing_tol_;
519 #ifdef BELOS_TEUCHOS_TIME_MONITOR
521 #endif // BELOS_TEUCHOS_TIME_MONITOR
529 bool completeBasis,
int howMany = -1 )
const;
561 template<
class ScalarType,
class MV,
class OP>
564 template<
class ScalarType,
class MV,
class OP>
565 const typename ICGSOrthoManager<ScalarType,MV,OP>::MagnitudeType
570 template<
class ScalarType,
class MV,
class OP>
571 const typename ICGSOrthoManager<ScalarType,MV,OP>::MagnitudeType
575 template<
class ScalarType,
class MV,
class OP>
578 template<
class ScalarType,
class MV,
class OP>
579 const typename ICGSOrthoManager<ScalarType,MV,OP>::MagnitudeType
583 template<
class ScalarType,
class MV,
class OP>
584 const typename ICGSOrthoManager<ScalarType,MV,OP>::MagnitudeType
590 template<
class ScalarType,
class MV,
class OP>
593 if (label != label_) {
595 #ifdef BELOS_TEUCHOS_TIME_MONITOR
596 std::stringstream ss;
597 ss << label_ +
": ICGS[" << max_ortho_steps_ <<
"]";
599 std::string orthoLabel = ss.str() +
": Orthogonalization";
602 std::string updateLabel = ss.str() +
": Ortho (Update)";
605 std::string normLabel = ss.str() +
": Ortho (Norm)";
608 std::string ipLabel = ss.str() +
": Ortho (Inner Product)";
616 template<
class ScalarType,
class MV,
class OP>
619 const ScalarType ONE = SCT::one();
620 int rank = MVT::GetNumberVecs(X);
623 for (
int i=0; i<rank; i++) {
631 template<
class ScalarType,
class MV,
class OP>
634 int r1 = MVT::GetNumberVecs(X1);
635 int r2 = MVT::GetNumberVecs(X2);
643 template<
class ScalarType,
class MV,
class OP>
659 typedef typename Array< RCP< const MV > >::size_type size_type;
661 #ifdef BELOS_TEUCHOS_TIME_MONITOR
665 ScalarType ONE = SCT::one();
666 const MagnitudeType ZERO = MGT::zero();
669 int xc = MVT::GetNumberVecs( X );
670 ptrdiff_t xr = MVT::GetGlobalLength( X );
677 B =
rcp (
new serial_dense_matrix_type (xc, xc));
687 for (size_type k = 0; k < nq; ++k)
689 const int numRows = MVT::GetNumberVecs (*Q[k]);
690 const int numCols = xc;
693 C[k] =
rcp (
new serial_dense_matrix_type (numRows, numCols));
694 else if (C[k]->numRows() != numRows || C[k]->numCols() != numCols)
696 int err = C[k]->reshape (numRows, numCols);
698 "IMGS orthogonalization: failed to reshape "
699 "C[" << k <<
"] (the array of block "
700 "coefficients resulting from projecting X "
701 "against Q[1:" << nq <<
"]).");
707 if (MX == Teuchos::null) {
709 MX = MVT::Clone(X,MVT::GetNumberVecs(X));
710 OPT::Apply(*(this->_Op),X,*MX);
718 int mxc = MVT::GetNumberVecs( *MX );
719 ptrdiff_t mxr = MVT::GetGlobalLength( *MX );
722 TEUCHOS_TEST_FOR_EXCEPTION( xc == 0 || xr == 0, std::invalid_argument,
"Belos::ICGSOrthoManager::projectAndNormalize(): X must be non-empty" );
725 for (
int i=0; i<nq; i++) {
726 numbas += MVT::GetNumberVecs( *Q[i] );
731 "Belos::ICGSOrthoManager::projectAndNormalize(): Size of X must be consistant with size of B" );
734 "Belos::ICGSOrthoManager::projectAndNormalize(): MVT returned negative dimensions for X,MX" );
736 TEUCHOS_TEST_FOR_EXCEPTION( xc!=mxc || xr!=mxr, std::invalid_argument,
737 "Belos::ICGSOrthoManager::projectAndNormalize(): Size of X must be consistant with size of MX" );
743 bool dep_flg =
false;
749 dep_flg = blkOrtho1( X, MX, C, Q );
752 if ( B == Teuchos::null ) {
755 std::vector<ScalarType> diag(xc);
757 #ifdef BELOS_TEUCHOS_TIME_MONITOR
760 MVT::MvDot( X, *MX, diag );
762 (*B)(0,0) = SCT::squareroot(SCT::magnitude(diag[0]));
764 if (SCT::magnitude((*B)(0,0)) > ZERO) {
766 MVT::MvScale( X, ONE/(*B)(0,0) );
769 MVT::MvScale( *MX, ONE/(*B)(0,0) );
777 tmpX = MVT::CloneCopy(X);
779 tmpMX = MVT::CloneCopy(*MX);
783 dep_flg = blkOrtho( X, MX, C, Q );
789 rank = blkOrthoSing( *tmpX, tmpMX, C, B, Q );
792 MVT::Assign( *tmpX, X );
794 MVT::Assign( *tmpMX, *MX );
799 rank = findBasis( X, MX, B,
false );
804 rank = blkOrthoSing( *tmpX, tmpMX, C, B, Q );
807 MVT::Assign( *tmpX, X );
809 MVT::Assign( *tmpMX, *MX );
816 TEUCHOS_TEST_FOR_EXCEPTION( rank > xc || rank < 0, std::logic_error,
817 "Belos::ICGSOrthoManager::projectAndNormalize(): Debug error in rank variable." );
827 template<
class ScalarType,
class MV,
class OP>
832 #ifdef BELOS_TEUCHOS_TIME_MONITOR
837 return findBasis(X, MX, B,
true);
844 template<
class ScalarType,
class MV,
class OP>
864 #ifdef BELOS_TEUCHOS_TIME_MONITOR
868 int xc = MVT::GetNumberVecs( X );
869 ptrdiff_t xr = MVT::GetGlobalLength( X );
871 std::vector<int> qcs(nq);
873 if (nq == 0 || xc == 0 || xr == 0) {
876 ptrdiff_t qr = MVT::GetGlobalLength ( *Q[0] );
885 if (MX == Teuchos::null) {
887 MX = MVT::Clone(X,MVT::GetNumberVecs(X));
888 OPT::Apply(*(this->_Op),X,*MX);
895 int mxc = MVT::GetNumberVecs( *MX );
896 ptrdiff_t mxr = MVT::GetGlobalLength( *MX );
900 "Belos::ICGSOrthoManager::project(): MVT returned negative dimensions for X,MX" );
903 "Belos::ICGSOrthoManager::project(): Size of X not consistant with MX,Q" );
907 for (
int i=0; i<nq; i++) {
909 "Belos::ICGSOrthoManager::project(): Q lengths not mutually consistant" );
910 qcs[i] = MVT::GetNumberVecs( *Q[i] );
912 "Belos::ICGSOrthoManager::project(): Q has less rows than columns" );
916 if ( C[i] == Teuchos::null ) {
921 "Belos::ICGSOrthoManager::project(): Size of Q not consistant with size of C" );
926 blkOrtho( X, MX, C, Q );
933 template<
class ScalarType,
class MV,
class OP>
956 const ScalarType ONE = SCT::one ();
957 const MagnitudeType ZERO = SCT::magnitude (SCT::zero ());
959 const int xc = MVT::GetNumberVecs (X);
960 const ptrdiff_t xr = MVT::GetGlobalLength (X);
973 if (MX == Teuchos::null) {
975 MX = MVT::Clone(X,xc);
976 OPT::Apply(*(this->_Op),X,*MX);
983 if ( B == Teuchos::null ) {
987 const int mxc = (this->_hasOp) ? MVT::GetNumberVecs( *MX ) : xc;
988 const ptrdiff_t mxr = (this->_hasOp) ? MVT::GetGlobalLength( *MX ) : xr;
992 "Belos::ICGSOrthoManager::findBasis(): X must be non-empty" );
994 "Belos::ICGSOrthoManager::findBasis(): Size of X not consistant with size of B" );
996 "Belos::ICGSOrthoManager::findBasis(): Size of X not consistant with size of MX" );
998 "Belos::ICGSOrthoManager::findBasis(): Size of X not feasible for normalization" );
1000 "Belos::ICGSOrthoManager::findBasis(): Invalid howMany parameter" );
1005 int xstart = xc - howMany;
1007 for (
int j = xstart; j < xc; j++) {
1013 bool addVec =
false;
1016 std::vector<int> index(1);
1022 MXj = MVT::CloneViewNonConst( *MX, index );
1030 std::vector<int> prev_idx( numX );
1035 for (
int i=0; i<numX; i++) {
1038 prevX = MVT::CloneView( X, prev_idx );
1040 prevMX = MVT::CloneView( *MX, prev_idx );
1043 oldMXj = MVT::CloneCopy( *MXj );
1048 std::vector<ScalarType> oldDot( 1 ), newDot( 1 );
1053 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1056 MVT::MvDot( *Xj, *MXj, oldDot );
1060 "Belos::ICGSOrthoManager::findBasis(): Negative definiteness discovered in inner product" );
1066 for (
int i=0; i<max_ortho_steps_; ++i) {
1070 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1079 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1082 MVT::MvTimesMatAddMv( -ONE, *prevX, P2, ONE, *Xj );
1090 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1093 MVT::MvTimesMatAddMv( -ONE, *prevMX, P2, ONE, *MXj );
1107 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1110 MVT::MvDot( *Xj, *oldMXj, newDot );
1113 newDot[0] = oldDot[0];
1117 if (completeBasis) {
1121 if ( SCT::magnitude(newDot[0]) < SCT::magnitude(sing_tol_*oldDot[0]) ) {
1126 std::cout <<
"Belos::ICGSOrthoManager::findBasis() --> Random for column " << numX << std::endl;
1131 MVT::MvRandom( *tempXj );
1133 tempMXj = MVT::Clone( X, 1 );
1134 OPT::Apply( *(this->_Op), *tempXj, *tempMXj );
1140 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1143 MVT::MvDot( *tempXj, *tempMXj, oldDot );
1146 for (
int num_orth=0; num_orth<max_ortho_steps_; num_orth++){
1148 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1154 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1157 MVT::MvTimesMatAddMv( -ONE, *prevX, product, ONE, *tempXj );
1160 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1163 MVT::MvTimesMatAddMv( -ONE, *prevMX, product, ONE, *tempMXj );
1168 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1171 MVT::MvDot( *tempXj, *tempMXj, newDot );
1174 if ( SCT::magnitude(newDot[0]) >= SCT::magnitude(oldDot[0]*sing_tol_) ) {
1176 MVT::Assign( *tempXj, *Xj );
1178 MVT::Assign( *tempMXj, *MXj );
1190 if ( SCT::magnitude(newDot[0]) < SCT::magnitude(oldDot[0]*blk_tol_) ) {
1198 ScalarType diag = SCT::squareroot(SCT::magnitude(newDot[0]));
1200 MVT::MvScale( *Xj, ONE/diag );
1203 MVT::MvScale( *MXj, ONE/diag );
1217 for (
int i=0; i<numX; i++) {
1218 (*B)(i,j) = product(i,0);
1229 template<
class ScalarType,
class MV,
class OP>
1231 ICGSOrthoManager<ScalarType, MV, OP>::blkOrtho1 ( MV &X,
Teuchos::RCP<MV> MX,
1236 int xc = MVT::GetNumberVecs( X );
1237 const ScalarType ONE = SCT::one();
1239 std::vector<int> qcs( nq );
1240 for (
int i=0; i<nq; i++) {
1241 qcs[i] = MVT::GetNumberVecs( *Q[i] );
1248 for (
int i=0; i<nq; i++) {
1251 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1258 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1261 MVT::MvTimesMatAddMv( -ONE, *Q[i], *C[i], ONE, X );
1267 OPT::Apply( *(this->_Op), X, *MX);
1271 MQ[i] = MVT::Clone( *Q[i], qcs[i] );
1272 OPT::Apply( *(this->_Op), *Q[i], *MQ[i] );
1274 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1277 MVT::MvTimesMatAddMv( -ONE, *MQ[i], *C[i], ONE, *MX );
1284 for (
int j = 1; j < max_ortho_steps_; ++j) {
1286 for (
int i=0; i<nq; i++) {
1291 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1298 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1301 MVT::MvTimesMatAddMv( -ONE, *Q[i], C2, ONE, X );
1307 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1311 MVT::MvTimesMatAddMv( -ONE, *MQ[i], C2, ONE, *MX );
1313 else if (xc <= qcs[i]) {
1315 OPT::Apply( *(this->_Op), X, *MX);
1326 template<
class ScalarType,
class MV,
class OP>
1328 ICGSOrthoManager<ScalarType, MV, OP>::blkOrtho ( MV &X,
Teuchos::RCP<MV> MX,
1333 int xc = MVT::GetNumberVecs( X );
1334 bool dep_flg =
false;
1335 const ScalarType ONE = SCT::one();
1337 std::vector<int> qcs( nq );
1338 for (
int i=0; i<nq; i++) {
1339 qcs[i] = MVT::GetNumberVecs( *Q[i] );
1345 std::vector<ScalarType> oldDot( xc );
1347 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1350 MVT::MvDot( X, *MX, oldDot );
1355 for (
int i=0; i<nq; i++) {
1358 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1365 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1368 MVT::MvTimesMatAddMv( -ONE, *Q[i], *C[i], ONE, X );
1373 OPT::Apply( *(this->_Op), X, *MX);
1377 MQ[i] = MVT::Clone( *Q[i], qcs[i] );
1378 OPT::Apply( *(this->_Op), *Q[i], *MQ[i] );
1380 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1383 MVT::MvTimesMatAddMv( -ONE, *MQ[i], *C[i], ONE, *MX );
1390 for (
int j = 1; j < max_ortho_steps_; ++j) {
1392 for (
int i=0; i<nq; i++) {
1397 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1404 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1407 MVT::MvTimesMatAddMv( -ONE, *Q[i], C2, ONE, X );
1413 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1417 MVT::MvTimesMatAddMv( -ONE, *MQ[i], C2, ONE, *MX );
1419 else if (xc <= qcs[i]) {
1421 OPT::Apply( *(this->_Op), X, *MX);
1428 std::vector<ScalarType> newDot(xc);
1430 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1433 MVT::MvDot( X, *MX, newDot );
1437 for (
int i=0; i<xc; i++){
1438 if (SCT::magnitude(newDot[i]) < SCT::magnitude(oldDot[i] * blk_tol_)) {
1447 template<
class ScalarType,
class MV,
class OP>
1449 ICGSOrthoManager<ScalarType, MV, OP>::blkOrthoSing ( MV &X,
Teuchos::RCP<MV> MX,
1456 const ScalarType ONE = SCT::one();
1457 const ScalarType ZERO = SCT::zero();
1460 int xc = MVT::GetNumberVecs( X );
1461 std::vector<int> indX( 1 );
1462 std::vector<ScalarType> oldDot( 1 ), newDot( 1 );
1464 std::vector<int> qcs( nq );
1465 for (
int i=0; i<nq; i++) {
1466 qcs[i] = MVT::GetNumberVecs( *Q[i] );
1475 for (
int j=0; j<xc; j++) {
1477 bool dep_flg =
false;
1481 std::vector<int> index( j );
1482 for (
int ind=0; ind<j; ind++) {
1485 lastQ = MVT::CloneView( X, index );
1488 Q.push_back( lastQ );
1490 qcs.push_back( MVT::GetNumberVecs( *lastQ ) );
1495 Xj = MVT::CloneViewNonConst( X, indX );
1497 MXj = MVT::CloneViewNonConst( *MX, indX );
1505 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1508 MVT::MvDot( *Xj, *MXj, oldDot );
1513 for (
int i=0; i<Q.size(); i++) {
1520 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1526 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1530 MVT::MvTimesMatAddMv( -ONE, *Q[i], tempC, ONE, *Xj );
1535 OPT::Apply( *(this->_Op), *Xj, *MXj);
1539 MQ[i] = MVT::Clone( *Q[i], qcs[i] );
1540 OPT::Apply( *(this->_Op), *Q[i], *MQ[i] );
1542 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1545 MVT::MvTimesMatAddMv( -ONE, *MQ[i], tempC, ONE, *MXj );
1552 for (
int num_ortho_steps=1; num_ortho_steps < max_ortho_steps_; ++num_ortho_steps) {
1554 for (
int i=0; i<Q.size(); i++) {
1560 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1567 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1570 MVT::MvTimesMatAddMv( -ONE, *Q[i], C2, ONE, *Xj );
1577 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1580 MVT::MvTimesMatAddMv( -ONE, *MQ[i], C2, ONE, *MXj );
1582 else if (xc <= qcs[i]) {
1584 OPT::Apply( *(this->_Op), *Xj, *MXj);
1592 if (SCT::magnitude(newDot[0]) < SCT::magnitude(oldDot[0]*sing_tol_)) {
1598 ScalarType diag = SCT::squareroot(SCT::magnitude(newDot[0]));
1600 MVT::MvScale( *Xj, ONE/diag );
1603 MVT::MvScale( *MXj, ONE/diag );
1613 MVT::MvRandom( *tempXj );
1615 tempMXj = MVT::Clone( X, 1 );
1616 OPT::Apply( *(this->_Op), *tempXj, *tempMXj );
1622 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1625 MVT::MvDot( *tempXj, *tempMXj, oldDot );
1628 for (
int num_orth=0; num_orth<max_ortho_steps_; num_orth++) {
1630 for (
int i=0; i<Q.size(); i++) {
1635 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1641 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1644 MVT::MvTimesMatAddMv( -ONE, *Q[i], product, ONE, *tempXj );
1650 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1654 MVT::MvTimesMatAddMv( -ONE, *MQ[i], product, ONE, *tempMXj );
1656 else if (xc <= qcs[i]) {
1658 OPT::Apply( *(this->_Op), *tempXj, *tempMXj);
1667 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1670 MVT::MvDot( *tempXj, *tempMXj, newDot );
1674 if ( SCT::magnitude(newDot[0]) >= SCT::magnitude(oldDot[0]*sing_tol_) ) {
1675 ScalarType diag = SCT::squareroot(SCT::magnitude(newDot[0]));
1681 MVT::MvAddMv( ONE/diag, *tempXj, ZERO, *tempXj, *Xj );
1683 MVT::MvAddMv( ONE/diag, *tempMXj, ZERO, *tempMXj, *MXj );
1703 template<
class ScalarType,
class MV,
class OP>
1707 using Teuchos::parameterList;
1710 RCP<ParameterList> params = parameterList (
"ICGS");
1715 "Maximum number of orthogonalization passes (includes the "
1716 "first). Default is 2, since \"twice is enough\" for Krylov "
1719 "Block reorthogonalization threshold.");
1721 "Singular block detection threshold.");
1726 template<
class ScalarType,
class MV,
class OP>
1732 RCP<ParameterList> params = getICGSDefaultParameters<ScalarType, MV, OP>();
1734 params->set (
"maxNumOrthogPasses",
1736 params->set (
"blkTol",
1738 params->set (
"singTol",
1746 #endif // BELOS_ICGS_ORTHOMANAGER_HPP
void setBlkTol(const MagnitudeType blk_tol)
Set parameter for block re-orthogonalization threshhold.
const std::string & getLabel() const
This method returns the label being used by the timers in the orthogonalization manager.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &plist)
bool is_null(const boost::shared_ptr< T > &p)
static const MagnitudeType sing_tol_default_
Singular block detection threshold (default).
ICGSOrthoManager(const std::string &label="Belos", Teuchos::RCP< const OP > Op=Teuchos::null, const int max_ortho_steps=max_ortho_steps_default_, const MagnitudeType blk_tol=blk_tol_default_, const MagnitudeType sing_tol=sing_tol_default_)
Constructor specifying re-orthogonalization tolerance.
static const int max_ortho_steps_default_
Max number of (re)orthogonalization steps, including the first (default).
T & get(const std::string &name, T def_value)
Teuchos::RCP< Teuchos::ParameterList > getICGSDefaultParameters()
"Default" parameters for robustness and accuracy.
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
bool is_null(const std::shared_ptr< T > &p)
ICGSOrthoManager(const Teuchos::RCP< Teuchos::ParameterList > &plist, const std::string &label="Belos", Teuchos::RCP< const OP > Op=Teuchos::null)
Constructor that takes a list of parameters.
MagnitudeType getBlkTol() const
Return parameter for block re-orthogonalization threshhold.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Declaration of basic traits for the multivector type.
void setLabel(const std::string &label)
This method sets the label used by the timers in the orthogonalization manager.
Teuchos::ScalarTraits< ScalarType >::magnitudeType orthogError(const MV &X1, const MV &X2) const
This method computes the error in orthogonality of two multivectors, measured as the Frobenius norm o...
static const MagnitudeType blk_tol_default_
Block reorthogonalization threshold (default).
Class which defines basic traits for the operator type.
ScalarTraits< ScalarType >::magnitudeType normFrobenius() const
Traits class which defines basic operations on multivectors.
static const MagnitudeType sing_tol_fast_
Singular block detection threshold (fast).
void innerProd(const MV &X, const MV &Y, Teuchos::SerialDenseMatrix< int, ScalarType > &Z) const
Provides the inner product defining the orthogonality concepts, using the provided operator...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
~ICGSOrthoManager()
Destructor.
Teuchos::ScalarTraits< ScalarType >::magnitudeType orthonormError(const MV &X) const
This method computes the error in orthonormality of a multivector, measured as the Frobenius norm of ...
void setMyParamList(const RCP< ParameterList > ¶mList)
RCP< ParameterList > getNonconstParameterList()
int normalize(MV &X, Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B) const
This method calls normalize(X,Teuchos::null,B); see documentation for that function.
void setSingTol(const MagnitudeType sing_tol)
Set parameter for singular block detection.
MagnitudeType getSingTol() const
Return parameter for singular block detection.
An implementation of the Belos::MatOrthoManager that performs orthogonalization using multiple steps ...
void project(MV &X, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C, Teuchos::ArrayView< Teuchos::RCP< const MV > > Q) const
This method calls project(X,Teuchos::null,C,Q); see documentation for that function.
static const MagnitudeType blk_tol_fast_
Block reorthogonalization threshold (fast).
TypeTo as(const TypeFrom &t)
virtual int projectAndNormalizeWithMxImpl(MV &X, Teuchos::RCP< MV > MX, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C, Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B, Teuchos::ArrayView< Teuchos::RCP< const MV > > Q) const
Given a set of bases Q[i] and a multivector X, this method computes an orthonormal basis for ...
Teuchos::RCP< const Teuchos::ParameterList > getFastParameters() const
"Fast" but possibly unsafe or less accurate parameters.
Class which defines basic traits for the operator type.
Belos's templated virtual class for providing routines for orthogonalization and orthonormzalition of...
static const int max_ortho_steps_fast_
Max number of (re)orthogonalization steps, including the first (fast).
Belos header file which uses auto-configuration information to include necessary C++ headers...
void project(MV &X, Teuchos::RCP< MV > MX, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C, Teuchos::ArrayView< Teuchos::RCP< const MV > > Q) const
Given a list of (mutually and internally) orthonormal bases Q, this method takes a multivector X and ...
int normalize(MV &X, Teuchos::RCP< MV > MX, Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B) const
This method takes a multivector X and attempts to compute an orthonormal basis for ...
Teuchos::RCP< Teuchos::ParameterList > getICGSFastParameters()
"Fast" but possibly unsafe or less accurate parameters.
Templated virtual class for providing orthogonalization/orthonormalization methods with matrix-based ...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const