10#ifndef THYRA_VECTOR_DEFAULT_BASE_DEF_HPP
11#define THYRA_VECTOR_DEFAULT_BASE_DEF_HPP
18#include "Thyra_VectorDefaultBase_decl.hpp"
19#include "Thyra_VectorSpaceFactoryBase.hpp"
20#include "Thyra_VectorBase.hpp"
21#include "Thyra_VectorStdOps.hpp"
22#include "Thyra_MultiVectorDefaultBase.hpp"
23#include "Thyra_AssertOp.hpp"
24#include "Thyra_MultiVectorBase.hpp"
25#include "Thyra_DetachedVectorView.hpp"
26#include "RTOpPack_ROpGetSubVector.hpp"
27#include "RTOpPack_TOpSetSubVector.hpp"
28#include "RTOpPack_ROpNorm1.hpp"
29#include "RTOpPack_ROpNorm2.hpp"
30#include "RTOpPack_ROpWeightedNorm2.hpp"
31#include "RTOpPack_ROpNormInf.hpp"
32#include "RTOpPack_TOpAbs.hpp"
33#include "RTOpPack_TOpAssignVectors.hpp"
34#include "RTOpPack_TOpAXPY.hpp"
35#include "RTOpPack_TOpEleWiseScale.hpp"
36#include "RTOpPack_TOpLinearCombination.hpp"
37#include "RTOpPack_TOpScaleVector.hpp"
38#include "RTOpPack_TOpReciprocal.hpp"
39#include "RTOpPack_TOpRandomize.hpp"
40#include "Teuchos_Assert.hpp"
43#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
44# include "Teuchos_VerboseObject.hpp"
45# define THYRA_VECTOR_VERBOSE_OUT_STATEMENT \
46 RCP<Teuchos::FancyOStream> dbgout = Teuchos::VerboseObjectBase::getDefaultOStream()
60 std::ostringstream oss;
64 oss <<
"{space=NULL}";
67 const Ordinal dim = vs->dim();
68 oss <<
"{dim=" << dim <<
"}";
85 if (this->
space()->dim()) {
89 for( Ordinal i = 0; i < dvv.
subDim(); ++i )
90 *out << i <<
":" << dvv[i] << std::endl;
103#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
104 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
105 *dbgout <<
"\nThyra::VectorDefaultBase<"
107 <<
">::range() called!\n";
109 return this->
space();
113template<
class Scalar>
117#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
118 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
119 *dbgout <<
"\nThyra::VectorDefaultBase<"
121 <<
">::domain() called!\n";
124 domain_ =
range()->smallVecSpcFcty()->createVecSpc(1);
133template<
class Scalar>
137#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
138 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
139 *dbgout <<
"\nThyra::VectorDefaultBase<"
141 <<
">::clone_mv() called!\n";
150template<
class Scalar>
154#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
155 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
156 *dbgout <<
"\nThyra::VectorDefaultBase<"
158 <<
">::clone_v() called!\n";
169template<
class Scalar>
176template<
class Scalar>
179 using Teuchos::tuple;
using Teuchos::null;
188template<
class Scalar>
191 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
192 RTOpPack::TOpAbs<Scalar> abs_op;
198template<
class Scalar>
201 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
202 RTOpPack::TOpReciprocal<Scalar> recip_op;
208template<
class Scalar>
211 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
218template<
class Scalar>
227template<
class Scalar>
235 for (Ordinal i = 0; i < x.size(); ++i)
241template<
class Scalar>
245 this->
dots(x, Teuchos::arrayView(&prod, 1));
250template<
class Scalar>
260template<
class Scalar>
270template<
class Scalar>
274 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
281 return norm_op(*norm_targ);
284template<
class Scalar>
297template<
class Scalar>
301#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
302 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
303 *dbgout <<
"\nThyra::VectorDefaultBase<"
315template<
class Scalar>
319#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
320 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
321 *dbgout <<
"\nThyra::VectorDefaultBase<"
323 <<
">::contigSubViewImpl(col_rng) const called!\n";
325 validateColRng(col_rng);
330template<
class Scalar>
334#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
335 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
336 *dbgout <<
"\nThyra::VectorDefaultBase<"
338 <<
">::nonconstContigSubViewImpl(col_rng) called!\n";
340 validateColRng(col_rng);
345template<
class Scalar>
350#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
351 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
352 *dbgout <<
"\nThyra::VectorDefaultBase<"
354 <<
">::nonContigSubViewImpl(cols) called!\n";
356 validateColIndexes(cols);
361template<
class Scalar>
366#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
367 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
368 *dbgout <<
"\nThyra::VectorDefaultBase<"
370 <<
">::nonconstNonContigSubViewImpl(cols) called!\n";
372 validateColIndexes(cols);
377template<
class Scalar>
384#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
385 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
386 *dbgout <<
"\nThyra::VectorDefaultBase<"
388 <<
">::acquireDetachedMultiVectorViewImpl() const called!\n";
393 validateColRng(colRng);
403template<
class Scalar>
413template<
class Scalar>
420#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
421 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
422 *dbgout <<
"\nThyra::VectorDefaultBase<"
424 <<
">::acquireNonconstDetachedMultiVectorViewImpl() called!\n";
429 validateColRng(colRng);
439template<
class Scalar>
444#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
445 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
446 *dbgout <<
"\nThyra::VectorDefaultBase<"
448 <<
">::commitNonconstDetachedMultiVectorViewImpl() called!\n";
463template<
class Scalar>
469 using Teuchos::tuple;
473 !(rng.
ubound() < this->space()->dim()), std::out_of_range
474 ,
"VectorDefaultBase<Scalar>::acquireDetachedVectorViewImpl(rng,...):"
476 <<
"] is not in range = [0,"<<(this->space()->dim()-1)<<
"]" );
485 Teuchos::null, reduct_obj.
ptr());
487 *sub_vec_inout = get_sub_vector_op(*reduct_obj);
491template<
class Scalar>
501template<
class Scalar>
519 Teuchos::arcp_const_cast<Scalar>(sub_vec.
values()), sub_vec.
stride()
524template<
class Scalar>
539template<
class Scalar>
551template<
class Scalar>
555 return ( ST::isComplex ? ( M_trans==
NOTRANS || M_trans==CONJTRANS ) :
true );
559template<
class Scalar>
561 const EOpTransp M_trans,
574 "VectorDefaultBase<Scalar>::apply()", *
this, M_trans, X, &*Y);
577 const Ordinal numCols = X.
domain()->dim();
579 for (Ordinal col_j = 0; col_j < numCols; ++col_j) {
586 if( M_trans ==
NOTRANS || (M_trans == CONJ && !ST::isComplex) ) {
588#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
589 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
590 *dbgout <<
"\nThyra::VectorDefaultBase<"
592 <<
">::apply(...) : y = beta*y + alpha*m*x (x is a scalar!)\n";
597 else if( M_trans == CONJTRANS || (M_trans == TRANS && !ST::isComplex) ) {
599#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
600 THYRA_VECTOR_VERBOSE_OUT_STATEMENT;
601 *dbgout <<
"\nThyra::VectorDefaultBase<"
603 <<
">::apply(...) : y = beta*y + alpha*m'*x (y is a scalar!)\n";
606 if( beta == ST::zero() ) {
607 y_inout = ST::zero();
612#if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_SPMD_APPLY_OP_DUMP)
613 RTOpPack::show_spmd_apply_op_dump =
true;
615#if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT)
616 RTOpPack::rtop_helpers_dump_all =
true;
618 y_inout += alpha * this->
space()->scalarProd(*
this, *x);
619#if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_SPMD_APPLY_OP_DUMP)
620 RTOpPack::show_spmd_apply_op_dump =
false;
622#if defined(THYRA_VECTOR_VERBOSE_TO_ERROR_OUT) && defined(RTOPPACK_RTOPT_HELPER_DUMP_OUTPUT)
623 RTOpPack::rtop_helpers_dump_all =
false;
626#ifdef THYRA_VECTOR_VERBOSE_TO_ERROR_OUT
628 <<
"\nThyra::VectorDefaultBase<"<<ST::name()<<
">::apply(...) : y_inout = "
634 "VectorBase<"<<ST::name()<<
">::apply(M_trans,...): Error, M_trans="
635 <<
toString(M_trans)<<
" not supported!" );
646template<
class Scalar>
648void VectorDefaultBase<Scalar>::validateColRng(
const Range1D &col_rng )
const
659template<
class Scalar>
661void VectorDefaultBase<Scalar>::validateColIndexes(
662 const ArrayView<const int>&cols )
const
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< const Scalar > &values_in, Ordinal leadingDim_in)
Ordinal globalOffset() const
Ordinal globalOffset() const
const ArrayRCP< const Scalar > values() const
Teuchos::RCP< ReductTarget > reduct_obj_create() const
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, Ordinal colOffset_in, Ordinal numSubCols_in, const ArrayRCP< Scalar > &values_in, Ordinal leadingDim_in)
const ArrayRCP< Scalar > values() const
void initialize(Ordinal globalOffset_in, Ordinal subDim_in, const ArrayRCP< Scalar > &values_in, ptrdiff_t stride_in)
const ArrayRCP< Scalar > values() const
virtual std::string description() const
Create an explicit non-mutable (const) view of a VectorBase object.
Teuchos_Ordinal subDim() const
Returns the dimension of the explicit view.
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
Interface for a collection of column vectors called a multi-vector.
void norms_inf(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
Column-wise infinity-norms.
void assign(const Ptr< MultiVectorBase< Scalar > > &V, Scalar alpha)
V = alpha.
RCP< const VectorBase< Scalar > > col(Ordinal j) const
Calls colImpl().
void dots(const MultiVectorBase< Scalar > &mv, const ArrayView< Scalar > &prods) const
Column-wise Euclidean dot product.
void applyOp(const RTOpPack::RTOpT< Scalar > &primary_op, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &multi_vecs, const ArrayView< const Ptr< MultiVectorBase< Scalar > > > &targ_multi_vecs, const ArrayView< const Ptr< RTOpPack::ReductTarget > > &reduct_objs, const Ordinal primary_global_offset=0)
Apply a reduction/transformation operator column by column and return an array of the reduction objec...
void norms_2(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
Column-wise 2-norms.
void norms_1(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
Column-wise 1-norms.
Abstract interface for finite-dimensional dense vectors.
void Vp_StV(const Ptr< VectorBase< Scalar > > &y, const Scalar &alpha, const VectorBase< Scalar > &x)
AXPY: y(i) = alpha * x(i) + y(i), i = 0...y->space()->dim()-1.
void set_ele(Ordinal i, Scalar alpha, const Ptr< VectorBase< Scalar > > &v)
Set single element: v(i) = alpha.
void linear_combination(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const VectorBase< Scalar > > > &x, const Scalar &beta)
Linear combination:
void Vt_S(const Ptr< VectorBase< Scalar > > &y, const Scalar &alpha)
Scale all elements by a scalar: y(i) *= alpha, i = 0...y->space()->dim()-1.
Scalar get_ele(const VectorBase< Scalar > &v, Ordinal i)
Get single element: result = v(i).
void commitDetachedView(RTOpPack::SubVectorView< Scalar > *sub_vec)
Calls commitDetachedView().
void assign(const VectorBase< Scalar > &x)
Vector assignment:
void copy(const VectorBase< Scalar > &x, const Ptr< VectorBase< Scalar > > &y)
Vector assignment: y(i) = x(i), i = 0...y->space()->dim()-1.
Teuchos::ScalarTraits< Scalar >::magnitudeType norm(const VectorBase< Scalar > &v)
Natural norm: result = sqrt(<v,v>).
void acquireDetachedView(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
Calls acquireDetachedVectorViewImpl().
virtual RCP< const VectorSpaceBase< Scalar > > space() const =0
Return a smart pointer to the vector space that this vector belongs to.
void update(Scalar alpha, const VectorBase< Scalar > &x)
AXPY:
virtual void acquireNonconstDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Implemented in terms of this->acquireDetachedView().
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.
virtual RCP< const VectorSpaceBase< Scalar > > range() const
Returns this->space().
virtual void acquireNonconstDetachedVectorViewImpl(const Range1D &rng, RTOpPack::SubVectorView< Scalar > *sub_vec)
virtual RCP< const VectorSpaceBase< Scalar > > domain() const
Returns a DefaultSerialVectorSpace object with dimension 1.
virtual RCP< const MultiVectorBase< Scalar > > nonContigSubViewImpl(const ArrayView< const int > &cols) const
Returns Teuchos::rcp(this,false).
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType norm2WeightedImpl(const VectorBase< Scalar > &x) const
Default implementation of norm_2 (weighted) using RTOps.
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType norm2Impl() const
Default implementation of norm_2 using RTOps.
virtual void randomizeImpl(Scalar l, Scalar u)
Default implementation of randomize using RTOps.
virtual void acquireDetachedVectorViewImpl(const Range1D &rng, RTOpPack::ConstSubVectorView< Scalar > *sub_vec) 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...
virtual RCP< const MultiVectorBase< Scalar > > contigSubViewImpl(const Range1D &col_rng) const
Returns Teuchos::rcp(this,false).
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType normInfImpl() const
Default implementation of norm_inf using RTOps.
virtual std::string description() const
Default description that gives the label, type, and dimenstion .
RCP< VectorBase< Scalar > > clone_v() const
Simply creates a new vector and copies the contents from *this.
virtual Scalar dotImpl(const VectorBase< Scalar > &x) const
Default implementation of dot using RTOps.
virtual void reciprocalImpl(const VectorBase< Scalar > &x)
Default implementation of reciprocal using RTOps.
virtual void absImpl(const VectorBase< Scalar > &x)
Default implementation of abs using RTOps.
virtual void acquireDetachedMultiVectorViewImpl(const Range1D &rowRng, const Range1D &colRng, RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
Implemented in terms of this->acquireDetachedView().
virtual RCP< VectorBase< Scalar > > nonconstColImpl(Ordinal j)
Returns Teuchos::rcp(this,false).
virtual void assignVecImpl(const VectorBase< Scalar > &x)
Default implementation of assign(vector) using RTOps.
virtual void eleWiseScaleImpl(const VectorBase< Scalar > &x)
Default implementation of ele_wise_scale using RTOps.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Generates a default outputting for all vectors.
virtual void setSubVectorImpl(const RTOpPack::SparseSubVectorT< Scalar > &sub_vec)
RCP< MultiVectorBase< Scalar > > clone_mv() const
Returns this->clone_v().
virtual RCP< MultiVectorBase< Scalar > > nonconstContigSubViewImpl(const Range1D &col_rng)
Returns Teuchos::rcp(this,false).
virtual void releaseDetachedMultiVectorViewImpl(RTOpPack::ConstSubMultiVectorView< Scalar > *sub_mv) const
Implemented in terms of this->releaseDetachedView().
virtual Teuchos::ScalarTraits< Scalar >::magnitudeType norm1Impl() const
Default implementation of norm_1 using RTOps.
virtual RCP< MultiVectorBase< Scalar > > nonconstNonContigSubViewImpl(const ArrayView< const int > &cols)
Returns Teuchos::rcp(this,false).
virtual void releaseDetachedVectorViewImpl(RTOpPack::ConstSubVectorView< Scalar > *sub_vec) const
virtual void commitNonconstDetachedMultiVectorViewImpl(RTOpPack::SubMultiVectorView< Scalar > *sub_mv)
Implemented in terms of this->commitDetachedView().
virtual void linearCombinationVecImpl(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const VectorBase< Scalar > > > &x, const Scalar &beta)
Default implementation of linear_combination using RTOps.
virtual void commitNonconstDetachedVectorViewImpl(RTOpPack::SubVectorView< Scalar > *sub_vec)
virtual void updateVecImpl(Scalar alpha, const VectorBase< Scalar > &x)
Default implementation of update using RTOps.
RCP< VectorBase< Scalar > > createMember(const RCP< const VectorSpaceBase< Scalar > > &vs, const std::string &label="")
Create a vector member from the vector space.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
#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...
const char * toString(EOpTransp transp)
Return a string name for a EOpTransp value.
NOTRANS
Type for the dimension of a vector space. `**/ typedef Teuchos::Ordinal Ordinal;.
T_To & dyn_cast(T_From &from)
basic_FancyOStream< char > FancyOStream
basic_OSTab< char > OSTab
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
static std::string name()