43 #include "Thyra_DefaultSpmdVectorSpace.hpp" 44 #include "Thyra_DefaultSpmdMultiVector.hpp" 45 #include "Thyra_DefaultSpmdVector.hpp" 46 #include "Thyra_DetachedVectorView.hpp" 47 #include "Thyra_DetachedMultiVectorView.hpp" 48 #include "Thyra_VectorSpaceFactoryBase.hpp" 49 #include "Thyra_ProductVectorSpaceBase.hpp" 50 #include "Teuchos_Assert.hpp" 51 #include "Teuchos_dyn_cast.hpp" 53 #include "Teuchos_DefaultSerialComm.hpp" 55 #include "Teuchos_DefaultMpiComm.hpp" 58 #include "Epetra_Map.h" 59 #include "Epetra_Comm.h" 60 #include "Epetra_SerialComm.h" 62 # include "Epetra_MpiComm.h" 64 #include "Epetra_MultiVector.h" 65 #include "Epetra_Vector.h" 76 unwrapSingleProductVectorSpace(
81 using Teuchos::rcp_dynamic_cast;
83 const RCP<const ProductVectorSpaceBase<double> > pvs =
84 rcp_dynamic_cast<
const ProductVectorSpaceBase<double> >(vs_in);
87 return pvs->getBlock(0);
105 using Teuchos::rcp_dynamic_cast;
106 using Teuchos::set_extra_data;
110 if( serialEpetraComm.
get() ) {
113 set_extra_data( serialEpetraComm,
"serialEpetraComm", Teuchos::inOutArg(serialComm) );
120 mpiEpetraComm = rcp_dynamic_cast<
const Epetra_MpiComm>(epetraComm);
121 if( mpiEpetraComm.
get() ) {
123 rawMpiComm = Teuchos::opaqueWrapper(mpiEpetraComm->
Comm());
124 set_extra_data( mpiEpetraComm,
"mpiEpetraComm", Teuchos::inOutArg(rawMpiComm) );
126 mpiComm =
rcp(
new Teuchos::MpiComm<Ordinal>(rawMpiComm));
133 return Teuchos::null;
146 !epetra_map.
get(), std::invalid_argument,
147 "create_VectorSpace::initialize(...): Error!" );
148 #endif // TEUCHOS_DEBUG 151 Teuchos::set_extra_data(epetra_map,
"epetra_map", inoutArg(comm));
154 defaultSpmdVectorSpace<double>(
155 comm, localSubDim, epetra_map->NumGlobalElements64(),
165 Teuchos::set_extra_data( epetra_map,
"epetra_map", inoutArg(vs) );
176 using Teuchos::rcp_dynamic_cast;
182 return parentSpace->smallVecSpcFcty()->createVecSpc(dim);
199 return Teuchos::null;
212 Teuchos::set_extra_data<RCP<Epetra_Vector> >( epetra_v,
"Epetra_Vector",
213 Teuchos::inOutArg(v) );
231 return Teuchos::null;
244 Teuchos::set_extra_data<RCP<const Epetra_Vector> >( epetra_v,
"Epetra_Vector",
245 Teuchos::inOutArg(v) );
257 using Teuchos::rcp_dynamic_cast;
263 unwrapSingleProductVectorSpace(range_in),
268 unwrapSingleProductVectorSpace(domain_in),
271 if (!epetra_mv.
get() )
272 return Teuchos::null;
279 double *localValues;
int leadingDim;
281 epetra_mv->
ExtractView( &localValues, &leadingDim );
292 Teuchos::arcp(localValues,0,leadingDim*epetra_mv->
NumVectors(),
false),
296 Teuchos::set_extra_data<RCP<Epetra_MultiVector> >(
297 epetra_mv,
"Epetra_MultiVector", Teuchos::inOutArg(mv) );
309 using Teuchos::rcp_dynamic_cast;
315 unwrapSingleProductVectorSpace(range_in),
320 unwrapSingleProductVectorSpace(domain_in),
323 if (!epetra_mv.
get())
324 return Teuchos::null;
331 double *localValues;
int leadingDim;
333 epetra_mv->
ExtractView( &localValues, &leadingDim );
344 Teuchos::arcp(localValues,0,leadingDim*epetra_mv->
NumVectors(),
false),
348 Teuchos::set_extra_data<RCP<const Epetra_MultiVector> >(
349 epetra_mv,
"Epetra_MultiVector", Teuchos::inOutArg(mv) );
359 using Teuchos::ptrFromRef;
360 using Teuchos::ptr_dynamic_cast;
363 using Teuchos::MpiComm;
369 ptr_dynamic_cast<
const SerialComm<Ordinal> >(comm);
376 ptr_dynamic_cast<
const MpiComm<Ordinal> >(comm);
380 "SPMD std::vector space has a communicator that is " 381 "neither a serial comm nor an MPI comm");
393 "SPMD std::vector space has a communicator that is " 394 "neither a serial comm nor an MPI comm");
401 "null communicator created");
413 using Teuchos::rcpFromRef;
414 using Teuchos::rcpFromPtr;
415 using Teuchos::rcp_dynamic_cast;
416 using Teuchos::ptrFromRef;
417 using Teuchos::ptr_dynamic_cast;
428 "Error, the concrete VectorSpaceBase object of type " 430 " SpmdVectorSpaceBase or the ProductVectorSpaceBase interfaces!" );
432 const int numBlocks = (
nonnull(prod_vs) ? prod_vs->numBlocks() : 1);
438 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
441 prod_vs->getBlock(block_i),
true);
446 spmd_vs_blocks.
push_back(rcpFromPtr(spmd_vs));
451 int myLocalElements = 0;
452 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
453 myLocalElements += spmd_vs_blocks[block_i]->localSubDim();
461 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
463 const int lowGIDInBlock = spmd_vs_i->localOffset();
464 const int numLocalElementsInBlock = spmd_vs_i->localSubDim();
465 for (
int i=0; i < numLocalElementsInBlock; ++i, ++count) {
466 myGIDs[count] = blockOffset + lowGIDInBlock + i;
468 blockOffset += spmd_vs_i->dim();
471 const int globalDim = vs_in.
dim();
485 using Teuchos::get_optional_extra_data;
490 "Thyra::get_Epetra_Vector(map,v)", *epetra_vs, *v->space() );
497 epetra_v_ptr = get_optional_extra_data<RCP<Epetra_Vector> >(
500 return *epetra_v_ptr;
530 ,
Range1D(localOffset,localOffset+localSubDim-1)
537 epetra_v = Teuchos::rcp(
541 ,const_cast<double*>(emvv->values())
549 Teuchos::set_extra_data( emvv,
"emvv", Teuchos::inOutArg(epetra_v),
550 Teuchos::PRE_DESTROY );
562 using Teuchos::get_optional_extra_data;
567 "Thyra::get_Epetra_Vector(map,v)", *epetra_vs, *v->space() );
574 epetra_v_ptr = get_optional_extra_data<RCP<const Epetra_Vector> >(
577 return *epetra_v_ptr;
579 epetra_nonconst_v_ptr = get_optional_extra_data<RCP<Epetra_Vector> >(
581 if(!
is_null(epetra_nonconst_v_ptr))
582 return *epetra_nonconst_v_ptr;
597 ,
Range1D(localOffset,localOffset+localSubDim-1)
604 epetra_v = Teuchos::rcp(
608 ,const_cast<double*>(evv->values())
616 Teuchos::set_extra_data( evv,
"evv", Teuchos::inOutArg(epetra_v),
617 Teuchos::PRE_DESTROY );
629 using Teuchos::get_optional_extra_data;
634 "Thyra::get_Epetra_MultiVector(map,mv)", *epetra_vs, *mv->range() );
641 epetra_mv_ptr = get_optional_extra_data<RCP<Epetra_MultiVector> >(
642 mv,
"Epetra_MultiVector");
644 return *epetra_mv_ptr;
668 emmvv = Teuchos::rcp(
671 ,
Range1D(localOffset,localOffset+localSubDim-1)
677 epetra_mv = Teuchos::rcp(
681 ,const_cast<double*>(emmvv->values())
692 Teuchos::set_extra_data( emmvv,
"emmvv", Teuchos::inOutArg(epetra_mv),
693 Teuchos::PRE_DESTROY );
695 Teuchos::set_extra_data( mv,
"mv", Teuchos::inOutArg(epetra_mv) );
707 using Teuchos::get_optional_extra_data;
712 "Thyra::get_Epetra_MultiVector(map,mv)",
713 *epetra_vs, *mv->range() );
721 = get_optional_extra_data<RCP<const Epetra_MultiVector> >(
722 mv,
"Epetra_MultiVector" );
724 return *epetra_mv_ptr;
740 ,
Range1D(localOffset,localOffset+localSubDim-1)
746 epetra_mv = Teuchos::rcp(
750 ,const_cast<double*>(emvv->values())
760 Teuchos::set_extra_data( emvv,
"emvv", Teuchos::inOutArg(epetra_mv),
761 Teuchos::PRE_DESTROY );
763 Teuchos::set_extra_data( mv,
"mv", Teuchos::inOutArg(epetra_mv) );
775 using Teuchos::rcpWithEmbeddedObj;
776 using Teuchos::rcpFromRef;
777 using Teuchos::ptrFromRef;
778 using Teuchos::ptr_dynamic_cast;
779 using Teuchos::outArg;
784 mvSpmdMv->getNonconstLocalData(outArg(mvData), outArg(mvLeadingDim));
787 return rcpWithEmbeddedObj(
804 using Teuchos::rcpWithEmbeddedObj;
805 using Teuchos::rcpFromRef;
806 using Teuchos::ptrFromRef;
807 using Teuchos::ptr_dynamic_cast;
808 using Teuchos::outArg;
813 mvSpmdMv->getLocalData(outArg(mvData), outArg(mvLeadingDim));
816 return rcpWithEmbeddedObj(
RCP< Epetra_MultiVector > get_Epetra_MultiVector(const Epetra_Map &map, const RCP< MultiVectorBase< double > > &mv)
Get a non-const Epetra_MultiVector view from a non-const MultiVectorBase object if possible...
const Epetra_BlockMap & Map() const
#define THYRA_ASSERT_VEC_SPACES(FUNC_NAME, VS1, VS2)
This is a very useful macro that should be used to validate that two vector spaces are compatible...
Create an explicit non-mutable (const) view of a MultiVectorBase object.
bool ConstantStride() const
bool is_null(const boost::shared_ptr< T > &p)
int ExtractView(double **V) const
bool DistributedGlobal() const
Base interface class for SPMD multi-vectors.
RCP< const Epetra_Map > get_Epetra_Map(const VectorSpaceBase< double > &vs, const RCP< const Epetra_Comm > &comm)
Get (or create) an Epetra_Map object given an VectorSpaceBase object an optionally an extra Epetra_Co...
RCP< const VectorSpaceBase< double > > create_VectorSpace(const RCP< const Epetra_Map > &epetra_map)
Create an VectorSpaceBase object given an Epetra_Map object.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
T_To & dyn_cast(T_From &from)
Create an explicit non-mutable (const) view of a VectorBase object.
TEUCHOSCORE_LIB_DLL_EXPORT std::string demangleName(const std::string &mangledName)
Abstract interface for objects that represent a space for vectors.
RCP< MultiVectorBase< double > > create_MultiVector(const RCP< Epetra_MultiVector > &epetra_mv, const RCP< const VectorSpaceBase< double > > &range, const RCP< const VectorSpaceBase< double > > &domain=Teuchos::null)
Create a non-const MultiVectorBase object from a non-const Epetra_MultiVector object.
RCP< VectorBase< double > > create_Vector(const RCP< Epetra_Vector > &epetra_v, const RCP< const VectorSpaceBase< double > > &space)
Create a non-const VectorBase object from a non-const Epetra_Vector object.
Create an explicit mutable (non-const) view of a MultiVectorBase object.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::Ordinal Ordinal
Type for the dimension of a vector space. `*.
Interface for a collection of column vectors called a multi-vector.
Create an explicit mutable (non-const) view of a VectorBase object.
int NumMyElements() const
RCP< Epetra_Vector > get_Epetra_Vector(const Epetra_Map &map, const RCP< VectorBase< double > > &v)
Get a non-const Epetra_Vector view from a non-const VectorBase object if possible.
Abstract interface for finite-dimensional dense vectors.
const Epetra_Comm & Comm() const
Efficient concrete implementation subclass for SPMD vectors.
RCP< const Epetra_Comm > get_Epetra_Comm(const Teuchos::Comm< Ordinal > &comm)
Get (or create) and Epetra_Comm given a Teuchos::Comm object.
virtual RCP< const VectorSpaceBase< Scalar > > domain() const =0
Return a smart pointer for the domain space for this operator.
bool nonnull(const boost::shared_ptr< T > &p)
void push_back(const value_type &x)
virtual Ordinal localOffset() const =0
Returns the offset for the local sub-vector stored on this process.
TypeTo as(const TypeFrom &t)
Efficient concrete implementation subclass for SPMD multi-vectors.
int ExtractView(double **A, int *MyLDA) const
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
const RCP< T > & assert_not_null() const
RCP< const VectorSpaceBase< double > > create_LocallyReplicatedVectorSpace(const RCP< const VectorSpaceBase< double > > &parentSpace, const int dim)
Create a VectorSpaceBase object that creates locally replicated vector objects.
RCP< const Teuchos::Comm< Ordinal > > create_Comm(const RCP< const Epetra_Comm > &epetraComm)
Given an Epetra_Comm object, return an equivalent Teuchos::Comm object.
Base abstract VectorSpaceBase class for all SPMD-based vector spaces.
virtual Ordinal dim() const =0
Return the dimension of the vector space.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
virtual Ordinal localSubDim() const =0
Returns the number of local elements stored on this process.