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_LINEAR_OP_SCALAR_PROD_HPP
00030 #define THYRA_LINEAR_OP_SCALAR_PROD_HPP
00031
00032 #include "Thyra_LinearOpScalarProdDecl.hpp"
00033 #include "Thyra_ScalarProdBase.hpp"
00034 #include "Thyra_MultiVectorStdOps.hpp"
00035 #include "Thyra_EuclideanLinearOpBase.hpp"
00036
00037 namespace Thyra {
00038
00039
00040
00041 template<class Scalar>
00042 LinearOpScalarProd<Scalar>::LinearOpScalarProd()
00043 {}
00044
00045 template<class Scalar>
00046 LinearOpScalarProd<Scalar>::LinearOpScalarProd( const Teuchos::RefCountPtr<const LinearOpBase<Scalar> > &op )
00047 {
00048 this->initialize(op);
00049 }
00050
00051 template<class Scalar>
00052 void LinearOpScalarProd<Scalar>::initialize( const Teuchos::RefCountPtr<const LinearOpBase<Scalar> > &op )
00053 {
00054 #ifdef TEUCHOS_DEBUG
00055 TEST_FOR_EXCEPT(op.get()==NULL);
00056 #endif
00057 op_ = op;
00058 }
00059
00060 template<class Scalar>
00061 void LinearOpScalarProd<Scalar>::uninitialize( Teuchos::RefCountPtr<const LinearOpBase<Scalar> > *op )
00062 {
00063 if(op) *op = op_;
00064 op_ = Teuchos::null;
00065 }
00066
00067
00068
00069 template<class Scalar>
00070 void LinearOpScalarProd<Scalar>::scalarProds( const MultiVectorBase<Scalar>& X, const MultiVectorBase<Scalar>& Y, Scalar scalar_prods[] ) const
00071 {
00072 Teuchos::RefCountPtr<MultiVectorBase<Scalar> >
00073 T = createMembers(Y.range(),Y.domain()->dim());
00074 Thyra::apply(*op_,NOTRANS,Y,&*T);
00075 dots(X,*T,scalar_prods);
00076 }
00077
00078 template<class Scalar>
00079 void LinearOpScalarProd<Scalar>::apply(
00080 const EuclideanLinearOpBase<Scalar> &M
00081 ,const ETransp M_trans
00082 ,const MultiVectorBase<Scalar> &X
00083 ,MultiVectorBase<Scalar> *Y
00084 ,const Scalar alpha
00085 ,const Scalar beta
00086 ) const
00087 {
00088 #ifdef TEUCHOS_DEBUG
00089 TEST_FOR_EXCEPT(Y==NULL);
00090 #endif
00091 Teuchos::RefCountPtr<MultiVectorBase<Scalar> >
00092 T = createMembers(X.range(),X.domain()->dim());
00093 Thyra::apply(*op_,NOTRANS,X,&*T);
00094 Thyra::euclideanApply(M,M_trans,*T,Y,alpha,beta);
00095 }
00096
00097 }
00098
00099 #endif // THYRA_LINEAR_OP_SCALAR_PROD_HPP