00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef THYRA_PRODUCT_VECTOR_DECL_HPP
00030 #define THYRA_PRODUCT_VECTOR_DECL_HPP
00031
00032 #include "Thyra_ProductVectorBase.hpp"
00033 #include "Thyra_VectorDefaultBase.hpp"
00034 #include "Teuchos_ConstNonconstObjectContainer.hpp"
00035
00036 namespace Thyra {
00037
00039 template <class Scalar> class DefaultProductVectorSpace;
00040
00054 template<class Scalar>
00055 class DefaultProductVector
00056 : virtual public ProductVectorBase<Scalar>
00057 , virtual protected VectorDefaultBase<Scalar>
00058 {
00059 public:
00060
00062 using ProductVectorBase<Scalar>::applyOp;
00064 using VectorDefaultBase<Scalar>::acquireDetachedView;
00066 using VectorDefaultBase<Scalar>::releaseDetachedView;
00068 using VectorDefaultBase<Scalar>::commitDetachedView;
00069
00072
00074 DefaultProductVector(
00075 const Teuchos::RefCountPtr<const DefaultProductVectorSpace<Scalar> > &productSpace
00076 );
00077
00079 DefaultProductVector(
00080 const Teuchos::RefCountPtr<const DefaultProductVectorSpace<Scalar> > &productSpace
00081 ,const Teuchos::RefCountPtr<VectorBase<Scalar> > vecs[]
00082 );
00083
00085 DefaultProductVector(
00086 const Teuchos::RefCountPtr<const DefaultProductVectorSpace<Scalar> > &productSpace
00087 ,const Teuchos::RefCountPtr<const VectorBase<Scalar> > vecs[]
00088 );
00089
00094 void initialize(
00095 const Teuchos::RefCountPtr<const DefaultProductVectorSpace<Scalar> > &productSpace
00096 );
00097
00102 void initialize(
00103 const Teuchos::RefCountPtr<const DefaultProductVectorSpace<Scalar> > &productSpace
00104 ,const Teuchos::RefCountPtr<VectorBase<Scalar> > vecs[]
00105 );
00106
00111 void initialize(
00112 const Teuchos::RefCountPtr<const DefaultProductVectorSpace<Scalar> > &productSpace
00113 ,const Teuchos::RefCountPtr<const VectorBase<Scalar> > vecs[]
00114 );
00115
00120 void uninitialize();
00121
00123
00126
00128 Teuchos::RefCountPtr<VectorBase<Scalar> > getNonconstVectorBlock(const int k);
00130 Teuchos::RefCountPtr<const VectorBase<Scalar> > getVectorBlock(const int k) const;
00131
00133
00137 void setBlock(int i, const Teuchos::RefCountPtr<const VectorBase<Scalar> >& b);
00139 void setNonconstBlock(int i, const Teuchos::RefCountPtr<VectorBase<Scalar> >& b);
00141
00144
00146 Teuchos::RefCountPtr<const ProductVectorSpaceBase<Scalar> > productSpace() const;
00148 bool blockIsConst(const int k) const;
00150 Teuchos::RefCountPtr<MultiVectorBase<Scalar> >
00151 getNonconstMultiVectorBlock(const int k);
00153 Teuchos::RefCountPtr<const MultiVectorBase<Scalar> >
00154 getMultiVectorBlock(const int k) const;
00155
00157
00160
00162 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> > space() const;
00164 void applyOp(
00165 const RTOpPack::RTOpT<Scalar> &op
00166 ,const int num_vecs
00167 ,const VectorBase<Scalar>*const vecs[]
00168 ,const int num_targ_vecs
00169 ,VectorBase<Scalar>*const targ_vecs[]
00170 ,RTOpPack::ReductTarget *reduct_obj
00171 ,const Index first_ele
00172 ,const Index sub_dim
00173 ,const Index global_offset
00174 ) const;
00176 void acquireDetachedView( const Range1D& rng, RTOpPack::ConstSubVectorView<Scalar>* sub_vec ) const;
00178 void releaseDetachedView( RTOpPack::ConstSubVectorView<Scalar>* sub_vec ) const;
00180 void acquireDetachedView( const Range1D& rng, RTOpPack::SubVectorView<Scalar>* sub_vec );
00182 void commitDetachedView( RTOpPack::SubVectorView<Scalar>* sub_vec );
00184 void setSubVector( const RTOpPack::SparseSubVectorT<Scalar>& sub_vec );
00185
00187
00188 private:
00189
00190
00191
00192
00193 typedef Teuchos::ConstNonconstObjectContainer<VectorBase<Scalar> > CNVC;
00194
00195
00196
00197
00198 Teuchos::RefCountPtr<const DefaultProductVectorSpace<Scalar> > productSpace_;
00199 Teuchos::Array<CNVC> vecs_;
00200
00201 int numBlocks_;
00202
00203 protected:
00204
00205
00206
00207
00208
00209 DefaultProductVector();
00210
00211 };
00212
00213 }
00214
00215 #endif // THYRA_PRODUCT_VECTOR_DECL_HPP