47 #ifndef ANASAZI_MATORTHOMANAGER_HPP
48 #define ANASAZI_MATORTHOMANAGER_HPP
75 template <
class ScalarType,
class MV,
class OP>
124 const MV& X,
const MV& Y,
313 mutable int _OpCounter;
317 template <
class ScalarType,
class MV,
class OP>
319 : _Op(Op), _hasOp(Op!=Teuchos::null), _OpCounter(0) {}
321 template <
class ScalarType,
class MV,
class OP>
325 _hasOp = (_Op != Teuchos::null);
328 template <
class ScalarType,
class MV,
class OP>
334 template <
class ScalarType,
class MV,
class OP>
340 template <
class ScalarType,
class MV,
class OP>
346 template <
class ScalarType,
class MV,
class OP>
359 if ( MVT::GetNumberVecs(X) < MVT::GetNumberVecs(Y) ) {
360 R = MVT::Clone(X,MVT::GetNumberVecs(X));
361 OPT::Apply(*_Op,X,*R);
362 _OpCounter += MVT::GetNumberVecs(X);
364 Q = Teuchos::rcpFromRef(Y);
367 P = Teuchos::rcpFromRef(X);
368 R = MVT::Clone(Y,MVT::GetNumberVecs(Y));
369 OPT::Apply(*_Op,Y,*R);
370 _OpCounter += MVT::GetNumberVecs(Y);
375 P = Teuchos::rcpFromRef(X);
376 Q = Teuchos::rcpFromRef(Y);
379 MVT::MvTransMv(SCT::one(),*P,*Q,Z);
382 template <
class ScalarType,
class MV,
class OP>
393 if ( MY == Teuchos::null ) {
398 MVT::MvTransMv(SCT::one(),X,*MY,Z);
402 MVT::MvTransMv(SCT::one(),X,Y,Z);
405 for (
int j=0; j<Z.
numCols(); j++) {
406 for (
int i=0; i<Z.
numRows(); i++) {
408 "Anasazi::MatOrthoManager::innerProdMat(): detected NaN/inf.");
414 template <
class ScalarType,
class MV,
class OP>
418 this->normMat(X,normvec);
421 template <
class ScalarType,
class MV,
class OP>
432 int nvecs = MVT::GetNumberVecs(X);
438 if (normvec.size() <
static_cast<size_t>(nvecs))
439 normvec.resize (nvecs);
444 MVT::MvNorm(X, normvec);
451 if(MX == Teuchos::null) {
453 OPT::Apply(*_Op,X,*tempVec);
460 const int numColsMX = MVT::GetNumberVecs(*MX);
462 "MatOrthoManager::norm(X, MX, normvec): "
463 "MX has fewer columns than X: "
464 "MX has " << numColsMX <<
" columns, "
465 "and X has " << nvecs <<
" columns.");
468 std::vector<ScalarType> dotvec(nvecs);
469 MVT::MvDot(X,*MX,dotvec);
470 for (
int i=0; i<nvecs; i++) {
471 normvec[i] = MT::squareroot( SCT::magnitude(dotvec[i]) );
476 template <
class ScalarType,
class MV,
class OP>
483 this->projectMat(X,Q,C);
486 template <
class ScalarType,
class MV,
class OP>
490 return this->normalizeMat(X,B);
493 template <
class ScalarType,
class MV,
class OP>
501 return this->projectAndNormalizeMat(X,Q,C,B);
504 template <
class ScalarType,
class MV,
class OP>
508 return this->orthonormErrorMat(X,Teuchos::null);
511 template <
class ScalarType,
class MV,
class OP>
515 return this->orthogErrorMat(X1,X2);
void norm(const MV &X, std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > &normvec) const
Implements the interface OrthoManager::norm().
virtual void setOp(Teuchos::RCP< const OP > Op)
Set operator used for inner product.
Declaration of basic traits for the multivector type.
int normalize(MV &X, Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B=Teuchos::null) const
Implements the interface OrthoManager::normalize().
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Virtual base class which defines basic traits for the operator type.
void innerProdMat(const MV &X, const MV &Y, Teuchos::SerialDenseMatrix< int, ScalarType > &Z, Teuchos::RCP< const MV > MX=Teuchos::null, Teuchos::RCP< const MV > MY=Teuchos::null) const
Provides a matrix-based inner product.
Teuchos::ScalarTraits< ScalarType >::magnitudeType orthonormError(const MV &X) const
Implements the interface OrthoManager::orthonormError().
virtual void projectMat(MV &X, Teuchos::Array< Teuchos::RCP< const MV > > Q, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C=Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > >(Teuchos::null)), Teuchos::RCP< MV > MX=Teuchos::null, Teuchos::Array< Teuchos::RCP< const MV > > MQ=Teuchos::tuple(Teuchos::RCP< const MV >(Teuchos::null))) const =0
Provides matrix-based projection method.
virtual Teuchos::RCP< const OP > getOp() const
Get operator used for inner product.
Anasazi's templated virtual class for providing routines for orthogonalization and orthonormalization...
void innerProd(const MV &X, const MV &Y, Teuchos::SerialDenseMatrix< int, ScalarType > &Z) const
Implements the interface OrthoManager::innerProd().
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual Teuchos::ScalarTraits< ScalarType >::magnitudeType orthonormErrorMat(const MV &X, Teuchos::RCP< const MV > MX=Teuchos::null) const =0
This method computes the error in orthonormality of a multivector.
MatOrthoManager(Teuchos::RCP< const OP > Op=Teuchos::null)
Default constructor.
Templated virtual class for providing orthogonalization/orthonormalization methods.
Traits class which defines basic operations on multivectors.
Virtual base class which defines basic traits for the operator type.
virtual ~MatOrthoManager()
Destructor.
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
void resetOpCounter()
Reset the operator counter to zero.
int projectAndNormalize(MV &X, Teuchos::Array< Teuchos::RCP< const MV > > Q, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C=Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > >(Teuchos::null)), Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B=Teuchos::null) const
Implements the interface OrthoManager::projectAndNormalize().
int getOpCounter() const
Retrieve operator counter.
OrdinalType numCols() const
Teuchos::ScalarTraits< ScalarType >::magnitudeType orthogError(const MV &X1, const MV &X2) const
Implements the interface OrthoManager::orthogError().
virtual int normalizeMat(MV &X, Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B=Teuchos::null, Teuchos::RCP< MV > MX=Teuchos::null) const =0
Provides matrix-based orthonormalization method.
Types and exceptions used within Anasazi solvers and interfaces.
Anasazi's templated virtual class for providing routines for orthogonalization and orthonormalization...
void project(MV &X, Teuchos::Array< Teuchos::RCP< const MV > > Q, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C=Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > >(Teuchos::null))) const
Implements the interface OrthoManager::project().
void normMat(const MV &X, std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > &normvec, Teuchos::RCP< const MV > MX=Teuchos::null) const
Provides the norm induced by the matrix-based inner product.
virtual Teuchos::ScalarTraits< ScalarType >::magnitudeType orthogErrorMat(const MV &X, const MV &Y, Teuchos::RCP< const MV > MX=Teuchos::null, Teuchos::RCP< const MV > MY=Teuchos::null) const =0
This method computes the error in orthogonality of two multivectors.
OrdinalType numRows() const
virtual int projectAndNormalizeMat(MV &X, Teuchos::Array< Teuchos::RCP< const MV > > Q, Teuchos::Array< Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > > C=Teuchos::tuple(Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > >(Teuchos::null)), Teuchos::RCP< Teuchos::SerialDenseMatrix< int, ScalarType > > B=Teuchos::null, Teuchos::RCP< MV > MX=Teuchos::null, Teuchos::Array< Teuchos::RCP< const MV > > MQ=Teuchos::tuple(Teuchos::RCP< const MV >(Teuchos::null))) const =0
Provides matrix-based projection/orthonormalization method.