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>
68 ,
const int clusterRootRank_in
70 ,
const int numBlocks_in
76 initialize(intraClusterComm_in,clusterRootRank_in,interClusterComm_in,numBlocks_in,vecSpaces);
79 template<
class Scalar>
82 ,
const int clusterRootRank_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>
160 Teuchos::ptr_dynamic_cast<const DCSPVS>(Teuchos::ptrFromRef(vecSpc),
false);
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>
180 if(!vecSpaces_.size())
181 return Teuchos::null;
182 return vecSpaces_[0]->smallVecSpcFcty();
185 template<
class Scalar>
191 this->scalarProds(x, y, scalarProds_out());
192 return scalarProds_out[0];
195 template<
class Scalar>
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>
238 template<
class Scalar>
241 return vecSpaces_.size();
244 template<
class Scalar>
250 return vecSpaces_[k];
255 template<
class Scalar>
263 template<
class Scalar>
273 #endif // THYRA_DEFAULT_CLUSTERED_SPMD_PRODUCT_VECTOR_SPACE_HPP