42 #ifndef THYRA_DEFAULT_COLUMNWISE_MULTI_VECTOR_DEF_HPP 43 #define THYRA_DEFAULT_COLUMNWISE_MULTI_VECTOR_DEF_HPP 45 #include "Thyra_DefaultColumnwiseMultiVector_decl.hpp" 46 #include "Thyra_MultiVectorDefaultBase.hpp" 47 #include "Thyra_VectorSpaceBase.hpp" 48 #include "Thyra_VectorBase.hpp" 49 #include "Thyra_MultiVectorBase.hpp" 50 #include "Thyra_VectorStdOps.hpp" 51 #include "Thyra_VectorSpaceFactoryBase.hpp" 52 #include "Thyra_AssertOp.hpp" 53 #include "Teuchos_Assert.hpp" 54 #include "Teuchos_as.hpp" 62 template<
class Scalar>
67 template<
class Scalar>
76 template<
class Scalar>
83 this->
initialize(range_in, domain_in, col_vecs_in);
87 template<
class Scalar>
93 const std::string err_msg =
94 "DefaultColumnwiseMultiVector<Scalar>::initialize(...): Error!";
95 TEUCHOS_TEST_FOR_EXCEPT_MSG( is_null(col_vec), err_msg );
96 TEUCHOS_TEST_FOR_EXCEPT_MSG( is_null(col_vec->space()), err_msg );
98 range_ = col_vec->space();
99 domain_ = range_->smallVecSpcFcty()->createVecSpc(1);
101 col_vecs_[0] = col_vec;
105 template<
class Scalar>
113 const std::string err_msg =
114 "DefaultColumnwiseMultiVector<Scalar>::initialize(...): Error!";
115 TEUCHOS_TEST_FOR_EXCEPT_MSG( is_null(range_in), err_msg );
116 TEUCHOS_TEST_FOR_EXCEPT_MSG( is_null(domain_in), err_msg );
117 TEUCHOS_TEST_FOR_EXCEPT_MSG( range_in->dim() == 0, err_msg );
118 TEUCHOS_TEST_FOR_EXCEPT_MSG( domain_in->dim() == 0, err_msg );
121 const int domainDim = domain_in->dim();
125 col_vecs_.reserve(domainDim);
126 if (col_vecs.size()) {
127 for(
Ordinal j = 0; j < domainDim; ++j )
128 col_vecs_.push_back(col_vecs[j]);
131 for(
Ordinal j = 0; j < domainDim; ++j )
132 col_vecs_.push_back(createMember(range_));
137 template<
class Scalar>
141 range_ = Teuchos::null;
142 domain_ = Teuchos::null;
149 template<
class Scalar>
150 RCP<const VectorSpaceBase<Scalar> >
157 template<
class Scalar>
158 RCP<const VectorSpaceBase<Scalar> >
168 template<
class Scalar>
171 const Ordinal m = col_vecs_.size();
172 for (
Ordinal col_j = 0; col_j < m; ++col_j) {
173 col_vecs_[col_j]->assign(alpha);
178 template<
class Scalar>
184 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), mv.
domain()->dim());
185 TEUCHOS_ASSERT(range_->isCompatible(*mv.
range()));
187 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
188 col_vecs_[col_j]->assign(*mv.
col(col_j));
193 template<
class Scalar>
196 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
197 col_vecs_[col_j]->scale(alpha);
202 template<
class Scalar>
209 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), mv.
domain()->dim());
210 TEUCHOS_ASSERT(range_->isCompatible(*mv.
range()));
212 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
213 col_vecs_[col_j]->update(alpha, *mv.
col(col_j));
218 template<
class Scalar>
220 const ArrayView<const Scalar>& alpha,
226 TEUCHOS_ASSERT_EQUALITY(alpha.size(), mv.size());
227 for (
Ordinal i = 0; i < mv.size(); ++i) {
228 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), mv[i]->domain()->dim());
229 TEUCHOS_ASSERT(range_->isCompatible(*mv[i]->range()));
232 Array<RCP<const VectorBase<Scalar> > > v_rcp(mv.size());
233 Array<Ptr<const VectorBase<Scalar> > > v(mv.size());
234 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
235 for (
Ordinal i = 0; i < mv.size(); ++i) {
236 v_rcp[i] = mv[i]->col(col_j);
237 v[i] = v_rcp[i].ptr();
239 col_vecs_[col_j]->linear_combination(alpha, v(), beta);
244 template<
class Scalar>
247 const ArrayView<Scalar>& prods
251 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), mv.
domain()->dim());
252 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), prods.size());
253 TEUCHOS_ASSERT(range_->isCompatible(*mv.
range()));
255 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
256 prods[col_j] = col_vecs_[col_j]->dot(*mv.
col(col_j));
261 template<
class Scalar>
263 const ArrayView<
typename ScalarTraits<Scalar>::magnitudeType>& norms
267 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), norms.size());
269 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
270 norms[col_j] = col_vecs_[col_j]->norm_1();
275 template<
class Scalar>
277 const ArrayView<
typename ScalarTraits<Scalar>::magnitudeType>& norms
281 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), norms.size());
283 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
284 norms[col_j] = col_vecs_[col_j]->norm_2();
289 template<
class Scalar>
291 const ArrayView<
typename ScalarTraits<Scalar>::magnitudeType>& norms
295 TEUCHOS_ASSERT_EQUALITY(col_vecs_.size(), norms.size());
297 for (
Ordinal col_j = 0; col_j < col_vecs_.size(); ++col_j) {
298 norms[col_j] = col_vecs_[col_j]->norm_inf();
307 template<
class Scalar>
310 typedef Teuchos::ScalarTraits<Scalar> ST;
311 return ( ST::isComplex ? ( M_trans==
NOTRANS || M_trans==
CONJTRANS ) :
true );
315 template<
class Scalar>
326 "MultiVectorBase<Scalar>::apply()", *
this, M_trans, X, &*Y);
328 const Ordinal nc = this->domain()->dim();
330 for (
Ordinal col_j = 0; col_j < m; ++col_j) {
331 const RCP<const VectorBase<Scalar> > x_j = X.
col(col_j);
332 const RCP<VectorBase<Scalar> > y_j = Y->col(col_j);
334 Vt_S(y_j.ptr(), beta);
341 RTOpPack::ConstSubVectorView<Scalar> x_sub_vec;
342 x_j->acquireDetachedView(
Range1D(), &x_sub_vec);
344 for (
Ordinal j = 0; j < nc; ++j )
345 Vp_StV( y_j.ptr(), Scalar(alpha*x_sub_vec(j)), *this->col(j) );
347 x_j->releaseDetachedView(&x_sub_vec);
357 RTOpPack::SubVectorView<Scalar> y_sub_vec;
358 y_j->acquireDetachedView(
Range1D(), &y_sub_vec);
360 for (
Ordinal j = 0; j < nc; ++j )
361 y_sub_vec(j) += alpha*dot(*this->col(j), *x_j);
363 y_j->commitDetachedView(&y_sub_vec);
372 template<
class Scalar>
373 RCP<VectorBase<Scalar> >
377 const int num_cols = col_vecs_.size();
378 TEUCHOS_TEST_FOR_EXCEPTION(
379 !( 0 <= j && j < num_cols ), std::logic_error
380 ,
"Error, j = " << j <<
" does not fall in the range [0,"<<(num_cols-1)<<
"]!" 386 template<
class Scalar>
387 RCP<MultiVectorBase<Scalar> >
392 const Ordinal numCols = domain_->dim();
393 const Range1D col_rng = Teuchos::full_range(col_rng_in,0,numCols-1);
395 TEUCHOS_TEST_FOR_EXCEPTION(
396 !( col_rng.ubound() < numCols ), std::logic_error
397 ,
"DefaultColumnwiseMultiVector<Scalar>::subView(col_rng):" 398 "Error, the input range col_rng = ["<<col_rng.lbound()
399 <<
","<<col_rng.ubound()<<
"] " 400 "is not in the range [0,"<<(numCols-1)<<
"]!" 406 domain_->smallVecSpcFcty()->createVecSpc(col_rng.size()),
407 col_vecs_(col_rng.lbound(),col_rng.size())
416 #endif // THYRA_DEFAULT_COLUMNWISE_MULTI_VECTOR_DEF_HPP void initialize(int *argc, char ***argv)
virtual void assignMultiVecImpl(const MultiVectorBase< Scalar > &mv)
virtual void updateImpl(Scalar alpha, const MultiVectorBase< Scalar > &mv)
virtual RCP< const VectorSpaceBase< Scalar > > range() const =0
Return a smart pointer for the range space for this operator.
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
#define THYRA_ASSERT_LINEAR_OP_MULTIVEC_APPLY_SPACES(FUNC_NAME, M, M_T, X, Y)
This is a very useful macro that should be used to validate that the spaces for the multi-vector vers...
Use the non-transposed operator.
RCP< const VectorSpaceBase< Scalar > > domain() const
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types)...
virtual void scaleImpl(Scalar alpha)
Abstract interface for objects that represent a space for vectors.
virtual void linearCombinationImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &mv, const Scalar &beta)
virtual void dotsImpl(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
bool opSupportedImpl(EOpTransp M_trans) const
For complex Scalar types returns true for NOTRANS and CONJTRANS and for real types returns true for a...
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
This function is implemented in terms of the multi-vector applyOp() function.
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
Interface for a collection of column vectors called a multi-vector.
RCP< const VectorBase< Scalar > > col(Ordinal j) const
Calls colImpl().
RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
virtual void norms1Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
Abstract interface for finite-dimensional dense vectors.
void initialize(const RCP< VectorBase< Scalar > > &col_vec)
Initialize given a single vector object.
Default subclass for MultiVectorBase implemented using columns of separate abstract vectors...
RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &col_rng)
RCP< const VectorSpaceBase< Scalar > > range() const
virtual void norms2Impl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
virtual void normsInfImpl(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
virtual void assignImpl(Scalar alpha)
DefaultColumnwiseMultiVector()
Construct to initialized.
void uninitialize()
Set uninitialized.