10#ifndef THYRA_TPETRA_VECTOR_HPP 
   11#define THYRA_TPETRA_VECTOR_HPP 
   14#include "Thyra_TpetraVector_decl.hpp" 
   15#include "Thyra_TpetraMultiVector.hpp" 
   16#include "Kokkos_Core.hpp" 
   24template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   29template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   32  const RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
 
   35  initializeImpl(tpetraVectorSpace, tpetraVector);
 
 
   39template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   42  const RCP<
const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
 
   45  initializeImpl(tpetraVectorSpace, tpetraVector);
 
 
   49template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   53  return tpetraVector_.getNonconstObj();
 
 
   57template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   66template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   70  if (domainSpace_.is_null()) {
 
   71    domainSpace_ = tpetraVectorSpace<Scalar>(
 
   72      Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
 
   74        tpetraVector_.getConstObj()->getMap()->getComm()
 
 
   85template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
   89  return tpetraVectorSpace_;
 
 
   96template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  100  *localValues = tpetraVector_.getNonconstObj()->get1dViewNonConst();
 
 
  104template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  108  *localValues = tpetraVector_->get1dView();
 
 
  115template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  123  if (!tpetraVector_.getNonconstObj()->isDistributed()) {
 
  124    auto comm = tpetraVector_.getNonconstObj()->getMap()->getComm();
 
  125    if (tpetraVector_.getConstObj()->getMap()->getComm()->getRank() == 0)
 
  126      tpetraVector_.getNonconstObj()->randomize(l, u);
 
  129    tpetraVector_.getNonconstObj()->reduce();
 
  131    tpetraVector_.getNonconstObj()->randomize(l, u);
 
 
  136template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  141  auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
 
  146    tpetraVector_.getNonconstObj()->abs(*tx);
 
 
  153template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  158  auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
 
  163    tpetraVector_.getNonconstObj()->reciprocal(*tx);
 
 
  170template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  175  auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
 
  181    tpetraVector_.getNonconstObj()->elementWiseMultiply(
 
  182      ST::one(), *tx, *tpetraVector_.getConstObj(), ST::zero());
 
 
  189template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  195  auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
 
  203      = Tpetra::createVector<Scalar>(tx->getMap());
 
  204    temp->elementWiseMultiply(
 
  205      ST::one(), *tx, *tpetraVector_.getConstObj(), ST::zero());
 
  206    return ST::magnitude(ST::squareroot(tpetraVector_.getConstObj()->dot(*temp)));
 
 
  213template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  226template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  237template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  249template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  262template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  265  tpetraVector_.getNonconstObj()->putScalar(alpha);
 
 
  269template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  273  auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
 
  278    tpetraVector_.getNonconstObj()->assign(*tmv);
 
 
  285template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  288  tpetraVector_.getNonconstObj()->scale(alpha);
 
 
  292template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  298  auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
 
  304    tpetraVector_.getNonconstObj()->update(alpha, *tmv, ST::one());
 
 
  311template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  325  bool allCastsSuccessful = 
true;
 
  327    auto mvIter = mv.begin();
 
  328    auto tmvIter = tmvs.
begin();
 
  329    for (; mvIter != mv.end(); ++mvIter, ++tmvIter) {
 
  330      tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromPtr(*mvIter));
 
  334        allCastsSuccessful = 
false;
 
  342  auto len = mv.size();
 
  344    tpetraVector_.getNonconstObj()->scale(beta);
 
  345  } 
else if (len == 1 && allCastsSuccessful) {
 
  346    tpetraVector_.getNonconstObj()->update(alpha[0], *tmvs[0], beta);
 
  347  } 
else if (len == 2 && allCastsSuccessful) {
 
  348    tpetraVector_.getNonconstObj()->update(alpha[0], *tmvs[0], alpha[1], *tmvs[1], beta);
 
  349  } 
else if (allCastsSuccessful) {
 
  351    auto tmvIter = tmvs.
begin();
 
  352    auto alphaIter = alpha.
begin();
 
  357    for (; tmvIter != tmvs.
end(); ++tmvIter) {
 
  358      if (tmvIter->getRawPtr() == tpetraVector_.getConstObj().getRawPtr()) {
 
  366    tmvIter = tmvs.
begin();
 
  370    if ((tmvs.
size() % 2) == 0) {
 
  371      tpetraVector_.getNonconstObj()->scale(beta);
 
  373      tpetraVector_.getNonconstObj()->update(*alphaIter, *(*tmvIter), beta);
 
  377    for (; tmvIter != tmvs.
end(); tmvIter+=2, alphaIter+=2) {
 
  378      tpetraVector_.getNonconstObj()->update(
 
  379        *alphaIter, *(*tmvIter), *(alphaIter+1), *(*(tmvIter+1)), ST::one());
 
 
  387template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  393  auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
 
  398    tpetraVector_.getConstObj()->dot(*tmv, prods);
 
 
  405template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  410  tpetraVector_.getConstObj()->norm1(norms);
 
 
  414template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  419  tpetraVector_.getConstObj()->norm2(norms);
 
 
  423template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  428  tpetraVector_.getConstObj()->normInf(norms);
 
 
  432template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  442  typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
 
  448  if (nonnull(X_tpetra) && nonnull(Y_tpetra)) {
 
  452      "Error, conjugation without transposition is not allowed for complex scalar types!");
 
  470    Y_tpetra->multiply(trans, 
Teuchos::NO_TRANS, alpha, *tpetraVector_.getConstObj(), *X_tpetra, beta);
 
 
  482template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  483template<
class TpetraVector_t>
 
  493  tpetraVectorSpace_ = tpetraVectorSpace;
 
  494  tpetraVector_.initialize(tpetraVector);
 
  495  this->updateSpmdSpace();
 
  499template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  500RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
 
  501TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
 
  502getTpetraMultiVector(
const RCP<MultiVectorBase<Scalar> >& mv)
 const 
  504  using Teuchos::rcp_dynamic_cast;
 
  505  typedef TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
 
  506  typedef TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TV;
 
  508  RCP<TMV> tmv = rcp_dynamic_cast<TMV>(mv);
 
  510    return tmv->getTpetraMultiVector();
 
  513  RCP<TV> tv = rcp_dynamic_cast<TV>(mv);
 
  515    return tv->getTpetraVector();
 
  522template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  523RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
 
  524TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
 
  525getConstTpetraMultiVector(
const RCP<
const MultiVectorBase<Scalar> >& mv)
 const 
  527  using Teuchos::rcp_dynamic_cast;
 
  528  typedef TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
 
  529  typedef TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TV;
 
  531  RCP<const TMV> tmv = rcp_dynamic_cast<const TMV>(mv);
 
  533    return tmv->getConstTpetraMultiVector();
 
  536  RCP<const TV> tv = rcp_dynamic_cast<const TV>(mv);
 
  538    return tv->getConstTpetraVector();
 
  545template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  546RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
 
  550  typedef TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TV;
 
  553    return tv->getTpetraVector();
 
  560template <
class Scalar, 
class LocalOrdinal, 
class GlobalOrdinal, 
class Node>
 
  561RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
 
  565  typedef TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TV;
 
  568    return tv->getConstTpetraVector();
 
Interface for a collection of column vectors called a multi-vector.
 
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.
 
void applyOpImpl(const RTOpPack::RTOpT< Scalar > &op, const ArrayView< const Ptr< const VectorBase< Scalar > > > &vecs, const ArrayView< const Ptr< VectorBase< Scalar > > > &targ_vecs, const Ptr< RTOpPack::ReductTarget > &reduct_obj, const Ordinal global_offset) const
Calls applyOpImplWithComm(null,op,...).
 
void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
Implemented through this->getLocalData()
 
void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
Implemented through this->getLocalData()
 
void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)
Implemented through this->commitLocalData()
 
Concrete implementation of an SPMD vector space for Tpetra.
 
Concrete Thyra::SpmdVectorBase using Tpetra::Vector.
 
void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
 
void getLocalVectorDataImpl(const Ptr< ArrayRCP< const Scalar > > &localValues) const
 
virtual void assignImpl(Scalar alpha)
 
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType norm2WeightedImpl(const VectorBase< Scalar > &x) const
 
virtual void randomizeImpl(Scalar l, Scalar u)
 
virtual void eleWiseScaleImpl(const VectorBase< Scalar > &x)
 
RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getTpetraVector()
Get the embedded non-const Tpetra::Vector.
 
RCP< const VectorSpaceBase< Scalar > > domain() const
 
virtual void linearCombinationImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &mv, const Scalar &beta)
 
RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpaceImpl() const
 
virtual void dotsImpl(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
 
void getNonconstLocalVectorDataImpl(const Ptr< ArrayRCP< Scalar > > &localValues)
 
virtual void scaleImpl(Scalar alpha)
 
TpetraVector()
Construct to uninitialized.
 
virtual void absImpl(const VectorBase< Scalar > &x)
 
void constInitialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Initialize.
 
virtual void assignMultiVecImpl(const MultiVectorBase< Scalar > &mv)
 
virtual void updateImpl(Scalar alpha, const MultiVectorBase< Scalar > &mv)
 
virtual void normsInfImpl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
 
void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)
 
virtual void norms1Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
 
virtual void reciprocalImpl(const VectorBase< Scalar > &x)
 
virtual void applyOpImpl(const RTOpPack::RTOpT< Scalar > &op, const ArrayView< const Ptr< const VectorBase< Scalar > > > &vecs, const ArrayView< const Ptr< VectorBase< Scalar > > > &targ_vecs, const Ptr< RTOpPack::ReductTarget > &reduct_obj, const Ordinal global_offset) const
 
void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
 
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
 
virtual void norms2Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
 
RCP< const Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getConstTpetraVector() const
Get the embedded non-const Tpetra::Vector.
 
void initialize(const RCP< const TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVectorSpace, const RCP< Tpetra::Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &tpetraVector)
Initialize.
 
Abstract interface for finite-dimensional dense vectors.
 
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
. Applies vector or its adjoint (transpose) as a linear operator.
 
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType norm2WeightedImpl(const VectorBase< Scalar > &x) const
Default implementation of norm_2 (weighted) using RTOps.
 
virtual void reciprocalImpl(const VectorBase< Scalar > &x)
Default implementation of reciprocal using RTOps.
 
virtual void absImpl(const VectorBase< Scalar > &x)
Default implementation of abs using RTOps.
 
virtual void eleWiseScaleImpl(const VectorBase< Scalar > &x)
Default implementation of ele_wise_scale using RTOps.
 
#define TEUCHOS_ASSERT(assertion_test)
 
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
 
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
 
bool nonnull(const std::shared_ptr< T > &p)
 
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
 
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
 
@ TRANS
Use the transposed operator.
 
@ NOTRANS
Use the non-transposed operator.
 
@ CONJTRANS
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types).
 
@ CONJ
Use the non-transposed operator with complex-conjugate elements (same as NOTRANS for real scalar type...
 
T_To & dyn_cast(T_From &from)
 
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)