42 #ifndef THYRA_VECTOR_DEFAULT_BASE_DEF_HPP 43 #define THYRA_VECTOR_DEFAULT_BASE_DEF_HPP 50 #include "Thyra_VectorDefaultBase_decl.hpp" 51 #include "Thyra_VectorSpaceFactoryBase.hpp" 52 #include "Thyra_VectorBase.hpp" 53 #include "Thyra_VectorStdOps.hpp" 54 #include "Thyra_MultiVectorDefaultBase.hpp" 55 #include "Thyra_AssertOp.hpp" 56 #include "Thyra_MultiVectorBase.hpp" 57 #include "Thyra_DetachedVectorView.hpp" 58 #include "RTOpPack_ROpGetSubVector.hpp" 59 #include "RTOpPack_TOpSetSubVector.hpp" 60 #include "Teuchos_Assert.hpp" 63 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 64 # include "Teuchos_VerboseObject.hpp" 65 # define THYRA_VECTOR_VERBOSE_OUT_STATEMENT \ 66 RCP<Teuchos::FancyOStream> dbgout = Teuchos::VerboseObjectBase::getDefaultOStream() 67 #endif // THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 77 template<
class Scalar>
80 std::ostringstream oss;
81 const RCP<const VectorSpaceBase<Scalar> > vs = this->space();
82 oss << Teuchos::Describable::description();
84 oss <<
"{space=NULL}";
88 oss <<
"{dim=" << dim <<
"}";
94 template<
class Scalar>
96 Teuchos::FancyOStream &out_arg,
97 const Teuchos::EVerbosityLevel verbLevel
100 using Teuchos::FancyOStream;
101 using Teuchos::OSTab;
102 RCP<FancyOStream> out = Teuchos::rcpFromRef(out_arg);
104 *out << this->description() <<
"\n";
105 if (this->space()->dim()) {
107 if (verbLevel >= Teuchos::VERB_HIGH) {
110 *out << i <<
":" << dvv[i] << std::endl;
119 template<
class Scalar>
120 RCP< const VectorSpaceBase<Scalar> >
123 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 124 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
125 *dbgout <<
"\nThyra::VectorDefaultBase<" 126 <<Teuchos::ScalarTraits<Scalar>::name()
127 <<
">::range() called!\n";
129 return this->space();
133 template<
class Scalar>
134 RCP< const VectorSpaceBase<Scalar> >
137 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 138 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
139 *dbgout <<
"\nThyra::VectorDefaultBase<" 140 <<Teuchos::ScalarTraits<Scalar>::name()
141 <<
">::domain() called!\n";
144 domain_ = range()->smallVecSpcFcty()->createVecSpc(1);
153 template<
class Scalar>
154 RCP<MultiVectorBase<Scalar> >
157 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 158 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
159 *dbgout <<
"\nThyra::VectorDefaultBase<" 160 <<Teuchos::ScalarTraits<Scalar>::name()
161 <<
">::clone_mv() called!\n";
163 return this->clone_v();
170 template<
class Scalar>
171 RCP<VectorBase<Scalar> >
174 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 175 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
176 *dbgout <<
"\nThyra::VectorDefaultBase<" 177 <<Teuchos::ScalarTraits<Scalar>::name()
178 <<
">::clone_v() called!\n";
180 const RCP<VectorBase<Scalar> > copy = createMember(this->space());
181 ::Thyra::assign<Scalar>(copy.ptr(), *
this);
192 template<
class Scalar>
193 RCP<VectorBase<Scalar> >
196 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 197 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
198 *dbgout <<
"\nThyra::VectorDefaultBase<" 199 <<Teuchos::ScalarTraits<Scalar>::name()<<
">::nonconstColImpl(j) called!\n";
202 TEUCHOS_TEST_FOR_EXCEPT( j != 0 );
204 return Teuchos::rcp(
this,
false);
208 template<
class Scalar>
209 RCP<const MultiVectorBase<Scalar> >
212 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 213 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
214 *dbgout <<
"\nThyra::VectorDefaultBase<" 215 <<Teuchos::ScalarTraits<Scalar>::name()
216 <<
">::contigSubViewImpl(col_rng) const called!\n";
218 validateColRng(col_rng);
219 return Teuchos::rcp(
this,
false);
223 template<
class Scalar>
224 RCP<MultiVectorBase<Scalar> >
227 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 228 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
229 *dbgout <<
"\nThyra::VectorDefaultBase<" 230 <<Teuchos::ScalarTraits<Scalar>::name()
231 <<
">::nonconstContigSubViewImpl(col_rng) called!\n";
233 validateColRng(col_rng);
234 return Teuchos::rcp(
this,
false);
238 template<
class Scalar>
239 RCP<const MultiVectorBase<Scalar> >
241 const ArrayView<const int> &cols )
const 243 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 244 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
245 *dbgout <<
"\nThyra::VectorDefaultBase<" 246 <<Teuchos::ScalarTraits<Scalar>::name()
247 <<
">::nonContigSubViewImpl(cols) called!\n";
249 validateColIndexes(cols);
250 return Teuchos::rcp(
this,
false);
254 template<
class Scalar>
255 RCP<MultiVectorBase<Scalar> >
257 const ArrayView<const int> &cols )
259 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 260 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
261 *dbgout <<
"\nThyra::VectorDefaultBase<" 262 <<Teuchos::ScalarTraits<Scalar>::name()
263 <<
">::nonconstNonContigSubViewImpl(cols) called!\n";
265 validateColIndexes(cols);
266 return Teuchos::rcp(
this,
false);
270 template<
class Scalar>
277 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 278 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
279 *dbgout <<
"\nThyra::VectorDefaultBase<" 280 <<Teuchos::ScalarTraits<Scalar>::name()
281 <<
">::acquireDetachedMultiVectorViewImpl() const called!\n";
284 TEUCHOS_TEST_FOR_EXCEPT(sub_mv==NULL);
286 validateColRng(colRng);
288 this->acquireDetachedView(rowRng,&sv);
290 TEUCHOS_TEST_FOR_EXCEPT( sv.
stride() != 1 );
296 template<
class Scalar>
301 TEUCHOS_TEST_FOR_EXCEPT(sub_mv == 0);
306 template<
class Scalar>
313 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 314 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
315 *dbgout <<
"\nThyra::VectorDefaultBase<" 316 <<Teuchos::ScalarTraits<Scalar>::name()
317 <<
">::acquireNonconstDetachedMultiVectorViewImpl() called!\n";
320 TEUCHOS_TEST_FOR_EXCEPT(sub_mv==NULL);
322 validateColRng(colRng);
324 this->acquireDetachedView(rowRng,&sv);
326 TEUCHOS_TEST_FOR_EXCEPT( sv.
stride() != 1 );
332 template<
class Scalar>
337 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 338 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
339 *dbgout <<
"\nThyra::VectorDefaultBase<" 340 <<Teuchos::ScalarTraits<Scalar>::name()
341 <<
">::commitNonconstDetachedMultiVectorViewImpl() called!\n";
344 TEUCHOS_TEST_FOR_EXCEPT(sub_mv==NULL);
348 this->commitDetachedView(&sv);
356 template<
class Scalar>
361 using Teuchos::dyn_cast;
362 using Teuchos::tuple;
363 const Range1D rng = rng_in.full_range() ?
Range1D(0,this->space()->dim()-1) : rng_in;
365 TEUCHOS_TEST_FOR_EXCEPTION(
366 !(rng.ubound() < this->space()->dim()), std::out_of_range
367 ,
"VectorDefaultBase<Scalar>::acquireDetachedVectorViewImpl(rng,...):" 368 " Error, rng = ["<<rng.lbound()<<
","<<rng.ubound()
369 <<
"] is not in range = [0,"<<(this->space()->dim()-1)<<
"]" );
374 RCP<RTOpPack::ReductTarget>
377 ::Thyra::applyOp<Scalar>(get_sub_vector_op, tuple(Teuchos::ptr<
const VectorBase<Scalar> >(
this))(),
378 Teuchos::null, reduct_obj.ptr());
380 *sub_vec_inout = get_sub_vector_op(*reduct_obj);
384 template<
class Scalar>
389 TEUCHOS_TEST_FOR_EXCEPT(sub_vec == 0);
394 template<
class Scalar>
412 Teuchos::arcp_const_cast<Scalar>(sub_vec.
values()), sub_vec.
stride()
417 template<
class Scalar>
422 TEUCHOS_TEST_FOR_EXCEPT(sub_vec_inout == 0);
432 template<
class Scalar>
436 ::Thyra::applyOp<Scalar>(set_sub_vector_op, Teuchos::null,
444 template<
class Scalar>
447 typedef Teuchos::ScalarTraits<Scalar> ST;
448 return ( ST::isComplex ? ( M_trans==
NOTRANS || M_trans==
CONJTRANS ) :
true );
452 template<
class Scalar>
462 typedef Teuchos::ScalarTraits<Scalar> ST;
467 "VectorDefaultBase<Scalar>::apply()", *
this, M_trans, X, &*Y);
472 for (
Ordinal col_j = 0; col_j < numCols; ++col_j) {
475 const RCP<const VectorBase<Scalar> > x = X.
col(col_j);
476 const RCP<VectorBase<Scalar> > y = Y->col(col_j);
479 if( M_trans ==
NOTRANS || (M_trans ==
CONJ && !ST::isComplex) ) {
481 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 482 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
483 *dbgout <<
"\nThyra::VectorDefaultBase<" 484 <<Teuchos::ScalarTraits<Scalar>::name()
485 <<
">::apply(...) : y = beta*y + alpha*m*x (x is a scalar!)\n";
487 Vt_S( y.ptr(), beta );
488 Vp_StV( y.ptr(), Scalar(alpha*get_ele(*x,0)), *this );
490 else if( M_trans ==
CONJTRANS || (M_trans ==
TRANS && !ST::isComplex) ) {
492 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 493 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
494 *dbgout <<
"\nThyra::VectorDefaultBase<" 495 <<Teuchos::ScalarTraits<Scalar>::name()
496 <<
">::apply(...) : y = beta*y + alpha*m'*x (y is a scalar!)\n";
499 if( beta == ST::zero() ) {
500 y_inout = ST::zero();
503 y_inout = beta*get_ele(*y,0);
505 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_SPMD_APPLY_OP_DUMP) 506 RTOpPack::show_spmd_apply_op_dump =
true;
508 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT) 509 RTOpPack::rtop_helpers_dump_all =
true;
511 y_inout += alpha * this->space()->scalarProd(*
this, *x);
512 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_SPMD_APPLY_OP_DUMP) 513 RTOpPack::show_spmd_apply_op_dump =
false;
515 #if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT) 516 RTOpPack::rtop_helpers_dump_all =
false;
518 set_ele(0, y_inout, y.ptr());
519 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 521 <<
"\nThyra::VectorDefaultBase<"<<ST::name()<<
">::apply(...) : y_inout = " 526 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
527 "VectorBase<"<<ST::name()<<
">::apply(M_trans,...): Error, M_trans=" 528 <<
toString(M_trans)<<
" not supported!" );
539 template<
class Scalar>
544 TEUCHOS_TEST_FOR_EXCEPT(
545 !( col_rng.full_range() || ( col_rng.lbound() == 0 && col_rng.ubound() == 0) ) );
550 template<
class Scalar>
552 void VectorDefaultBase<Scalar>::validateColIndexes(
553 const ArrayView<const int>&cols )
const 556 TEUCHOS_TEST_FOR_EXCEPT( cols.size() != 1 || cols[0] != 0 );
564 #endif // THYRA_VECTOR_DEFAULT_BASE_DEF_HPP virtual RCP< const MultiVectorBase< Scalar > > contigSubViewImpl(const Range1D &col_rng) const
Returns Teuchos::rcp(this,false).
RCP< MultiVectorBase< Scalar > > clone_mv() const
Returns this->clone_v().
virtual RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &col_rng)
Returns Teuchos::rcp(this,false).
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...
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
. Applies vector or its adjoint (transpose) as a linear operator.
Use the non-transposed operator.
Teuchos_Ordinal subDim() const
Returns the dimension of the explicit view.
Create an explicit non-mutable (const) view of a VectorBase object.
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types)...
Ordinal globalOffset() const
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Generates a default outputting for all vectors.
Use the non-transposed operator with complex-conjugate elements (same as NOTRANS for real scalar type...
virtual void releaseDetachedMultiVectorViewImpl(RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
Implemented in terms of this->releaseDetachedView().
Use the transposed operator.
const ArrayRCP< const Scalar > values() const
virtual void acquireNonconstDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Implemented in terms of this->acquireDetachedView().
virtual void releaseDetachedVectorViewImpl(RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
Convenient node subclass for concrete VectorBase subclasses that relies on a default MultiVectorBase ...
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().
Teuchos::RCP< ReductTarget > reduct_obj_create() const
virtual RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
Returns Teuchos::rcp(this,false).
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< Scalar > &values_in, Ordinal leadingDim_in)
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< Scalar > &values_in, ptrdiff_t stride_in)
Abstract interface for finite-dimensional dense vectors.
virtual void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
virtual std::string description() const
Default description that gives the label, type, and dimenstion .
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
virtual RCP< const VectorSpaceBase< Scalar > > range() const
Returns this->space().
const ArrayRCP< Scalar > values() const
RCP< VectorBase< Scalar > > clone_v() const
Simply creates a new vector and copies the contents from *this.
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< const Scalar > &values_in, Ordinal leadingDim_in)
virtual void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
Implemented in terms of this->acquireDetachedView().
const ArrayRCP< Scalar > values() const
virtual void setSubVectorImpl(const RTOpPack::SparseSubVectorT< Scalar > &sub_vec)
Ordinal globalOffset() const
virtual RCP< const MultiVectorBase< Scalar > > nonContigSubViewImpl(const ArrayView< const int > &cols) const
Returns Teuchos::rcp(this,false).
const char * toString(EConj conj)
Return a string name for a EOpTransp value. `*.
virtual void commitNonconstDetachedMultiVectorViewImpl(RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Implemented in terms of this->commitDetachedView().
virtual void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
bool opSupportedImpl(EOpTransp M_trans) const
For complex Scalar types returns true for NOTRANS and CONJTRANS and for real types returns true for a...
virtual RCP< MultiVectorBase< Scalar > > nonconstNonContigSubViewImpl(const ArrayView< const int > &cols)
Returns Teuchos::rcp(this,false).
virtual RCP< const VectorSpaceBase< Scalar > > domain() const
Returns a DefaultSerialVectorSpace object with dimension 1.
virtual void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)