00001 /* @HEADER@ */ 00002 // 00003 /* @HEADER@ */ 00004 00005 #ifndef PLAYA_SIMPLEBLOCKOP_DECL_HPP 00006 #define PLAYA_SIMPLEBLOCKOP_DECL_HPP 00007 00008 00009 #include "PlayaDefs.hpp" 00010 #include "Teuchos_Array.hpp" 00011 #include "PlayaBlockOperatorBaseDecl.hpp" 00012 #include "PlayaLinearOperatorDecl.hpp" 00013 #include "PlayaLinearOpWithSpacesDecl.hpp" 00014 00015 00016 00017 namespace Playa 00018 { 00019 using namespace Teuchos; 00020 00021 /** 00022 * Array-based block operator 00023 * 00024 * @author Kevin Long (kevin.long@ttu.edu) 00025 */ 00026 template <class Scalar> 00027 class SimpleBlockOp : public LinearOpWithSpaces<Scalar>, 00028 public SetableBlockOperatorBase<Scalar> 00029 { 00030 public: 00031 /** */ 00032 SimpleBlockOp(const VectorSpace<Scalar>& domain, 00033 const VectorSpace<Scalar>& range); 00034 00035 /** */ 00036 int numBlockRows() const ; 00037 00038 /** */ 00039 int numBlockCols() const ; 00040 00041 /** */ 00042 const LinearOperator<Scalar>& getBlock(int i, int j) const ; 00043 00044 /** */ 00045 LinearOperator<Scalar> getNonconstBlock(int i, int j) ; 00046 00047 /** */ 00048 void setBlock(int i, int j, const LinearOperator<Scalar>& Aij) ; 00049 00050 /** */ 00051 void apply(Teuchos::ETransp transApplyType, 00052 const Vector<Scalar>& in, 00053 Vector<Scalar> out) const ; 00054 00055 private: 00056 Array<Array<LinearOperator<Scalar> > > blocks_; 00057 00058 }; 00059 00060 00061 /** \relates SimpleBlockOp Nonmember function to create a SimpleBlockOp */ 00062 template <class Scalar> 00063 LinearOperator<Scalar> makeBlockOperator( 00064 const VectorSpace<Scalar>& domain, 00065 const VectorSpace<Scalar>& range 00066 ); 00067 00068 00069 00070 00071 00072 } 00073 00074 #endif