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_SERIAL_MULTI_VECTOR_STD_HPP
00030 #define THYRA_SERIAL_MULTI_VECTOR_STD_HPP
00031
00032
00033
00034
00035 #include "Thyra_SerialMultiVectorStdDecl.hpp"
00036 #include "Thyra_SerialMultiVectorBase.hpp"
00037 #include "Thyra_SerialVectorStd.hpp"
00038
00039 namespace Thyra {
00040
00041
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
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
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
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
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 }
00233
00234 #endif // THYRA_SERIAL_MULTI_VECTOR_STD_HPP