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;
84 oss <<
"{space=NULL}";
88 oss <<
"{dim=" << dim <<
"}";
94 template<
class Scalar>
104 *out << this->description() <<
"\n";
105 if (this->space()->dim()) {
110 *out << i <<
":" << dvv[i] << std::endl;
119 template<
class Scalar>
123 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 124 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
125 *dbgout <<
"\nThyra::VectorDefaultBase<" 127 <<
">::range() called!\n";
129 return this->space();
133 template<
class Scalar>
137 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 138 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
139 *dbgout <<
"\nThyra::VectorDefaultBase<" 141 <<
">::domain() called!\n";
144 domain_ = range()->smallVecSpcFcty()->createVecSpc(1);
153 template<
class Scalar>
157 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 158 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
159 *dbgout <<
"\nThyra::VectorDefaultBase<" 161 <<
">::clone_mv() called!\n";
163 return this->clone_v();
170 template<
class Scalar>
174 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 175 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
176 *dbgout <<
"\nThyra::VectorDefaultBase<" 178 <<
">::clone_v() called!\n";
181 ::Thyra::assign<Scalar>(copy.ptr(), *
this);
192 template<
class Scalar>
196 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 197 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
198 *dbgout <<
"\nThyra::VectorDefaultBase<" 204 return Teuchos::rcp(
this,
false);
208 template<
class Scalar>
212 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 213 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
214 *dbgout <<
"\nThyra::VectorDefaultBase<" 216 <<
">::contigSubViewImpl(col_rng) const called!\n";
218 validateColRng(col_rng);
219 return Teuchos::rcp(
this,
false);
223 template<
class Scalar>
227 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 228 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
229 *dbgout <<
"\nThyra::VectorDefaultBase<" 231 <<
">::nonconstContigSubViewImpl(col_rng) called!\n";
233 validateColRng(col_rng);
234 return Teuchos::rcp(
this,
false);
238 template<
class Scalar>
243 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 244 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
245 *dbgout <<
"\nThyra::VectorDefaultBase<" 247 <<
">::nonContigSubViewImpl(cols) called!\n";
249 validateColIndexes(cols);
250 return Teuchos::rcp(
this,
false);
254 template<
class Scalar>
259 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 260 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
261 *dbgout <<
"\nThyra::VectorDefaultBase<" 263 <<
">::nonconstNonContigSubViewImpl(cols) called!\n";
265 validateColIndexes(cols);
266 return Teuchos::rcp(
this,
false);
270 template<
class Scalar>
274 RTOpPack::ConstSubMultiVectorView<Scalar> *sub_mv
277 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 278 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
279 *dbgout <<
"\nThyra::VectorDefaultBase<" 281 <<
">::acquireDetachedMultiVectorViewImpl() const called!\n";
286 validateColRng(colRng);
287 RTOpPack::ConstSubVectorView<Scalar> sv;
288 this->acquireDetachedView(rowRng,&sv);
292 sub_mv->initialize( sv.globalOffset(), sv.subDim(), 0, 1, sv.values(), sv.subDim() );
296 template<
class Scalar>
298 RTOpPack::ConstSubMultiVectorView<Scalar>* sub_mv
302 sub_mv->uninitialize();
306 template<
class Scalar>
310 RTOpPack::SubMultiVectorView<Scalar> *sub_mv
313 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 314 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
315 *dbgout <<
"\nThyra::VectorDefaultBase<" 317 <<
">::acquireNonconstDetachedMultiVectorViewImpl() called!\n";
322 validateColRng(colRng);
323 RTOpPack::SubVectorView<Scalar> sv;
324 this->acquireDetachedView(rowRng,&sv);
328 sub_mv->initialize( sv.globalOffset(), sv.subDim(), 0, 1, sv.values(), sv.subDim() );
332 template<
class Scalar>
334 RTOpPack::SubMultiVectorView<Scalar>* sub_mv
337 #ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT 338 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
339 *dbgout <<
"\nThyra::VectorDefaultBase<" 341 <<
">::commitNonconstDetachedMultiVectorViewImpl() called!\n";
346 RTOpPack::SubVectorView<Scalar> sv(
347 sub_mv->globalOffset(),sub_mv->subDim(),sub_mv->values(),1);
348 this->commitDetachedView(&sv);
349 sub_mv->uninitialize();
356 template<
class Scalar>
358 const Range1D& rng_in, RTOpPack::ConstSubVectorView<Scalar>* sub_vec_inout
362 using Teuchos::tuple;
366 !(rng.
ubound() < this->space()->dim()), std::out_of_range
367 ,
"VectorDefaultBase<Scalar>::acquireDetachedVectorViewImpl(rng,...):" 369 <<
"] is not in range = [0,"<<(this->space()->dim()-1)<<
"]" );
372 RTOpPack::ROpGetSubVector<Scalar> get_sub_vector_op(rng.
lbound(),rng.
ubound());
375 reduct_obj = get_sub_vector_op.reduct_obj_create();
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>
386 RTOpPack::ConstSubVectorView<Scalar>* sub_vec
390 sub_vec->uninitialize();
394 template<
class Scalar>
396 const Range1D& rng, RTOpPack::SubVectorView<Scalar>* sub_vec_inout
408 RTOpPack::ConstSubVectorView<Scalar> sub_vec;
410 sub_vec_inout->initialize(
411 sub_vec.globalOffset(), sub_vec.subDim(),
412 Teuchos::arcp_const_cast<Scalar>(sub_vec.values()), sub_vec.stride()
417 template<
class Scalar>
419 RTOpPack::SubVectorView<Scalar>* sub_vec_inout
423 RTOpPack::SparseSubVectorT<Scalar> spc_sub_vec(
424 sub_vec_inout->globalOffset(), sub_vec_inout->subDim()
425 ,sub_vec_inout->values(), sub_vec_inout->stride()
428 sub_vec_inout->uninitialize();
432 template<
class Scalar>
435 RTOpPack::TOpSetSubVector<Scalar> set_sub_vector_op(sub_vec);
436 ::Thyra::applyOp<Scalar>(set_sub_vector_op, Teuchos::null,
444 template<
class Scalar>
448 return ( ST::isComplex ? ( M_trans==
NOTRANS || M_trans==
CONJTRANS ) :
true );
452 template<
class Scalar>
467 "VectorDefaultBase<Scalar>::apply()", *
this, M_trans, X, &*Y);
472 for (
Ordinal col_j = 0; col_j < numCols; ++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<" 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<" 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 = " 527 "VectorBase<"<<ST::name()<<
">::apply(M_trans,...): Error, M_trans=" 528 <<
toString(M_trans)<<
" not supported!" );
539 template<
class Scalar>
550 template<
class Scalar>
552 void VectorDefaultBase<Scalar>::validateColIndexes(
553 const ArrayView<const int>&cols )
const 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).
bool is_null(const boost::shared_ptr< T > &p)
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
basic_OSTab< char > OSTab
#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.
basic_FancyOStream< char > FancyOStream
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Use the non-transposed operator.
Teuchos_Ordinal subDim() const
Returns the dimension of the explicit view.
T_To & dyn_cast(T_From &from)
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)...
virtual std::string description() const
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Generates a default outputting for all vectors.
static std::string name()
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.
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().
virtual RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
Returns Teuchos::rcp(this,false).
Abstract interface for finite-dimensional dense vectors.
virtual void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
TEUCHOSCORE_LIB_DLL_EXPORT std::string toString(const EVerbosityLevel verbLevel)
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().
RCP< VectorBase< Scalar > > clone_v() const
Simply creates a new vector and copies the contents from *this.
virtual void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
Implemented in terms of this->acquireDetachedView().
virtual void setSubVectorImpl(const RTOpPack::SparseSubVectorT< Scalar > &sub_vec)
virtual RCP< const MultiVectorBase< Scalar > > nonContigSubViewImpl(const ArrayView< const int > &cols) const
Returns Teuchos::rcp(this,false).
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.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
virtual void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)