PlayaDefaultBlockVectorSpaceImpl.hpp

00001 /* @HEADER@ */
00002 //   
00003  /* @HEADER@ */
00004 
00005 #ifndef PLAYA_DEFAULTBLOCKVECTORSPACEIMPL_HPP
00006 #define PLAYA_DEFAULTBLOCKVECTORSPACEIMPL_HPP
00007 
00008 #include "PlayaDefaultBlockVectorSpaceDecl.hpp"
00009 #include "PlayaDefaultBlockVectorDecl.hpp"
00010 #include "PlayaVectorSpaceDecl.hpp"
00011 #include "PlayaExceptions.hpp"
00012 
00013 namespace Playa
00014 {
00015 
00016 template <class Scalar> inline
00017 DefaultBlockVectorSpace<Scalar>::
00018 DefaultBlockVectorSpace(const Array<VectorSpace<Scalar> >& blocks) 
00019   : blocks_(blocks), baseGNI_(-1) 
00020 {
00021   baseGNI_ = this->accumulateBaseGNI();
00022 }
00023 
00024 template <class Scalar> inline
00025 const VectorSpace<Scalar>&  
00026 DefaultBlockVectorSpace<Scalar>::getBlock(int b) const 
00027 {
00028   TEUCHOS_TEST_FOR_EXCEPTION(b < 0 || b >= this->numBlocks(),
00029     RuntimeError, "block index b=" << b << " into vector space "
00030     << this->description() << " out of range [0,"
00031     << this->numBlocks() << ")");
00032   return blocks_[b];
00033 }
00034 
00035 
00036 template <class Scalar> inline
00037 RCP<VectorBase<Scalar> > DefaultBlockVectorSpace<Scalar>
00038 ::createMember(const VectorSpace<Scalar>& self) const
00039 {
00040   TEUCHOS_TEST_FOR_EXCEPTION(this != self.ptr().get(), RuntimeError,
00041     "inconsistent self-reference in DefaultBlockVectorSpace::"
00042     "createMember()");
00043   return rcp(new DefaultBlockVector<Scalar>(self));
00044 }
00045 
00046 
00047 template <class Scalar> inline
00048 const MPIComm& DefaultBlockVectorSpace<Scalar>::comm() const
00049 {
00050   return getBlock(0).comm();
00051 }
00052 
00053 template <class Scalar> inline
00054 int DefaultBlockVectorSpace<Scalar>::baseGlobalNaturalIndex() const
00055 {
00056   return baseGNI_;
00057 }
00058 
00059 
00060 
00061 
00063 template <class Scalar> inline
00064 VectorSpace<Scalar> blockSpace(
00065   const VectorSpace<Scalar>& v1)
00066 {
00067   Array<VectorSpace<Scalar> > x(1);
00068   x[0] = v1;
00069   return blockSpace<Scalar>(x);
00070 }
00071 
00072 
00074 template <class Scalar> inline
00075 VectorSpace<Scalar> blockSpace(
00076   const VectorSpace<Scalar>& v1,
00077   const VectorSpace<Scalar>& v2)
00078 {
00079   Array<VectorSpace<Scalar> > x(2);
00080   x[0] = v1;
00081   x[1] = v2;
00082   return blockSpace<Scalar>(x);
00083 }
00084 
00086 template <class Scalar> inline
00087 VectorSpace<Scalar> blockSpace(
00088   const VectorSpace<Scalar>& v1,
00089   const VectorSpace<Scalar>& v2,
00090   const VectorSpace<Scalar>& v3)
00091 {
00092   Array<VectorSpace<Scalar> > x(3);
00093   x[0] = v1;
00094   x[1] = v2;
00095   x[2] = v3;
00096   return blockSpace<Scalar>(x);
00097 }
00098 
00100 template <class Scalar> inline
00101 VectorSpace<Scalar> blockSpace(
00102   const VectorSpace<Scalar>& v1,
00103   const VectorSpace<Scalar>& v2,
00104   const VectorSpace<Scalar>& v3,
00105   const VectorSpace<Scalar>& v4)
00106 {
00107   Array<VectorSpace<Scalar> > x(4);
00108   x[0] = v1;
00109   x[1] = v2;
00110   x[2] = v3;
00111   x[3] = v4;
00112   return blockSpace<Scalar>(x);
00113 }
00114 
00116 template <class Scalar> inline
00117 VectorSpace<Scalar> blockSpace(const Array<VectorSpace<Scalar> >& x)
00118 {
00119   RCP<const VectorSpaceBase<Scalar> > rtn 
00120     = rcp(new DefaultBlockVectorSpace<Scalar>(x));
00121   return rtn;
00122 }
00123 
00124 
00125 }
00126 
00127 
00128  
00129 
00130 #endif

doxygen