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_LINEAROPERATOR_DECL_HPP
00030 #define THYRA_LINEAROPERATOR_DECL_HPP
00031
00032 #include "Teuchos_Handle.hpp"
00033 #include "Thyra_VectorSpaceDecl.hpp"
00034 #include "Thyra_ConfigDefs.hpp"
00035 #include "Thyra_LinearOpBase.hpp"
00036
00037 namespace Thyra
00038 {
00039
00045 template<class Scalar>
00046 class ConstLinearOperator
00047 : public virtual Teuchos::ConstHandle<LinearOpBase<Scalar> >
00048 {
00049 public:
00050
00052 ConstLinearOperator( const Teuchos::ENull _null = Teuchos::null )
00053 : Teuchos::ConstHandle<LinearOpBase<Scalar> >(){;}
00054
00056 ConstLinearOperator(Teuchos::ConstHandleable<LinearOpBase<Scalar> >* rawPtr)
00057 : Teuchos::ConstHandle<LinearOpBase<Scalar> >(rawPtr){;}
00058
00060 ConstLinearOperator(const Teuchos::RCP<const LinearOpBase<Scalar> >& smartPtr)
00061 : Teuchos::ConstHandle<LinearOpBase<Scalar> >(smartPtr){;}
00062
00064 const VectorSpace<Scalar> domain() const ;
00065
00067 const VectorSpace<Scalar> range() const ;
00068
00076 void apply(const ConstVector<Scalar>& in,
00077 Vector<Scalar>& out,
00078 const Scalar& alpha = 1.0,
00079 const Scalar& beta = 0.0) const ;
00080
00088 void applyTranspose(const ConstVector<Scalar>& in,
00089 Vector<Scalar>& out,
00090 const Scalar& alpha = 1.0,
00091 const Scalar& beta = 0.0) const ;
00092
00093
00095 int numBlockRows() const ;
00096
00098 int numBlockCols() const ;
00099
00101 ConstLinearOperator<Scalar> getBlock(int blockRow, int blockCol) const ;
00102
00103 };
00104
00110 template<class Scalar>
00111 class LinearOperator
00112 : public Teuchos::Handle<LinearOpBase<Scalar> >,
00113 public ConstLinearOperator<Scalar>
00114 {
00115 public:
00116
00118 LinearOperator( const Teuchos::ENull _null = Teuchos::null )
00119 : Teuchos::Handle<LinearOpBase<Scalar> >(){;}
00120
00122 LinearOperator(Teuchos::Handleable<LinearOpBase<Scalar> >* rawPtr)
00123 : Teuchos::Handle<LinearOpBase<Scalar> >(rawPtr){;}
00124
00126 LinearOperator(const Teuchos::RCP<LinearOpBase<Scalar> >& smartPtr)
00127 : Teuchos::Handle<LinearOpBase<Scalar> >(smartPtr){;}
00128
00130 LinearOperator<Scalar> getBlock(int blockRow, int blockCol) ;
00131
00132 };
00133
00138 template <class Scalar>
00139 ConstLinearOperator<Scalar>
00140 operator*(const Scalar& a,
00141 const ConstLinearOperator<Scalar>& A);
00142
00147 template <class Scalar>
00148 LinearOperator<Scalar>
00149 operator*(const Scalar& a,
00150 const LinearOperator<Scalar>& A);
00151
00156 template <class Scalar>
00157 ConstLinearOperator<Scalar>
00158 operator*(const ConstLinearOperator<Scalar>& A,
00159 const Scalar& a);
00160
00165 template <class Scalar>
00166 LinearOperator<Scalar>
00167 operator*(const LinearOperator<Scalar>& A,
00168 const Scalar& a);
00169
00174 template <class Scalar>
00175 ConstLinearOperator<Scalar>
00176 operator*(const ConstLinearOperator<Scalar>& A,
00177 const ConstLinearOperator<Scalar>& B);
00178
00183 template <class Scalar>
00184 LinearOperator<Scalar>
00185 operator*(const LinearOperator<Scalar>& A,
00186 const LinearOperator<Scalar>& B);
00187
00192 template <class Scalar>
00193 ConstLinearOperator<Scalar>
00194 operator+(const ConstLinearOperator<Scalar>& A,
00195 const ConstLinearOperator<Scalar>& B);
00196
00201 template <class Scalar>
00202 LinearOperator<Scalar>
00203 operator+(const LinearOperator<Scalar>& A,
00204 const LinearOperator<Scalar>& B);
00205
00211 template<class Scalar>
00212 ConstLinearOperator<Scalar>
00213 block2x2(
00214 const ConstLinearOperator<Scalar>& A00,
00215 const ConstLinearOperator<Scalar>& A01,
00216 const ConstLinearOperator<Scalar>& A10,
00217 const ConstLinearOperator<Scalar>& A11
00218 );
00219
00224 template<class Scalar>
00225 ConstLinearOperator<Scalar>
00226 block2x1(
00227 const ConstLinearOperator<Scalar>& A00,
00228 const ConstLinearOperator<Scalar>& A10
00229 );
00230
00235 template<class Scalar>
00236 ConstLinearOperator<Scalar>
00237 block1x2(
00238 const ConstLinearOperator<Scalar>& A00,
00239 const ConstLinearOperator<Scalar>& A01
00240 );
00241
00247 template<class Scalar>
00248 LinearOperator<Scalar>
00249 block2x2(
00250 const LinearOperator<Scalar>& A00,
00251 const LinearOperator<Scalar>& A01,
00252 const LinearOperator<Scalar>& A10,
00253 const LinearOperator<Scalar>& A11
00254 );
00255
00260 template<class Scalar>
00261 LinearOperator<Scalar>
00262 block2x1(
00263 const LinearOperator<Scalar>& A00,
00264 const LinearOperator<Scalar>& A10
00265 );
00266
00271 template<class Scalar>
00272 LinearOperator<Scalar>
00273 block1x2(
00274 const LinearOperator<Scalar>& A00,
00275 const LinearOperator<Scalar>& A01
00276 );
00277
00279 template<class Scalar>
00280 ConstLinearOperator<Scalar>
00281 identity( const VectorSpace<Scalar> &space );
00282
00284 template<class Scalar>
00285 ConstLinearOperator<Scalar>
00286 zero( const VectorSpace<Scalar> &range, const VectorSpace<Scalar> &domain );
00287
00288 }
00289
00290 #endif