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;
145 TEUCHOS_TEST_FOR_EXCEPTION(
146 !epetra_map.get(), std::invalid_argument,
147 "create_VectorSpace::initialize(...): Error!" );
148 #endif // TEUCHOS_DEBUG 149 RCP<const Teuchos::Comm<Ordinal> > comm =
150 create_Comm(Teuchos::rcpFromRef(epetra_map->Comm())).assert_not_null();
151 Teuchos::set_extra_data(epetra_map,
"epetra_map", inoutArg(comm));
152 const Ordinal localSubDim = epetra_map->NumMyElements();
153 RCP<DefaultSpmdVectorSpace<double> > vs =
154 defaultSpmdVectorSpace<double>(
155 comm, localSubDim, epetra_map->NumGlobalElements64(),
156 !epetra_map->DistributedGlobal());
157 TEUCHOS_ASSERT_EQUALITY(vs->dim(), as<Ordinal>(epetra_map->NumGlobalElements64()));
165 Teuchos::set_extra_data( epetra_map,
"epetra_map", inoutArg(vs) );
170 Teuchos::RCP<const Thyra::VectorSpaceBase<double> >
172 const RCP<
const VectorSpaceBase<double> > &parentSpace,
176 using Teuchos::rcp_dynamic_cast;
178 TEUCHOS_TEST_FOR_EXCEPT(parentSpace.get()==NULL);
179 Teuchos::dyn_cast<
const SpmdVectorSpaceBase<double> >(*parentSpace);
180 TEUCHOS_TEST_FOR_EXCEPT(dim <= 0);
182 return parentSpace->smallVecSpcFcty()->createVecSpc(dim);
186 Teuchos::RCP<Thyra::VectorBase<double> >
188 const RCP<Epetra_Vector> &epetra_v,
189 const RCP<
const VectorSpaceBase<double> > &space_in
193 TEUCHOS_TEST_FOR_EXCEPT(space_in.get()==NULL);
195 RCP<const SpmdVectorSpaceBase<double> >
196 space = Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
199 return Teuchos::null;
202 epetra_v->ExtractView( &localValues );
204 RCP<SpmdVectorBase<double> >
206 new DefaultSpmdVector<double>(
208 Teuchos::arcp(localValues,0,epetra_v->Map().NumMyElements(),
false),
212 Teuchos::set_extra_data<RCP<Epetra_Vector> >( epetra_v,
"Epetra_Vector",
213 Teuchos::inOutArg(v) );
218 Teuchos::RCP<const Thyra::VectorBase<double> >
220 const RCP<const Epetra_Vector> &epetra_v,
221 const RCP<
const VectorSpaceBase<double> > &space_in
225 TEUCHOS_TEST_FOR_EXCEPT(space_in.get()==NULL);
227 RCP<const SpmdVectorSpaceBase<double> >
228 space = Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
231 return Teuchos::null;
234 epetra_v->ExtractView( &localValues );
236 RCP<const SpmdVectorBase<double> >
238 new DefaultSpmdVector<double>(
240 Teuchos::arcp(localValues,0,epetra_v->Map().NumMyElements(),
false),
244 Teuchos::set_extra_data<RCP<const Epetra_Vector> >( epetra_v,
"Epetra_Vector",
245 Teuchos::inOutArg(v) );
250 Teuchos::RCP<Thyra::MultiVectorBase<double> >
252 const RCP<Epetra_MultiVector> &epetra_mv,
253 const RCP<
const VectorSpaceBase<double> > &range_in,
254 const RCP<
const VectorSpaceBase<double> > &domain_in
257 using Teuchos::rcp_dynamic_cast;
259 TEUCHOS_TEST_FOR_EXCEPT(range_in.get()==NULL);
261 const RCP<const SpmdVectorSpaceBase<double> > range =
262 Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
263 unwrapSingleProductVectorSpace(range_in),
266 RCP<const ScalarProdVectorSpaceBase<double> > domain =
267 Teuchos::rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
268 unwrapSingleProductVectorSpace(domain_in),
271 if (!epetra_mv.get() )
272 return Teuchos::null;
273 if ( is_null(domain) ) {
274 domain = rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
279 double *localValues;
int leadingDim;
280 if( epetra_mv->ConstantStride() ) {
281 epetra_mv->ExtractView( &localValues, &leadingDim );
284 TEUCHOS_TEST_FOR_EXCEPT(
true);
287 RCP<SpmdMultiVectorBase<double> >
289 new DefaultSpmdMultiVector<double>(
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) );
302 Teuchos::RCP<const Thyra::MultiVectorBase<double> >
304 const RCP<const Epetra_MultiVector> &epetra_mv,
305 const RCP<
const VectorSpaceBase<double> > &range_in,
306 const RCP<
const VectorSpaceBase<double> > &domain_in
309 using Teuchos::rcp_dynamic_cast;
311 TEUCHOS_TEST_FOR_EXCEPT(range_in.get()==NULL);
313 const RCP<const SpmdVectorSpaceBase<double> > range =
314 Teuchos::rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
315 unwrapSingleProductVectorSpace(range_in),
318 RCP<const ScalarProdVectorSpaceBase<double> > domain =
319 Teuchos::rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
320 unwrapSingleProductVectorSpace(domain_in),
323 if (!epetra_mv.get())
324 return Teuchos::null;
325 if ( is_null(domain) ) {
326 domain = rcp_dynamic_cast<
const ScalarProdVectorSpaceBase<double> >(
331 double *localValues;
int leadingDim;
332 if( epetra_mv->ConstantStride() ) {
333 epetra_mv->ExtractView( &localValues, &leadingDim );
336 TEUCHOS_TEST_FOR_EXCEPT(
true);
339 RCP<const SpmdMultiVectorBase<double> >
341 new DefaultSpmdMultiVector<double>(
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) );
354 Teuchos::RCP<const Epetra_Comm>
359 using Teuchos::ptrFromRef;
360 using Teuchos::ptr_dynamic_cast;
361 using Teuchos::SerialComm;
363 using Teuchos::MpiComm;
366 const Ptr<const Teuchos::Comm<Ordinal> > comm = Teuchos::ptrFromRef(comm_in);
368 const Ptr<const SerialComm<Ordinal> > serialComm =
369 ptr_dynamic_cast<
const SerialComm<Ordinal> >(comm);
371 RCP<const Epetra_Comm> epetraComm;
375 const Ptr<const MpiComm<Ordinal> > mpiComm =
376 ptr_dynamic_cast<
const MpiComm<Ordinal> >(comm);
378 TEUCHOS_TEST_FOR_EXCEPTION(is_null(mpiComm) && is_null(serialComm),
380 "SPMD std::vector space has a communicator that is " 381 "neither a serial comm nor an MPI comm");
383 if (nonnull(mpiComm)) {
384 epetraComm = rcp(
new Epetra_MpiComm(*mpiComm->getRawMpiComm()()));
387 epetraComm = rcp(
new Epetra_SerialComm());
392 TEUCHOS_TEST_FOR_EXCEPTION(is_null(serialComm), std::runtime_error,
393 "SPMD std::vector space has a communicator that is " 394 "neither a serial comm nor an MPI comm");
396 epetraComm = rcp(
new Epetra_SerialComm());
400 TEUCHOS_TEST_FOR_EXCEPTION(is_null(epetraComm), std::runtime_error,
401 "null communicator created");
408 Teuchos::RCP<const Epetra_Map>
410 const RCP<const Epetra_Comm>& comm)
413 using Teuchos::rcpFromRef;
414 using Teuchos::rcpFromPtr;
415 using Teuchos::rcp_dynamic_cast;
416 using Teuchos::ptrFromRef;
417 using Teuchos::ptr_dynamic_cast;
419 const Ptr<const VectorSpaceBase<double> > vs_ptr = ptrFromRef(vs_in);
421 const Ptr<const SpmdVectorSpaceBase<double> > spmd_vs =
422 ptr_dynamic_cast<
const SpmdVectorSpaceBase<double> >(vs_ptr);
424 const Ptr<const ProductVectorSpaceBase<double> > &prod_vs =
425 ptr_dynamic_cast<
const ProductVectorSpaceBase<double> >(vs_ptr);
427 TEUCHOS_TEST_FOR_EXCEPTION( is_null(spmd_vs) && is_null(prod_vs), std::logic_error,
428 "Error, the concrete VectorSpaceBase object of type " 429 +Teuchos::demangleName(
typeid(vs_in).name())+
" does not support the" 430 " SpmdVectorSpaceBase or the ProductVectorSpaceBase interfaces!" );
432 const int numBlocks = (nonnull(prod_vs) ? prod_vs->numBlocks() : 1);
436 Array<RCP<const SpmdVectorSpaceBase<double> > > spmd_vs_blocks;
437 if (nonnull(prod_vs)) {
438 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
439 const RCP<const SpmdVectorSpaceBase<double> > spmd_vs_i =
440 rcp_dynamic_cast<
const SpmdVectorSpaceBase<double> >(
441 prod_vs->getBlock(block_i),
true);
442 spmd_vs_blocks.push_back(spmd_vs_i);
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();
460 Array<int> myGIDs(myLocalElements);
461 for (
int block_i = 0; block_i < numBlocks; ++block_i) {
462 const RCP<const SpmdVectorSpaceBase<double> > spmd_vs_i = spmd_vs_blocks[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();
474 new Epetra_Map(globalDim, myLocalElements, myGIDs.getRawPtr(), 0, *comm));
479 Teuchos::RCP<Epetra_Vector>
481 const Epetra_Map &map,
482 const RCP<VectorBase<double> > &v
485 using Teuchos::get_optional_extra_data;
487 RCP<const VectorSpaceBase<double> >
489 THYRA_ASSERT_VEC_SPACES(
490 "Thyra::get_Epetra_Vector(map,v)", *epetra_vs, *v->space() );
496 const Ptr<const RCP<Epetra_Vector> >
497 epetra_v_ptr = get_optional_extra_data<RCP<Epetra_Vector> >(
499 if(!is_null(epetra_v_ptr)) {
500 return *epetra_v_ptr;
508 const VectorSpaceBase<double> &vs = *v->range();
509 const SpmdVectorSpaceBase<double> *mpi_vs
510 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
511 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
512 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
526 RCP<DetachedVectorView<double> >
528 new DetachedVectorView<double>(
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 );
556 Teuchos::RCP<const Epetra_Vector>
558 const Epetra_Map &map,
559 const RCP<
const VectorBase<double> > &v
562 using Teuchos::get_optional_extra_data;
564 RCP<const VectorSpaceBase<double> >
566 THYRA_ASSERT_VEC_SPACES(
567 "Thyra::get_Epetra_Vector(map,v)", *epetra_vs, *v->space() );
573 const Ptr<const RCP<const Epetra_Vector> >
574 epetra_v_ptr = get_optional_extra_data<RCP<const Epetra_Vector> >(
576 if(!is_null(epetra_v_ptr))
577 return *epetra_v_ptr;
578 const Ptr<const RCP<Epetra_Vector> >
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;
586 const VectorSpaceBase<double> &vs = *v->range();
587 const SpmdVectorSpaceBase<double> *mpi_vs
588 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
589 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
590 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
593 RCP<ConstDetachedVectorView<double> >
595 new ConstDetachedVectorView<double>(
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 );
623 Teuchos::RCP<Epetra_MultiVector>
625 const Epetra_Map &map,
626 const RCP<MultiVectorBase<double> > &mv
629 using Teuchos::get_optional_extra_data;
631 RCP<const VectorSpaceBase<double> >
633 THYRA_ASSERT_VEC_SPACES(
634 "Thyra::get_Epetra_MultiVector(map,mv)", *epetra_vs, *mv->range() );
640 const Ptr<const RCP<Epetra_MultiVector> >
641 epetra_mv_ptr = get_optional_extra_data<RCP<Epetra_MultiVector> >(
642 mv,
"Epetra_MultiVector");
643 if(!is_null(epetra_mv_ptr)) {
644 return *epetra_mv_ptr;
652 const VectorSpaceBase<double> &vs = *mv->range();
653 const SpmdVectorSpaceBase<double> *mpi_vs
654 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
655 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
656 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
667 RCP<DetachedMultiVectorView<double> >
668 emmvv = Teuchos::rcp(
669 new DetachedMultiVectorView<double>(
671 ,Range1D(localOffset,localOffset+localSubDim-1)
676 RCP<Epetra_MultiVector>
677 epetra_mv = Teuchos::rcp(
678 new Epetra_MultiVector(
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) );
701 Teuchos::RCP<const Epetra_MultiVector>
703 const Epetra_Map &map,
704 const RCP<
const MultiVectorBase<double> > &mv
707 using Teuchos::get_optional_extra_data;
709 RCP<const VectorSpaceBase<double> >
711 THYRA_ASSERT_VEC_SPACES(
712 "Thyra::get_Epetra_MultiVector(map,mv)",
713 *epetra_vs, *mv->range() );
719 const Ptr<const RCP<const Epetra_MultiVector> >
721 = get_optional_extra_data<RCP<const Epetra_MultiVector> >(
722 mv,
"Epetra_MultiVector" );
723 if(!is_null(epetra_mv_ptr)) {
724 return *epetra_mv_ptr;
729 const VectorSpaceBase<double> &vs = *mv->range();
730 const SpmdVectorSpaceBase<double> *mpi_vs
731 =
dynamic_cast<const SpmdVectorSpaceBase<double>*
>(&vs);
732 const Ordinal localOffset = ( mpi_vs ? mpi_vs->localOffset() : 0 );
733 const Ordinal localSubDim = ( mpi_vs ? mpi_vs->localSubDim() : vs.dim() );
736 RCP<ConstDetachedMultiVectorView<double> >
738 new ConstDetachedMultiVectorView<double>(
740 ,Range1D(localOffset,localOffset+localSubDim-1)
745 RCP<Epetra_MultiVector>
746 epetra_mv = Teuchos::rcp(
747 new Epetra_MultiVector(
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) );
769 Teuchos::RCP<Epetra_MultiVector>
771 const Epetra_Map &map,
772 MultiVectorBase<double> &mv
775 using Teuchos::rcpWithEmbeddedObj;
776 using Teuchos::rcpFromRef;
777 using Teuchos::ptrFromRef;
778 using Teuchos::ptr_dynamic_cast;
779 using Teuchos::outArg;
780 ArrayRCP<double> mvData;
782 Ptr<SpmdMultiVectorBase<double> > mvSpmdMv;
783 if (nonnull(mvSpmdMv = ptr_dynamic_cast<SpmdMultiVectorBase<double> >(ptrFromRef(mv)))) {
784 mvSpmdMv->getNonconstLocalData(outArg(mvData), outArg(mvLeadingDim));
786 if (nonnull(mvData)) {
787 return rcpWithEmbeddedObj(
788 new Epetra_MultiVector(
789 ::View, map, mvData.getRawPtr(), mvLeadingDim, mv.domain()->dim()
798 Teuchos::RCP<const Epetra_MultiVector>
800 const Epetra_Map &map,
801 const MultiVectorBase<double> &mv
804 using Teuchos::rcpWithEmbeddedObj;
805 using Teuchos::rcpFromRef;
806 using Teuchos::ptrFromRef;
807 using Teuchos::ptr_dynamic_cast;
808 using Teuchos::outArg;
809 ArrayRCP<const double> mvData;
811 Ptr<const SpmdMultiVectorBase<double> > mvSpmdMv;
812 if (nonnull(mvSpmdMv = ptr_dynamic_cast<
const SpmdMultiVectorBase<double> >(ptrFromRef(mv)))) {
813 mvSpmdMv->getLocalData(outArg(mvData), outArg(mvLeadingDim));
815 if (nonnull(mvData)) {
816 return rcpWithEmbeddedObj(
817 new Epetra_MultiVector(
818 ::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, 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.
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.