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_VECTOR_MULTI_VECTOR_HPP
00030 #define THYRA_VECTOR_MULTI_VECTOR_HPP
00031
00032
00033
00034
00035 #include "Thyra_VectorMultiVectorDecl.hpp"
00036 #include "Thyra_VectorBase.hpp"
00037 #include "Thyra_MultiVectorBase.hpp"
00038 #include "Teuchos_Workspace.hpp"
00039
00040 namespace Thyra {
00041
00042
00043
00044 template<class Scalar>
00045 VectorMultiVector<Scalar>::VectorMultiVector()
00046 {}
00047
00048 template<class Scalar>
00049 VectorMultiVector<Scalar>::VectorMultiVector(
00050 const Teuchos::RefCountPtr<MultiVectorBase<Scalar> > &mv
00051 )
00052 {
00053 initialize(mv);
00054 }
00055
00056 template<class Scalar>
00057 void VectorMultiVector<Scalar>::initialize(
00058 const Teuchos::RefCountPtr<MultiVectorBase<Scalar> > &mv
00059 )
00060 {
00061 #ifdef _DEBUG
00062 TEST_FOR_EXCEPTION( mv.get() == NULL, std::invalid_argument, "Error!" );
00063 TEST_FOR_EXCEPTION( mv->domain().get() == NULL, std::invalid_argument, "Error!" );
00064 TEST_FOR_EXCEPTION( mv->domain()->dim() != 1, std::invalid_argument, "Error!" );
00065 #endif
00066 mv_ = mv;
00067 }
00068
00069 template<class Scalar>
00070 void VectorMultiVector<Scalar>::uninitialize(
00071 Teuchos::RefCountPtr<MultiVectorBase<Scalar> > *mv
00072 )
00073 {
00074 if(mv) *mv = mv_;
00075 mv_ = Teuchos::null;
00076 }
00077
00078
00079
00080 template<class Scalar>
00081 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> >
00082 VectorMultiVector<Scalar>::range() const
00083 {
00084 return (mv_.get() ? mv_->range() : Teuchos::null );
00085 }
00086
00087 template<class Scalar>
00088 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> >
00089 VectorMultiVector<Scalar>::domain() const
00090 {
00091 return (mv_.get() ? mv_->domain() : Teuchos::null );
00092 }
00093
00094 template<class Scalar>
00095 bool VectorMultiVector<Scalar>::opSupported(ETransp M_trans) const
00096 {
00097 return mv_->opSupported(M_trans);
00098 }
00099
00100
00101
00102 template<class Scalar>
00103 void VectorMultiVector<Scalar>::apply(
00104 const ETransp M_trans
00105 ,const MultiVectorBase<Scalar> &X
00106 ,MultiVectorBase<Scalar> *Y
00107 ,const Scalar alpha
00108 ,const Scalar beta
00109 ) const
00110 {
00111 mv_->apply(M_trans,X,Y,alpha,beta);
00112 }
00113
00114
00115
00116 template<class Scalar>
00117 Teuchos::RefCountPtr<VectorBase<Scalar> >
00118 VectorMultiVector<Scalar>::col(Index j)
00119 {
00120 return mv_->col(j);
00121 }
00122
00123 template<class Scalar>
00124 Teuchos::RefCountPtr<MultiVectorBase<Scalar> >
00125 VectorMultiVector<Scalar>::clone_mv() const
00126 {
00127 return mv_->clone_mv();
00128 }
00129
00130 template<class Scalar>
00131 Teuchos::RefCountPtr<const MultiVectorBase<Scalar> >
00132 VectorMultiVector<Scalar>::subView( const Range1D& col_rng ) const
00133 {
00134 return mv_->subView(col_rng);
00135 }
00136
00137 template<class Scalar>
00138 Teuchos::RefCountPtr<MultiVectorBase<Scalar> >
00139 VectorMultiVector<Scalar>::subView( const Range1D& col_rng )
00140 {
00141 return mv_->subView(col_rng);
00142 }
00143
00144 template<class Scalar>
00145 Teuchos::RefCountPtr<const MultiVectorBase<Scalar> >
00146 VectorMultiVector<Scalar>::subView( const int numCols, const int cols[] ) const
00147 {
00148 return mv_->subView(numCols,cols);
00149 }
00150
00151 template<class Scalar>
00152 Teuchos::RefCountPtr<MultiVectorBase<Scalar> >
00153 VectorMultiVector<Scalar>::subView( const int numCols, const int cols[] )
00154 {
00155 return mv_->subView(numCols,cols);
00156 }
00157
00158 template<class Scalar>
00159 void VectorMultiVector<Scalar>::applyOp(
00160 const RTOpPack::RTOpT<Scalar> &primary_op
00161 ,const int num_multi_vecs
00162 ,const MultiVectorBase<Scalar>* multi_vecs[]
00163 ,const int num_targ_multi_vecs
00164 ,MultiVectorBase<Scalar>* targ_multi_vecs[]
00165 ,RTOpPack::ReductTarget* reduct_objs[]
00166 ,const Index primary_first_ele
00167 ,const Index primary_sub_dim
00168 ,const Index primary_global_offset
00169 ,const Index secondary_first_ele
00170 ,const Index secondary_sub_dim
00171 ) const
00172 {
00173 mv_->applyOp(
00174 primary_op,num_multi_vecs,multi_vecs,num_targ_multi_vecs,targ_multi_vecs,reduct_objs
00175 ,primary_first_ele,primary_sub_dim,primary_global_offset,secondary_first_ele,secondary_sub_dim
00176 );
00177 }
00178
00179 template<class Scalar>
00180 void VectorMultiVector<Scalar>::applyOp(
00181 const RTOpPack::RTOpT<Scalar> &primary_op
00182 ,const RTOpPack::RTOpT<Scalar> &secondary_op
00183 ,const int num_multi_vecs
00184 ,const MultiVectorBase<Scalar>* multi_vecs[]
00185 ,const int num_targ_multi_vecs
00186 ,MultiVectorBase<Scalar>* targ_multi_vecs[]
00187 ,RTOpPack::ReductTarget *reduct_obj
00188 ,const Index primary_first_ele
00189 ,const Index primary_sub_dim
00190 ,const Index primary_global_offset
00191 ,const Index secondary_first_ele
00192 ,const Index secondary_sub_dim
00193 ) const
00194 {
00195 mv_->applyOp(
00196 primary_op,secondary_op,num_multi_vecs,multi_vecs,num_targ_multi_vecs,targ_multi_vecs,reduct_obj
00197 ,primary_first_ele,primary_sub_dim,primary_global_offset,secondary_first_ele,secondary_sub_dim
00198 );
00199 }
00200
00201 template<class Scalar>
00202 void VectorMultiVector<Scalar>::getSubMultiVector(
00203 const Range1D &rowRng
00204 ,const Range1D &colRng
00205 ,RTOpPack::SubMultiVectorT<Scalar> *sub_mv
00206 ) const
00207 {
00208 mv_->getSubMultiVector(rowRng,colRng,sub_mv);
00209 }
00210
00211 template<class Scalar>
00212 void VectorMultiVector<Scalar>::freeSubMultiVector( RTOpPack::SubMultiVectorT<Scalar>* sub_mv ) const
00213 {
00214 mv_->freeSubMultiVector(sub_mv);
00215 }
00216
00217 template<class Scalar>
00218 void VectorMultiVector<Scalar>::getSubMultiVector(
00219 const Range1D &rowRng
00220 ,const Range1D &colRng
00221 ,RTOpPack::MutableSubMultiVectorT<Scalar> *sub_mv
00222 )
00223 {
00224 mv_->getSubMultiVector(rowRng,colRng,sub_mv);
00225 }
00226
00227 template<class Scalar>
00228 void VectorMultiVector<Scalar>::commitSubMultiVector( RTOpPack::MutableSubMultiVectorT<Scalar>* sub_mv )
00229 {
00230 mv_->commitSubMultiVector(sub_mv);
00231 }
00232
00233
00234
00235 template<class Scalar>
00236 Teuchos::RefCountPtr< const VectorSpaceBase<Scalar> >
00237 VectorMultiVector<Scalar>::space() const
00238 {
00239 #ifdef THYRA_VECTOR_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
00240 std::cerr << "\nVectorMultiVector<Scalar>::space() const called!\n";
00241 #endif
00242 return ( mv_.get() ? mv_->range() : Teuchos::null );
00243 }
00244
00245 template<class Scalar>
00246 void VectorMultiVector<Scalar>::applyOp(
00247 const RTOpPack::RTOpT<Scalar> &op
00248 ,const int num_vecs
00249 ,const VectorBase<Scalar>* vecs[]
00250 ,const int num_targ_vecs
00251 ,VectorBase<Scalar>* targ_vecs[]
00252 ,RTOpPack::ReductTarget *reduct_obj
00253 ,const Index first_ele
00254 ,const Index sub_dim
00255 ,const Index global_offset
00256 ) const
00257 {
00258 #ifdef THYRA_VECTOR_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
00259 std::cerr << "\nVectorMultiVector<Scalar>::applyOp() const called!\n";
00260 #endif
00261 using Teuchos::Workspace;
00262 Teuchos::WorkspaceStore* wss = Teuchos::get_default_workspace_store().get();
00263
00264 Workspace<const MultiVectorBase<Scalar>*> multi_vecs(wss,num_vecs,false);
00265 for( int k = 0; k < num_vecs; ++k ) {
00266 const VectorMultiVector<Scalar> *v_mv = dynamic_cast<const VectorMultiVector<Scalar>*>(vecs[k]);
00267 multi_vecs[k] = ( v_mv ? &*v_mv->mv() : vecs[k] );
00268 }
00269 Workspace<MultiVectorBase<Scalar>*> targ_multi_vecs(wss,num_targ_vecs,false);
00270 for( int k = 0; k < num_targ_vecs; ++k ) {
00271 VectorMultiVector<Scalar> *v_mv = dynamic_cast<VectorMultiVector<Scalar>*>(targ_vecs[k]);
00272 targ_multi_vecs[k] = ( v_mv ? &*v_mv->mv() : targ_vecs[k] );
00273 }
00274 RTOpPack::ReductTarget* reduct_objs[] = { reduct_obj };
00275 Thyra::applyOp(
00276 op
00277 ,num_vecs,num_vecs?&multi_vecs[0]:NULL
00278 ,num_targ_vecs,num_targ_vecs?&targ_multi_vecs[0]:NULL
00279 ,reduct_objs
00280 ,first_ele,sub_dim,global_offset
00281 ,1,0
00282 );
00283 }
00284
00285 template<class Scalar>
00286 void VectorMultiVector<Scalar>::getSubVector( const Range1D& rng, RTOpPack::SubVectorT<Scalar>* sub_vec ) const
00287 {
00288 #ifdef THYRA_VECTOR_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
00289 std::cerr << "\nVectorMultiVector<Scalar>::getSubVector() const called!\n";
00290 #endif
00291 #ifdef _DEBUG
00292 TEST_FOR_EXCEPT(sub_vec==NULL);
00293 #endif
00294 RTOpPack::SubMultiVectorT<Scalar> sub_mv;
00295 mv_->getSubMultiVector(rng,Range1D(),&sub_mv);
00296 sub_vec->initialize(sub_mv.globalOffset(),sub_mv.subDim(),sub_mv.values(),1);
00297 }
00298
00299 template<class Scalar>
00300 void VectorMultiVector<Scalar>::freeSubVector( RTOpPack::SubVectorT<Scalar>* sub_vec ) const
00301 {
00302 #ifdef THYRA_VECTOR_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
00303 std::cerr << "\nVectorMultiVector<Scalar>::freeSubVector() const called!\n";
00304 #endif
00305 #ifdef _DEBUG
00306 TEST_FOR_EXCEPT(sub_vec==NULL);
00307 #endif
00308 RTOpPack::SubMultiVectorT<Scalar> sub_mv(sub_vec->globalOffset(),sub_vec->subDim(),0,1,sub_vec->values(),sub_vec->subDim());
00309 mv_->freeSubMultiVector(&sub_mv);
00310 sub_vec->set_uninitialized();
00311 }
00312
00313 template<class Scalar>
00314 void VectorMultiVector<Scalar>::getSubVector( const Range1D& rng, RTOpPack::MutableSubVectorT<Scalar>* sub_vec )
00315 {
00316 #ifdef THYRA_VECTOR_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
00317 std::cerr << "\nVectorMultiVector<Scalar>::getSubVector() called!\n";
00318 #endif
00319 #ifdef _DEBUG
00320 TEST_FOR_EXCEPT(sub_vec==NULL);
00321 #endif
00322 RTOpPack::MutableSubMultiVectorT<Scalar> sub_mv;
00323 mv_->getSubMultiVector(rng,Range1D(),&sub_mv);
00324 sub_vec->initialize(sub_mv.globalOffset(),sub_mv.subDim(),sub_mv.values(),1);
00325 }
00326
00327 template<class Scalar>
00328 void VectorMultiVector<Scalar>::commitSubVector( RTOpPack::MutableSubVectorT<Scalar>* sub_vec )
00329 {
00330 #ifdef THYRA_VECTOR_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
00331 std::cerr << "\nVectorMultiVector<Scalar>::commitSubVector() called!\n";
00332 #endif
00333 #ifdef _DEBUG
00334 TEST_FOR_EXCEPT(sub_vec==NULL);
00335 #endif
00336 RTOpPack::MutableSubMultiVectorT<Scalar> sub_mv(sub_vec->globalOffset(),sub_vec->subDim(),0,1,sub_vec->values(),sub_vec->subDim());
00337 mv_->commitSubMultiVector(&sub_mv);
00338 sub_vec->set_uninitialized();
00339 }
00340
00341 }
00342
00343 #endif // THYRA_VECTOR_MULTI_VECTOR_HPP