15 #ifndef ANASAZI_MATORTHOMANAGER_HPP
16 #define ANASAZI_MATORTHOMANAGER_HPP
43 template <
class ScalarType,
class MV,
class OP>
92 const MV& X,
const MV& Y,
281 mutable int _OpCounter;
285 template <
class ScalarType,
class MV,
class OP>
287 : _Op(Op), _hasOp(Op!=Teuchos::null), _OpCounter(0) {}
289 template <
class ScalarType,
class MV,
class OP>
293 _hasOp = (_Op != Teuchos::null);
296 template <
class ScalarType,
class MV,
class OP>
302 template <
class ScalarType,
class MV,
class OP>
308 template <
class ScalarType,
class MV,
class OP>
314 template <
class ScalarType,
class MV,
class OP>
327 if ( MVT::GetNumberVecs(X) < MVT::GetNumberVecs(Y) ) {
328 R = MVT::Clone(X,MVT::GetNumberVecs(X));
329 OPT::Apply(*_Op,X,*R);
330 _OpCounter += MVT::GetNumberVecs(X);
332 Q = Teuchos::rcpFromRef(Y);
335 P = Teuchos::rcpFromRef(X);
336 R = MVT::Clone(Y,MVT::GetNumberVecs(Y));
337 OPT::Apply(*_Op,Y,*R);
338 _OpCounter += MVT::GetNumberVecs(Y);
343 P = Teuchos::rcpFromRef(X);
344 Q = Teuchos::rcpFromRef(Y);
347 MVT::MvTransMv(SCT::one(),*P,*Q,Z);
350 template <
class ScalarType,
class MV,
class OP>
361 if ( MY == Teuchos::null ) {
366 MVT::MvTransMv(SCT::one(),X,*MY,Z);
370 MVT::MvTransMv(SCT::one(),X,Y,Z);
373 for (
int j=0; j<Z.
numCols(); j++) {
374 for (
int i=0; i<Z.
numRows(); i++) {
376 "Anasazi::MatOrthoManager::innerProdMat(): detected NaN/inf.");
382 template <
class ScalarType,
class MV,
class OP>
386 this->normMat(X,normvec);
389 template <
class ScalarType,
class MV,
class OP>
400 int nvecs = MVT::GetNumberVecs(X);
406 if (normvec.size() <
static_cast<size_t>(nvecs))
407 normvec.resize (nvecs);
412 MVT::MvNorm(X, normvec);
419 if(MX == Teuchos::null) {
421 OPT::Apply(*_Op,X,*tempVec);
428 const int numColsMX = MVT::GetNumberVecs(*MX);
430 "MatOrthoManager::norm(X, MX, normvec): "
431 "MX has fewer columns than X: "
432 "MX has " << numColsMX <<
" columns, "
433 "and X has " << nvecs <<
" columns.");
436 std::vector<ScalarType> dotvec(nvecs);
437 MVT::MvDot(X,*MX,dotvec);
438 for (
int i=0; i<nvecs; i++) {
439 normvec[i] = MT::squareroot( SCT::magnitude(dotvec[i]) );
444 template <
class ScalarType,
class MV,
class OP>
451 this->projectMat(X,Q,C);
454 template <
class ScalarType,
class MV,
class OP>
458 return this->normalizeMat(X,B);
461 template <
class ScalarType,
class MV,
class OP>
469 return this->projectAndNormalizeMat(X,Q,C,B);
472 template <
class ScalarType,
class MV,
class OP>
476 return this->orthonormErrorMat(X,Teuchos::null);
479 template <
class ScalarType,
class MV,
class OP>
483 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.