42 #ifndef THYRA_DEFAULT_CLUSTERED_SPMD_PRODUCT_VECTOR_SPACE_HPP 43 #define THYRA_DEFAULT_CLUSTERED_SPMD_PRODUCT_VECTOR_SPACE_HPP 45 #include "Thyra_DefaultClusteredSpmdProductVectorSpace_decl.hpp" 46 #include "Thyra_SpmdVectorSpaceBase.hpp" 47 #include "Thyra_DefaultClusteredSpmdProductVector.hpp" 48 #include "Thyra_VectorSpaceDefaultBase.hpp" 49 #include "Thyra_VectorStdOps.hpp" 50 #include "Thyra_MultiVectorStdOps.hpp" 51 #include "Thyra_SpmdVectorSpaceUtilities.hpp" 52 #include "Teuchos_implicit_cast.hpp" 53 #include "Teuchos_CommHelpers.hpp" 59 template<
class Scalar>
61 :clusterRootRank_(-1), isEuclidean_(false), globalDim_(0), clusterSubDim_(-1),
65 template<
class Scalar>
67 const Teuchos::RCP<
const Teuchos::Comm<Ordinal> > &intraClusterComm_in
68 ,
const int clusterRootRank_in
69 ,
const Teuchos::RCP<
const Teuchos::Comm<Ordinal> > &interClusterComm_in
70 ,
const int numBlocks_in
76 initialize(intraClusterComm_in,clusterRootRank_in,interClusterComm_in,numBlocks_in,vecSpaces);
79 template<
class Scalar>
81 const Teuchos::RCP<
const Teuchos::Comm<Ordinal> > &intraClusterComm_in
82 ,
const int clusterRootRank_in
83 ,
const Teuchos::RCP<
const Teuchos::Comm<Ordinal> > &interClusterComm_in
84 ,
const int numBlocks_in
89 intraClusterComm_ = intraClusterComm_in.assert_not_null();
90 clusterRootRank_ = clusterRootRank_in;
91 interClusterComm_ = interClusterComm_in;
92 vecSpaces_.resize(numBlocks_in);
95 for(
int k = 0; k < numBlocks_in; ++k ) {
96 l_clusterSubDim += vecSpaces[k]->dim();
97 if(!vecSpaces[k]->isEuclidean())
99 vecSpaces_[k] = vecSpaces[k];
103 if(interClusterComm_.get()) {
104 clusterOffset_ = SpmdVectorSpaceUtilities::computeLocalOffset(
105 *interClusterComm_,l_clusterSubDim
107 globalDim_ = SpmdVectorSpaceUtilities::computeGlobalDim(
108 *interClusterComm_,l_clusterSubDim
114 Ordinal buff[num] = { clusterOffset_, globalDim_ };
115 Teuchos::broadcast<Ordinal>(*intraClusterComm_, clusterRootRank_, num, &buff[0]);
116 clusterOffset_ = buff[0];
117 globalDim_ = buff[1];
121 clusterSubDim_ = l_clusterSubDim;
130 template<
class Scalar>
133 std::ostringstream oss;
134 oss <<
"DefaultClusteredSpmdProductVectorSpace{";
135 oss <<
"numBlocks="<<vecSpaces_.size();
136 oss <<
",globalDim="<<globalDim_;
137 oss <<
",clusterOffset="<<clusterOffset_;
144 template<
class Scalar>
150 template<
class Scalar>
159 const Ptr<const DCSPVS> dcspvs =
160 Teuchos::ptr_dynamic_cast<
const DCSPVS>(Teuchos::ptrFromRef(vecSpc),
false);
161 if (is_null(dcspvs)) {
164 if (vecSpaces_.size() != dcspvs->vecSpaces_.size()) {
167 const int l_numBlocks = vecSpaces_.size();
168 for(
int k = 0; k < l_numBlocks; ++k ) {
169 if (!vecSpaces_[k]->isCompatible(*dcspvs->vecSpaces_[k])) {
176 template<
class Scalar>
177 Teuchos::RCP< const VectorSpaceFactoryBase<Scalar> >
180 if(!vecSpaces_.size())
181 return Teuchos::null;
182 return vecSpaces_[0]->smallVecSpcFcty();
185 template<
class Scalar>
190 Teuchos::Tuple<Scalar,1> scalarProds_out;
191 this->scalarProds(x, y, scalarProds_out());
192 return scalarProds_out[0];
195 template<
class Scalar>
198 const ArrayView<Scalar> &scalarProds_out )
const 200 TEUCHOS_TEST_FOR_EXCEPTION(
201 !isEuclidean_, std::logic_error
202 ,
"Error, have not implemented support for none Euclidean scalar products yet!" 204 return dots(X, Y, scalarProds_out);
215 template<
class Scalar>
221 template<
class Scalar>
229 template<
class Scalar>
230 Teuchos::RCP< const VectorSpaceBase<Scalar> >
238 template<
class Scalar>
241 return vecSpaces_.size();
244 template<
class Scalar>
245 Teuchos::RCP<const VectorSpaceBase<Scalar> >
248 using Teuchos::implicit_cast;
249 TEUCHOS_TEST_FOR_EXCEPT( !( 0 <= k && k < implicit_cast<int>(vecSpaces_.size()) ) );
250 return vecSpaces_[k];
255 template<
class Scalar>
256 Teuchos::RCP<VectorBase<Scalar> >
263 template<
class Scalar>
264 Teuchos::RCP<MultiVectorBase<Scalar> >
273 #endif // THYRA_DEFAULT_CLUSTERED_SPMD_PRODUCT_VECTOR_SPACE_HPP
RCP< const VectorSpaceBase< Scalar > > getBlock(const int k) const
RCP< MultiVectorBase< Scalar > > createMembers(int numMembers) const
RCP< const VectorSpaceBase< Scalar > > clone() const
Abstract interface for objects that represent a space for vectors.
EViewType
Determines if a view is a direct view of data or a detached copy of data.
bool hasInCoreView(const Range1D &rng, const EViewType viewType, const EStrideType strideType) const
Scalar scalarProd(const VectorBase< Scalar > &x, const VectorBase< Scalar > &y) const
std::string description() const
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
Interface for a collection of column vectors called a multi-vector.
Concrete implementation of a clustered Spmd-based product vector.
Abstract interface for finite-dimensional dense vectors.
void scalarProdsImpl(const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y, const ArrayView< Scalar > &scalarProds) const
DefaultClusteredSpmdProductVectorSpace()
RCP< MultiVectorBase< Scalar > > createMembers(int numMembers) const
void initialize(const RCP< const Teuchos::Comm< Ordinal > > &intraClusterComm, const int clusterRootRank, const RCP< const Teuchos::Comm< Ordinal > > &interClusterComm, const int numBlocks, const RCP< const VectorSpaceBase< Scalar > > vecSpaces[])
Initalize.
EStrideType
Determine if data is unit stride or non-unit stride.
RCP< VectorBase< Scalar > > createMember() const
bool isCompatible(const VectorSpaceBase< Scalar > &vecSpc) const
RCP< const VectorSpaceFactoryBase< Scalar > > smallVecSpcFcty() const