42#ifndef THYRA_MULTI_VECTOR_STD_OPS_DECL_HPP
43#define THYRA_MULTI_VECTOR_STD_OPS_DECL_HPP
45#include "Thyra_MultiVectorBase.hpp"
46#include "RTOpPack_ROpNorm1.hpp"
47#include "RTOpPack_ROpNorm2.hpp"
48#include "RTOpPack_ROpNormInf.hpp"
81template<
class Scalar,
class NormOp>
111template<
class Scalar>
126template<
class Scalar>
135template<
class Scalar>
152template<
class Scalar>
167template<
class Scalar>
175template<
class Scalar>
187template<
class Scalar>
195template<
class Scalar>
203template<
class Scalar>
210template<
class Scalar>
219template<
class Scalar>
229template<
class Scalar>
243template<
class Scalar>
278template<
class Scalar>
297template<
class Scalar>
306template<
class Scalar>
315template<
class Scalar>
324template<
class Scalar>
334template<
class Scalar>
344template<
class Scalar>
354template<
class Scalar>
366template<
class Scalar>
375template<
class Scalar>
377void Thyra::norms_2(
const MultiVectorBase<Scalar>& V,
378 const ArrayView<
typename ScalarTraits<Scalar>::magnitudeType> &norms )
384template<
class Scalar>
386void Thyra::norms_inf(
const MultiVectorBase<Scalar>& V,
387 const ArrayView<
typename ScalarTraits<Scalar>::magnitudeType> &norms )
393template<
class Scalar>
395Thyra::norms_inf(
const MultiVectorBase<Scalar>& V )
397 typedef typename ScalarTraits<Scalar>::magnitudeType ScalarMag;
398 Array<ScalarMag> norms(V.domain()->dim());
399 Thyra::norms_inf<Scalar>(V, norms());
408template<
class Scalar,
class NormOp>
409void Thyra::reductions(
const MultiVectorBase<Scalar>& V,
const NormOp &op,
410 const ArrayView<
typename ScalarTraits<Scalar>::magnitudeType> &norms )
412 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
413 const int m = V.domain()->dim();
414 Array<RCP<RTOpPack::ReductTarget> > rcp_op_targs(m);
415 Array<Ptr<RTOpPack::ReductTarget> > op_targs(m);
416 for(
int kc = 0; kc < m; ++kc ) {
417 rcp_op_targs[kc] = op.reduct_obj_create();
418 op_targs[kc] = rcp_op_targs[kc].ptr();
420 applyOp<Scalar>(op, tuple(ptrInArg(V)),
421 ArrayView<Ptr<MultiVectorBase<Scalar> > >(null),
423 for(
int kc = 0; kc < m; ++kc ) {
424 norms[kc] = op(*op_targs[kc]);
Interface for a collection of column vectors called a multi-vector.
void update(const ArrayView< const Scalar > &alpha, Scalar beta, const MultiVectorBase< Scalar > &U, const Ptr< MultiVectorBase< Scalar > > &V)
alpha[j]*beta*U(j) + V(j) - > V(j), for j = 0 ,,,
void linear_combination(const ArrayView< const Scalar > &alpha, const ArrayView< const Ptr< const MultiVectorBase< Scalar > > > &X, const Scalar &beta, const Ptr< MultiVectorBase< Scalar > > &Y)
Y.col(j)(i) = beta*Y.col(j)(i) + sum( alpha[k]*X[k].col(j)(i), k=0...m-1 ), for i = 0....
void norms_1(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector one norm.
void assign(const Ptr< MultiVectorBase< Scalar > > &V, Scalar alpha)
V = alpha.
void update(const MultiVectorBase< Scalar > &U, const ArrayView< const Scalar > &alpha, Scalar beta, const Ptr< MultiVectorBase< Scalar > > &V)
U(j) + alpha[j]*beta*V(j) - > V(j), for j = 0 ,,, U.domain()->dim()-1.
void scale(Scalar alpha, const Ptr< MultiVectorBase< Scalar > > &V)
V = alpha*V.
void sums(const MultiVectorBase< Scalar > &V, const ArrayView< Scalar > &sums)
Multi-vector column sum.
Array< typename ScalarTraits< Scalar >::magnitudeType > norms_inf(const MultiVectorBase< Scalar > &V)
Column-wise multi-vector infinity norm.
void V_StVpV(const Ptr< MultiVectorBase< Scalar > > &Z, const Scalar &alpha, const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y)
Z(i,j) = alpha*X(i,j) + Y(i), i = 0...z->space()->dim()-1, , j = 0...Z->domain()->dim()-1.
ScalarTraits< Scalar >::magnitudeType norm_1(const MultiVectorBase< Scalar > &V)
Take the induced matrix one norm of a multi-vector.
void norms(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector natural norm.
void norms_2(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector 2 (Euclidean) norm.
void dots(const MultiVectorBase< Scalar > &V1, const MultiVectorBase< Scalar > &V2, const ArrayView< Scalar > &dots)
Multi-vector dot product.
void V_VmV(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y)
Z(i,j) = X(i,j) - Y(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void Vp_V(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X)
Z(i,j) += X(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void norms_1(const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms) const
Column-wise 1-norms.
void reductions(const MultiVectorBase< Scalar > &V, const NormOp &op, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector reductions.
void randomize(Scalar l, Scalar u, const Ptr< MultiVectorBase< Scalar > > &V)
Generate a random multi-vector with elements uniformly distributed elements.
void norms_inf(const MultiVectorBase< Scalar > &V, const ArrayView< typename ScalarTraits< Scalar >::magnitudeType > &norms)
Column-wise multi-vector infinity norm.
void assign(const Ptr< MultiVectorBase< Scalar > > &V, const MultiVectorBase< Scalar > &U)
V = U.
void V_VpV(const Ptr< MultiVectorBase< Scalar > > &Z, const MultiVectorBase< Scalar > &X, const MultiVectorBase< Scalar > &Y)
Z(i,j) = X(i,j) + Y(i,j), i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void update(Scalar alpha, const MultiVectorBase< Scalar > &U, const Ptr< MultiVectorBase< Scalar > > &V)
alpha*U + V -> V.
void scaleUpdate(const VectorBase< Scalar > &a, const MultiVectorBase< Scalar > &U, const Ptr< MultiVectorBase< Scalar > > &V)
A*U + V -> V (where A is a diagonal matrix with diagonal a).
void Vt_S(const Ptr< MultiVectorBase< Scalar > > &Z, const Scalar &alpha)
Z(i,j) *= alpha, i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
void Vp_S(const Ptr< MultiVectorBase< Scalar > > &Z, const Scalar &alpha)
Z(i,j) += alpha, i = 0...Z->range()->dim()-1, j = 0...Z->domain()->dim()-1.
Abstract interface for finite-dimensional dense vectors.