Thyra  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Thyra_MultiVectorAdapterBase_def.hpp
1 // @HEADER
2 // ***********************************************************************
3 //
4 // Thyra: Interfaces and Support for Abstract Numerical Algorithms
5 // Copyright (2004) Sandia Corporation
6 //
7 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8 // license for use of this work by or on behalf of the U.S. Government.
9 //
10 // Redistribution and use in source and binary forms, with or without
11 // modification, are permitted provided that the following conditions are
12 // met:
13 //
14 // 1. Redistributions of source code must retain the above copyright
15 // notice, this list of conditions and the following disclaimer.
16 //
17 // 2. Redistributions in binary form must reproduce the above copyright
18 // notice, this list of conditions and the following disclaimer in the
19 // documentation and/or other materials provided with the distribution.
20 //
21 // 3. Neither the name of the Corporation nor the names of the
22 // contributors may be used to endorse or promote products derived from
23 // this software without specific prior written permission.
24 //
25 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 //
37 // Questions? Contact Roscoe A. Bartlett (bartlettra@ornl.gov)
38 //
39 // ***********************************************************************
40 // @HEADER
41 
42 #ifndef THYRA_MULTI_VECTOR_ADAPTER_BASE_DEF_HPP
43 #define THYRA_MULTI_VECTOR_ADAPTER_BASE_DEF_HPP
44 
45 #include "Thyra_MultiVectorAdapterBase_decl.hpp"
46 #include "Thyra_ScalarProdVectorSpaceBase.hpp"
47 #include "Thyra_ScalarProdBase.hpp"
48 
49 
50 namespace Thyra {
51 
52 
53 // Overridden functions from LinearOp
54 
55 
56 template<class Scalar>
57 RCP<const VectorSpaceBase<Scalar> >
59 {
60  return rangeScalarProdVecSpc();
61 }
62 
63 
64 template<class Scalar>
67 {
68  return domainScalarProdVecSpc();
69 }
70 
71 
72 // Overridden protected functions from LinearOpBase
73 
74 
75 template<class Scalar>
77 {
79  return (M_trans == NOTRANS || M_trans == CONJTRANS);
80  return true;
81 }
82 
83 
84 template<class Scalar>
86  const EOpTransp M_trans,
87  const MultiVectorBase<Scalar> &X,
88  const Ptr<MultiVectorBase<Scalar> > &Y,
89  const Scalar alpha,
90  const Scalar beta
91  ) const
92 {
93  //
94  // Perform:
95  //
96  // NOTRANS: Y = beta*Y + alpha * M * Q_D * X
97  //
98  // CONJTRANS: Y = beta*Y + alpha * M^H * Q_R * X
99  //
100  // where T = Q_D * X or Q_R * X
101  //
103  ( real_trans(M_trans) == NOTRANS
104  ? domainScalarProdVecSpc()
105  : rangeScalarProdVecSpc() );
106  RCP<const ScalarProdBase<Scalar> > scalarProd = scalarProdVecSpc->getScalarProd();
107  if (scalarProd->isEuclidean()) {
108  // Y = beta*Y + alpha * op(M) * X
109  this->euclideanApply(M_trans, X, Y, alpha, beta);
110  }
111  else {
112  // T = Q * X
113  RCP<MultiVectorBase<Scalar> > T = createMembers(X.range(), X.domain());
114  ::Thyra::apply(*scalarProd->getLinearOp(), NOTRANS, X, T.ptr());
115  // Y = beta*Y + alpha * op(M) * T
116  this->euclideanApply(M_trans, *T, Y, alpha, beta);
117  }
118 }
119 
120 
121 } // namespace Thyra
122 
123 
124 #endif // THYRA_MULTI_VECTOR_ADAPTER_BASE_DEF_HPP
RCP< const VectorSpaceBase< Scalar > > domain() const
Returns this-&gt;domainScalarProdVecSpc()
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
virtual RCP< const VectorSpaceBase< Scalar > > range() const =0
Return a smart pointer for the range space for this operator.
EOpTransp
Enumeration for determining how a linear operator is applied. `*.
Use the non-transposed operator.
EOpTransp real_trans(EOpTransp transp)
Return NOTRANS or TRANS for real scalar valued operators and this also is used for determining struct...
Use the transposed operator with complex-conjugate clements (same as TRANS for real scalar types)...
Interface for a collection of column vectors called a multi-vector.
bool opSupportedImpl(EOpTransp M_trans) const
Ptr< T > ptr() const
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
RCP< const VectorSpaceBase< Scalar > > range() const
Returns this-&gt;rangeScalarProdVecSpc()