10#ifndef THYRA_TPETRA_VECTOR_SPACE_HPP
11#define THYRA_TPETRA_VECTOR_SPACE_HPP
14#include "Thyra_TpetraVectorSpace_decl.hpp"
15#include "Thyra_TpetraThyraWrappers.hpp"
16#include "Thyra_TpetraVector.hpp"
17#include "Thyra_TpetraMultiVector.hpp"
18#include "Thyra_TpetraEuclideanScalarProd.hpp"
19#include "Tpetra_Details_StaticView.hpp"
24template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
34template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
36 const RCP<
const Tpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > &tpetraMap
40 tpetraMap_ = tpetraMap;
41 this->
updateState(tpetraMap->getGlobalNumElements(),
42 !tpetraMap->isDistributed());
50template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
56 Tpetra::createLocalMapWithNode<LocalOrdinal,GlobalOrdinal,Node>(
57 size, tpetraMap_->getComm() ) );
64template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69 weakSelfPtr_.create_strong().getConst(),
71 new Tpetra::Vector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(tpetraMap_,
false)
77template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
82 weakSelfPtr_.create_strong().getConst(),
83 this->createLocallyReplicatedVectorSpace(numMembers),
85 new Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(
86 tpetraMap_, numMembers,
false)
92template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
93class CopyTpetraMultiVectorViewBack {
96 :mv_(mv), raw_mv_(raw_mv)
99 bool inUse = Teuchos::get_extra_data<bool>(tmv,
"inUse");
102 "Cannot use the cached vector simultaneously more than once.");
104 Teuchos::set_extra_data(inUse,
"inUse",Teuchos::outArg(tmv), Teuchos::POST_DESTROY,
false);
106 ~CopyTpetraMultiVectorViewBack()
110 RTOpPack::assign_entries<Scalar>( Teuchos::outArg(raw_mv_), smv );
111 mv_->releaseDetachedView(&smv);
113 RCP<Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> > tmv = Teuchos::rcp_dynamic_cast<TpetraMultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node> >(mv_,
true)->getTpetraMultiVector();
114 Teuchos::set_extra_data(inUse,
"inUse",Teuchos::outArg(tmv), Teuchos::POST_DESTROY,
false);
117 RCP<MultiVectorBase<Scalar> > mv_;
118 const RTOpPack::SubMultiVectorView<Scalar> raw_mv_;
122template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
134 if (!tpetraMap_->isDistributed()) {
136 if (tpetraMV_.is_null() || (tpetraMV_->getNumVectors() != size_t (raw_mv.
numSubCols()))) {
137 if (!tpetraMV_.is_null())
141 "Cannot use the cached vector simultaneously more than once.");
142 using IST =
typename Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type;
143 using DT =
typename Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::device_type;
144 auto dv = ::Tpetra::Details::getStatic2dDualView<IST, DT> (tpetraMap_->getGlobalNumElements(), raw_mv.
numSubCols());
145 tpetraMV_ =
Teuchos::rcp(
new Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(tpetraMap_, dv));
147 Teuchos::set_extra_data(inUse,
"inUse",Teuchos::outArg(tpetraMV_));
150 if (tpetraDomainSpace_.is_null() || raw_mv.
numSubCols() != tpetraDomainSpace_->localSubDim())
158 Teuchos::set_extra_data(inUse,
"inUse",Teuchos::outArg(tmv));
164 RTOpPack::assign_entries<Scalar>(
168 mv->commitDetachedView(&smv);
171 Teuchos::set_extra_data(
173 Teuchos::rcp(
new CopyTpetraMultiVectorViewBack<Scalar,LocalOrdinal,GlobalOrdinal,Node>(Teuchos::rcpFromRef(*mv),raw_mv)),
174 "CopyTpetraMultiVectorViewBack",
182template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
192 if (!tpetraMap_->isDistributed()) {
193 if (tpetraMV_.is_null() || (tpetraMV_->getNumVectors() != size_t (raw_mv.
numSubCols()))) {
194 if (!tpetraMV_.is_null())
198 "Cannot use the cached vector simultaneously more than once.");
199 using IST =
typename Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::impl_scalar_type;
200 using DT =
typename Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>::device_type;
201 auto dv = ::Tpetra::Details::getStatic2dDualView<IST, DT> (tpetraMap_->getGlobalNumElements(), raw_mv.
numSubCols());
202 tpetraMV_ =
Teuchos::rcp(
new Tpetra::MultiVector<Scalar,LocalOrdinal,GlobalOrdinal,Node>(tpetraMap_, dv));
204 Teuchos::set_extra_data(inUse,
"inUse",Teuchos::outArg(tpetraMV_));
207 if (tpetraDomainSpace_.is_null() || raw_mv.
numSubCols() != tpetraDomainSpace_->localSubDim())
215 Teuchos::set_extra_data(inUse,
"inUse",Teuchos::outArg(tmv));
220 RTOpPack::assign_entries<Scalar>(
223 mv->commitDetachedView(&smv);
228template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
233 const Range1D rng = full_range(rng_in,0,this->
dim()-1);
236 const Ordinal myLocalSubDim = tpetraMap_.is_null () ?
237 static_cast<Ordinal
> (0) : tpetraMap_->getLocalNumElements ();
239 return ( l_localOffset<=rng.
lbound() && rng.
ubound()<l_localOffset+myLocalSubDim );
243template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
250template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
260template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
268template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
271 return tpetraMap_.
is_null () ?
static_cast<Ordinal
> (0) :
272 static_cast<Ordinal
> (tpetraMap_->getLocalNumElements ());
278template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
279TpetraVectorSpace<Scalar,LocalOrdinal,GlobalOrdinal,Node>::TpetraVectorSpace()
Ordinal numSubCols() const
RCP< T > create_weak() const
Interface for a collection of column vectors called a multi-vector.
virtual void setScalarProd(const RCP< const ScalarProdBase< Scalar > > &scalarProd)
Set a different scalar product.
virtual void updateState(const Ordinal globalDim, const bool isLocallyReplicated=false)
This function must be called whenever the state of this changes and some internal state must be updat...
Ordinal localOffset() const
Ordinal dim() const
Returns the sum of the local number of elements on every process.
RCP< const TpetraEuclideanScalarProd< Scalar, LocalOrdinal, GlobalOrdinal, Node > > tpetraEuclideanScalarProd()
Nonmember constructor for TpetraEuclideanScalarProd.
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.
Concrete implementation of an SPMD vector space for Tpetra.
TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > this_t
RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getTpetraMap() const
Get the embedded Tpetra::Map.
RCP< TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > tpetraVectorSpace(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &tpetraMap)
Nonmember constructor that creats a serial vector space.
bool hasInCoreView(const Range1D &rng, const EViewType viewType, const EStrideType strideType) const
Returns true if all the elements in rng are in this process.
Ordinal localSubDim() const
void initialize(const RCP< const Tpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &tpetraMap)
Initialize a serial space.
RCP< const VectorSpaceBase< Scalar > > clone() const
RCP< VectorBase< Scalar > > createMember() const
RCP< MultiVectorBase< Scalar > > createCachedMembersView(const RTOpPack::SubMultiVectorView< Scalar > &raw_mv, bool initialize=true) const
Create a (possibly) cached multi-vector member that is a non-const view of raw multi-vector data....
RCP< MultiVectorBase< Scalar > > createMembers(int numMembers) const
RCP< const Teuchos::Comm< Ordinal > > getComm() const
static RCP< TpetraVectorSpace< Scalar, LocalOrdinal, GlobalOrdinal, Node > > create()
Create with weak ownership to self.
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.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
EStrideType
Determine if data is unit stride or non-unit stride.
EViewType
Determines if a view is a direct view of data or a detached copy of data.
RCP< const Teuchos::Comm< Ordinal > > convertTpetraToThyraComm(const RCP< const Teuchos::Comm< int > > &tpetraComm)
Given an Tpetra Teuchos::Comm<int> object, return an equivalent Teuchos::Comm<Ordinal> object.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)