PlayaDefaultBlockVectorImpl.hpp

00001 /* @HEADER@ */
00002 //   
00003  /* @HEADER@ */
00004 
00005 #ifndef PLAYA_DEFAULT_BLOCK_VECTOR_IMPL_HPP
00006 #define PLAYA_DEFAULT_BLOCK_VECTOR_IMPL_HPP
00007 
00008 #include "PlayaDefaultBlockVectorDecl.hpp"
00009 #include "PlayaDefaultBlockVectorSpaceDecl.hpp"
00010 #include "PlayaExceptions.hpp"
00011 
00012 #ifndef HAVE_TEUCHOS_EXPLICIT_INSTANTIATION
00013 #include "PlayaVectorImpl.hpp"
00014 #include "PlayaBlockIteratorImpl.hpp"
00015 #include "PlayaVectorSpaceBaseImpl.hpp"
00016 #include "PlayaDefaultBlockVectorSpaceImpl.hpp"
00017 #include "PlayaBlockVectorBaseImpl.hpp"
00018 #endif
00019 
00020 
00021 
00022 
00023 
00024 namespace Playa
00025 {
00026 template <class Scalar> inline
00027 DefaultBlockVector<Scalar>
00028 ::DefaultBlockVector(const VectorSpace<Scalar>& space)
00029   : BlockVectorBase<Scalar>(), space_(space), blocks_(space.numBlocks())
00030 {
00031   for (int i=0; i<space.numBlocks(); i++)
00032   {
00033     blocks_[i] = space.getBlock(i).createMember();
00034   }
00035 }
00036 
00037 template <class Scalar> inline
00038 DefaultBlockVector<Scalar>
00039 ::DefaultBlockVector(const VectorSpace<Scalar>& space, 
00040     const Array<Vector<Scalar> >& blocks)
00041   : BlockVectorBase<Scalar>(), space_(space), blocks_(blocks)
00042 {}
00043 
00044 template <class Scalar> inline
00045 void DefaultBlockVector<Scalar>::setBlock(int b, const Vector<Scalar>& block)
00046 {
00047   PLAYA_BOUNDSCHECK(b, 0, space_.numBlocks(), 
00048     "DefaultBlockVector::setBlock()");
00049 
00050   TEUCHOS_TEST_FOR_EXCEPTION(
00051     block.space() != space_.getBlock(b),
00052     RuntimeError,
00053     "inconsistent block spaces in setBlock: \n" 
00054     "old=" << space_.getBlock(b) << std::endl
00055     << "new=" << block.space());
00056   
00057   blocks_[b] = block;
00058 }
00059 
00060 
00061 template <class Scalar> inline
00062 const Vector<Scalar>& DefaultBlockVector<Scalar>::getBlock(int b) const 
00063 {
00064   PLAYA_BOUNDSCHECK(b, 0, space_.numBlocks(), 
00065     "const DefaultBlockVector::setBlock()");
00066 
00067   return blocks_[b];
00068 }
00069 
00070 template <class Scalar> inline
00071 Vector<Scalar> DefaultBlockVector<Scalar>::getNonConstBlock(int b) 
00072 {
00073   PLAYA_BOUNDSCHECK(b, 0, space_.numBlocks(), 
00074     "non-const DefaultBlockVector::setBlock()");
00075 
00076   return blocks_[b];
00077 }
00078 
00079 
00080 
00082 template <class Scalar> inline
00083 Vector<Scalar> blockVector(
00084   const Vector<Scalar>& v1)
00085 {
00086   Array<Vector<Scalar> > x(1);
00087   x[0] = v1;
00088   return blockVector<Scalar>(x);
00089 }
00090 
00091 
00093 template <class Scalar> inline
00094 Vector<Scalar> blockVector(
00095   const Vector<Scalar>& v1,
00096   const Vector<Scalar>& v2)
00097 {
00098   Array<Vector<Scalar> > x(2);
00099   x[0] = v1;
00100   x[1] = v2;
00101   return blockVector<Scalar>(x);
00102 }
00103 
00105 template <class Scalar> inline
00106 Vector<Scalar> blockVector(
00107   const Vector<Scalar>& v1,
00108   const Vector<Scalar>& v2,
00109   const Vector<Scalar>& v3)
00110 {
00111   Array<Vector<Scalar> > x(3);
00112   x[0] = v1;
00113   x[1] = v2;
00114   x[2] = v3;
00115   return blockVector<Scalar>(x);
00116 }
00117 
00119 template <class Scalar> inline
00120 Vector<Scalar> blockVector(
00121   const Vector<Scalar>& v1,
00122   const Vector<Scalar>& v2,
00123   const Vector<Scalar>& v3,
00124   const Vector<Scalar>& v4)
00125 {
00126   Array<Vector<Scalar> > x(4);
00127   x[0] = v1;
00128   x[1] = v2;
00129   x[2] = v3;
00130   x[3] = v4;
00131   return blockVector<Scalar>(x);
00132 }
00133 
00135 template <class Scalar> inline
00136 Vector<Scalar> blockVector(const Array<Vector<Scalar> >& x)
00137 {
00138   Array<VectorSpace<Scalar> > spaces(x.size());
00139   for (int i=0; i<x.size(); i++) spaces[i] = x[i].space();
00140 
00141   VectorSpace<Scalar> bs = blockSpace(spaces);
00142   RCP<VectorBase<Scalar> > rtn = rcp(new DefaultBlockVector<Scalar>(bs, x));
00143   return rtn;
00144 }
00145 
00146 
00147   
00148 
00149 }
00150 
00151 #endif

doxygen