00001
00002
00003
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
00062
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
00073
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
00085
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
00099
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
00115
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