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_MULTI_VECTOR_BASE_STD_HPP
00030 #define THYRA_MPI_MULTI_VECTOR_BASE_STD_HPP
00031
00032
00033
00034
00035 #include "Thyra_MPIMultiVectorStdDecl.hpp"
00036 #include "Thyra_MPIVectorStd.hpp"
00037
00038
00039 namespace Thyra {
00040
00041
00042
00043 template<class Scalar>
00044 MPIMultiVectorStd<Scalar>::MPIMultiVectorStd()
00045 :leadingDim_(0)
00046 {}
00047
00048 template<class Scalar>
00049 MPIMultiVectorStd<Scalar>::MPIMultiVectorStd(
00050 const Teuchos::RefCountPtr<const MPIVectorSpaceBase<Scalar> > &mpiRangeSpace
00051 ,const Teuchos::RefCountPtr<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace
00052 ,const Teuchos::RefCountPtr<Scalar> &localValues
00053 ,const Index leadingDim
00054 )
00055 {
00056 initialize(mpiRangeSpace,domainSpace,localValues,leadingDim);
00057 }
00058
00059 template<class Scalar>
00060 void MPIMultiVectorStd<Scalar>::initialize(
00061 const Teuchos::RefCountPtr<const MPIVectorSpaceBase<Scalar> > &mpiRangeSpace
00062 ,const Teuchos::RefCountPtr<const ScalarProdVectorSpaceBase<Scalar> > &domainSpace
00063 ,const Teuchos::RefCountPtr<Scalar> &localValues
00064 ,const Index leadingDim
00065 )
00066 {
00067 #ifdef _DEBUG
00068 TEST_FOR_EXCEPT(mpiRangeSpace.get()==NULL);
00069 TEST_FOR_EXCEPT(domainSpace.get()==NULL);
00070 TEST_FOR_EXCEPT(localValues.get()==NULL);
00071 TEST_FOR_EXCEPT(leadingDim < mpiRangeSpace->localSubDim());
00072 #endif
00073 mpiRangeSpace_ = mpiRangeSpace;
00074 domainSpace_ = domainSpace;
00075 localValues_ = localValues;
00076 leadingDim_ = leadingDim;
00077 this->updateMpiSpace();
00078 }
00079
00080 template<class Scalar>
00081 void MPIMultiVectorStd<Scalar>::uninitialize(
00082 Teuchos::RefCountPtr<const MPIVectorSpaceBase<Scalar> > *mpiRangeSpace
00083 ,Teuchos::RefCountPtr<const ScalarProdVectorSpaceBase<Scalar> > *domainSpace
00084 ,Teuchos::RefCountPtr<Scalar> *localValues
00085 ,Index *leadingDim
00086 )
00087 {
00088 if(mpiRangeSpace) *mpiRangeSpace = mpiRangeSpace_;
00089 if(domainSpace) *domainSpace = domainSpace_;
00090 if(localValues) *localValues = localValues_;
00091 if(leadingDim) *leadingDim = leadingDim_;
00092
00093 mpiRangeSpace_ = Teuchos::null;
00094 domainSpace_ = Teuchos::null;
00095 localValues_ = Teuchos::null;
00096 leadingDim_ = 0;
00097
00098 this->updateMpiSpace();
00099 }
00100
00101
00102
00103 template<class Scalar>
00104 std::string MPIMultiVectorStd<Scalar>::description() const
00105 {
00106 return (std::string("MPIMultiVectorStd<") + Teuchos::ScalarTraits<Scalar>::name() + std::string(">"));
00107 }
00108
00109
00110
00111 template<class Scalar>
00112 Teuchos::RefCountPtr< const ScalarProdVectorSpaceBase<Scalar> >
00113 MPIMultiVectorStd<Scalar>::domainScalarProdVecSpc() const
00114 {
00115 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00116 std::cerr << "\nMPIMultiVectorStd<Scalar>::domainScalarProdVecSpc() const called!\n";
00117 #endif
00118 return domainSpace_;
00119 }
00120
00121
00122
00123 template<class Scalar>
00124 Teuchos::RefCountPtr<VectorBase<Scalar> >
00125 MPIMultiVectorStd<Scalar>::col(Index j)
00126 {
00127 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00128 std::cerr << "\nMPIMultiVectorStd<Scalar>::col() called!\n";
00129 #endif
00130 #ifdef _DEBUG
00131 TEST_FOR_EXCEPT( j < 1 || this->domain()->dim() < j );
00132 #endif
00133 return Teuchos::rcp(
00134 new MPIVectorStd<Scalar>(
00135 mpiRangeSpace_
00136 ,Teuchos::rcp( (&*localValues_) + (j-1)*leadingDim_, false )
00137 ,1
00138 )
00139 );
00140
00141 }
00142
00143 template<class Scalar>
00144 Teuchos::RefCountPtr<MultiVectorBase<Scalar> >
00145 MPIMultiVectorStd<Scalar>::subView( const Range1D& col_rng_in )
00146 {
00147 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00148 std::cerr << "\nMPIMultiVectorStd<Scalar>::subView() called!\n";
00149 #endif
00150 const Range1D colRng = this->validateColRange(col_rng_in);
00151 return Teuchos::rcp(
00152 new MPIMultiVectorStd<Scalar>(
00153 mpiRangeSpace_
00154 ,Teuchos::rcp_dynamic_cast<const ScalarProdVectorSpaceBase<Scalar> >(
00155 mpiRangeSpace_->smallVecSpcFcty()->createVecSpc(colRng.size())
00156 ,true)
00157 ,Teuchos::rcp( (&*localValues_) + (colRng.lbound()-1)*leadingDim_, false )
00158 ,leadingDim_
00159 )
00160 );
00161 }
00162
00163
00164
00165 template<class Scalar>
00166 Teuchos::RefCountPtr<const MPIVectorSpaceBase<Scalar> >
00167 MPIMultiVectorStd<Scalar>::mpiSpace() const
00168 {
00169 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00170 std::cerr << "\nMPIMultiVectorStd<Scalar>::mpiSpace() const called!\n";
00171 #endif
00172 return mpiRangeSpace_;
00173 }
00174
00175 template<class Scalar>
00176 void MPIMultiVectorStd<Scalar>::getLocalData( Scalar **localValues, Index *leadingDim )
00177 {
00178 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00179 std::cerr << "\nMPIMultiVectorStd<Scalar>::getLocalData() called!\n";
00180 #endif
00181 #ifdef _DEBUG
00182 TEST_FOR_EXCEPT( localValues==NULL );
00183 TEST_FOR_EXCEPT( leadingDim==NULL );
00184 #endif
00185 *localValues = &*localValues_;
00186 *leadingDim = leadingDim_;
00187 }
00188
00189 template<class Scalar>
00190 void MPIMultiVectorStd<Scalar>::commitLocalData( Scalar *localValues )
00191 {
00192 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00193 std::cerr << "\nMPIMultiVectorStd<Scalar>::commitLocalData() called!\n";
00194 #endif
00195 #ifdef _DEBUG
00196 TEST_FOR_EXCEPT( localValues!=&*localValues_ );
00197 #endif
00198
00199 }
00200
00201 template<class Scalar>
00202 void MPIMultiVectorStd<Scalar>::getLocalData( const Scalar **localValues, Index *leadingDim ) const
00203 {
00204 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00205 std::cerr << "\nMPIMultiVectorStd<Scalar>::getLocalData() called!\n";
00206 #endif
00207 #ifdef _DEBUG
00208 TEST_FOR_EXCEPT( localValues==NULL );
00209 TEST_FOR_EXCEPT( leadingDim==NULL );
00210 #endif
00211 *localValues = &*localValues_;
00212 *leadingDim = leadingDim_;
00213 }
00214
00215 template<class Scalar>
00216 void MPIMultiVectorStd<Scalar>::freeLocalData( const Scalar *localValues ) const
00217 {
00218 #ifdef _DEBUG
00219 TEST_FOR_EXCEPT( localValues!=&*localValues_ );
00220 #endif
00221 #ifdef THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00222 std::cerr << "\nMPIMultiVectorStd<Scalar>::commitLocalData() called!\n";
00223 #endif
00224
00225 }
00226
00227 }
00228
00229 #endif // THYRA_MPI_MULTI_VECTOR_BASE_STD_HPP