Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_MultiVectorStdOps_decl.hpp
1// @HEADER
2// *****************************************************************************
3// Thyra: Interfaces and Support for Abstract Numerical Algorithms
4//
5// Copyright 2004 NTESS and the Thyra contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef THYRA_MULTI_VECTOR_STD_OPS_DECL_HPP
11#define THYRA_MULTI_VECTOR_STD_OPS_DECL_HPP
12
13#include "Thyra_MultiVectorBase.hpp"
14#include "RTOpPack_ROpNorm1.hpp"
15#include "RTOpPack_ROpNorm2.hpp"
16#include "RTOpPack_ROpNormInf.hpp"
17
18namespace Thyra {
19
20
31template<class Scalar>
33 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms );
34
35
49template<class Scalar, class NormOp>
50void reductions( const MultiVectorBase<Scalar>& V, const NormOp &op,
51 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms );
52
53
64template<class Scalar>
66 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms );
67
68
79template<class Scalar>
81 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms );
82
83
94template<class Scalar>
96 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms );
97
98
103template<class Scalar>
106
107
120template<class Scalar>
122 const ArrayView<Scalar> &dots );
123
124
135template<class Scalar>
136void sums( const MultiVectorBase<Scalar>& V, const ArrayView<Scalar> &sums );
137
138
143template<class Scalar>
146
147
155template<class Scalar>
156void scale( Scalar alpha, const Ptr<MultiVectorBase<Scalar> > &V );
157
158
163template<class Scalar>
165 const Ptr<MultiVectorBase<Scalar> > &V );
166
171template<class Scalar>
172void assign( const Ptr<MultiVectorBase<Scalar> > &V, Scalar alpha );
173
178template<class Scalar>
180 const MultiVectorBase<Scalar>& U );
181
182
187template<class Scalar>
188void update( Scalar alpha, const MultiVectorBase<Scalar>& U,
189 const Ptr<MultiVectorBase<Scalar> > &V );
190
191
197template<class Scalar>
199 const ArrayView<const Scalar> &alpha,
200 Scalar beta,
203 );
204
205
211template<class Scalar>
214 const ArrayView<const Scalar> &alpha,
215 Scalar beta,
217 );
218
219
246template<class Scalar>
248 const ArrayView<const Scalar> &alpha,
249 const ArrayView<const Ptr<const MultiVectorBase<Scalar> > > &X,
250 const Scalar &beta,
252 );
253
254
265template<class Scalar>
266void randomize( Scalar l, Scalar u, const Ptr<MultiVectorBase<Scalar> > &V );
267
268
274template<class Scalar>
275void Vt_S( const Ptr<MultiVectorBase<Scalar> > &Z, const Scalar& alpha );
276
277
283template<class Scalar>
284void Vp_S( const Ptr<MultiVectorBase<Scalar> > &Z, const Scalar& alpha );
285
286
292template<class Scalar>
294 const MultiVectorBase<Scalar>& X );
295
296
302template<class Scalar>
305
306
312template<class Scalar>
315
316
322template<class Scalar>
323void V_StVpV( const Ptr<MultiVectorBase<Scalar> > &Z, const Scalar &alpha,
325
326
327} // end namespace Thyra
328
329
330// /////////////////////////////////////
331// Inline functions
332
333
334template<class Scalar>
335inline
336void Thyra::norms_1( const MultiVectorBase<Scalar>& V,
337 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms )
338{
339 V.norms_1(norms);
340}
341
342
343template<class Scalar>
344inline
345void Thyra::norms_2( const MultiVectorBase<Scalar>& V,
346 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms )
347{
348 V.norms_2(norms);
349}
350
351
352template<class Scalar>
353inline
354void Thyra::norms_inf( const MultiVectorBase<Scalar>& V,
355 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms )
356{
357 V.norms_inf(norms);
358}
359
360
361template<class Scalar>
363Thyra::norms_inf( const MultiVectorBase<Scalar>& V )
364{
365 typedef typename ScalarTraits<Scalar>::magnitudeType ScalarMag;
366 Array<ScalarMag> norms(V.domain()->dim());
367 Thyra::norms_inf<Scalar>(V, norms());
368 return norms;
369}
370
371
372// /////////////////////////////////////////////
373// Other implementations
374
375
376template<class Scalar, class NormOp>
377void Thyra::reductions( const MultiVectorBase<Scalar>& V, const NormOp &op,
378 const ArrayView<typename ScalarTraits<Scalar>::magnitudeType> &norms )
379{
380 using Teuchos::tuple; using Teuchos::ptrInArg; using Teuchos::null;
381 const int m = V.domain()->dim();
382 Array<RCP<RTOpPack::ReductTarget> > rcp_op_targs(m);
383 Array<Ptr<RTOpPack::ReductTarget> > op_targs(m);
384 for( int kc = 0; kc < m; ++kc ) {
385 rcp_op_targs[kc] = op.reduct_obj_create();
386 op_targs[kc] = rcp_op_targs[kc].ptr();
387 }
388 applyOp<Scalar>(op, tuple(ptrInArg(V)),
389 ArrayView<Ptr<MultiVectorBase<Scalar> > >(null),
390 op_targs );
391 for( int kc = 0; kc < m; ++kc ) {
392 norms[kc] = op(*op_targs[kc]);
393 }
394}
395
396
397#endif // THYRA_MULTI_VECTOR_STD_OPS_DECL_HPP
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.
T_To & dyn_cast(T_From &from)