10#ifndef THYRA_DEFAULT_SPMD_MULTI_VECTOR_DEF_HPP
11#define THYRA_DEFAULT_SPMD_MULTI_VECTOR_DEF_HPP
16#include "Thyra_DefaultSpmdMultiVector_decl.hpp"
17#include "Thyra_SpmdMultiVectorDefaultBase.hpp"
18#include "Thyra_VectorSpaceFactoryBase.hpp"
19#include "Thyra_DefaultSpmdVector.hpp"
20#include "Teuchos_Assert.hpp"
32class CopyBackSpmdMultiVectorEntries {
34 CopyBackSpmdMultiVectorEntries(
35 const ArrayView<const int> &cols,
36 const ArrayRCP<const Scalar> &localValuesView,
const Ordinal localSubDim,
37 const ArrayRCP<Scalar> &localValues,
const Ordinal leadingDim
39 : cols_(cols), localValuesView_(localValuesView), localSubDim_(localSubDim),
40 localValues_(localValues), leadingDim_(leadingDim)
42 ~CopyBackSpmdMultiVectorEntries()
47 if (localValues_.strong_count()) {
48 const int numCols = cols_.size();
49 const const_itr_t lvv = localValuesView_.begin();
50 const itr_t lv = localValues_.begin();
51 for (
int k = 0; k < numCols; ++k) {
52 const int col_k = cols_[k];
53 const const_itr_t lvv_k = lvv + localSubDim_*k;
54 const itr_t lv_k = lv + leadingDim_*col_k;
55 std::copy( lvv_k, lvv_k + localSubDim_, lv_k );
60 ++DefaultSpmdMultiVector<Scalar>::numSkipCopyBack;
66 ArrayRCP<const Scalar> localValuesView_;
68 ArrayRCP<Scalar> localValues_;
71 CopyBackSpmdMultiVectorEntries();
72 CopyBackSpmdMultiVectorEntries(
const CopyBackSpmdMultiVectorEntries&);
73 CopyBackSpmdMultiVectorEntries& operator=(
const CopyBackSpmdMultiVectorEntries&);
79copyBackSpmdMultiVectorEntries(
86 new CopyBackSpmdMultiVectorEntries<Scalar>(
87 cols, localValuesView, localSubDim, localValues, leadingDim
101template<
class Scalar>
107template<
class Scalar>
117template<
class Scalar>
122 ,
const Ordinal leadingDim
125 initialize(spmdRangeSpace,domainSpace,localValues,leadingDim);
129template<
class Scalar>
135 const Ordinal localSubDim = spmdRangeSpace->localSubDim();
138 values = Teuchos::arcp<Scalar>(localSubDim * domainSpace->dim());
139 initialize(spmdRangeSpace, domainSpace, values, localSubDim);
143template<
class Scalar>
148 const Ordinal leadingDim_in
151 const Ordinal localSubDim = spmdRangeSpace->localSubDim();
152 const Ordinal leadingDim = (leadingDim_in >= 0 ? leadingDim_in : localSubDim);
156 if (spmdRangeSpace->dim() && localSubDim) {
161 spmdRangeSpace_ = spmdRangeSpace;
162 domainSpace_ = domainSpace;
163 localValues_ = localValues;
164 leadingDim_ = leadingDim;
169template<
class Scalar>
177 if(spmdRangeSpace) *spmdRangeSpace = spmdRangeSpace_;
178 if(domainSpace) *domainSpace = domainSpace_;
179 if(localValues) *localValues = localValues_;
180 if(leadingDim) *leadingDim = leadingDim_;
182 spmdRangeSpace_ = Teuchos::null;
183 domainSpace_ = Teuchos::null;
184 localValues_ = Teuchos::null;
191template<
class Scalar>
195#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
196 std::cerr <<
"\nSpmdMultiVectorStd<Scalar>::domainScalarProdVecSpc() const called!\n";
205template<
class Scalar>
209#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
210 std::cerr <<
"\nSpmdMultiVectorStd<Scalar>::col() called!\n";
218 localValues_.persistingView(j*leadingDim_,spmdRangeSpace_->localSubDim()),
226template<
class Scalar>
237 spmdRangeSpace_->smallVecSpcFcty()->createVecSpc(colRng.
size())
240 localValues_.persistingView(colRng.
lbound()*leadingDim_,colRng.
size()*spmdRangeSpace_->localSubDim()),
247template<
class Scalar>
253 return Teuchos::rcp_const_cast<MultiVectorBase<Scalar> >(
264template<
class Scalar>
270 THYRA_DEBUG_ASSERT_MV_COLS(
"nonContigSubViewImpl(cols)", cols);
271 const int numCols = cols.
size();
273 return defaultSpmdMultiVector<Scalar>(
281template<
class Scalar>
286 THYRA_DEBUG_ASSERT_MV_COLS(
"nonContigSubViewImpl(cols)", cols);
287 const int numCols = cols.
size();
289 const Ordinal localSubDim = spmdRangeSpace_->localSubDim();
291 copyBackSpmdMultiVectorEntries<Scalar>(cols, localValuesView.
getConst(),
292 localSubDim, localValues_.
create_weak(), leadingDim_);
293 return Teuchos::rcpWithEmbeddedObjPreDestroy(
306template<
class Scalar>
310#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
311 std::cerr <<
"\nSpmdMultiVectorStd<Scalar>::spmdSpace() const called!\n";
313 return spmdRangeSpace_;
317template<
class Scalar>
322#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
323 std::cerr <<
"\nSpmdMultiVectorStd<Scalar>::getLocalMultiVectorDataImpl() called!\n";
325 *localValues = localValues_;
326 *leadingDim = leadingDim_;
330template<
class Scalar>
335#ifdef THYRA_DEFAULT_SPMD_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
336 std::cerr <<
"\nSpmdMultiVectorStd<Scalar>::getLocalData() called!\n";
338 *localValues = localValues_;
339 *leadingDim = leadingDim_;
346template<
class Scalar>
348DefaultSpmdMultiVector<Scalar>::createContiguousCopy(
353 const int numCols = cols.
size();
354 const Ordinal localSubDim = spmdRangeSpace_->localSubDim();
355 ArrayRCP<Scalar> localValuesView = Teuchos::arcp<Scalar>(numCols*localSubDim);
357 const const_itr_t lv = localValues_.begin();
358 const itr_t lvv = localValuesView.
begin();
359 for (
int k = 0; k < numCols; ++k) {
360 const int col_k = cols[k];
361 const const_itr_t lv_k = lv + leadingDim_*col_k;
362 const itr_t lvv_k = lvv + localSubDim*k;
363 std::copy(lv_k, lv_k+localSubDim, lvv_k);
365 return localValuesView;
ArrayRCP< T > create_weak() const
ArrayRCP< const T > getConst() const
void getLocalMultiVectorDataImpl(const Ptr< ArrayRCP< const Scalar > > &localValues, const Ptr< Ordinal > &leadingDim) const
RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpaceImpl() const
DefaultSpmdMultiVector()
Construct to uninitialized.
void uninitialize(RCP< const SpmdVectorSpaceBase< Scalar > > *spmdRangeSpace=NULL, RCP< const ScalarProdVectorSpaceBase< Scalar > > *domainSpace=NULL, ArrayRCP< Scalar > *localValues=NULL, Ordinal *leadingDim=NULL)
Set to an uninitialized state.
RCP< MultiVectorBase< Scalar > > nonconstNonContigSubViewImpl(const ArrayView< const int > &cols)
RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
RCP< const MultiVectorBase< Scalar > > contigSubViewImpl(const Range1D &colRng) const
void getNonconstLocalMultiVectorDataImpl(const Ptr< ArrayRCP< Scalar > > &localValues, const Ptr< Ordinal > &leadingDim)
RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &colRng)
void initialize(const RCP< const SpmdVectorSpaceBase< Scalar > > &spmdRangeSpace, const RCP< const ScalarProdVectorSpaceBase< Scalar > > &domainSpace)
Initialize only with vector spaces where storage is allocated internally..
RCP< const MultiVectorBase< Scalar > > nonContigSubViewImpl(const ArrayView< const int > &cols) const
RCP< const ScalarProdVectorSpaceBase< Scalar > > domainScalarProdVecSpc() const
Efficient concrete implementation subclass for SPMD vectors.
RCP< const VectorSpaceBase< Scalar > > domain() const
Returns this->domainScalarProdVecSpc().
RCP< const ScalarProdVectorSpaceBase< Scalar > > createSmallScalarProdVectorSpaceBase(const RCP< const VectorSpaceBase< Scalar > > &vs, const Ordinal dim)
Create a small vector space casted to ScalarProdVectorSpaceBase.
Range1D validateColRange(const Range1D &rowCol) const
Validate and resize the column range.
virtual void updateSpmdSpace()
Subclasses should call whenever the structure of the VectorSpaceBase changes.
Base abstract VectorSpaceBase class for all SPMD-based vector spaces.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_ASSERT_INEQUALITY(val1, comp, val2)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)