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" 75 Teuchos::RCP<const Thyra::VectorSpaceBase<double> >
76 unwrapSingleProductVectorSpace(
77 const Teuchos::RCP<
const Thyra::VectorSpaceBase<double> > &vs_in
81 using Teuchos::rcp_dynamic_cast;
82 using Thyra::ProductVectorSpaceBase;
83 const RCP<const ProductVectorSpaceBase<double> > pvs =
84 rcp_dynamic_cast<
const ProductVectorSpaceBase<double> >(vs_in);
86 TEUCHOS_ASSERT_EQUALITY( pvs->numBlocks(), 1 );
87 return pvs->getBlock(0);
101 Teuchos::RCP<const Teuchos::Comm<Thyra::Ordinal> >
105 using Teuchos::rcp_dynamic_cast;
106 using Teuchos::set_extra_data;
108 RCP<const Epetra_SerialComm>
109 serialEpetraComm = rcp_dynamic_cast<
const Epetra_SerialComm>(epetraComm);
110 if( serialEpetraComm.get() ) {
111 RCP<const Teuchos::SerialComm<Ordinal> >
112 serialComm = rcp(
new Teuchos::SerialComm<Ordinal>());
113 set_extra_data( serialEpetraComm,
"serialEpetraComm", Teuchos::inOutArg(serialComm) );
119 RCP<const Epetra_MpiComm>
120 mpiEpetraComm = rcp_dynamic_cast<
const Epetra_MpiComm>(epetraComm);
121 if( mpiEpetraComm.get() ) {
122 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> >
123 rawMpiComm = Teuchos::opaqueWrapper(mpiEpetraComm->Comm());
124 set_extra_data( mpiEpetraComm,
"mpiEpetraComm", Teuchos::inOutArg(rawMpiComm) );
125 RCP<const Teuchos::MpiComm<Ordinal> >
126 mpiComm = rcp(
new Teuchos::MpiComm<Ordinal>(rawMpiComm));
133 return Teuchos::null;
138 Teuchos::RCP<const Thyra::VectorSpaceBase<double> >
140 const RCP<const Epetra_Map> &epetra_map
143 using Teuchos::as;
using Teuchos::inoutArg;
146 TEUCHOS_TEST_FOR_EXCEPTION(
147 !epetra_map.get(), std::invalid_argument,
148 "create_VectorSpace::initialize(...): Error!" );
149 #endif // TEUCHOS_DEBUG 151 RCP<const Teuchos::Comm<Ordinal> > comm =
152 create_Comm(Teuchos::rcpFromRef(epetra_map->Comm())).assert_not_null();
154 Teuchos::set_extra_data(epetra_map,
"epetra_map", inoutArg(comm));
155 const Ordinal localSubDim = epetra_map->NumMyElements();
157 RCP<DefaultSpmdVectorSpace<double> > vs =
158 defaultSpmdVectorSpace<double>(
159 comm, localSubDim, epetra_map->NumGlobalElements64(),
160 !epetra_map->DistributedGlobal());
162 TEUCHOS_ASSERT_EQUALITY(vs->dim(), as<Ordinal>(epetra_map->NumGlobalElements64()));
170 Teuchos::set_extra_data( epetra_map,
"epetra_map", inoutArg(vs) );
176 Teuchos::RCP<const Thyra::VectorSpaceBase<double> >
178 const RCP<
const VectorSpaceBase<double> > &parentSpace,
182 using Teuchos::rcp_dynamic_cast;
184 TEUCHOS_TEST_FOR_EXCEPT(parentSpace.get()==NULL);
185 Teuchos::dyn_cast<
const SpmdVectorSpaceBase<double> >(*parentSpace);
186 TEUCHOS_TEST_FOR_EXCEPT(dim <= 0);
188 return parentSpace->smallVecSpcFcty()->createVecSpc(dim);
192 Teuchos::RCP<Thyra::VectorBase<double> >
194 const RCP<Epetra_Vector> &epetra_v,
195 const RCP<
const VectorSpaceBase<double> > &space_in
199 TEUCHOS_TEST_FOR_EXCEPT(space_in.get()==NULL);
201 RCP<const SpmdVectorSpaceBase<double> >
202 space = Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
209 return Teuchos::null;
212 epetra_v->ExtractView( &localValues );
214 RCP<SpmdVectorBase<double> >
216 new DefaultSpmdVector<double>(
218 Teuchos::arcp(localValues,0,epetra_v->Map().NumMyElements(),
false),
222 Teuchos::set_extra_data<RCP<Epetra_Vector> >( epetra_v,
"Epetra_Vector",
223 Teuchos::inOutArg(v) );
228 Teuchos::RCP<const Thyra::VectorBase<double> >
230 const RCP<const Epetra_Vector> &epetra_v,
231 const RCP<
const VectorSpaceBase<double> > &space_in
235 TEUCHOS_TEST_FOR_EXCEPT(space_in.get()==NULL);
237 RCP<const SpmdVectorSpaceBase<double> >
238 space = Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
245 return Teuchos::null;
248 epetra_v->ExtractView( &localValues );
250 RCP<const SpmdVectorBase<double> >
252 new DefaultSpmdVector<double>(
254 Teuchos::arcp(localValues,0,epetra_v->Map().NumMyElements(),
false),
258 Teuchos::set_extra_data<RCP<const Epetra_Vector> >( epetra_v,
"Epetra_Vector",
259 Teuchos::inOutArg(v) );
264 Teuchos::RCP<Thyra::MultiVectorBase<double> >
266 const RCP<Epetra_MultiVector> &epetra_mv,
267 const RCP<
const VectorSpaceBase<double> > &range_in,
268 const RCP<
const VectorSpaceBase<double> > &domain_in
271 using Teuchos::rcp_dynamic_cast;
273 TEUCHOS_TEST_FOR_EXCEPT(range_in.get()==NULL);
275 const RCP<const SpmdVectorSpaceBase<double> > range =
276 Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
277 unwrapSingleProductVectorSpace(range_in),
280 RCP<const ScalarProdVectorSpaceBase<double> > domain =
281 Teuchos::rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
282 unwrapSingleProductVectorSpace(domain_in),
289 if (!epetra_mv.get() )
290 return Teuchos::null;
291 if ( is_null(domain) ) {
292 domain = rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
297 double *localValues;
int leadingDim;
298 if( epetra_mv->ConstantStride() ) {
299 epetra_mv->ExtractView( &localValues, &leadingDim );
302 TEUCHOS_TEST_FOR_EXCEPT(
true);
305 RCP<SpmdMultiVectorBase<double> >
307 new DefaultSpmdMultiVector<double>(
310 Teuchos::arcp(localValues,0,leadingDim*epetra_mv->NumVectors(),
false),
314 Teuchos::set_extra_data<RCP<Epetra_MultiVector> >(
315 epetra_mv,
"Epetra_MultiVector", Teuchos::inOutArg(mv) );
320 Teuchos::RCP<const Thyra::MultiVectorBase<double> >
322 const RCP<const Epetra_MultiVector> &epetra_mv,
323 const RCP<
const VectorSpaceBase<double> > &range_in,
324 const RCP<
const VectorSpaceBase<double> > &domain_in
327 using Teuchos::rcp_dynamic_cast;
329 TEUCHOS_TEST_FOR_EXCEPT(range_in.get()==NULL);
331 const RCP<const SpmdVectorSpaceBase<double> > range =
332 Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
333 unwrapSingleProductVectorSpace(range_in),
336 RCP<const ScalarProdVectorSpaceBase<double> > domain =
337 Teuchos::rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
338 unwrapSingleProductVectorSpace(domain_in),
345 if (!epetra_mv.get())
346 return Teuchos::null;
347 if ( is_null(domain) ) {
348 domain = rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
353 double *localValues;
int leadingDim;
354 if( epetra_mv->ConstantStride() ) {
355 epetra_mv->ExtractView( &localValues, &leadingDim );
358 TEUCHOS_TEST_FOR_EXCEPT(
true);
361 RCP<const SpmdMultiVectorBase<double> >
363 new DefaultSpmdMultiVector<double>(
366 Teuchos::arcp(localValues,0,leadingDim*epetra_mv->NumVectors(),
false),
370 Teuchos::set_extra_data<RCP<const Epetra_MultiVector> >(
371 epetra_mv,
"Epetra_MultiVector", Teuchos::inOutArg(mv) );
376 Teuchos::RCP<const Epetra_Comm>
381 using Teuchos::ptrFromRef;
382 using Teuchos::ptr_dynamic_cast;
383 using Teuchos::SerialComm;
385 using Teuchos::MpiComm;
388 const Ptr<const Teuchos::Comm<Ordinal> > comm = Teuchos::ptrFromRef(comm_in);
390 const Ptr<const SerialComm<Ordinal> > serialComm =
391 ptr_dynamic_cast<
const SerialComm<Ordinal> >(comm);
393 RCP<const Epetra_Comm> epetraComm;
397 const Ptr<const MpiComm<Ordinal> > mpiComm =
398 ptr_dynamic_cast<
const MpiComm<Ordinal> >(comm);
400 TEUCHOS_TEST_FOR_EXCEPTION(is_null(mpiComm) && is_null(serialComm),
402 "SPMD std::vector space has a communicator that is " 403 "neither a serial comm nor an MPI comm");
405 if (nonnull(mpiComm)) {
406 epetraComm = rcp(
new Epetra_MpiComm(*mpiComm->getRawMpiComm()()));
409 epetraComm = rcp(
new Epetra_SerialComm());
414 TEUCHOS_TEST_FOR_EXCEPTION(is_null(serialComm), std::runtime_error,
415 "SPMD std::vector space has a communicator that is " 416 "neither a serial comm nor an MPI comm");
418 epetraComm = rcp(
new Epetra_SerialComm());
422 TEUCHOS_TEST_FOR_EXCEPTION(is_null(epetraComm), std::runtime_error,
423 "null communicator created");
430 Teuchos::RCP<const Epetra_Map>
432 const VectorSpaceBase<double>& vs_in,
433 const RCP<const Epetra_Comm>& comm)
436 using Teuchos::rcpFromRef;
437 using Teuchos::rcpFromPtr;
438 using Teuchos::rcp_dynamic_cast;
439 using Teuchos::ptrFromRef;
440 using Teuchos::ptr_dynamic_cast;
442 const Ptr<const VectorSpaceBase<double> > vs_ptr = ptrFromRef(vs_in);
444 const Ptr<const SpmdVectorSpaceBase<double> > spmd_vs =
445 ptr_dynamic_cast<
const SpmdVectorSpaceBase<double> >(vs_ptr);
447 const Ptr<const ProductVectorSpaceBase<double> > &prod_vs =
448 ptr_dynamic_cast<
const ProductVectorSpaceBase<double> >(vs_ptr);
450 TEUCHOS_TEST_FOR_EXCEPTION( is_null(spmd_vs) && is_null(prod_vs), std::logic_error,
451 "Error, the concrete VectorSpaceBase object of type " 452 +Teuchos::demangleName(
typeid(vs_in).name())+
" does not support the" 453 " SpmdVectorSpaceBase or the ProductVectorSpaceBase interfaces!" );
455 const int numBlocks = (nonnull(prod_vs) ? prod_vs->numBlocks() : 1);
459 Array<RCP<const SpmdVectorSpaceBase<double> > > spmd_vs_blocks;
460 if (nonnull(prod_vs)) {
461 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
462 const RCP<const SpmdVectorSpaceBase<double> > spmd_vs_i =
463 rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
464 prod_vs->getBlock(block_i),
true);
465 spmd_vs_blocks.push_back(spmd_vs_i);
469 spmd_vs_blocks.push_back(rcpFromPtr(spmd_vs));
474 int myLocalElements = 0;
475 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
476 myLocalElements += spmd_vs_blocks[block_i]->localSubDim();
483 Array<int> myGIDs(myLocalElements);
484 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
485 const RCP<const SpmdVectorSpaceBase<double> > spmd_vs_i = spmd_vs_blocks[block_i];
486 const int lowGIDInBlock = spmd_vs_i->localOffset();
487 const int numLocalElementsInBlock = spmd_vs_i->localSubDim();
488 for (
int i=0; i < numLocalElementsInBlock; ++i, ++count) {
489 myGIDs[count] = blockOffset + lowGIDInBlock + i;
491 blockOffset += spmd_vs_i->dim();
494 const int globalDim = vs_in.dim();
497 new Epetra_Map(globalDim, myLocalElements, myGIDs.getRawPtr(), 0, *comm));
503 Teuchos::RCP<const Epetra_Map>
505 const RCP<
const VectorSpaceBase<double>>& vs,
506 const RCP<const Epetra_Comm>& comm)
512 const Ptr<const RCP<const Epetra_Map> >
513 epetra_map_ptr = Teuchos::get_optional_extra_data<RCP<const Epetra_Map> >(
517 if(!is_null(epetra_map_ptr)) {
518 return *epetra_map_ptr;
522 TEUCHOS_TEST_FOR_EXCEPTION(comm.is_null(), std::runtime_error,
523 "Error! No RCP Epetra_Map attached to the input vector space RCP, " 524 "and the input comm RCP is null.\n");
529 Teuchos::RCP<Epetra_Vector>
531 const Epetra_Map &map,
532 const RCP<VectorBase<double> > &v
535 using Teuchos::get_optional_extra_data;
537 RCP<const VectorSpaceBase<double> >
539 THYRA_ASSERT_VEC_SPACES(
540 "Thyra::get_Epetra_Vector(map,v)", *epetra_vs, *v->space() );
546 const Ptr<const RCP<Epetra_Vector> >
547 epetra_v_ptr = get_optional_extra_data<RCP<Epetra_Vector> >(
551 if(!is_null(epetra_v_ptr)) {
552 return *epetra_v_ptr;
560 const VectorSpaceBase<double> &vs = *v->range();
561 const SpmdVectorSpaceBase<double> *mpi_vs
562 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
563 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
564 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
578 RCP<DetachedVectorView<double> >
580 new DetachedVectorView<double>(
582 ,Range1D(localOffset,localOffset+localSubDim-1)
589 epetra_v = Teuchos::rcp(
593 ,const_cast<double*>(emvv->values())
601 Teuchos::set_extra_data( emvv,
"emvv", Teuchos::inOutArg(epetra_v),
602 Teuchos::PRE_DESTROY );
609 Teuchos::RCP<Epetra_Vector>
611 const RCP<VectorBase<double> > &v,
612 const RCP<const Epetra_Map>& map
619 const Ptr<const RCP<Epetra_Vector> >
620 epetra_v_ptr = Teuchos::get_optional_extra_data<RCP<Epetra_Vector> >(
624 if(!is_null(epetra_v_ptr)) {
625 return *epetra_v_ptr;
629 TEUCHOS_TEST_FOR_EXCEPTION(map.is_null(), std::runtime_error,
630 "Error! No RCP Epetra_Vector attached to the input vector RCP, " 631 "and the input map RCP is null.\n");
636 Teuchos::RCP<const Epetra_Vector>
638 const Epetra_Map &map,
639 const RCP<
const VectorBase<double> > &v
642 using Teuchos::get_optional_extra_data;
644 RCP<const VectorSpaceBase<double> >
646 THYRA_ASSERT_VEC_SPACES(
647 "Thyra::get_Epetra_Vector(map,v)", *epetra_vs, *v->space() );
653 const Ptr<const RCP<const Epetra_Vector> >
654 epetra_v_ptr = get_optional_extra_data<RCP<const Epetra_Vector> >(
658 if(!is_null(epetra_v_ptr))
659 return *epetra_v_ptr;
660 const Ptr<const RCP<Epetra_Vector> >
661 epetra_nonconst_v_ptr = get_optional_extra_data<RCP<Epetra_Vector> >(
665 if(!is_null(epetra_nonconst_v_ptr))
666 return *epetra_nonconst_v_ptr;
670 const VectorSpaceBase<double> &vs = *v->range();
671 const SpmdVectorSpaceBase<double> *mpi_vs
672 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
673 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
674 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
677 RCP<ConstDetachedVectorView<double> >
679 new ConstDetachedVectorView<double>(
681 ,Range1D(localOffset,localOffset+localSubDim-1)
688 epetra_v = Teuchos::rcp(
692 ,const_cast<double*>(evv->values())
700 Teuchos::set_extra_data( evv,
"evv", Teuchos::inOutArg(epetra_v),
701 Teuchos::PRE_DESTROY );
708 Teuchos::RCP<const Epetra_Vector>
710 const RCP<
const VectorBase<double> > &v,
711 const RCP<const Epetra_Map>& map
718 const Ptr<const RCP<const Epetra_Vector> >
719 epetra_v_ptr = Teuchos::get_optional_extra_data<RCP<const Epetra_Vector> >(
723 if(!is_null(epetra_v_ptr)) {
724 return *epetra_v_ptr;
728 TEUCHOS_TEST_FOR_EXCEPTION(map.is_null(), std::runtime_error,
729 "Error! No RCP to Epetra_Vector attached to the input vector RCP, " 730 "and the input map RCP is null.\n");
735 Teuchos::RCP<Epetra_MultiVector>
737 const Epetra_Map &map,
738 const RCP<MultiVectorBase<double> > &mv
741 using Teuchos::get_optional_extra_data;
743 RCP<const VectorSpaceBase<double> >
745 THYRA_ASSERT_VEC_SPACES(
746 "Thyra::get_Epetra_MultiVector(map,mv)", *epetra_vs, *mv->range() );
752 const Ptr<const RCP<Epetra_MultiVector> >
753 epetra_mv_ptr = get_optional_extra_data<RCP<Epetra_MultiVector> >(
754 mv,
"Epetra_MultiVector");
757 if(!is_null(epetra_mv_ptr)) {
758 return *epetra_mv_ptr;
766 const VectorSpaceBase<double> &vs = *mv->range();
767 const SpmdVectorSpaceBase<double> *mpi_vs
768 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
769 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
770 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
781 RCP<DetachedMultiVectorView<double> >
782 emmvv = Teuchos::rcp(
783 new DetachedMultiVectorView<double>(
785 ,Range1D(localOffset,localOffset+localSubDim-1)
790 RCP<Epetra_MultiVector>
791 epetra_mv = Teuchos::rcp(
792 new Epetra_MultiVector(
795 ,const_cast<double*>(emmvv->values())
806 Teuchos::set_extra_data( emmvv,
"emmvv", Teuchos::inOutArg(epetra_mv),
807 Teuchos::PRE_DESTROY );
809 Teuchos::set_extra_data( mv,
"mv", Teuchos::inOutArg(epetra_mv) );
816 Teuchos::RCP<Epetra_MultiVector>
818 const RCP<MultiVectorBase<double> > &mv,
819 const RCP<const Epetra_Map>& map
826 const Ptr<const RCP<Epetra_MultiVector> >
827 epetra_mv_ptr = Teuchos::get_optional_extra_data<RCP<Epetra_MultiVector> >(
828 mv,
"Epetra_MultiVector");
831 if(!is_null(epetra_mv_ptr)) {
832 return *epetra_mv_ptr;
836 TEUCHOS_TEST_FOR_EXCEPTION(map.is_null(), std::runtime_error,
837 "Error! No RCP to Epetra_MultiVector attached to the input vector RCP, " 838 "and the input map RCP is null.\n");
843 Teuchos::RCP<const Epetra_MultiVector>
845 const Epetra_Map &map,
846 const RCP<
const MultiVectorBase<double> > &mv
849 using Teuchos::get_optional_extra_data;
852 RCP<const VectorSpaceBase<double> >
855 THYRA_ASSERT_VEC_SPACES(
856 "Thyra::get_Epetra_MultiVector(map,mv)",
857 *epetra_vs, *mv->range() );
864 const Ptr<const RCP<const Epetra_MultiVector> >
866 = get_optional_extra_data<RCP<const Epetra_MultiVector> >(
867 mv,
"Epetra_MultiVector" );
870 if(!is_null(epetra_mv_ptr)) {
871 return *epetra_mv_ptr;
877 const VectorSpaceBase<double> &vs = *mv->range();
878 const SpmdVectorSpaceBase<double> *mpi_vs
879 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
880 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
881 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
884 RCP<ConstDetachedMultiVectorView<double> >
886 new ConstDetachedMultiVectorView<double>(
888 ,Range1D(localOffset,localOffset+localSubDim-1)
894 RCP<Epetra_MultiVector>
895 epetra_mv = Teuchos::rcp(
896 new Epetra_MultiVector(
899 ,const_cast<double*>(emvv->values())
910 Teuchos::set_extra_data( emvv,
"emvv", Teuchos::inOutArg(epetra_mv),
911 Teuchos::PRE_DESTROY );
913 Teuchos::set_extra_data( mv,
"mv", Teuchos::inOutArg(epetra_mv) );
921 Teuchos::RCP<const Epetra_MultiVector>
923 const RCP<
const MultiVectorBase<double> > &mv,
924 const RCP<const Epetra_Map>& map
931 const Ptr<const RCP<const Epetra_MultiVector> >
932 epetra_mv_ptr = Teuchos::get_optional_extra_data<RCP<const Epetra_MultiVector> >(
933 mv,
"Epetra_MultiVector");
936 if(!is_null(epetra_mv_ptr)) {
937 return *epetra_mv_ptr;
941 TEUCHOS_TEST_FOR_EXCEPTION(map.is_null(), std::runtime_error,
942 "Error! No RCP to Epetra_MultiVector attached to the input vector RCP, " 943 "and the input map RCP is null.\n");
948 Teuchos::RCP<Epetra_MultiVector>
950 const Epetra_Map &map,
951 MultiVectorBase<double> &mv
954 using Teuchos::rcpWithEmbeddedObj;
955 using Teuchos::ptrFromRef;
956 using Teuchos::ptr_dynamic_cast;
957 using Teuchos::outArg;
959 Ptr<SpmdMultiVectorBase<double> > mvSpmdMv =
960 ptr_dynamic_cast<SpmdMultiVectorBase<double> >(ptrFromRef(mv));
962 ArrayRCP<double> mvData;
963 Ordinal mvLeadingDim = 0;
964 if (nonnull(mvSpmdMv)) {
965 mvSpmdMv->getNonconstLocalData(outArg(mvData), outArg(mvLeadingDim));
968 return rcpWithEmbeddedObj(
969 new Epetra_MultiVector(
970 ::View, map, mvData.getRawPtr(), mvLeadingDim, mv.domain()->dim()
977 Teuchos::RCP<const Epetra_MultiVector>
979 const Epetra_Map &map,
980 const MultiVectorBase<double> &mv
983 using Teuchos::rcpWithEmbeddedObj;
984 using Teuchos::ptrFromRef;
985 using Teuchos::ptr_dynamic_cast;
986 using Teuchos::outArg;
988 Ptr<const SpmdMultiVectorBase<double> > mvSpmdMv =
989 ptr_dynamic_cast<
const SpmdMultiVectorBase<double> >(ptrFromRef(mv));
991 ArrayRCP<const double> mvData;
992 Ordinal mvLeadingDim = 0;
993 if (nonnull(mvSpmdMv)) {
994 mvSpmdMv->getLocalData(outArg(mvData), outArg(mvLeadingDim));
997 return rcpWithEmbeddedObj(
998 new Epetra_MultiVector(
999 ::View, map, const_cast<double*>(mvData.getRawPtr()), mvLeadingDim, mv.domain()->dim()
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...
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.
RCP< MultiVectorBase< double > > create_MultiVector(const RCP< Epetra_MultiVector > &epetra_mv, const RCP< const VectorSpaceBase< double > > &range=Teuchos::null, 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=Teuchos::null)
Create a non-const VectorBase object from a non-const Epetra_Vector object.
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.
RCP< const Epetra_Comm > get_Epetra_Comm(const Teuchos::Comm< Ordinal > &comm)
Get (or create) and Epetra_Comm given a Teuchos::Comm object.
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.