Thyra_MPIMultiVectorStd.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_MPI_MULTI_VECTOR_BASE_STD_HPP
00030 #define THYRA_MPI_MULTI_VECTOR_BASE_STD_HPP
00031 
00032 // Define to make some verbose output
00033 //#define THYRA_MPI_MULTI_VECTOR_STD_VERBOSE_TO_ERROR_OUT
00034 
00035 #include "Thyra_MPIMultiVectorStdDecl.hpp"
00036 #include "Thyra_MPIVectorStd.hpp"
00037 //#include "Thyra_VectorMultiVector.hpp"
00038 
00039 namespace Thyra {
00040 
00041 // Constructors/initializers/accessors
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 // Overridden from Teuchos::Describable
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 // Overridden from EuclideanLinearOpBase
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 // Overridden from MultiVectorBase
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   //return Teuchos::rcp(new VectorMultiVector<Scalar>(subView(Range1D(j,j))));
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 // Overridden from MPIMultiVectorBase
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   // Nothing to commit!
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   // Nothing to free
00225 }
00226 
00227 } // end namespace Thyra
00228 
00229 #endif // THYRA_MPI_MULTI_VECTOR_BASE_STD_HPP

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