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_DEFAULT_PRODUCT_VECTOR_SPACE_DECL_HPP
00030 #define THYRA_DEFAULT_PRODUCT_VECTOR_SPACE_DECL_HPP
00031
00032 #include "Thyra_ProductVectorSpaceBase.hpp"
00033 #include "Thyra_VectorSpaceDefaultBase.hpp"
00034 #include "Teuchos_implicit_cast.hpp"
00035
00036 namespace Thyra {
00037
00038
00122 template<class Scalar>
00123 class DefaultProductVectorSpace
00124 : virtual public ProductVectorSpaceBase<Scalar>,
00125 virtual protected VectorSpaceDefaultBase<Scalar>
00126 {
00127 public:
00128
00131
00133 DefaultProductVectorSpace();
00134
00136 DefaultProductVectorSpace(
00137 const ArrayView<const RCP<const VectorSpaceBase<Scalar> > > &vecSpaces
00138 );
00139
00178 virtual void initialize(
00179 const ArrayView<const RCP<const VectorSpaceBase<Scalar> > > &vecSpaces
00180 );
00181
00188 bool hasBeenCloned() const;
00189
00210 virtual void uninitialize(
00211 const ArrayView<RCP<const VectorSpaceBase<Scalar> > > &vecSpaces = Teuchos::null
00212 );
00213
00222 virtual const RCP<const VectorSpaceBase<Scalar> >* vecSpaces() const;
00223
00232 virtual const Index* vecSpacesOffsets() const;
00233
00262 void getVecSpcPoss( Index i, int* kth_vector_space, Index* kth_global_offset ) const;
00263
00265
00268
00270 int numBlocks() const;
00272 RCP<const VectorSpaceBase<Scalar> > getBlock(const int k) const;
00273
00275
00278
00280 Index dim() const;
00281
00285 bool isCompatible( const VectorSpaceBase<Scalar>& vecSpc ) const;
00286
00288 RCP< VectorBase<Scalar> > createMember() const;
00289
00293 Scalar scalarProd(
00294 const VectorBase<Scalar>& x, const VectorBase<Scalar>& y ) const;
00295
00299 void scalarProdsImpl(
00300 const MultiVectorBase<Scalar>& X, const MultiVectorBase<Scalar>& Y,
00301 const ArrayView<Scalar> &scalarProds ) const;
00302
00306 bool hasInCoreView(const Range1D& rng, const EViewType viewType,
00307 const EStrideType strideType) const;
00308
00310 RCP< const VectorSpaceFactoryBase<Scalar> > smallVecSpcFcty() const;
00311
00313 RCP< MultiVectorBase<Scalar> > createMembers(int numMembers) const;
00314
00316 RCP< const VectorSpaceBase<Scalar> > clone() const;
00317
00319
00322
00326 std::string description() const;
00327
00335 void describe(
00336 Teuchos::FancyOStream &out,
00337 const Teuchos::EVerbosityLevel verbLevel
00338 ) const;
00339
00341
00344
00346 DefaultProductVectorSpace(
00347 const int numBlocks_in,
00348 const RCP<const VectorSpaceBase<Scalar> > vecSpaces_in[]
00349 )
00350 : numBlocks_(-1), dim_(-1)
00351 {
00352 initialize(numBlocks_in, vecSpaces_in);
00353 }
00354
00356 void initialize(
00357 const int numBlocks_in,
00358 const RCP<const VectorSpaceBase<Scalar> > vecSpaces_in[]
00359 )
00360 {
00361 initialize(Teuchos::arrayView(vecSpaces_in, numBlocks_in));
00362 }
00363
00365
00366 protected:
00367
00368
00369
00370
00371 private:
00372
00373
00374
00375
00376 typedef Array<RCP<const VectorSpaceBase<Scalar> > > vecSpaces_t;
00377 typedef Array<Index> vecSpacesOffsets_t;
00378
00379
00380
00381
00382 int numBlocks_;
00383 RCP<vecSpaces_t> vecSpaces_;
00384 RCP<vecSpacesOffsets_t> vecSpacesOffsets_;
00385
00386 Index dim_;
00387 bool isInCore_;
00388
00389
00390
00391
00392 void assertInitialized() const;
00393
00394 };
00395
00396
00401 template<class Scalar>
00402 inline
00403 RCP<DefaultProductVectorSpace<Scalar> >
00404 productVectorSpace()
00405 {
00406 return Teuchos::rcp(new DefaultProductVectorSpace<Scalar>);
00407 }
00408
00409
00414 template<class Scalar>
00415 inline
00416 RCP<DefaultProductVectorSpace<Scalar> >
00417 productVectorSpace(
00418 const ArrayView<RCP<const VectorSpaceBase<Scalar> > > &vecSpaces
00419 )
00420 {
00421 return Teuchos::rcp(new DefaultProductVectorSpace<Scalar>(vecSpaces));
00422 }
00423
00424
00430 template<class Scalar>
00431 inline
00432 RCP<DefaultProductVectorSpace<Scalar> >
00433 productVectorSpace(
00434 const RCP<const VectorSpaceBase<Scalar> > &vecSpace,
00435 const int numBlocks
00436 )
00437 {
00438 Array<RCP<const VectorSpaceBase<Scalar> > > vecSpaceBlocks;
00439 for ( int i = 0; i < numBlocks; ++i )
00440 vecSpaceBlocks.push_back(vecSpace);
00441 return productVectorSpace<Scalar>(vecSpaceBlocks());
00442 }
00443
00444
00445
00446
00447
00448
00449 template<class Scalar>
00450 inline const RCP<const VectorSpaceBase<Scalar> >*
00451 DefaultProductVectorSpace<Scalar>::vecSpaces() const
00452 {
00453 return ( dim_ ? &(*vecSpaces_)[0] : NULL );
00454 }
00455
00456
00457 template<class Scalar>
00458 inline const Index*
00459 DefaultProductVectorSpace<Scalar>::vecSpacesOffsets() const
00460 {
00461 return ( dim_ ? &(*vecSpacesOffsets_)[0] : NULL );
00462 }
00463
00464
00465 template<class Scalar>
00466 inline bool DefaultProductVectorSpace<Scalar>::hasBeenCloned() const
00467 {
00468 return vecSpaces_.count() > 1;
00469 }
00470
00471
00472 template<class Scalar>
00473 inline
00474 void DefaultProductVectorSpace<Scalar>::assertInitialized() const
00475 {
00476 using Teuchos::implicit_cast;
00477 #ifdef TEUCHOS_DEBUG
00478 TEST_FOR_EXCEPT( is_null(vecSpaces_) );
00479 #endif
00480 }
00481
00482
00483 }
00484
00485
00486 #endif // THYRA_DEFAULT_PRODUCT_VECTOR_SPACE_DECL_HPP