00001 /* @HEADER@ */ 00002 // 00003 /* @HEADER@ */ 00004 00005 #ifndef PLAYA_DEFAULT_BLOCK_VECTOR_SPACE_DECL_HPP 00006 #define PLAYA_DEFAULT_BLOCK_VECTOR_SPACE_DECL_HPP 00007 00008 #include "PlayaDefs.hpp" 00009 #include "PlayaBlockVectorSpaceDecl.hpp" 00010 #include "Teuchos_Array.hpp" 00011 00012 00013 00014 namespace Playa 00015 { 00016 using Teuchos::Array; 00017 00018 /** 00019 * This is the default implementation of a blocked vector space, which 00020 * simply stores blocks in an array. 00021 * 00022 * @author Kevin Long (kevin.long@ttu.edu) 00023 */ 00024 template <class Scalar> 00025 class DefaultBlockVectorSpace : public BlockVectorSpaceBase<Scalar> 00026 { 00027 public: 00028 /** ctor */ 00029 DefaultBlockVectorSpace(const Array<VectorSpace<Scalar> >& blocks) ; 00030 00031 /** Get a block specified by an integer index. This function 00032 * should hrow an exception if the index is out of range */ 00033 virtual const VectorSpace<Scalar>& getBlock(int b) const ; 00034 00035 /** Create a block vector */ 00036 virtual RCP<VectorBase<Scalar> > createMember(const VectorSpace<Scalar>& self) const ; 00037 00038 /** Return the communicator */ 00039 virtual const MPIComm& comm() const ; 00040 00041 /** Return the lowest index of the first block */ 00042 virtual int baseGlobalNaturalIndex() const ; 00043 00044 /** */ 00045 int numBlocks() const {return blocks_.size();} 00046 00047 00048 private: 00049 Array<VectorSpace<Scalar> > blocks_; 00050 int baseGNI_; 00051 }; 00052 00053 00054 /** \relates VectorSpace */ 00055 template <class Scalar> 00056 VectorSpace<Scalar> blockSpace( 00057 const VectorSpace<Scalar>& v1); 00058 00059 /** \relates VectorSpace */ 00060 template <class Scalar> 00061 VectorSpace<Scalar> blockSpace( 00062 const VectorSpace<Scalar>& v1, 00063 const VectorSpace<Scalar>& v2); 00064 00065 /** \relates VectorSpace */ 00066 template <class Scalar> 00067 VectorSpace<Scalar> blockSpace( 00068 const VectorSpace<Scalar>& v1, 00069 const VectorSpace<Scalar>& v2, 00070 const VectorSpace<Scalar>& v3); 00071 00072 /** \relates VectorSpace */ 00073 template <class Scalar> 00074 VectorSpace<Scalar> blockSpace( 00075 const VectorSpace<Scalar>& v1, 00076 const VectorSpace<Scalar>& v2, 00077 const VectorSpace<Scalar>& v3, 00078 const VectorSpace<Scalar>& v4); 00079 00080 /** \relates VectorSpace */ 00081 template <class Scalar> 00082 VectorSpace<Scalar> blockSpace(const Array<VectorSpace<Scalar> >& x); 00083 00084 } 00085 00086 #endif