PlayaDefaultBlockVectorImpl.hpp
00001
00002
00003
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