Thyra Version of the Day
Loading...
Searching...
No Matches
Thyra_MultiVectorAdapterBase_def.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_ADAPTER_BASE_DEF_HPP
11#define THYRA_MULTI_VECTOR_ADAPTER_BASE_DEF_HPP
12
13#include "Thyra_MultiVectorAdapterBase_decl.hpp"
14#include "Thyra_ScalarProdVectorSpaceBase.hpp"
15#include "Thyra_ScalarProdBase.hpp"
16
17
18namespace Thyra {
19
20
21// Overridden functions from LinearOp
22
23
24template<class Scalar>
30
31
32template<class Scalar>
38
39
40// Overridden protected functions from LinearOpBase
41
42
43template<class Scalar>
45{
47 return (M_trans == NOTRANS || M_trans == CONJTRANS);
48 return true;
49}
50
51
52template<class Scalar>
54 const EOpTransp M_trans,
57 const Scalar alpha,
58 const Scalar beta
59 ) const
60{
61 //
62 // Perform:
63 //
64 // NOTRANS: Y = beta*Y + alpha * M * Q_D * X
65 //
66 // CONJTRANS: Y = beta*Y + alpha * M^H * Q_R * X
67 //
68 // where T = Q_D * X or Q_R * X
69 //
71 ( real_trans(M_trans) == NOTRANS
74 RCP<const ScalarProdBase<Scalar> > scalarProd = scalarProdVecSpc->getScalarProd();
75 if (scalarProd->isEuclidean()) {
76 // Y = beta*Y + alpha * op(M) * X
77 this->euclideanApply(M_trans, X, Y, alpha, beta);
78 }
79 else {
80 // T = Q * X
82 ::Thyra::apply(*scalarProd->getLinearOp(), NOTRANS, X, T.ptr());
83 // Y = beta*Y + alpha * op(M) * T
84 this->euclideanApply(M_trans, *T, Y, alpha, beta);
85 }
86}
87
88
89} // namespace Thyra
90
91
92#endif // THYRA_MULTI_VECTOR_ADAPTER_BASE_DEF_HPP
Ptr< T > ptr() const
void apply(const LinearOpBase< Scalar > &M, const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha=static_cast< Scalar >(1.0), const Scalar beta=static_cast< Scalar >(0.0))
Non-member function call for M.apply(...).
virtual RCP< const VectorSpaceBase< Scalar > > range() const =0
Return a smart pointer for the range space for this operator.
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
virtual RCP< const ScalarProdVectorSpaceBase< Scalar > > rangeScalarProdVecSpc() const =0
virtual RCP< const ScalarProdVectorSpaceBase< Scalar > > domainScalarProdVecSpc() const =0
RCP< const VectorSpaceBase< Scalar > > domain() const
Returns this->domainScalarProdVecSpc().
virtual void euclideanApply(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const =0
Apply the linear operator to a multi-vector with respect to a Euclidean vector space where the scalar...
void applyImpl(const EOpTransp M_trans, const MultiVectorBase< Scalar > &X, const Ptr< MultiVectorBase< Scalar > > &Y, const Scalar alpha, const Scalar beta) const
RCP< const VectorSpaceBase< Scalar > > range() const
Returns this->rangeScalarProdVecSpc().
Interface for a collection of column vectors called a multi-vector.
Scalar scalarProd(const VectorBase< Scalar > &x, const VectorBase< Scalar > &y)
Scalar product result = <x,y>.
RCP< MultiVectorBase< Scalar > > createMembers(const RCP< const VectorSpaceBase< Scalar > > &vs, int numMembers, const std::string &label="")
Create a set of vector members (a MultiVectorBase) from the vector space.
NOTRANS
Type for the dimension of a vector space. `**/ typedef Teuchos::Ordinal Ordinal;.
EOpTransp real_trans(EOpTransp transp)
Return NOTRANS or TRANS for real scalar valued operators and this also is used for determining struct...
static const bool isComplex