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