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_MULTI_VECTOR_COLS_HPP
00030 #define THYRA_MULTI_VECTOR_COLS_HPP
00031
00032 #include "Thyra_DefaultColumnwiseMultiVectorDecl.hpp"
00033 #include "Thyra_MultiVectorDefaultBase.hpp"
00034 #include "Thyra_VectorSpaceBase.hpp"
00035 #include "Thyra_VectorBase.hpp"
00036 #include "Thyra_SingleRhsLinearOpBase.hpp"
00037 #include "Thyra_MultiVectorBase.hpp"
00038 #include "Thyra_VectorSpaceFactoryBase.hpp"
00039 #include "Teuchos_TestForException.hpp"
00040 #include "Teuchos_as.hpp"
00041
00042 namespace Thyra {
00043
00044
00045
00046
00047
00048 template<class Scalar>
00049 DefaultColumnwiseMultiVector<Scalar>::DefaultColumnwiseMultiVector()
00050 {}
00051
00052
00053 template<class Scalar>
00054 DefaultColumnwiseMultiVector<Scalar>::DefaultColumnwiseMultiVector(
00055 const RCP<VectorBase<Scalar> > &col_vec
00056 )
00057 {
00058 this->initialize(col_vec);
00059 }
00060
00061
00062 template<class Scalar>
00063 DefaultColumnwiseMultiVector<Scalar>::DefaultColumnwiseMultiVector(
00064 const RCP<const VectorSpaceBase<Scalar> > &range_in,
00065 const RCP<const VectorSpaceBase<Scalar> > &domain_in,
00066 const ArrayView<const RCP<VectorBase<Scalar> > > &col_vecs_in
00067 )
00068 {
00069 this->initialize(range_in, domain_in, col_vecs_in);
00070 }
00071
00072
00073 template<class Scalar>
00074 void DefaultColumnwiseMultiVector<Scalar>::initialize(
00075 const RCP<VectorBase<Scalar> > &col_vec
00076 )
00077 {
00078 #ifdef TEUCHOS_DEBUG
00079 const std::string err_msg =
00080 "DefaultColumnwiseMultiVector<Scalar>::initialize(...): Error!";
00081 TEST_FOR_EXCEPT_MSG( is_null(col_vec), err_msg );
00082 TEST_FOR_EXCEPT_MSG( is_null(col_vec->space()), err_msg );
00083 #endif
00084 range_ = col_vec->space();
00085 domain_ = range_->smallVecSpcFcty()->createVecSpc(1);
00086 col_vecs_.resize(1);
00087 col_vecs_[0] = col_vec;
00088 }
00089
00090
00091 template<class Scalar>
00092 void DefaultColumnwiseMultiVector<Scalar>::initialize(
00093 const RCP<const VectorSpaceBase<Scalar> > &range_in,
00094 const RCP<const VectorSpaceBase<Scalar> > &domain_in,
00095 const ArrayView<const RCP<VectorBase<Scalar> > > &col_vecs
00096 )
00097 {
00098 #ifdef TEUCHOS_DEBUG
00099 const std::string err_msg =
00100 "DefaultColumnwiseMultiVector<Scalar>::initialize(...): Error!";
00101 TEST_FOR_EXCEPT_MSG( is_null(range_in), err_msg );
00102 TEST_FOR_EXCEPT_MSG( is_null(domain_in), err_msg );
00103 TEST_FOR_EXCEPT_MSG( range_in->dim() == 0, err_msg );
00104 TEST_FOR_EXCEPT_MSG( domain_in->dim() == 0, err_msg );
00105
00106 #endif
00107 const int domainDim = domain_in->dim();
00108 range_ = range_in;
00109 domain_ = domain_in;
00110 col_vecs_.clear();
00111 col_vecs_.reserve(domainDim);
00112 if (col_vecs.size()) {
00113 for( Index j = 0; j < domainDim; ++j )
00114 col_vecs_.push_back(col_vecs[j]);
00115 }
00116 else {
00117 for( Index j = 0; j < domainDim; ++j )
00118 col_vecs_.push_back(createMember(range_));
00119 }
00120 }
00121
00122
00123 template<class Scalar>
00124 void DefaultColumnwiseMultiVector<Scalar>::set_uninitialized()
00125 {
00126 col_vecs_.resize(0);
00127 range_ = Teuchos::null;
00128 domain_ = Teuchos::null;
00129 }
00130
00131
00132
00133
00134
00135 template<class Scalar>
00136 RCP<const VectorSpaceBase<Scalar> >
00137 DefaultColumnwiseMultiVector<Scalar>::range() const
00138 {
00139 return range_;
00140 }
00141
00142
00143 template<class Scalar>
00144 RCP<const VectorSpaceBase<Scalar> >
00145 DefaultColumnwiseMultiVector<Scalar>::domain() const
00146 {
00147 return domain_;
00148 }
00149
00150
00151
00152
00153
00154 template<class Scalar>
00155 bool DefaultColumnwiseMultiVector<Scalar>::opSupported(EOpTransp M_trans) const
00156 {
00157 typedef Teuchos::ScalarTraits<Scalar> ST;
00158 return ( ST::isComplex ? ( M_trans==NOTRANS || M_trans==CONJTRANS ) : true );
00159 }
00160
00161
00162 template<class Scalar>
00163 void DefaultColumnwiseMultiVector<Scalar>::apply(
00164 const EOpTransp M_trans
00165 ,const VectorBase<Scalar> &x
00166 ,VectorBase<Scalar> *y
00167 ,const Scalar alpha
00168 ,const Scalar beta
00169 ) const
00170 {
00171 #ifdef TEUCHOS_DEBUG
00172 THYRA_ASSERT_LINEAR_OP_VEC_APPLY_SPACES(
00173 "MultiVectorBase<Scalar>::apply()",*this,M_trans,x,y);
00174 #endif
00175 const Index nc = this->domain()->dim();
00176
00177 Vt_S(y,beta);
00178
00179 if(M_trans == NOTRANS) {
00180
00181
00182
00183
00184 RTOpPack::ConstSubVectorView<Scalar> x_sub_vec;
00185 x.acquireDetachedView(Range1D(),&x_sub_vec);
00186
00187 for(Index j = 0; j < nc; ++j )
00188 Vp_StV( y, Scalar(alpha*x_sub_vec(j)), *this->col(j) );
00189
00190 x.releaseDetachedView(&x_sub_vec);
00191 }
00192 else {
00193
00194
00195
00196
00197
00198
00199
00200 RTOpPack::SubVectorView<Scalar> y_sub_vec;
00201 y->acquireDetachedView(Range1D(),&y_sub_vec);
00202
00203 for(Index j = 0; j < nc; ++j )
00204 y_sub_vec(j) += alpha*dot(*this->col(j),x);
00205
00206 y->commitDetachedView(&y_sub_vec);
00207 }
00208 }
00209
00210
00211
00212
00213
00214 template<class Scalar>
00215 RCP<VectorBase<Scalar> >
00216 DefaultColumnwiseMultiVector<Scalar>::nonconstColImpl(Index j)
00217 {
00218 using Teuchos::as;
00219 const int num_cols = col_vecs_.size();
00220 TEST_FOR_EXCEPTION(
00221 !( 0 <= j && j < num_cols ), std::logic_error
00222 ,"Error, j = " << j << " does not fall in the range [0,"<<(num_cols-1)<< "]!"
00223 );
00224 return col_vecs_[j];
00225 }
00226
00227
00228 template<class Scalar>
00229 RCP<MultiVectorBase<Scalar> >
00230 DefaultColumnwiseMultiVector<Scalar>::nonconstContigSubViewImpl(
00231 const Range1D& col_rng_in
00232 )
00233 {
00234 const Index numCols = domain_->dim();
00235 const Range1D col_rng = Teuchos::full_range(col_rng_in,0,numCols-1);
00236 #ifdef TEUCHOS_DEBUG
00237 TEST_FOR_EXCEPTION(
00238 !( col_rng.ubound() < numCols ), std::logic_error
00239 ,"DefaultColumnwiseMultiVector<Scalar>::subView(col_rng):"
00240 "Error, the input range col_rng = ["<<col_rng.lbound()
00241 <<","<<col_rng.ubound()<<"] "
00242 "is not in the range [0,"<<(numCols-1)<<"]!"
00243 );
00244 #endif
00245 return Teuchos::rcp(
00246 new DefaultColumnwiseMultiVector<Scalar>(
00247 range_,
00248 domain_->smallVecSpcFcty()->createVecSpc(col_rng.size()),
00249 col_vecs_(col_rng.lbound(),col_rng.size())
00250 )
00251 );
00252 }
00253
00254
00255 }
00256
00257
00258 #endif // THYRA_MULTI_VECTOR_COLS_HPP