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>
28template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
29TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>::~TpetraVector() =
default;
32template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
35 const RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
38 initializeImpl(tpetraVectorSpace, tpetraVector);
42template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
45 const RCP<
const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
48 initializeImpl(tpetraVectorSpace, tpetraVector);
52template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
56 return tpetraVector_.getNonconstObj();
60template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
73 if (domainSpace_.is_null()) {
74 domainSpace_ = tpetraVectorSpace<Scalar>(
75 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
77 tpetraVector_.getConstObj()->getMap()->getComm()
88template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
92 return tpetraVectorSpace_;
99template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
103 *localValues = tpetraVector_.getNonconstObj()->get1dViewNonConst();
107template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
111 *localValues = tpetraVector_->get1dView();
118template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
126 if (!tpetraVector_.getNonconstObj()->isDistributed()) {
127 auto comm = tpetraVector_.getNonconstObj()->getMap()->getComm();
128 if (tpetraVector_.getConstObj()->getMap()->getComm()->getRank() == 0)
129 tpetraVector_.getNonconstObj()->randomize(l, u);
132 tpetraVector_.getNonconstObj()->reduce();
134 tpetraVector_.getNonconstObj()->randomize(l, u);
139template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
144 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
149 tpetraVector_.getNonconstObj()->abs(*tx);
156template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
161 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
166 tpetraVector_.getNonconstObj()->reciprocal(*tx);
173template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
178 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
184 tpetraVector_.getNonconstObj()->elementWiseMultiply(
185 ST::one(), *tx, *tpetraVector_.getConstObj(), ST::zero());
192template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
198 auto tx = this->getConstTpetraVector(Teuchos::rcpFromRef(x));
206 = Tpetra::createVector<Scalar>(tx->getMap());
207 temp->elementWiseMultiply(
208 ST::one(), *tx, *tpetraVector_.getConstObj(), ST::zero());
209 return ST::magnitude(ST::squareroot(tpetraVector_.getConstObj()->dot(*temp)));
216template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
229template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
240template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
252template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
265template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
268 tpetraVector_.getNonconstObj()->putScalar(alpha);
272template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
276 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
281 tpetraVector_.getNonconstObj()->assign(*tmv);
288template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
291 tpetraVector_.getNonconstObj()->scale(alpha);
295template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
301 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
307 tpetraVector_.getNonconstObj()->update(alpha, *tmv, ST::one());
314template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
328 bool allCastsSuccessful =
true;
330 auto mvIter = mv.begin();
331 auto tmvIter = tmvs.
begin();
332 for (; mvIter != mv.end(); ++mvIter, ++tmvIter) {
333 tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromPtr(*mvIter));
337 allCastsSuccessful =
false;
345 auto len = mv.size();
347 tpetraVector_.getNonconstObj()->scale(beta);
348 }
else if (len == 1 && allCastsSuccessful) {
349 tpetraVector_.getNonconstObj()->update(alpha[0], *tmvs[0], beta);
350 }
else if (len == 2 && allCastsSuccessful) {
351 tpetraVector_.getNonconstObj()->update(alpha[0], *tmvs[0], alpha[1], *tmvs[1], beta);
352 }
else if (allCastsSuccessful) {
354 auto tmvIter = tmvs.
begin();
355 auto alphaIter = alpha.
begin();
360 for (; tmvIter != tmvs.
end(); ++tmvIter) {
361 if (tmvIter->getRawPtr() == tpetraVector_.getConstObj().getRawPtr()) {
369 tmvIter = tmvs.
begin();
373 if ((tmvs.
size() % 2) == 0) {
374 tpetraVector_.getNonconstObj()->scale(beta);
376 tpetraVector_.getNonconstObj()->update(*alphaIter, *(*tmvIter), beta);
380 for (; tmvIter != tmvs.
end(); tmvIter+=2, alphaIter+=2) {
381 tpetraVector_.getNonconstObj()->update(
382 *alphaIter, *(*tmvIter), *(alphaIter+1), *(*(tmvIter+1)), ST::one());
390template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
396 auto tmv = this->getConstTpetraMultiVector(Teuchos::rcpFromRef(mv));
401 tpetraVector_.getConstObj()->dot(*tmv, prods);
408template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
413 tpetraVector_.getConstObj()->norm1(norms);
417template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
422 tpetraVector_.getConstObj()->norm2(norms);
426template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
431 tpetraVector_.getConstObj()->normInf(norms);
435template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
445 typedef Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
451 if (nonnull(X_tpetra) && nonnull(Y_tpetra)) {
455 "Error, conjugation without transposition is not allowed for complex scalar types!");
473 Y_tpetra->multiply(trans,
Teuchos::NO_TRANS, alpha, *tpetraVector_.getConstObj(), *X_tpetra, beta);
485template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
486template<
class TpetraVector_t>
496 tpetraVectorSpace_ = tpetraVectorSpace;
497 tpetraVector_.initialize(tpetraVector);
498 this->updateSpmdSpace();
502template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
503RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
504TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
505getTpetraMultiVector(
const RCP<MultiVectorBase<Scalar> >& mv)
const
507 using Teuchos::rcp_dynamic_cast;
508 typedef TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
509 typedef TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TV;
511 RCP<TMV> tmv = rcp_dynamic_cast<TMV>(mv);
513 return tmv->getTpetraMultiVector();
516 RCP<TV> tv = rcp_dynamic_cast<TV>(mv);
518 return tv->getTpetraVector();
521 return Teuchos::null;
525template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
526RCP<const Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
527TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::
528getConstTpetraMultiVector(
const RCP<
const MultiVectorBase<Scalar> >& mv)
const
530 using Teuchos::rcp_dynamic_cast;
531 typedef TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TMV;
532 typedef TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> TV;
534 RCP<const TMV> tmv = rcp_dynamic_cast<const TMV>(mv);
536 return tmv->getConstTpetraMultiVector();
539 RCP<const TV> tv = rcp_dynamic_cast<const TV>(mv);
541 return tv->getConstTpetraVector();
544 return Teuchos::null;
548template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
549RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
553 typedef TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TV;
554 RCP<TV> tv = Teuchos::rcp_dynamic_cast<TV>(v);
556 return tv->getTpetraVector();
558 return Teuchos::null;
563template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
564RCP<const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
568 typedef TpetraVector<Scalar, LocalOrdinal, GlobalOrdinal, Node> TV;
569 RCP<const TV> tv = Teuchos::rcp_dynamic_cast<const TV>(v);
571 return tv->getConstTpetraVector();
573 return Teuchos::null;
577template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
578RCP<TpetraVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >
581 const RCP<Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
586 v->initialize(tpetraVectorSpace, tpetraVector);
590template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
594 const RCP<
const Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > &tpetraVector
599 v->constInitialize(tpetraVectorSpace, tpetraVector);
606#define THYRATPETRAADAPTERS_TPETRAVECTOR_INSTANT(S, LO, GO, N) \
607 template class Thyra::TpetraVector<S, LO, GO, N>; \
609 template Teuchos::RCP<Thyra::TpetraVector<S, LO, GO, N>> \
610 Thyra::tpetraVector( \
611 const Teuchos::RCP<const Thyra::TpetraVectorSpace<S, LO, GO, N>> &, \
612 const Teuchos::RCP<Tpetra::Vector<S, LO, GO, N>> &); \
614 template Teuchos::RCP<const Thyra::TpetraVector<S, LO, GO, N>> \
615 Thyra::constTpetraVector( \
616 const Teuchos::RCP<const Thyra::TpetraVectorSpace<S, LO, GO, N>> &, \
617 const Teuchos::RCP<const Tpetra::Vector<S, LO, GO, N>> &);
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 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.
Concrete implementation of an SPMD vector space for Tpetra.
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...
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)