10#ifndef THYRA_VECTOR_STD_OPS_HPP
11#define THYRA_VECTOR_STD_OPS_HPP
13#include "Thyra_VectorStdOps_decl.hpp"
14#include "Thyra_VectorSpaceBase.hpp"
15#include "Thyra_VectorBase.hpp"
16#include "RTOpPack_ROpGetElement.hpp"
17#include "RTOpPack_TOpSetElement.hpp"
18#include "RTOpPack_ROpMin.hpp"
19#include "RTOpPack_ROpMinIndex.hpp"
20#include "RTOpPack_ROpMinIndexGreaterThanBound.hpp"
21#include "RTOpPack_ROpMax.hpp"
22#include "RTOpPack_ROpMaxIndex.hpp"
23#include "RTOpPack_ROpMaxIndexLessThanBound.hpp"
24#include "RTOpPack_ROpSum.hpp"
25#include "RTOpPack_TOpAddScalar.hpp"
26#include "RTOpPack_TOpEleWiseDivide.hpp"
27#include "RTOpPack_TOpEleWiseProd.hpp"
28#include "RTOpPack_TOpPairWiseMax.hpp"
29#include "RTOpPack_TOpEleWiseConjProd.hpp"
30#include "RTOpPack_TOpEleWiseProdUpdate.hpp"
31#include "RTOpPack_TOpPairWiseMaxUpdate.hpp"
32#include "RTOpPack_TOpRandomize.hpp"
33#include "Teuchos_Assert.hpp"
48Scalar Thyra::sum(
const VectorBase<Scalar>& v_rhs )
50 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
51 RTOpPack::ROpSum<Scalar> sum_op;
53 applyOp<Scalar>(sum_op,
54 tuple(ptrInArg(v_rhs)),
55 ArrayView<Ptr<VectorBase<Scalar> > >(null),
57 return sum_op(*sum_targ);
63Thyra::norm_1(
const VectorBase<Scalar>& v_rhs )
65 return v_rhs.norm_1();
71Thyra::norm_2(
const VectorBase<Scalar>& v_rhs )
73 return v_rhs.norm_2();
79Thyra::norm_2(
const VectorBase<Scalar>& w,
const VectorBase<Scalar>& v )
87Thyra::norm_inf(
const VectorBase<Scalar>& v_rhs )
89 return v_rhs.norm_inf();
94Scalar Thyra::dot(
const VectorBase<Scalar>& v_rhs1,
const VectorBase<Scalar>& v_rhs2 )
96 return v_rhs2.dot(v_rhs1);
100template<
class Scalar>
101Scalar Thyra::get_ele(
const VectorBase<Scalar>& v, Ordinal i )
103 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
109 applyOp<Scalar>(get_ele_op, tuple(ptrInArg(v)),
110 ArrayView<Ptr<VectorBase<Scalar> > >(null),
111 get_ele_targ.
ptr() );
112 return get_ele_op(*get_ele_targ);
119template<
class Scalar>
120void Thyra::set_ele( Ordinal i, Scalar alpha,
const Ptr<VectorBase<Scalar> > &v )
122 using Teuchos::tuple;
using Teuchos::null;
127 applyOp<Scalar>(set_ele_op,
128 ArrayView<Ptr<
const VectorBase<Scalar> > >(null),
134template<
class Scalar>
135void Thyra::put_scalar(
const Scalar& alpha,
const Ptr<VectorBase<Scalar> > &v_lhs )
137 v_lhs->assign(alpha);
141template<
class Scalar>
142void Thyra::copy(
const VectorBase<Scalar>& v_rhs,
143 const Ptr<VectorBase<Scalar> > &v_lhs )
145 v_lhs->assign(v_rhs);
149template<
class Scalar>
150void Thyra::add_scalar(
const Scalar& alpha,
const Ptr<VectorBase<Scalar> > &v_lhs )
152 using Teuchos::tuple;
using Teuchos::null;
154 applyOp<Scalar>(add_scalar_op,
155 ArrayView<Ptr<
const VectorBase<Scalar> > >(null),
156 tuple(v_lhs), null );
160template<
class Scalar>
161void Thyra::scale(
const Scalar& alpha,
const Ptr<VectorBase<Scalar> > &v_lhs )
167template<
class Scalar>
168void Thyra::abs(
const VectorBase<Scalar>& x,
const Ptr<VectorBase<Scalar> > &y )
174template<
class Scalar>
175void Thyra::reciprocal(
const VectorBase<Scalar>& x,
const Ptr<VectorBase<Scalar> > &y )
181template<
class Scalar>
182void Thyra::ele_wise_prod(
183 const Scalar& alpha,
const VectorBase<Scalar>& v_rhs1,
184 const VectorBase<Scalar>& v_rhs2,
const Ptr<VectorBase<Scalar> > &v_lhs
187 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
189 applyOp<Scalar>( ele_wise_prod_op, tuple(ptrInArg(v_rhs1),ptrInArg(v_rhs2)),
190 tuple(v_lhs), null );
193template<
class Scalar>
194void Thyra::pair_wise_max(
195 const Scalar &alpha,
const VectorBase<Scalar>& v_rhs1,
196 const VectorBase<Scalar>& v_rhs2,
const Ptr<VectorBase<Scalar> > &v_lhs
199 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
201 applyOp<Scalar>( pair_wise_max_op, tuple(ptrInArg(v_rhs1),ptrInArg(v_rhs2)),
202 tuple(v_lhs), null );
206template<
class Scalar>
207void Thyra::ele_wise_conj_prod(
208 const Scalar& alpha,
const VectorBase<Scalar>& v_rhs1,
209 const VectorBase<Scalar>& v_rhs2,
const Ptr<VectorBase<Scalar> > &v_lhs
212 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
214 applyOp<Scalar>( ele_wise_conj_prod_op, tuple(ptrInArg(v_rhs1),ptrInArg(v_rhs2)),
215 tuple(v_lhs), null );
219template<
class Scalar>
220void Thyra::ele_wise_scale(
const VectorBase<Scalar>& x,
221 const Ptr<VectorBase<Scalar> > &y )
223 y->ele_wise_scale(x);
227template<
class Scalar>
229 const Ptr<VectorBase<Scalar> > &v_lhs,
230 const Scalar& alpha,
const VectorBase<Scalar>& v_rhs1,
231 const VectorBase<Scalar>& v_rhs2
234 ele_wise_prod(alpha,v_rhs1,v_rhs2,v_lhs);
238template<
class Scalar>
239void Thyra::ele_wise_prod_update(
240 const Scalar& alpha,
const VectorBase<Scalar>& v_rhs1,
241 const Ptr<VectorBase<Scalar> > &v_lhs
244 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
246 applyOp<Scalar>( ele_wise_prod_update_op, tuple(ptrInArg(v_rhs1)),
247 tuple(v_lhs), null );
251template<
class Scalar>
252void Thyra::pair_wise_max_update(
253 const Scalar& alpha,
const VectorBase<Scalar>& v_rhs1,
254 const Ptr<VectorBase<Scalar> > &v_lhs
257 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
259 applyOp<Scalar>( pair_wise_max_update_op, tuple(ptrInArg(v_rhs1)),
260 tuple(v_lhs), null );
265template<
class Scalar>
267 const Ptr<VectorBase<Scalar> > &v_lhs,
268 const Scalar& alpha,
const VectorBase<Scalar>& x )
270 ele_wise_prod_update(alpha,x,v_lhs);
274template<
class Scalar>
275void Thyra::ele_wise_divide(
276 const Scalar& alpha,
const VectorBase<Scalar>& v_rhs1,
277 const VectorBase<Scalar>& v_rhs2,
278 const Ptr<VectorBase<Scalar> > &v_lhs
281 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
283 applyOp<Scalar>( ele_wise_divide_op, tuple(ptrInArg(v_rhs1),ptrInArg(v_rhs2)),
284 tuple(v_lhs), null );
288template<
class Scalar>
289void Thyra::linear_combination(
290 const ArrayView<const Scalar> &alpha,
291 const ArrayView<
const Ptr<
const VectorBase<Scalar> > > &x,
293 const Ptr<VectorBase<Scalar> > &y
296 y->linear_combination(alpha, x, beta);
300template<
class Scalar>
301void Thyra::seed_randomize(
unsigned int s )
307template<
class Scalar>
308void Thyra::randomize( Scalar l, Scalar u,
const Ptr<VectorBase<Scalar> > &v )
322template<
class Scalar>
323void Thyra::assign(
const Ptr<VectorBase<Scalar> > &v_lhs,
const Scalar& alpha )
325 put_scalar(alpha,v_lhs);
329template<
class Scalar>
330void Thyra::assign(
const Ptr<VectorBase<Scalar> > &v_lhs,
const VectorBase<Scalar>& v_rhs )
336template<
class Scalar>
337void Thyra::Vp_S(
const Ptr<VectorBase<Scalar> > &v_lhs,
const Scalar& alpha )
339 add_scalar(alpha,v_lhs);
343template<
class Scalar>
344void Thyra::Vt_S(
const Ptr<VectorBase<Scalar> > &v_lhs,
const Scalar& alpha )
350template<
class Scalar>
351void Thyra::V_StV(
const Ptr<VectorBase<Scalar> > &y,
const Scalar& alpha,
352 const VectorBase<Scalar> &x
355 using Teuchos::tuple;
using Teuchos::ptrInArg;
356 linear_combination<Scalar>( tuple<Scalar>(alpha), tuple(ptrInArg(x)),
357 ScalarTraits<Scalar>::zero(), y );
361template<
class Scalar>
362void Thyra::Vp_StV(
const Ptr<VectorBase<Scalar> > &v_lhs,
const Scalar& alpha,
363 const VectorBase<Scalar>& v_rhs
366 v_lhs->update(alpha, v_rhs);
370template<
class Scalar>
371void Thyra::Vp_V(
const Ptr<VectorBase<Scalar> > &y,
const VectorBase<Scalar>& x,
375 using Teuchos::tuple;
using Teuchos::ptrInArg;
376 linear_combination<Scalar>(
383template<
class Scalar>
384void Thyra::V_V(
const Ptr<VectorBase<Scalar> > &y,
const VectorBase<Scalar>& x )
390template<
class Scalar>
391void Thyra::V_S(
const Ptr<VectorBase<Scalar> > &y,
const Scalar& alpha )
397template<
class Scalar>
398void Thyra::V_VpV(
const Ptr<VectorBase<Scalar> > &z,
const VectorBase<Scalar>& x,
399 const VectorBase<Scalar>& y
402 using Teuchos::tuple;
using Teuchos::ptrInArg;
404 linear_combination<Scalar>(
405 tuple(ST::one(),ST::one()),
406 tuple(ptrInArg(x),ptrInArg(y)),
412template<
class Scalar>
413void Thyra::V_VmV(
const Ptr<VectorBase<Scalar> > &z,
const VectorBase<Scalar>& x,
414 const VectorBase<Scalar>& y
417 using Teuchos::tuple;
using Teuchos::ptrInArg;
419 linear_combination<Scalar>(
420 tuple(ST::one(),Scalar(-ST::one())),
421 tuple(ptrInArg(x),ptrInArg(y)),
427template<
class Scalar>
428void Thyra::V_StVpV(
const Ptr<VectorBase<Scalar> > &z,
const Scalar &alpha,
429 const VectorBase<Scalar>& x,
const VectorBase<Scalar>& y
432 using Teuchos::tuple;
using Teuchos::ptrInArg;
434 linear_combination<Scalar>(
435 tuple(alpha, ST::one()), tuple(ptrInArg(x),ptrInArg(y)),
441template<
class Scalar>
442void Thyra::V_VpStV(
const Ptr<VectorBase<Scalar> > &z,
443 const VectorBase<Scalar>& x,
444 const Scalar &alpha,
const VectorBase<Scalar>& y )
446 using Teuchos::tuple;
using Teuchos::ptrInArg;
448 linear_combination<Scalar>(
449 tuple(ST::one(), alpha), tuple(ptrInArg(x),ptrInArg(y)),
455template<
class Scalar>
456void Thyra::V_StVpStV(
const Ptr<VectorBase<Scalar> > &z,
const Scalar &alpha,
457 const VectorBase<Scalar>& x,
const Scalar &beta,
const VectorBase<Scalar>& y
460 using Teuchos::tuple;
using Teuchos::ptrInArg;
462 linear_combination<Scalar>(
463 tuple(alpha, beta), tuple(ptrInArg(x),ptrInArg(y)),
474template<
class Scalar>
475Scalar Thyra::min(
const VectorBase<Scalar>& x ) {
476 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
477 RTOpPack::ROpMin<Scalar> min_op;
479 applyOp<Scalar>( min_op, tuple(ptrInArg(x)),
480 ArrayView<
const Ptr<VectorBase<Scalar> > >(null),
482 return min_op(*min_targ);
486template<
class Scalar>
487void Thyra::min(
const VectorBase<Scalar>& x,
488 const Ptr<Scalar> &minEle,
const Ptr<Ordinal> &minIndex
491 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
494 applyOp<Scalar>( min_op, tuple(ptrInArg(x)),
495 ArrayView<
const Ptr<VectorBase<Scalar> > >(null),
498 *minEle = scalarIndex.
scalar;
499 *minIndex = scalarIndex.
index;
503template<
class Scalar>
504void Thyra::minGreaterThanBound(
const VectorBase<Scalar>& x,
505 const Scalar &bound,
const Ptr<Scalar> &minEle,
const Ptr<Ordinal> &minIndex
508 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
511 applyOp<Scalar>( min_op, tuple(ptrInArg(x)),
512 ArrayView<
const Ptr<VectorBase<Scalar> > >(null),
515 *minEle = scalarIndex.
scalar;
516 *minIndex = scalarIndex.
index;
520template<
class Scalar>
521Scalar Thyra::max(
const VectorBase<Scalar>& x )
523 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
524 RTOpPack::ROpMax<Scalar> max_op;
526 applyOp<Scalar>( max_op, tuple(ptrInArg(x)),
527 ArrayView<
const Ptr<VectorBase<Scalar> > >(null),
529 return max_op(*max_targ);
533template<
class Scalar>
534void Thyra::max(
const VectorBase<Scalar>& x,
535 const Ptr<Scalar> &maxEle,
const Ptr<Ordinal> &maxIndex
538 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
541 applyOp<Scalar>( max_op, tuple(ptrInArg(x)),
542 ArrayView<
const Ptr<VectorBase<Scalar> > >(null),
545 *maxEle = scalarIndex.
scalar;
546 *maxIndex = scalarIndex.
index;
550template<
class Scalar>
551void Thyra::maxLessThanBound(
const VectorBase<Scalar>& x,
552 const Scalar &bound,
const Ptr<Scalar> &maxEle,
const Ptr<Ordinal> &maxIndex
555 using Teuchos::tuple;
using Teuchos::ptrInArg;
using Teuchos::null;
558 applyOp<Scalar>( max_op, tuple(ptrInArg(x)),
559 ArrayView<
const Ptr<VectorBase<Scalar> > >(null),
562 *maxEle = scalarIndex.
scalar;
563 *maxIndex = scalarIndex.
index;
572#define THYRA_VECTOR_STD_OPS_INSTANT(SCALAR) \
574 template SCALAR sum( const VectorBase<SCALAR >& v_rhs ); \
576 template ScalarTraits<SCALAR >::magnitudeType \
577 norm_1( const VectorBase<SCALAR >& v_rhs ); \
579 template ScalarTraits<SCALAR >::magnitudeType \
580 norm_2( const VectorBase<SCALAR >& v_rhs ); \
582 template ScalarTraits<SCALAR >::magnitudeType \
583 norm_2( const VectorBase<SCALAR >& w, const VectorBase<SCALAR >& v ); \
585 template ScalarTraits<SCALAR >::magnitudeType \
586 norm_inf( const VectorBase<SCALAR >& v_rhs ); \
588 template SCALAR dot( const VectorBase<SCALAR >& v_rhs1, const VectorBase<SCALAR >& v_rhs2 ); \
590 template SCALAR get_ele( const VectorBase<SCALAR >& v, Ordinal i ); \
592 template void set_ele( Ordinal i, SCALAR alpha, const Ptr<VectorBase<SCALAR > > &v ); \
594 template void put_scalar( const SCALAR& alpha, const Ptr<VectorBase<SCALAR > > &v_lhs ); \
596 template void copy( const VectorBase<SCALAR >& v_rhs, \
597 const Ptr<VectorBase<SCALAR > > &v_lhs ); \
599 template void add_scalar( const SCALAR& alpha, const Ptr<VectorBase<SCALAR > > &v_lhs ); \
601 template void scale( const SCALAR& alpha, const Ptr<VectorBase<SCALAR > > &v_lhs ); \
603 template void abs( const VectorBase< SCALAR > &x, const Ptr<VectorBase< SCALAR > > &y ); \
605 template void reciprocal( const VectorBase< SCALAR > &x, const Ptr<VectorBase< SCALAR > > &y ); \
607 template void ele_wise_prod( \
608 const SCALAR& alpha, const VectorBase<SCALAR >& v_rhs1, \
609 const VectorBase<SCALAR >& v_rhs2, const Ptr<VectorBase<SCALAR > > &v_lhs \
612 template void ele_wise_conj_prod( \
613 const SCALAR& alpha, const VectorBase<SCALAR >& v_rhs1, \
614 const VectorBase<SCALAR >& v_rhs2, const Ptr<VectorBase<SCALAR > > &v_lhs \
617 template void ele_wise_scale( const VectorBase<SCALAR>& x, \
618 const Ptr<VectorBase<SCALAR> > &y ); \
620 template void Vp_StVtV( \
621 const Ptr<VectorBase<SCALAR > > &v_lhs, \
622 const SCALAR& alpha, const VectorBase<SCALAR >& v_rhs1, \
623 const VectorBase<SCALAR >& v_rhs2 \
626 template void ele_wise_prod_update( \
627 const SCALAR& alpha, const VectorBase<SCALAR >& v_rhs1, \
628 const Ptr<VectorBase<SCALAR > > &v_lhs \
631 template void Vt_StV( \
632 const Ptr<VectorBase<SCALAR > > &v_lhs, \
633 const SCALAR& alpha, const VectorBase<SCALAR >& x ); \
635 template void ele_wise_divide( \
636 const SCALAR& alpha, const VectorBase<SCALAR >& v_rhs1, \
637 const VectorBase<SCALAR >& v_rhs2, \
638 const Ptr<VectorBase<SCALAR > > &v_lhs \
641 template void linear_combination( \
642 const ArrayView<const SCALAR > &alpha, \
643 const ArrayView<const Ptr<const VectorBase<SCALAR > > > &x, \
644 const SCALAR &beta, \
645 const Ptr<VectorBase<SCALAR > > &y \
648 template void seed_randomize<SCALAR >( unsigned int s ); \
650 template void randomize( SCALAR l, SCALAR u, const Ptr<VectorBase<SCALAR > > &v ); \
652 template void assign( const Ptr<VectorBase<SCALAR > > &v_lhs, const SCALAR& alpha ); \
654 template void assign( const Ptr<VectorBase<SCALAR > > &v_lhs, const VectorBase<SCALAR >& v_rhs ); \
656 template void Vp_S( const Ptr<VectorBase<SCALAR > > &v_lhs, const SCALAR& alpha ); \
658 template void Vt_S( const Ptr<VectorBase<SCALAR > > &v_lhs, const SCALAR& alpha ); \
660 template void V_StV( const Ptr<VectorBase<SCALAR > > &y, const SCALAR& alpha, \
661 const VectorBase<SCALAR > &x \
664 template void Vp_StV( const Ptr<VectorBase<SCALAR > > &v_lhs, const SCALAR& alpha, \
665 const VectorBase<SCALAR >& v_rhs \
668 template void Vp_V( const Ptr<VectorBase<SCALAR > > &y, const VectorBase<SCALAR >& x, \
672 template void V_V( const Ptr<VectorBase<SCALAR > > &y, const VectorBase<SCALAR >& x ); \
674 template void V_S( const Ptr<VectorBase<SCALAR > > &y, const SCALAR& alpha ); \
676 template void V_VpV( const Ptr<VectorBase<SCALAR > > &z, const VectorBase<SCALAR >& x, \
677 const VectorBase<SCALAR >& y \
680 template void V_VmV( const Ptr<VectorBase<SCALAR > > &z, const VectorBase<SCALAR >& x, \
681 const VectorBase<SCALAR >& y \
684 template void V_StVpV( const Ptr<VectorBase<SCALAR > > &z, const SCALAR &alpha, \
685 const VectorBase<SCALAR >& x, const VectorBase<SCALAR >& y \
688 template void V_VpStV( const Ptr<VectorBase<SCALAR > > &z, \
689 const VectorBase<SCALAR >& x, \
690 const SCALAR &alpha, const VectorBase<SCALAR >& y ); \
692 template void V_StVpStV( const Ptr<VectorBase<SCALAR > > &z, const SCALAR &alpha, \
693 const VectorBase<SCALAR >& x, const SCALAR &beta, const VectorBase<SCALAR >& y \
698#define THYRA_VECTOR_STD_OPS_REAL_INSTANT(SCALAR) \
700 template SCALAR min( const VectorBase<SCALAR >& x ); \
702 template void pair_wise_max( \
703 const SCALAR& alpha, const VectorBase<SCALAR >& v_rhs1, \
704 const VectorBase<SCALAR >& v_rhs2, const Ptr<VectorBase<SCALAR > > &v_lhs \
707 template void pair_wise_max_update( \
708 const SCALAR& alpha, const VectorBase<SCALAR >& v_rhs1, \
709 const Ptr<VectorBase<SCALAR > > &v_lhs \
712 template void min( const VectorBase<SCALAR >& x, \
713 const Ptr<SCALAR > &minEle, const Ptr<Ordinal> &minIndex \
716 template void minGreaterThanBound( const VectorBase<SCALAR >& x, \
717 const SCALAR &bound, const Ptr<SCALAR > &minEle, const Ptr<Ordinal> &minIndex \
720 template SCALAR max( const VectorBase<SCALAR >& x ); \
722 template void max( const VectorBase<SCALAR >& x, \
723 const Ptr<SCALAR > &maxEle, const Ptr<Ordinal> &maxIndex \
726 template void maxLessThanBound( const VectorBase<SCALAR >& x, \
727 const SCALAR &bound, const Ptr<SCALAR > &maxEle, const Ptr<Ordinal> &maxIndex \
Teuchos::RCP< ReductTarget > reduct_obj_create() const
static void set_static_seed(const unsigned int static_seed)
#define TEUCHOS_ASSERT_IN_RANGE_UPPER_EXCLUSIVE(index, lower_inclusive, upper_exclusive)