Thyra_VectorMultiVector.hpp

00001 // @HEADER
00002 // ***********************************************************************
00003 // 
00004 //    Thyra: Interfaces and Support for Abstract Numerical Algorithms
00005 //                 Copyright (2004) Sandia Corporation
00006 // 
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 // 
00010 // This library is free software; you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as
00012 // published by the Free Software Foundation; either version 2.1 of the
00013 // License, or (at your option) any later version.
00014 //  
00015 // This library is distributed in the hope that it will be useful, but
00016 // WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 // Lesser General Public License for more details.
00019 //  
00020 // You should have received a copy of the GNU Lesser General Public
00021 // License along with this library; if not, write to the Free Software
00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00023 // USA
00024 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 
00025 // 
00026 // ***********************************************************************
00027 // @HEADER
00028 
00029 #ifndef THYRA_VECTOR_MULTI_VECTOR_HPP
00030 #define THYRA_VECTOR_MULTI_VECTOR_HPP
00031 
00032 // Define to make some verbose output
00033 //#define THYRA_VECTOR_MULTI_VECTOR_VERBOSE_TO_ERROR_OUT
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 // Constructors/initializers/accessors
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 // Overridden from OpBase (forwarded to this->mv())
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 // Overridden from LinearOpBase (forwarded to this->mv())
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 // Overridden from MultiVectorBase (forwarded to this->mv())
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 // Overridden from VectorBase
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   // Get MultiVectorBase arguments
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 } // end namespace Thyra
00342 
00343 #endif // THYRA_VECTOR_MULTI_VECTOR_HPP

Generated on Thu Sep 18 12:39:53 2008 for Thyra ANA Operator/VectorBase Interfaces and Related Software by doxygen 1.3.9.1