42 #ifndef BELOS_GMRESPOLYOP_HPP
43 #define BELOS_GMRESPOLYOP_HPP
79 #ifdef BELOS_TEUCHOS_TIME_MONITOR
81 #endif // BELOS_TEUCHOS_TIME_MONITOR
96 template <
class ScalarType,
class MV>
106 mv_ = Teuchos::rcp_const_cast<MV>( mv_in );
194 template <
class ScalarType,
class MV,
class OP>
205 : problem_(problem_in),
207 LP_(problem_in->getLeftPrec()),
208 RP_(problem_in->getRightPrec())
212 polyUpdateLabel_ = label_ +
": Hybrid Gmres: Vector Update";
213 #ifdef BELOS_TEUCHOS_TIME_MONITOR
215 #endif // BELOS_TEUCHOS_TIME_MONITOR
217 if (polyType_ ==
"Arnoldi" || polyType_==
"Roots")
219 else if (polyType_ ==
"Gmres")
223 "Belos::GmresPolyOp: \"Polynomial Type\" must be either \"Arnoldi\", \"Gmres\", or \"Roots\".");
228 : problem_(problem_in)
268 void ApplyPoly (
const MV& x, MV& y )
const;
287 #ifdef BELOS_TEUCHOS_TIME_MONITOR
289 #endif // BELOS_TEUCHOS_TIME_MONITOR
290 std::string polyUpdateLabel_;
299 static constexpr
int maxDegree_default_ = 25;
301 static constexpr
bool randomRHS_default_ =
true;
302 static constexpr
const char * label_default_ =
"Belos";
303 static constexpr
const char * polyType_default_ =
"Roots";
304 static constexpr
const char * orthoType_default_ =
"DGKS";
305 static constexpr std::ostream * outputStream_default_ = &std::cout;
306 static constexpr
bool damp_default_ =
false;
307 static constexpr
bool addRoots_default_ =
true;
323 int maxDegree_ = maxDegree_default_;
324 int verbosity_ = verbosity_default_;
325 bool randomRHS_ = randomRHS_default_;
326 std::string label_ = label_default_;
327 std::string polyType_ = polyType_default_;
328 std::string orthoType_ = orthoType_default_;
330 bool damp_ = damp_default_;
331 bool addRoots_ = addRoots_default_;
339 bool autoDeg =
false;
350 void ComputeAddedRoots();
353 template <
class ScalarType,
class MV,
class OP>
358 polyType_ = params_in->
get(
"Polynomial Type", polyType_default_);
362 if (params_in->
isParameter(
"Polynomial Tolerance")) {
363 if (params_in->
isType<MagnitudeType> (
"Polynomial Tolerance")) {
364 polyTol_ = params_in->
get (
"Polynomial Tolerance",
374 maxDegree_ = params_in->
get(
"Maximum Degree", maxDegree_default_);
379 randomRHS_ = params_in->
get(
"Random RHS", randomRHS_default_);
384 if (Teuchos::isParameterType<int>(*params_in,
"Verbosity")) {
385 verbosity_ = params_in->
get(
"Verbosity", verbosity_default_);
388 verbosity_ = (int)Teuchos::getParameter<Belos::MsgType>(*params_in,
"Verbosity");
393 orthoType_ = params_in->
get(
"Orthogonalization",orthoType_default_);
398 label_ = params_in->
get(
"Timer Label", label_default_);
403 outputStream_ = Teuchos::getParameter<Teuchos::RCP<std::ostream> >(*params_in,
"Output Stream");
408 damp_ = params_in->
get(
"Damped Poly", damp_default_);
413 addRoots_ = params_in->
get(
"Add Roots", addRoots_default_);
417 template <
class ScalarType,
class MV,
class OP>
423 std::vector<int> index(1,0);
426 MVT::MvRandom( *V0 );
428 MVT::Assign( *problem_->getRHS(), *V0 );
430 if ( !LP_.is_null() ) {
432 problem_->applyLeftPrec( *Vtemp, *V0);
436 problem_->apply( *Vtemp, *V0);
439 for(
int i=0; i< maxDegree_+1; i++)
445 problem_->apply( *Vi, *Vip1);
454 MVT::MvTransMv( SCT::one(), *AV, *AV, AVtransAV);
463 while( status && dim_ >= 1)
473 std::cout <<
"BelosGmresPolyOp.hpp: LAPACK POTRF was not successful!!" << std::endl;
474 std::cout <<
"Error code: " << infoInt << std::endl;
495 pCoeff_.
shape( 1, 1);
496 pCoeff_(0,0) = SCT::one();
497 std::cout <<
"Poly Degree is zero. No preconditioner created." << std::endl;
501 pCoeff_.shape( dim_+1, 1);
507 MVT::MvTransMv( SCT::one(), *AVsub, *V0, pCoeff_);
508 lapack.
POTRS(
'U', dim_+1, 1, lhs.
values(), lhs.
stride(), pCoeff_.values(), pCoeff_.stride(), &infoInt);
511 std::cout <<
"BelosGmresPolyOp.hpp: LAPACK POTRS was not successful!!" << std::endl;
512 std::cout <<
"Error code: " << infoInt << std::endl;
517 template <
class ScalarType,
class MV,
class OP>
520 std::string polyLabel = label_ +
": GmresPolyOp creation";
523 std::vector<int> idx(1,0);
526 MVT::MvInit( *newX, SCT::zero() );
528 MVT::MvRandom( *newB );
531 MVT::Assign( *(MVT::CloneView(*(problem_->getRHS()), idx)), *newB );
535 newProblem->setInitResVec( newB );
536 newProblem->setLeftPrec( problem_->getLeftPrec() );
537 newProblem->setRightPrec( problem_->getRightPrec() );
538 newProblem->setLabel(polyLabel);
539 newProblem->setProblem();
540 newProblem->setLSIndex( idx );
546 polyList.
set(
"Num Blocks",maxDegree_);
547 polyList.
set(
"Block Size",1);
548 polyList.
set(
"Keep Hessenberg",
true);
554 if (ortho_.is_null()) {
555 params_->set(
"Orthogonalization", orthoType_);
559 ortho_ = factory.
makeMatOrthoManager (orthoType_, Teuchos::null, printer_, polyLabel, paramsOrtho);
581 if ( !LP_.is_null() )
582 newProblem->applyLeftPrec( *newB, *V_0 );
586 newProblem->apply( *Vtemp, *V_0 );
593 int rank = ortho_->normalize( *V_0, Teuchos::rcpFromRef(r0_) );
595 "Belos::GmresPolyOp::generateArnoldiPoly(): Failed to compute initial block of orthonormal vectors for polynomial generation.");
600 newstate.
z = Teuchos::rcpFromRef( r0_);
602 gmres_iter->initializeGmres(newstate);
606 gmres_iter->iterate();
610 gmres_iter->updateLSQR( gmres_iter->getCurSubspaceDim() );
612 catch (std::exception& e) {
614 printer_->stream(
Errors) <<
"Error! Caught exception in BlockGmresIter::iterate() at iteration "
615 << gmres_iter->getNumIters() << endl << e.what () << endl;
630 if(polyType_ ==
"Arnoldi"){
643 y_.values(), y_.stride() );
651 for(
int i=0; i <= dim_-3; i++) {
652 for(
int k=i+2; k <= dim_-1; k++) {
653 H_(k,i) = SCT::zero();
660 ScalarType Hlast = (*gmresState.
H)(dim_,dim_-1);
666 E(dim_-1,0) = SCT::one();
669 HSolver.
setMatrix( Teuchos::rcpFromRef(Htemp));
671 HSolver.
setVectors( Teuchos::rcpFromRef(F), Teuchos::rcpFromRef(E));
678 std::cout <<
"Hsolver factor: info = " << info << std::endl;
680 info = HSolver.
solve();
682 std::cout <<
"Hsolver solve : info = " << info << std::endl;
686 F.scale(Hlast*Hlast);
691 theta_.shape(dim_,2);
698 std::vector<ScalarType> work(1);
699 std::vector<MagnitudeType> rwork(2*dim_);
702 lapack.
GEEV(
'N',
'N',dim_,H_.values(),H_.stride(),theta_[0],theta_[1],vlr, ldv, vlr, ldv, &work[0], lwork, &rwork[0], &info);
704 work.resize( lwork );
706 lapack.
GEEV(
'N',
'N',dim_,H_.values(),H_.stride(),theta_[0],theta_[1],vlr, ldv, vlr, ldv, &work[0], lwork, &rwork[0], &info);
709 std::cout <<
"GEEV solve : info = " << info << std::endl;
713 std::vector<int> index(dim_);
714 for(
int i=0; i<dim_; ++i){
717 SortModLeja(theta_,index);
726 template <
class ScalarType,
class MV,
class OP>
731 std::vector<std::complex<MagnitudeType>> cmplxHRitz (dim_);
732 for(
unsigned int i=0; i<cmplxHRitz.size(); ++i){
733 cmplxHRitz[i] = std::complex<MagnitudeType>( theta_(i,0), theta_(i,1) );
737 const MagnitudeType one(1.0);
738 std::vector<MagnitudeType> pof (dim_,one);
739 for(
int j=0; j<dim_; ++j) {
740 for(
int i=0; i<dim_; ++i) {
742 pof[j] = std::abs(pof[j]*(one-(cmplxHRitz[j]/cmplxHRitz[i])));
748 std::vector<int> extra (dim_);
750 for(
int i=0; i<dim_; ++i){
751 if (pof[i] > MCT::zero())
752 extra[i] = ceil((log10(pof[i])-MagnitudeType(4.0))/MagnitudeType(14.0));
756 totalExtra += extra[i];
760 printer_->stream(
Warnings) <<
"Warning: Need to add " << totalExtra <<
" extra roots." << std::endl;}
763 if(addRoots_ && totalExtra>0)
765 theta_.reshape(dim_+totalExtra,2);
771 for(
int i=0; i<dim_; ++i){
772 for(
int j=0; j< extra[i]; ++j){
773 theta_(count,0) = theta_(i,0);
774 theta_(count,1) = theta_(i,1);
775 thetaPert(count,0) = theta_(i,0)+(j+MCT::one())*MagnitudeType(5e-8);
776 thetaPert(count,1) = theta_(i,1);
784 printer_->stream(
Warnings) <<
"New poly degree is: " << dim_ << std::endl;}
787 std::vector<int> index2(dim_);
788 for(
int i=0; i<dim_; ++i){
791 SortModLeja(thetaPert,index2);
793 for(
int i=0; i<dim_; ++i)
795 thetaPert(i,0) = theta_(index2[i],0);
796 thetaPert(i,1) = theta_(index2[i],1);
805 template <
class ScalarType,
class MV,
class OP>
811 int dimN = index.size();
812 std::vector<int> newIndex(dimN);
818 for(
int i = 0; i < dimN; i++){
819 absVal(i) = hypot(thetaN(i,0), thetaN(i,1));
821 MagnitudeType * maxPointer = std::max_element(absVal.values(), (absVal.values()+dimN));
822 int maxIndex = int (maxPointer- absVal.values());
825 sorted(0,0) = thetaN(maxIndex,0);
826 sorted(0,1) = thetaN(maxIndex,1);
827 newIndex[0] = index[maxIndex];
831 if(sorted(0,1)!= SCT::zero() && !SCT::isComplex)
833 sorted(1,0) = thetaN(maxIndex,0);
834 sorted(1,1) = -thetaN(maxIndex,1);
835 newIndex[1] = index[maxIndex+1];
848 for(
int i = 0; i < dimN; i++)
850 prod(i) = MCT::one();
851 for(
int k = 0; k < j; k++)
853 a = thetaN(i,0) - sorted(k,0);
854 b = thetaN(i,1) - sorted(k,1);
855 if (a*a + b*b > MCT::zero())
856 prod(i) = prod(i) + log10(hypot(a,b));
858 prod(i) = -std::numeric_limits<MagnitudeType>::infinity();
865 MagnitudeType * maxPointer = std::max_element(prod.values(), (prod.values()+dimN));
866 int maxIndex = int (maxPointer- prod.values());
867 sorted(j,0) = thetaN(maxIndex,0);
868 sorted(j,1) = thetaN(maxIndex,1);
869 newIndex[j] = index[maxIndex];
872 if(sorted(j,1)!= SCT::zero() && !SCT::isComplex)
875 sorted(j,0) = thetaN(maxIndex,0);
876 sorted(j,1) = -thetaN(maxIndex,1);
877 newIndex[j] = index[maxIndex+1];
887 template <
class ScalarType,
class MV,
class OP>
891 if (polyType_ ==
"Arnoldi")
892 ApplyArnoldiPoly(x, y);
893 else if (polyType_ ==
"Gmres")
894 ApplyGmresPoly(x, y);
895 else if (polyType_ ==
"Roots")
896 ApplyRootsPoly(x, y);
900 problem_->applyOp( x, y );
904 template <
class ScalarType,
class MV,
class OP>
911 if (!LP_.is_null()) {
913 problem_->applyLeftPrec( *AX, *Xtmp );
918 #ifdef BELOS_TEUCHOS_TIME_MONITOR
921 MVT::MvAddMv(pCoeff_(0,0), *AX, SCT::zero(), y, y);
923 for(
int i=1; i < dim_+1; i++)
936 problem_->apply(*X, *Y);
938 #ifdef BELOS_TEUCHOS_TIME_MONITOR
941 MVT::MvAddMv(pCoeff_(i,0), *Y, SCT::one(), y, y);
946 if (!RP_.is_null()) {
948 problem_->applyRightPrec( *Ytmp, y );
952 template <
class ScalarType,
class MV,
class OP>
955 MVT::MvInit( y, SCT::zero() );
961 if (!LP_.is_null()) {
962 problem_->applyLeftPrec( *prod, *Xtmp );
969 if(theta_(i,1)== SCT::zero() || SCT::isComplex)
972 #ifdef BELOS_TEUCHOS_TIME_MONITOR
975 MVT::MvAddMv(SCT::one(), y, SCT::one()/theta_(i,0), *prod, y);
977 problem_->apply(*prod, *Xtmp);
979 #ifdef BELOS_TEUCHOS_TIME_MONITOR
982 MVT::MvAddMv(SCT::one(), *prod, -SCT::one()/theta_(i,0), *Xtmp, *prod);
988 MagnitudeType mod = theta_(i,0)*theta_(i,0) + theta_(i,1)*theta_(i,1);
989 problem_->apply(*prod, *Xtmp);
991 #ifdef BELOS_TEUCHOS_TIME_MONITOR
994 MVT::MvAddMv(2*theta_(i,0), *prod, -SCT::one(), *Xtmp, *Xtmp);
995 MVT::MvAddMv(SCT::one(), y, SCT::one()/mod, *Xtmp, y);
999 problem_->apply(*Xtmp, *Xtmp2);
1001 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1004 MVT::MvAddMv(SCT::one(), *prod, -SCT::one()/mod, *Xtmp2, *prod);
1010 if(theta_(dim_-1,1)== SCT::zero() || SCT::isComplex)
1012 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1015 MVT::MvAddMv(SCT::one(), y, SCT::one()/theta_(dim_-1,0), *prod, y);
1019 if (!RP_.is_null()) {
1021 problem_->applyRightPrec( *Ytmp, y );
1025 template <
class ScalarType,
class MV,
class OP>
1030 V_ = MVT::Clone( x, dim_ );
1031 if (!LP_.is_null()) {
1032 wL_ = MVT::Clone( y, 1 );
1034 if (!RP_.is_null()) {
1035 wR_ = MVT::Clone( y, 1 );
1041 int n = MVT::GetNumberVecs( x );
1042 std::vector<int> idxi(1), idxi2, idxj(1);
1045 for (
int j=0; j<n; ++j) {
1051 if (!LP_.is_null()) {
1053 problem_->applyLeftPrec( *x_view, *v_curr );
1055 MVT::SetBlock( *x_view, idxi, *V_ );
1058 for (
int i=0; i<dim_-1; ++i) {
1062 for (
int ii=0; ii<i+1; ++ii) { idxi2[ii] = ii; }
1074 if (!RP_.is_null()) {
1075 problem_->applyRightPrec( *v_curr, *wR_ );
1080 if (LP_.is_null()) {
1084 problem_->applyOp( *wR_, *wL_ );
1086 if (!LP_.is_null()) {
1087 problem_->applyLeftPrec( *wL_, *v_next );
1093 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1096 MVT::MvTimesMatAddMv( -SCT::one(), *v_prev, h, SCT::one(), *v_next );
1100 MVT::MvScale( *v_next, SCT::one()/H_(i+1,i) );
1104 if (!RP_.is_null()) {
1106 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1109 MVT::MvTimesMatAddMv( SCT::one()/r0_(0), *V_, y_, SCT::zero(), *wR_ );
1111 problem_->applyRightPrec( *wR_, *y_view );
1114 #ifdef BELOS_TEUCHOS_TIME_MONITOR
1117 MVT::MvTimesMatAddMv( SCT::one()/r0_(0), *V_, y_, SCT::zero(), *y_view );
ScaleType convertStringToScaleType(const std::string &scaleType)
Convert the given string to its ScaleType enum value.
ScalarType * values() const
GmresPolyMv(const Teuchos::RCP< const MV > &mv_in)
Collection of types and exceptions used within the Belos solvers.
const GmresPolyMv * CloneView(const std::vector< int > &index) const
Creates a new Belos::MultiVec that shares the selected contents of *this. The index of the numvecs ve...
void TRSM(ESide side, EUplo uplo, ETransp transa, EDiag diag, const OrdinalType &m, const OrdinalType &n, const alpha_type alpha, const A_type *A, const OrdinalType &lda, ScalarType *B, const OrdinalType &ldb) const
Belos's basic output manager for sending information of select verbosity levels to the appropriate ou...
void MvScale(const std::vector< ScalarType > &alpha)
Scale each element of the i-th vector in *this with alpha[i].
Class which manages the output and verbosity of the Belos solvers.
static void MvDot(const MV &mv, const MV &A, std::vector< ScalarType > &b)
Compute a vector b where the components are the individual dot-products of the i-th columns of A and ...
void MvAddMv(const ScalarType alpha, const MultiVec< ScalarType > &A, const ScalarType beta, const MultiVec< ScalarType > &B)
Replace *this with alpha * A + beta * B.
GmresPolyMv * CloneCopy() const
Create a new MultiVec and copy contents of *this into it (deep copy).
void MvScale(const ScalarType alpha)
Scale each element of the vectors in *this with alpha.
ptrdiff_t GetGlobalLength() const
The number of rows in the multivector.
static void MvRandom(MV &mv)
Replace the vectors in mv with random vectors.
This class implements the block GMRES iteration, where a block Krylov subspace is constructed...
Teuchos::RCP< const MV > V
The current Krylov basis.
Teuchos::RCP< MV > getMV()
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
void ApplyGmresPoly(const MV &x, MV &y) const
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
static Teuchos::RCP< const MV > CloneView(const MV &mv, const std::vector< int > &index)
Creates a new const MV that shares the selected contents of mv (shallow copy).
void generateGmresPoly()
This routine takes the matrix, preconditioner, and vectors from the linear problem as well as the par...
Declaration of basic traits for the multivector type.
void POTRS(const char &UPLO, const OrdinalType &n, const OrdinalType &nrhs, const ScalarType *A, const OrdinalType &lda, ScalarType *B, const OrdinalType &ldb, OrdinalType *info) const
Teuchos::RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > z
The current right-hand side of the least squares system RY = Z.
An implementation of StatusTestResNorm using a family of residual norms.
GmresPolyMv * CloneViewNonConst(const std::vector< int > &index)
Creates a new Belos::MultiVec that shares the selected contents of *this. The index of the numvecs ve...
GmresPolyMv * CloneCopy(const std::vector< int > &index) const
Creates a new Belos::MultiVec and copies the selected contents of *this into the new multivector (dee...
void MvRandom()
Fill all the vectors in *this with random numbers.
Structure to contain pointers to GmresIteration state variables.
GmresPolyOp(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem_in, const Teuchos::RCP< Teuchos::ParameterList > ¶ms_in)
Basic contstructor.
Belos::StatusTest class for specifying a maximum number of iterations.
static void MvInit(MV &mv, const ScalarType alpha=Teuchos::ScalarTraits< ScalarType >::zero())
Replace each element of the vectors in mv with alpha.
static const double polyTol
Relative residual tolerance for matrix polynomial construction.
static void MvTransMv(const ScalarType alpha, const MV &A, const MV &mv, Teuchos::SerialDenseMatrix< int, ScalarType > &B)
Compute a dense matrix B through the matrix-matrix multiply .
Class which defines basic traits for the operator type.
int GetNumberVecs() const
The number of vectors (i.e., columns) in the multivector.
static int GetNumberVecs(const MV &mv)
Obtain the number of vectors in mv.
A factory class for generating StatusTestOutput objects.
static void MvAddMv(const ScalarType alpha, const MV &A, const ScalarType beta, const MV &B, MV &mv)
Replace mv with .
ETrans
Whether to apply the (conjugate) transpose of an operator.
Traits class which defines basic operations on multivectors.
Belos::StatusTest for logically combining several status tests.
bool isParameter(const std::string &name) const
static void SetBlock(const MV &A, const std::vector< int > &index, MV &mv)
Copy the vectors in A to a set of vectors in mv indicated by the indices given in index...
A Belos::StatusTest class for specifying a maximum number of iterations.
static Teuchos::RCP< MV > CloneViewNonConst(MV &mv, const std::vector< int > &index)
Creates a new MV that shares the selected contents of mv (shallow copy).
void MvTimesMatAddMv(const ScalarType alpha, const MultiVec< ScalarType > &A, const Teuchos::SerialDenseMatrix< int, ScalarType > &B, const ScalarType beta)
Update *this with alpha * A * B + beta * (*this).
static Teuchos::RCP< MV > Clone(const MV &mv, const int numvecs)
Creates a new empty MV containing numvecs columns.
Alternative run-time polymorphic interface for operators.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
int curDim
The current dimension of the reduction.
void ApplyPoly(const MV &x, MV &y) const
This routine takes the MV x and applies the polynomial operator phi(OP) to it resulting in the MV y...
void POTRF(const char &UPLO, const OrdinalType &n, ScalarType *A, const OrdinalType &lda, OrdinalType *info) const
Teuchos::RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > R
The current upper-triangular matrix from the QR reduction of H.
int putScalar(const ScalarType value=Teuchos::ScalarTraits< ScalarType >::zero())
void factorWithEquilibration(bool flag)
void ApplyArnoldiPoly(const MV &x, MV &y) const
void MvNorm(std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > &normvec, NormType type=TwoNorm) const
Compute the norm of each vector in *this.
void solveWithTransposeFlag(Teuchos::ETransp trans)
A linear system to solve, and its associated information.
Class which describes the linear problem to be solved by the iterative solver.
GmresPolyOpOrthoFailure(const std::string &what_arg)
void SetBlock(const MultiVec< ScalarType > &A, const std::vector< int > &index)
Copy the vectors in A to a set of vectors in *this.
void ApplyRootsPoly(const MV &x, MV &y) const
static Teuchos::RCP< MV > CloneCopy(const MV &mv)
Creates a new MV and copies contents of mv into the new vector (deep copy).
Teuchos::RCP< const MV > getConstMV() const
static void MvTimesMatAddMv(const ScalarType alpha, const MV &A, const Teuchos::SerialDenseMatrix< int, ScalarType > &B, const ScalarType beta, MV &mv)
Update mv with .
Belos's class for applying the GMRES polynomial operator that is used by the hybrid-GMRES linear solv...
Belos concrete class for performing the block GMRES iteration.
OrdinalType numCols() const
static ptrdiff_t GetGlobalLength(const MV &mv)
Return the number of rows in the given multivector mv.
NormType
The type of vector norm to compute.
void MvInit(const ScalarType alpha)
Replace each element of the vectors in *this with alpha.
void MvDot(const MultiVec< ScalarType > &A, std::vector< ScalarType > &b) const
Compute the dot product of each column of *this with the corresponding column of A.
void MvTransMv(const ScalarType alpha, const MultiVec< ScalarType > &A, Teuchos::SerialDenseMatrix< int, ScalarType > &B) const
Compute a dense matrix B through the matrix-matrix multiply alpha * A^T * (*this).
int setVectors(const RCP< SerialDenseMatrix< OrdinalType, ScalarType > > &X, const RCP< SerialDenseMatrix< OrdinalType, ScalarType > > &B)
Alternative run-time polymorphic interface for operators.
virtual ~GmresPolyOp()
Destructor.
void GEEV(const char &JOBVL, const char &JOBVR, const OrdinalType &n, ScalarType *A, const OrdinalType &lda, MagnitudeType *WR, MagnitudeType *WI, ScalarType *VL, const OrdinalType &ldvl, ScalarType *VR, const OrdinalType &ldvr, ScalarType *WORK, const OrdinalType &lwork, MagnitudeType *RWORK, OrdinalType *info) const
GmresPolyMv * Clone(const int numvecs) const
Create a new MultiVec with numvecs columns.
Belos::StatusTestResNorm for specifying general residual norm stopping criteria.
Belos::StatusTest for specifying an implicit residual norm stopping criteria that checks for loss of ...
bool isType(const std::string &name) const
A class for extending the status testing capabilities of Belos via logical combinations.
Interface for multivectors used by Belos' linear solvers.
GmresPolyOp(const Teuchos::RCP< LinearProblem< ScalarType, MV, OP > > &problem_in)
Given no ParameterList, constructor creates no polynomial and only applies the given operator...
static void MvNorm(const MV &mv, std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > &normvec, NormType type=TwoNorm)
Compute the norm of each individual vector of mv. Upon return, normvec[i] holds the value of ...
void generateArnoldiPoly()
This routine takes the matrix, preconditioner, and vectors from the linear problem as well as the par...
static void MvScale(MV &mv, const ScalarType alpha)
Scale each element of the vectors in mv with alpha.
Parent class to all Belos exceptions.
int shape(OrdinalType numRows, OrdinalType numCols)
Pure virtual base class which augments the basic interface for a Gmres linear solver iteration...
GmresIterationOrthoFailure is thrown when the GmresIteration object is unable to compute independent ...
Belos header file which uses auto-configuration information to include necessary C++ headers...
static void MvPrint(const MV &mv, std::ostream &os)
Print the mv multi-vector to the os output stream.
GmresPolyOpOrthoFailure is thrown when the orthogonalization manager is unable to generate orthonorma...
void MvPrint(std::ostream &os) const
Print *this multivector to the os output stream.
OrdinalType stride() const
void Apply(const MultiVec< ScalarType > &x, MultiVec< ScalarType > &y, ETrans=NOTRANS) const
This routine casts the MultiVec to GmresPolyMv to retrieve the MV. Then the above apply method is cal...
void setParameters(const Teuchos::RCP< Teuchos::ParameterList > ¶ms_in)
Process the passed in parameters.
OrdinalType numRows() const
int setMatrix(const RCP< SerialDenseMatrix< OrdinalType, ScalarType > > &A)
Interface for multivectors used by Belos' linear solvers.
GmresPolyMv(const Teuchos::RCP< MV > &mv_in)
Teuchos::RCP< const Teuchos::SerialDenseMatrix< int, ScalarType > > H
The current Hessenberg matrix.
Teuchos::RCP< Belos::MatOrthoManager< Scalar, MV, OP > > makeMatOrthoManager(const std::string &ortho, const Teuchos::RCP< const OP > &M, const Teuchos::RCP< OutputManager< Scalar > > &, const std::string &label, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Return an instance of the specified MatOrthoManager subclass.