00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef THYRA_EUCLIDEAN_LINEAR_OP_DECL_HPP
00030 #define THYRA_EUCLIDEAN_LINEAR_OP_DECL_HPP
00031
00032 #include "Thyra_LinearOpBaseDecl.hpp"
00033
00034 namespace Thyra {
00035
00047 template<class RangeScalar, class DomainScalar>
00048 class EuclideanLinearOpBase : virtual public LinearOpBase<RangeScalar,DomainScalar> {
00049 public:
00050
00053
00055 virtual Teuchos::RefCountPtr<const ScalarProdVectorSpaceBase<RangeScalar> > rangeScalarProdVecSpc() const = 0;
00056
00058 virtual Teuchos::RefCountPtr<const ScalarProdVectorSpaceBase<DomainScalar> > domainScalarProdVecSpc() const = 0;
00059
00068 virtual void euclideanApply(
00069 const EConj conj
00070 ,const MultiVectorBase<DomainScalar> &X
00071 ,MultiVectorBase<RangeScalar> *Y
00072 ,const RangeScalar alpha
00073 ,const RangeScalar beta
00074 ) const = 0;
00075
00077
00080
00092 virtual void euclideanApplyTranspose(
00093 const EConj conj
00094 ,const MultiVectorBase<RangeScalar> &X
00095 ,MultiVectorBase<DomainScalar> *Y
00096 ,const DomainScalar alpha
00097 ,const DomainScalar beta
00098 ) const;
00099
00101
00104
00105 Teuchos::RefCountPtr<const VectorSpaceBase<RangeScalar> > range() const;
00107 Teuchos::RefCountPtr<const VectorSpaceBase<DomainScalar> > domain() const;
00109
00112
00118 void apply(
00119 const EConj conj
00120 ,const MultiVectorBase<DomainScalar> &X
00121 ,MultiVectorBase<RangeScalar> *Y
00122 ,const RangeScalar alpha
00123 ,const RangeScalar beta
00124 ) const;
00125
00131 void applyTranspose(
00132 const EConj conj
00133 ,const MultiVectorBase<RangeScalar> &X
00134 ,MultiVectorBase<DomainScalar> *Y
00135 ,const DomainScalar alpha
00136 ,const DomainScalar beta
00137 ) const;
00138
00140
00141 protected:
00142
00143 void euclidean_apply_impl(
00144 const EConj conj
00145 ,const MultiVectorBase<DomainScalar> &X
00146 ,MultiVectorBase<RangeScalar> *Y
00147 ,const RangeScalar alpha
00148 ,const RangeScalar beta
00149 ) const;
00150
00151 void euclidean_applyTranspose_impl(
00152 const EConj conj
00153 ,const MultiVectorBase<RangeScalar> &X
00154 ,MultiVectorBase<DomainScalar> *Y
00155 ,const DomainScalar alpha
00156 ,const DomainScalar beta
00157 ) const;
00158
00159 };
00160
00169 template<class Scalar>
00170 inline void euclideanApply(
00171 const EuclideanLinearOpBase<Scalar> &M
00172 ,const ETransp M_trans
00173 ,const MultiVectorBase<Scalar> &X
00174 ,MultiVectorBase<Scalar> *Y
00175 ,const Scalar alpha
00176 ,const Scalar beta
00177 )
00178 {
00179 if(real_trans(M_trans)==NOTRANS) {
00180 M.euclideanApply(transToConj(M_trans),X,Y,alpha,beta);
00181 }
00182 else {
00183 M.euclideanApplyTranspose(transToConj(M_trans),X,Y,alpha,beta);
00184 }
00185 }
00186
00187 }
00188
00189 #endif // THYRA_EUCLIDEAN_LINEAR_OP_DECL_HPP