34 #ifndef ANASAZI_THYRA_ADAPTER_HPP 35 #define ANASAZI_THYRA_ADAPTER_HPP 41 #include <Thyra_DetachedMultiVectorView.hpp> 42 #include <Thyra_MultiVectorBase.hpp> 43 #include <Thyra_MultiVectorStdOps.hpp> 44 #include <Thyra_VectorStdOps.hpp> 46 #include <Teuchos_Ptr.hpp> 47 #include <Teuchos_ArrayRCP.hpp> 48 #include <Teuchos_ArrayView.hpp> 66 template<
class ScalarType>
70 typedef Thyra::MultiVectorBase<ScalarType> TMVB;
71 typedef Teuchos::ScalarTraits<ScalarType> ST;
72 typedef typename ST::magnitudeType magType;
83 static Teuchos::RCP<TMVB>
Clone(
const TMVB & mv,
const int numvecs )
85 Teuchos::RCP<TMVB> c = Thyra::createMembers( mv.range(), numvecs );
93 static Teuchos::RCP<TMVB>
96 const int numvecs = mv.domain()->dim();
98 Teuchos::RCP< TMVB > cc = Thyra::createMembers (mv.range(), numvecs);
100 Thyra::assign (Teuchos::outArg (*cc), mv);
109 static Teuchos::RCP< TMVB >
CloneCopy(
const TMVB & mv,
const std::vector<int>& index )
111 const int numvecs = index.size();
113 Teuchos::RCP<TMVB > cc = Thyra::createMembers (mv.range(), numvecs);
115 Teuchos::RCP<const TMVB > view = mv.subView ( Teuchos::arrayViewFromVector( index ) );
117 Thyra::assign (Teuchos::outArg (*cc), *view);
121 static Teuchos::RCP<TMVB>
122 CloneCopy (
const TMVB& mv,
const Teuchos::Range1D& index)
124 const int numVecs = index.size();
126 Teuchos::RCP<TMVB> cc = Thyra::createMembers (mv.range(), numVecs);
128 Teuchos::RCP<const TMVB> view = mv.subView (index);
130 Thyra::assign (Teuchos::outArg (*cc), *view);
141 int numvecs = index.size();
157 for (
int i=0; i<numvecs; i++) {
158 if (lb+i != index[i]) contig =
false;
161 Teuchos::RCP< TMVB > cc;
163 const Thyra::Range1D rng(lb,lb+numvecs-1);
165 cc = mv.subView(rng);
169 cc = mv.subView( Teuchos::arrayViewFromVector( index ) );
174 static Teuchos::RCP<TMVB>
182 return mv.subView (index);
190 static Teuchos::RCP<const TMVB >
CloneView(
const TMVB & mv,
const std::vector<int>& index )
192 int numvecs = index.size();
208 for (
int i=0; i<numvecs; i++) {
209 if (lb+i != index[i]) contig =
false;
212 Teuchos::RCP< const TMVB > cc;
214 const Thyra::Range1D rng(lb,lb+numvecs-1);
216 cc = mv.subView(rng);
220 cc = mv.subView(Teuchos::arrayViewFromVector( index ) );
225 static Teuchos::RCP<const TMVB>
226 CloneView (
const TMVB& mv,
const Teuchos::Range1D& index)
233 return mv.subView (index);
243 {
return mv.range()->dim(); }
247 {
return mv.domain()->dim(); }
257 const Teuchos::SerialDenseMatrix<int,ScalarType>& B,
258 const ScalarType beta, TMVB & mv )
263 Teuchos::RCP< const TMVB >
264 B_thyra = Thyra::createMembersView(
266 RTOpPack::ConstSubMultiVectorView<ScalarType>(
268 Teuchos::arcpFromArrayView(Teuchos::arrayView(&B(0,0), B.stride()*B.numCols())), B.stride()
272 A.apply(Thyra::NOTRANS,*B_thyra,Teuchos::outArg (mv),alpha,beta);
277 static void MvAddMv(
const ScalarType alpha,
const TMVB & A,
278 const ScalarType beta,
const TMVB & B, TMVB & mv )
280 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::inoutArg;
282 Thyra::linear_combination<ScalarType>(
283 tuple(alpha, beta)(), tuple(ptrInArg(A), ptrInArg(B))(), ST::zero(), inoutArg(mv));
288 static void MvTransMv(
const ScalarType alpha,
const TMVB & A,
const TMVB & mv,
289 Teuchos::SerialDenseMatrix<int,ScalarType>& B )
292 int m = A.domain()->dim();
293 int n = mv.domain()->dim();
296 B_thyra = Thyra::createMembersView(
298 RTOpPack::SubMultiVectorView<ScalarType>(
300 Teuchos::arcpFromArrayView(Teuchos::arrayView(&B(0,0), B.stride()*B.numCols())), B.stride()
303 A.apply(Thyra::CONJTRANS,mv,B_thyra.ptr(),alpha,Teuchos::ScalarTraits<ScalarType>::zero());
309 static void MvDot(
const TMVB & mv,
const TMVB & A, std::vector<ScalarType> &b )
310 { Thyra::dots(mv,A,Teuchos::arrayViewFromVector( b )); }
316 const ScalarType alpha)
318 Thyra::scale (alpha, Teuchos::inOutArg (mv));
325 const std::vector<ScalarType>& alpha)
327 for (
unsigned int i=0; i<alpha.size(); i++) {
328 Thyra::scale (alpha[i], mv.col(i).ptr());
340 static void MvNorm(
const TMVB & mv, std::vector<
typename Teuchos::ScalarTraits<ScalarType>::magnitudeType> &normvec )
341 { Thyra::norms_2(mv,Teuchos::arrayViewFromVector( normvec )); }
350 static void SetBlock(
const TMVB & A,
const std::vector<int>& index, TMVB & mv )
353 int numvecs = index.size();
354 std::vector<int> indexA(numvecs);
355 int numAcols = A.domain()->dim();
356 for (
int i=0; i<numvecs; i++) {
361 if ( numAcols < numvecs ) {
366 else if ( numAcols > numvecs ) {
368 indexA.resize( numAcols );
371 Teuchos::RCP< const TMVB > relsource = A.subView( Teuchos::arrayViewFromVector( indexA ) );
373 Teuchos::RCP< TMVB > reldest = mv.subView( Teuchos::arrayViewFromVector( index ) );
375 Thyra::assign (Teuchos::outArg (*reldest), *relsource);
379 SetBlock (
const TMVB& A,
const Teuchos::Range1D& index, TMVB& mv)
381 const int numColsA = A.domain()->dim();
382 const int numColsMv = mv.domain()->dim();
384 const bool validIndex = index.lbound() >= 0 && index.ubound() < numColsMv;
386 const bool validSource = index.size() <= numColsA;
388 if (! validIndex || ! validSource)
390 std::ostringstream os;
391 os <<
"Anasazi::MultiVecTraits<Scalar, Thyra::MultiVectorBase<Scalar> " 392 ">::SetBlock(A, [" << index.lbound() <<
", " << index.ubound()
394 TEUCHOS_TEST_FOR_EXCEPTION(index.lbound() < 0, std::invalid_argument,
395 os.str() <<
"Range lower bound must be nonnegative.");
396 TEUCHOS_TEST_FOR_EXCEPTION(index.ubound() >= numColsMv, std::invalid_argument,
397 os.str() <<
"Range upper bound must be less than " 398 "the number of columns " << numColsA <<
" in the " 399 "'mv' output argument.");
400 TEUCHOS_TEST_FOR_EXCEPTION(index.size() > numColsA, std::invalid_argument,
401 os.str() <<
"Range must have no more elements than" 402 " the number of columns " << numColsA <<
" in the " 403 "'A' input argument.");
404 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
410 Teuchos::RCP<TMVB> mv_view;
411 if (index.lbound() == 0 && index.ubound()+1 == numColsMv)
412 mv_view = Teuchos::rcpFromRef (mv);
414 mv_view = mv.subView (index);
419 Teuchos::RCP<const TMVB> A_view;
420 if (index.size() == numColsA)
421 A_view = Teuchos::rcpFromRef (A);
423 A_view = A.subView (Teuchos::Range1D(0, index.size()-1));
426 Thyra::assign (Teuchos::outArg (*mv_view), *A_view);
430 Assign (
const TMVB& A, TMVB& mv)
433 using Teuchos::Range1D;
436 const int numColsA = A.domain()->dim();
437 const int numColsMv = mv.domain()->dim();
438 if (numColsA > numColsMv) {
439 const std::string prefix (
"Anasazi::MultiVecTraits<Scalar, " 440 "Thyra::MultiVectorBase<Scalar>" 441 " >::Assign(A, mv): ");
442 TEUCHOS_TEST_FOR_EXCEPTION(numColsA > numColsMv, std::invalid_argument,
443 prefix <<
"Input multivector 'A' has " 444 << numColsA <<
" columns, but output multivector " 445 "'mv' has only " << numColsMv <<
" columns.");
446 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
"Should never get here!");
449 if (numColsA == numColsMv) {
450 Thyra::assign (outArg (mv), A);
454 Thyra::assign (outArg (*mv_view), A);
464 Thyra::randomize(-Teuchos::ScalarTraits<ScalarType>::one(),
465 Teuchos::ScalarTraits<ScalarType>::one(),
466 Teuchos::outArg (mv));
473 ScalarType alpha = Teuchos::ScalarTraits<ScalarType>::zero())
475 Thyra::assign (Teuchos::outArg (mv), alpha);
485 static void MvPrint(
const TMVB & mv, std::ostream& os )
487 Teuchos::RCP<Teuchos::FancyOStream> out = Teuchos::getFancyOStream(Teuchos::rcp(&os,
false));
488 out->setf(std::ios_base::scientific);
490 mv.describe(*out,Teuchos::VERB_EXTREME);
513 template <
class ScalarType>
514 class OperatorTraits < ScalarType, Thyra::MultiVectorBase<ScalarType>, Thyra::LinearOpBase<ScalarType> >
521 static void Apply (
const Thyra::LinearOpBase< ScalarType >& Op,
const Thyra::MultiVectorBase< ScalarType > & x, Thyra::MultiVectorBase< ScalarType > & y )
523 Op.apply(Thyra::NOTRANS,x,Teuchos::outArg (y), Teuchos::ScalarTraits<ScalarType>::one(),Teuchos::ScalarTraits<ScalarType>::zero());
static void MvNorm(const TMVB &mv, std::vector< typename Teuchos::ScalarTraits< ScalarType >::magnitudeType > &normvec)
Compute the 2-norm of each individual vector of mv. Upon return, normvec[i] holds the value of ...
static Teuchos::RCP< TMVB > CloneCopy(const TMVB &mv, const std::vector< int > &index)
Creates a new MultiVectorBase and copies the selected contents of mv into the new vector (deep copy)...
static void MvDot(const TMVB &mv, const TMVB &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 ...
Declaration of basic traits for the multivector type.
Virtual base class which defines basic traits for the operator type.
static void MvTimesMatAddMv(const ScalarType alpha, const TMVB &A, const Teuchos::SerialDenseMatrix< int, ScalarType > &B, const ScalarType beta, TMVB &mv)
Update mv with .
static void Assign(const MV &A, MV &mv)
mv := A
Namespace Anasazi contains the classes, structs, enums and utilities used by the Anasazi package...
static void MvPrint(const TMVB &mv, std::ostream &os)
Print the mv multi-vector to the os output stream.
static void MvTransMv(const ScalarType alpha, const TMVB &A, const TMVB &mv, Teuchos::SerialDenseMatrix< int, ScalarType > &B)
Compute a dense matrix B through the matrix-matrix multiply .
Traits class which defines basic operations on multivectors.
static Teuchos::RCP< MV > CloneCopy(const MV &mv)
Creates a new MV and copies contents of mv into the new vector (deep copy).
Virtual base class which defines basic traits for the operator type.
static void MvAddMv(const ScalarType alpha, const TMVB &A, const ScalarType beta, const TMVB &B, TMVB &mv)
Replace mv with .
Anasazi header file which uses auto-configuration information to include necessary C++ headers...
static void MvRandom(TMVB &mv)
Replace the vectors in mv with random vectors.
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).
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).
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...
static int GetNumberVecs(const TMVB &mv)
Obtain the number of vectors in mv.
static void SetBlock(const TMVB &A, const std::vector< int > &index, TMVB &mv)
Copy the vectors in A to a set of vectors in mv indicated by the indices given in index...
static Teuchos::RCP< TMVB > CloneViewNonConst(TMVB &mv, const std::vector< int > &index)
Creates a new MultiVectorBase that shares the selected contents of mv (shallow copy).
static void MvInit(TMVB &mv, ScalarType alpha=Teuchos::ScalarTraits< ScalarType >::zero())
Replace each element of the vectors in mv with alpha.
static Teuchos::RCP< TMVB > CloneCopy(const TMVB &mv)
Creates a new MultiVectorBase and copies contents of mv into the new vector (deep copy)...
static void MvScale(TMVB &mv, const std::vector< ScalarType > &alpha)
Scale each element of the i-th vector in *this with alpha[i].
static ptrdiff_t GetGlobalLength(const TMVB &mv)
Obtain the vector length of mv.
static void Apply(const Thyra::LinearOpBase< ScalarType > &Op, const Thyra::MultiVectorBase< ScalarType > &x, Thyra::MultiVectorBase< ScalarType > &y)
This method takes the MultiVectorBase x and applies the LinearOpBase Op to it resulting in the MultiV...
static Teuchos::RCP< const TMVB > CloneView(const TMVB &mv, const std::vector< int > &index)
Creates a new const MultiVectorBase that shares the selected contents of mv (shallow copy)...
static void MvScale(TMVB &mv, const ScalarType alpha)
Scale each element of the vectors in *this with alpha.
static Teuchos::RCP< TMVB > Clone(const TMVB &mv, const int numvecs)
Creates a new empty MultiVectorBase containing numvecs columns.