10#ifndef THYRA_TPETRA_MULTIVECTOR_HPP
11#define THYRA_TPETRA_MULTIVECTOR_HPP
13#include "Thyra_TpetraMultiVector_decl.hpp"
14#include "Thyra_TpetraVectorSpace.hpp"
15#include "Thyra_TpetraVector.hpp"
16#include "Teuchos_Assert.hpp"
17#include "Kokkos_Core.hpp"
26template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
31template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
42template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
53template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
57 return tpetraMultiVector_.getNonconstObj();
61template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
65 return tpetraMultiVector_;
72template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
83template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
87 tpetraMultiVector_.getNonconstObj()->putScalar(alpha);
91template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
100 tpetraMultiVector_.getNonconstObj()->assign(*tmv);
107template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
111 tpetraMultiVector_.getNonconstObj()->scale(alpha);
115template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
127 tpetraMultiVector_.getNonconstObj()->update(alpha, *tmv, ST::one());
134template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
146 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
149 bool allCastsSuccessful =
true;
151 auto mvIter = mv.begin();
152 auto tmvIter = tmvs.
begin();
153 for (; mvIter != mv.end(); ++mvIter, ++tmvIter) {
158 allCastsSuccessful =
false;
166 auto len = tmvs.
size();
168 tpetraMultiVector_.getNonconstObj()->scale(beta);
169 }
else if (len == 1 && allCastsSuccessful) {
170 tpetraMultiVector_.getNonconstObj()->update(alpha[0], *tmvs[0], beta);
171 }
else if (len == 2 && allCastsSuccessful) {
172 tpetraMultiVector_.getNonconstObj()->update(alpha[0], *tmvs[0], alpha[1], *tmvs[1], beta);
173 }
else if (allCastsSuccessful) {
175 auto tmvIter = tmvs.
begin();
176 auto alphaIter = alpha.
begin();
181 for (; tmvIter != tmvs.
end(); ++tmvIter) {
182 if (tmvIter->getRawPtr() == tpetraMultiVector_.getConstObj().getRawPtr()) {
189 tmvIter = tmvs.
begin();
193 if ((tmvs.
size() % 2) == 0) {
194 tpetraMultiVector_.getNonconstObj()->scale(beta);
196 tpetraMultiVector_.getNonconstObj()->update(*alphaIter, *(*tmvIter), beta);
200 for (; tmvIter != tmvs.
end(); tmvIter+=2, alphaIter+=2) {
201 tpetraMultiVector_.getNonconstObj()->update(
202 *alphaIter, *(*tmvIter), *(alphaIter+1), *(*(tmvIter+1)), ST::one());
210template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
221 tpetraMultiVector_.getConstObj()->dot(*tmv, prods);
228template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
233 tpetraMultiVector_.getConstObj()->norm1(
norms);
237template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
242 tpetraMultiVector_.getConstObj()->norm2(
norms);
246template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
251 tpetraMultiVector_.getConstObj()->normInf(
norms);
255template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
264 tpetraMultiVector_->getVector(j)
269template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
278 tpetraMultiVector_.getNonconstObj()->getVectorNonConst(j)
283template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
289#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
290 std::cerr <<
"\nTpetraMultiVector::subView(Range1D) const called!\n";
299 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
300 tpetraView->getNumVectors(),
301 tpetraView->getMap()->getComm()
313template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
319#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
320 std::cerr <<
"\nTpetraMultiVector::subView(Range1D) called!\n";
329 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
330 tpetraView->getNumVectors(),
331 tpetraView->getMap()->getComm()
343template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
349#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
350 std::cerr <<
"\nTpetraMultiVector::subView(ArrayView) const called!\n";
355 cols[i] =
static_cast<std::size_t
>(cols_in[i]);
362 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
363 tpetraView->getNumVectors(),
364 tpetraView->getMap()->getComm()
376template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
382#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
383 std::cerr <<
"\nTpetraMultiVector::subView(ArrayView) called!\n";
388 cols[i] =
static_cast<std::size_t
>(cols_in[i]);
395 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
396 tpetraView->getNumVectors(),
397 tpetraView->getMap()->getComm()
409template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
416 const Ordinal primary_global_offset
421 primary_op, multi_vecs, targ_multi_vecs, reduct_objs, primary_global_offset);
425template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
438template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
451template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
510template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
514 return tpetraVectorSpace_;
518template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
523 *localValues = tpetraMultiVector_.getNonconstObj()->get1dViewNonConst();
524 *leadingDim = tpetraMultiVector_->getStride();
528template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
533 *localValues = tpetraMultiVector_->get1dView();
534 *leadingDim = tpetraMultiVector_->getStride();
538template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
540 const EOpTransp M_trans,
548 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
554 if (nonnull(X_tpetra) && nonnull(Y_tpetra)) {
558 "Error, conjugation without transposition is not allowed for complex scalar types!");
576 Y_tpetra->multiply(trans,
Teuchos::NO_TRANS, alpha, *tpetraMultiVector_.getConstObj(), *X_tpetra, beta);
587template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
588template<
class TpetraMultiVector_t>
589void TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::initializeImpl(
603 domainSpace_ = domainSpace;
605 this->updateSpmdSpace();
609template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
610RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
614 using Teuchos::rcp_dynamic_cast;
618 RCP<TMV> tmv = rcp_dynamic_cast<TMV>(mv);
620 return tmv->getTpetraMultiVector();
623 RCP<TV> tv = rcp_dynamic_cast<TV>(mv);
625 return tv->getTpetraVector();
628 return Teuchos::null;
631template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
636 using Teuchos::rcp_dynamic_cast;
637 typedef Thyra::TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
638 typedef Thyra::TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TV;
642 return tmv->getConstTpetraMultiVector();
647 return tv->getConstTpetraVector();
650 return Teuchos::null;
RCP< const VectorSpaceBase< Scalar > > domain() const
Returns this->domainScalarProdVecSpc().
Interface for a collection of column vectors called a multi-vector.
virtual void mvMultiReductApplyOpImpl(const RTOpPack::RTOpT< Scalar > &primary_op, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &multi_vecs, const ArrayView< const Ptr< MultiVectorBase< Scalar > > > &targ_multi_vecs, const ArrayView< const Ptr< RTOpPack::ReductTarget > > &reduct_objs, const Ordinal primary_global_offset) const =0
Apply a reduction/transformation operator column by column and return an array of the reduction objec...
void norms(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector natural norm.
virtual void dotsImpl(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
Default implementation of dots using RTOps.
virtual void linearCombinationImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &mv, const Scalar &beta)
Default implementation of linear_combination using RTOps.
virtual void assignMultiVecImpl(const MultiVectorBase< Scalar > &mv)
Default implementation of assign(MV) using RTOps.
virtual void updateImpl(Scalar alpha, const MultiVectorBase< Scalar > &mv)
Default implementation of update using RTOps.
Range1D validateColRange(const Range1D &rowCol) const
Validate and resize the column range.
void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
void euclideanApply(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
Uses GEMM() and Teuchos::reduceAll() to implement.
void acquireNonconstDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
void commitNonconstDetachedMultiVectorViewImpl(RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Concrete implementation of Thyra::MultiVector in terms of Tpetra::MultiVector.
RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraMultiVector()
Extract the underlying non-const Tpetra::MultiVector object.
void initialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Initialize.
RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpaceImpl() const
RCP< const ScalarProdVectorSpaceBase< Scalar > > domainScalarProdVecSpc() const
RCP< const TpetraMultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > constTpetraMultiVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Nonmember constructor for const TpetraMultiVector.
RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraMultiVector() const
Extract the underlying const Tpetra::MultiVector object.
virtual void norms2Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
void commitNonconstDetachedMultiVectorViewImpl(RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
virtual void updateImpl(Scalar alpha, const MultiVectorBase< Scalar > &mv)
void acquireNonconstDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
RCP< const VectorBase< Scalar > > colImpl(Ordinal j) const
void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
void getLocalMultiVectorDataImpl(const Ptr< ArrayRCP< const Scalar > > &localValues, const Ptr< Ordinal > &leadingDim) const
RCP< MultiVectorBase< Scalar > > nonconstNonContigSubViewImpl(const ArrayView< const int > &cols_in)
RCP< const MultiVectorBase< Scalar > > nonContigSubViewImpl(const ArrayView< const int > &cols_in) const
RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &colRng)
RCP< const MultiVectorBase< Scalar > > contigSubViewImpl(const Range1D &colRng) const
void constInitialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< const Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Initialize.
virtual void norms1Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
TpetraMultiVector()
Construct to uninitialized.
RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
virtual void dotsImpl(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
virtual void euclideanApply(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
virtual void assignMultiVecImpl(const MultiVectorBase< Scalar > &mv)
virtual void scaleImpl(Scalar alpha)
void getNonconstLocalMultiVectorDataImpl(const Ptr< ArrayRCP< Scalar > > &localValues, const Ptr< Ordinal > &leadingDim)
virtual void mvMultiReductApplyOpImpl(const RTOpPack::RTOpT< Scalar > &primary_op, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &multi_vecs, const ArrayView< const Ptr< MultiVectorBase< Scalar > > > &targ_multi_vecs, const ArrayView< const Ptr< RTOpPack::ReductTarget > > &reduct_objs, const Ordinal primary_global_offset) const
RCP< TpetraMultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > tpetraMultiVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace, const RCP< Tpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraMultiVector)
Nonmember constructor for non-const TpetraMultiVector.
virtual void assignImpl(Scalar alpha)
virtual void linearCombinationImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &mv, const Scalar &beta)
virtual void normsInfImpl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
Concrete Thyra::SpmdVectorBase using Tpetra::Vector.
RCP< const TpetraVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > constTpetraVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Nonmember constructor for TpetraVector.
RCP< TpetraVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > tpetraVector(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Nonmember constructor for TpetraVector.
Concrete implementation of an SPMD vector space for Tpetra.
RCP< TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > tpetraVectorSpace(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &tpetraMap)
Nonmember constructor that creats a serial vector space.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
bool nonnull(const std::shared_ptr< T > &p)
NOTRANS
Type for the dimension of a vector space. `**/ typedef Teuchos::Ordinal Ordinal;.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)