10#ifndef THYRA_SPMD_VECTOR_DEFAULT_BASE_DEF_HPP
11#define THYRA_SPMD_VECTOR_DEFAULT_BASE_DEF_HPP
14#if defined (__clang__) && !defined (__INTEL_COMPILER)
15#pragma clang system_header
18#include "Thyra_SpmdVectorDefaultBase_decl.hpp"
19#include "Thyra_VectorDefaultBase.hpp"
20#include "Thyra_SpmdVectorSpaceDefaultBase.hpp"
21#include "Thyra_apply_op_helper.hpp"
22#include "Thyra_SpmdLocalDataAccess.hpp"
23#include "RTOpPack_SPMD_apply_op.hpp"
24#include "Teuchos_Workspace.hpp"
25#include "Teuchos_Assert.hpp"
26#include "Teuchos_dyn_cast.hpp"
27#include "Teuchos_Assert.hpp"
51 const Ordinal global_offset_in
58 using Teuchos::rcpFromPtr;
60 const int num_vecs = vecs.
size();
61 const int num_targ_vecs = targ_vecs.size();
68 "SpmdVectorDefaultBase<>::applyOp(...)",*
space(),
69 op, vecs, targ_vecs, reduct_obj, global_offset_in);
74 comm = Teuchos::rcpFromPtr(comm_in);
82 const Range1D local_rng(localOffset_, localOffset_+localSubDim_-1);
85 Workspace<RTOpPack::ConstSubVectorView<Scalar> > sub_vecs(wss.
get(), num_vecs);
86 Workspace<RTOpPack::SubVectorView<Scalar> > sub_targ_vecs(wss.
get(), num_targ_vecs);
87 for(
int k = 0; k < num_vecs; ++k ) {
89 sub_vecs[k].setGlobalOffset(localOffset_+global_offset_in);
91 for(
int k = 0; k < num_targ_vecs; ++k ) {
93 sub_targ_vecs[k].setGlobalOffset(localOffset_+global_offset_in);
97 RTOpPack::SPMD_apply_op(
98 locallyReplicated ? NULL : &*comm,
101 sub_vecs.getRawPtr(),
103 sub_targ_vecs.getRawPtr(),
108 for (
int k = 0; k < num_vecs; ++k ) {
111 for (
int k = 0; k < num_targ_vecs; ++k ) {
121template<
class Scalar>
126 std::ostringstream ostr;
127 ostr<<typeName(*
this)<<
"{spmdSpace="<<this->
spmdSpace()->description()<<
"}";
135template<
class Scalar>
149template<
class Scalar>
155 const Ordinal global_offset
163template<
class Scalar>
171 if( rng_in == Range1D::INVALID ) {
177 const Range1D rng = validateRange(rng_in);
178 const bool isLocallyReplicated = this->
spmdSpace()->isLocallyReplicated();
181 rng.
lbound() < localOffset_
183 localOffset_+localSubDim_-1 < rng.
ubound()
207template<
class Scalar>
216 ,
"SpmdVectorDefaultBase<Scalar>::releaseDetachedVectorViewImpl(...) : Error, this sub vector was not gotten from acquireDetachedView(...)!"
221 || localOffset_+localSubDim_ < sub_vec->globalOffset()+sub_vec->
subDim()
233template<
class Scalar>
241 if( rng_in == Range1D::INVALID ) {
247 const Range1D rng = validateRange(rng_in);
248 const bool isLocallyReplicated = this->
spmdSpace()->isLocallyReplicated();
251 rng.
lbound() < localOffset_
253 localOffset_+localSubDim_-1 < rng.
ubound()
277template<
class Scalar>
286 ,
"SpmdVectorDefaultBase<Scalar>::commitDetachedView(...) : Error, this sub vector was not gotten from acquireDetachedView(...)!"
292 localOffset_+localSubDim_ < sub_vec->globalOffset()+sub_vec->
subDim()
306template<
class Scalar>
323template<
class Scalar>
327 using Teuchos::outArg;
341template<
class Scalar>
346 *leadingDim = localValues->size();
350template<
class Scalar>
355 *leadingDim = localValues->size();
362template<
class Scalar>
377template<
class Scalar>
395template<
class Scalar>
398 if(globalDim_ == 0) {
401 globalDim_ = l_spmdSpace->
dim();
417template<
class Scalar>
418Range1D SpmdVectorDefaultBase<Scalar>::validateRange(
const Range1D &rng_in )
const
420 const Range1D rng = Teuchos::full_range(rng_in,0,globalDim_-1);
423 !(0 <= rng.
lbound() && rng.
ubound() < globalDim_), std::invalid_argument
424 ,
"SpmdVectorDefaultBase<Scalar>::validateRange(...): Error, the range ["
426 "in the range [0,"<<(globalDim_-1)<<
"]!"
433#ifdef THYRA_SPMD_VECTOR_BASE_DUMP
434template<
class Scalar>
435bool SpmdVectorDefaultBase<Scalar>::show_dump =
false;
Ordinal globalOffset() const
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< const Scalar > &values_in, ptrdiff_t stride_in)
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< Scalar > &values_in, ptrdiff_t stride_in)
ArrayRCP< T > persistingView(size_type lowerOffset, size_type size) const
const Ptr< T > ptr() const
RCP< const SpmdVectorSpaceBase< Scalar > > spmdSpace() const
Returns the SPMD vector space object for the range of *this multi-vector.
void getNonconstLocalData(const Ptr< ArrayRCP< Scalar > > &localValues)
Returns a non-const pointer to the beginning of the local vector data.
void getLocalData(const Ptr< ArrayRCP< const Scalar > > &localValues) const
Returns a const pointer to the beginning of the local vector data.
RTOpPack::SubMultiVectorView< Scalar > getNonconstLocalSubMultiVectorImpl()
void getLocalMultiVectorDataImpl(const Ptr< ArrayRCP< const Scalar > > &localValues, const Ptr< Ordinal > &leadingDim) const
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 releaseDetachedVectorViewImpl(RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
Implemented through this->freeLocalData().
void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
Implemented through this->getLocalData().
std::string description() const
void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)
Implemented through this->commitLocalData().
virtual void updateSpmdSpace()
Subclasses must call this function whenever the structure of the VectorSpaceBase changes.
RTOpPack::ConstSubMultiVectorView< Scalar > getLocalSubMultiVectorImpl() const
void getNonconstLocalMultiVectorDataImpl(const Ptr< ArrayRCP< Scalar > > &localValues, const Ptr< Ordinal > &leadingDim)
virtual void applyOpImplWithComm(const Ptr< const Teuchos::Comm< Ordinal > > &comm, 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
Implementation of applyOpImpl(...) that uses an input Comm.
RTOpPack::SubVectorView< Scalar > getNonconstLocalSubVectorImpl()
Virtual implementation for getNonconstLocalSubVector().
Teuchos::RCP< const VectorSpaceBase< Scalar > > space() const
Returns this->spmdSpace().
RTOpPack::ConstSubVectorView< Scalar > getLocalSubVectorImpl() const
Virtual implementation for getLocalSubVector().
Base abstract VectorSpaceBase class for all SPMD-based vector spaces.
virtual Ordinal localSubDim() const =0
Returns the number of local elements stored on this process.
virtual Teuchos::RCP< const Teuchos::Comm< Ordinal > > getComm() const =0
Returns the SPMD communicator.
virtual bool isLocallyReplicated() const =0
Returns true if vector space is locally replicated space.
virtual Ordinal localOffset() const =0
Returns the offset for the local sub-vector stored on this process.
Abstract interface for finite-dimensional dense vectors.
virtual void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
virtual void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
virtual void releaseDetachedVectorViewImpl(RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
virtual void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)
virtual Ordinal dim() const =0
Return the dimension of the vector space.
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
RTOpPack::SubVectorView< Scalar > getNonconstLocalSubVectorView(const RCP< VectorBase< Scalar > > &vec)
Return a contiguous non-const semi-persisting view of the local process data of a VectorBase object.
RTOpPack::ConstSubVectorView< Scalar > getLocalSubVectorView(const RCP< const VectorBase< Scalar > > &vec)
Return a contiguous const semi-persisting view of the local process data of a VectorBase object.
void apply_op_validate_input(const std::string &func_name, const VectorSpaceBase< Scalar > &space, 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)
Validate the inputs to VectorBase::applyOp().
std::string typeName(const T &t)
T_To & dyn_cast(T_From &from)
TEUCHOSCORE_LIB_DLL_EXPORT Teuchos::RCP< WorkspaceStore > get_default_workspace_store()