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_MPI_VECTOR_BASE_DECL_HPP
00030 #define THYRA_MPI_VECTOR_BASE_DECL_HPP
00031
00032 #include "Thyra_VectorDefaultBase.hpp"
00033 #include "Thyra_MPIVectorSpaceBaseDecl.hpp"
00034
00035 namespace Thyra {
00036
00103 template<class Scalar>
00104 class MPIVectorBase : virtual public VectorDefaultBase<Scalar> {
00105 public:
00106
00108 using VectorDefaultBase<Scalar>::applyOp;
00109
00111 MPIVectorBase();
00112
00115
00118 virtual Teuchos::RefCountPtr<const MPIVectorSpaceBase<Scalar> > mpiSpace() const = 0;
00119
00141 virtual void getLocalData( Scalar** localValues, Index* stride ) = 0;
00142
00156 virtual void commitLocalData( Scalar* localValues ) = 0;
00157
00159
00162
00191 virtual void getLocalData( const Scalar** localValues, Index* stride ) const;
00192
00209 virtual void freeLocalData( const Scalar* localValues ) const;
00210
00212
00215
00217 Teuchos::RefCountPtr<const VectorSpaceBase<Scalar> > space() const;
00228 void applyOp(
00229 const RTOpPack::RTOpT<Scalar> &op
00230 ,const int num_vecs
00231 ,const VectorBase<Scalar>* vecs[]
00232 ,const int num_targ_vecs
00233 ,VectorBase<Scalar>* targ_vecs[]
00234 ,RTOpPack::ReductTarget *reduct_obj
00235 ,const Index first_ele
00236 ,const Index sub_dim
00237 ,const Index global_offset
00238 ) const;
00240 void getSubVector( const Range1D& rng, RTOpPack::SubVectorT<Scalar>* sub_vec ) const;
00242 void freeSubVector( RTOpPack::SubVectorT<Scalar>* sub_vec ) const;
00244 void getSubVector( const Range1D& rng, RTOpPack::MutableSubVectorT<Scalar>* sub_vec );
00246 void commitSubVector( RTOpPack::MutableSubVectorT<Scalar>* sub_vec );
00247
00249
00250 protected:
00251
00255 virtual void updateMpiSpace();
00256
00257 private:
00258
00259
00260
00261
00262 mutable bool in_applyOp_;
00263
00264
00265 mutable Index globalDim_;
00266 mutable Index localOffset_;
00267 mutable Index localSubDim_;
00268
00269
00270
00271
00272 Range1D validateRange( const Range1D& rng_in ) const;
00273
00274 };
00275
00276 }
00277
00278 #endif // THYRA_MPI_VECTOR_BASE_DECL_HPP