Teuchos::RCP<const Epetra_MultiVector> Thyra::get_Epetra_MultiVector( const Epetra_Map &map, const MultiVectorBase<double> &mv ) { using Teuchos::rcpWithEmbeddedObj; using Teuchos::rcpFromRef; using Teuchos::outArg; ArrayRCP<const double> mvData; Ordinal mvLeadingDim = -1; const SpmdMultiVectorBase<double> *mvSpmdMv = 0; const SpmdVectorBase<double> *mvSpmdV = 0; if ((mvSpmdMv = dynamic_cast<const SpmdMultiVectorBase<double>*>(&mv))) { mvSpmdMv->getLocalData(outArg(mvData), outArg(mvLeadingDim)); } else if ((mvSpmdV = dynamic_cast<const SpmdVectorBase<double>*>(&mv))) { mvSpmdV->getLocalData(outArg(mvData)); mvLeadingDim = mvSpmdV->spmdSpace()->localSubDim(); } if (nonnull(mvData)) { return rcpWithEmbeddedObj( new Epetra_MultiVector( ::View,map, const_cast<double*>(mvData.getRawPtr()), mvLeadingDim, mv.domain()->dim() ), mvData ); } return ::Thyra::get_Epetra_MultiVector(map, rcpFromRef(mv)); }