// -- FACTORY METHODS -- static Epetra_Map epetraMap( DataMap const& dmap ) { std::vector<int> e( dmap.nMyElements() ); std::copy( dmap.myGlobalElements().begin(), dmap.myGlobalElements().end(), e.begin() ); return Epetra_Map( -1, dmap.nMyElements(), e.data(), 0, Epetra_MpiComm( dmap.comm() ) ); }
static Epetra_Map epetraMapStatic( DataMap const& dmap ) { return Epetra_Map( dmap.nGlobalElements(), dmap.nMyElements(), 0, Epetra_MpiComm( dmap.comm() ) ); }
Epetra_Map StkNodalBasisSource::atomMap() const { return Epetra_Map(*disc_->getNodeMap()); }
CrsMatrix_SubCopy::NewTypeRef CrsMatrix_SubCopy:: operator()( OriginalTypeRef orig ) { origObj_ = &orig; //Error, must be local indices assert( orig.Filled() ); //test maps, new map must be subset of old const Epetra_Map & oRowMap = orig.RowMap(); const Epetra_Map & oColMap = orig.ColMap(); int oNumRows = oRowMap.NumMyElements(); (void) oNumRows; // Silence "unused variable" compiler warning. int oNumCols = oColMap.NumMyElements(); int nNumRows = newRowMap_.NumMyElements(); int nNumDomain = newDomainMap_.NumMyElements(); bool matched = true; // Make sure all rows in newRowMap are already on this processor for( int i = 0; i < nNumRows; ++i ) matched = matched && ( oRowMap.MyGID(newRowMap_.GID(i)) ); if( !matched ) std::cerr << "EDT_CrsMatrix_SubCopy: Bad new_row_Map. GIDs of new row map must be GIDs of the original row map on the same processor.\n"; // Make sure all GIDs in the new domain map are GIDs in the old domain map if( !newRangeMap_.SameAs(newDomainMap_) ) { Epetra_IntSerialDenseVector pidList(nNumDomain); oColMap.RemoteIDList(newDomainMap_.NumMyElements(), newDomainMap_.MyGlobalElements(), pidList.Values(), 0); for( int i = 0; i < nNumDomain; ++i ) matched = matched && ( pidList[i]>=0 ); } if( !matched ) std::cout << "EDT_CrsMatrix_SubCopy: Bad newDomainMap. One or more GIDs in new domain map are not part of original domain map.\n"; assert( matched ); // Next build new column map Epetra_IntSerialDenseVector pidList(oNumCols); Epetra_IntSerialDenseVector lidList(oNumCols); Epetra_IntSerialDenseVector sizeList(oNumCols); newDomainMap_.RemoteIDList(oColMap.NumMyElements(), oColMap.MyGlobalElements(), pidList.Values(), 0); int numNewCols = 0; Epetra_IntSerialDenseVector newColMapGidList(oNumCols); int * origColGidList = oColMap.MyGlobalElements(); for( int i = 0; i < oNumCols; ++i ) if (pidList[i] >=0) newColMapGidList[numNewCols++]= origColGidList[i]; newColMap_ = Epetra_Map(-1, numNewCols, newColMapGidList.Values(), 0, oColMap.Comm()); importer_ = new Epetra_Import(newRowMap_, oRowMap); Epetra_CrsMatrix * newMatrix = new Epetra_CrsMatrix(Copy, newRowMap_, newColMap_, 0); newObj_ = newMatrix; newObj_->Import(*origObj_, *importer_, Add); newObj_->FillComplete(); return *newObj_; }
TEUCHOS_UNIT_TEST_TEMPLATE_4_DECL( ThyraBlockedOperator, XpetraBlockedCrsMatConstructor, Scalar, LO, GO, Node ) { #ifdef HAVE_XPETRA_THYRA #ifdef HAVE_XPETRA_EPETRAEXT Teuchos::RCP<const Teuchos::Comm<int> > comm = Teuchos::DefaultComm<int>::getComm(); const Teuchos::RCP<const Epetra_Comm> epComm = Xpetra::toEpetra(comm); // 1) load all matrices Epetra_Map pointmap(36,0,*epComm); // generate local maps for loading matrices std::vector<int> velgidvec; // global strided maps std::vector<int> pregidvec; std::vector<int> fullgidvec; // full global map for (int i=0; i<pointmap.NumMyElements(); i++) { // loop over all local ids in pointmap // get corresponding global id int gid = pointmap.GID(i); // store global strided gids velgidvec.push_back(3*gid); velgidvec.push_back(3*gid+1); pregidvec.push_back(3*gid+2); // gid for full map fullgidvec.push_back(3*gid); fullgidvec.push_back(3*gid+1); fullgidvec.push_back(3*gid+2); } // generate strided maps Teuchos::RCP<const Epetra_Map> velmap = Teuchos::rcp(new const Epetra_Map(-1, velgidvec.size(), &velgidvec[0], 0, *epComm)); Teuchos::RCP<const Epetra_Map> premap = Teuchos::rcp(new const Epetra_Map(-1, pregidvec.size(), &pregidvec[0], 0, *epComm)); // generate full map const Teuchos::RCP<const Epetra_Map> fullmap = Teuchos::rcp(new const Epetra_Map(-1, fullgidvec.size(), &fullgidvec[0], 0, *epComm)); // read in matrices Epetra_CrsMatrix* ptrA = 0; EpetraExt::MatrixMarketFileToCrsMatrix("A.mat",*fullmap,*fullmap,*fullmap,ptrA); Teuchos::RCP<Epetra_CrsMatrix> fullA = Teuchos::rcp(ptrA); Teuchos::RCP<Epetra_Vector> x = Teuchos::rcp(new Epetra_Vector(*fullmap)); x->PutScalar(1.0); // split fullA into A11,..., A22 Teuchos::RCP<Epetra_CrsMatrix> A11; Teuchos::RCP<Epetra_CrsMatrix> A12; Teuchos::RCP<Epetra_CrsMatrix> A21; Teuchos::RCP<Epetra_CrsMatrix> A22; TEST_EQUALITY(SplitMatrix2x2(fullA,*velmap,*premap,A11,A12,A21,A22),true); // build Xpetra objects from Epetra_CrsMatrix objects Teuchos::RCP<Xpetra::CrsMatrix<Scalar,LO,GO,Node> > xfuA = Teuchos::rcp(new Xpetra::EpetraCrsMatrixT<GO,Node>(fullA)); Teuchos::RCP<Xpetra::CrsMatrix<Scalar,LO,GO,Node> > xA11 = Teuchos::rcp(new Xpetra::EpetraCrsMatrixT<GO,Node>(A11)); Teuchos::RCP<Xpetra::CrsMatrix<Scalar,LO,GO,Node> > xA12 = Teuchos::rcp(new Xpetra::EpetraCrsMatrixT<GO,Node>(A12)); Teuchos::RCP<Xpetra::CrsMatrix<Scalar,LO,GO,Node> > xA21 = Teuchos::rcp(new Xpetra::EpetraCrsMatrixT<GO,Node>(A21)); Teuchos::RCP<Xpetra::CrsMatrix<Scalar,LO,GO,Node> > xA22 = Teuchos::rcp(new Xpetra::EpetraCrsMatrixT<GO,Node>(A22)); // build map extractor Teuchos::RCP<Xpetra::EpetraMapT<GO,Node> > xfullmap = Teuchos::rcp(new Xpetra::EpetraMapT<GO,Node>(fullmap)); Teuchos::RCP<Xpetra::EpetraMapT<GO,Node> > xvelmap = Teuchos::rcp(new Xpetra::EpetraMapT<GO,Node>(velmap )); Teuchos::RCP<Xpetra::EpetraMapT<GO,Node> > xpremap = Teuchos::rcp(new Xpetra::EpetraMapT<GO,Node>(premap )); std::vector<Teuchos::RCP<const Xpetra::Map<LO,GO,Node> > > xmaps; xmaps.push_back(xvelmap); xmaps.push_back(xpremap); Teuchos::RCP<const Xpetra::MapExtractor<Scalar,LO,GO,Node> > map_extractor = Xpetra::MapExtractorFactory<Scalar,LO,GO,Node>::Build(xfullmap,xmaps); // build blocked operator Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar,LO,GO,Node> > bOp = Teuchos::rcp(new Xpetra::BlockedCrsMatrix<Scalar,LO,GO,Node>(map_extractor,map_extractor,10)); bOp->setMatrix(0,0,xA11); bOp->setMatrix(0,1,xA12); bOp->setMatrix(1,0,xA21); bOp->setMatrix(1,1,xA22); bOp->fillComplete(); TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(bOp)); // create Thyra operator Teuchos::RCP<Thyra::LinearOpBase<Scalar> > thOp = Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(bOp); TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thOp)); Teuchos::RCP<Thyra::BlockedLinearOpBase<Scalar> > thbOp = Teuchos::rcp_dynamic_cast<Thyra::BlockedLinearOpBase<Scalar> >(thOp); TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thbOp)); Teuchos::RCP<const Thyra::ProductVectorSpaceBase<Scalar> > productRange = thbOp->productRange(); Teuchos::RCP<const Thyra::ProductVectorSpaceBase<Scalar> > productDomain = thbOp->productDomain(); TEST_EQUALITY(productRange->numBlocks() ,2); TEST_EQUALITY(productDomain->numBlocks() ,2); TEST_EQUALITY(Teuchos::as<Xpetra::global_size_t>(productRange->dim()) ,xfullmap->getGlobalNumElements()); TEST_EQUALITY(Teuchos::as<Xpetra::global_size_t>(productDomain->dim()) ,xfullmap->getGlobalNumElements()); TEST_EQUALITY(Teuchos::as<Xpetra::global_size_t>(productRange->getBlock(0)->dim()) ,xvelmap->getGlobalNumElements()); TEST_EQUALITY(Teuchos::as<Xpetra::global_size_t>(productDomain->getBlock(0)->dim()) ,xvelmap->getGlobalNumElements()); TEST_EQUALITY(Teuchos::as<Xpetra::global_size_t>(productRange->getBlock(1)->dim()) ,xpremap->getGlobalNumElements()); TEST_EQUALITY(Teuchos::as<Xpetra::global_size_t>(productDomain->getBlock(1)->dim()) ,xpremap->getGlobalNumElements()); //construct a Xpetra::BlockedCrsMatrix object Teuchos::RCP<Xpetra::BlockedCrsMatrix<Scalar, LO, GO, Node> > bOp2 = Teuchos::rcp(new Xpetra::BlockedCrsMatrix<Scalar, LO, GO, Node>(thbOp,comm)); TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(bOp2)); TEST_EQUALITY(bOp2->getGlobalNumRows(),bOp->getGlobalNumRows()); TEST_EQUALITY(bOp2->getGlobalNumCols(),bOp->getGlobalNumCols()); TEST_EQUALITY(bOp2->getNodeNumRows(),bOp->getNodeNumRows()); TEST_EQUALITY(bOp2->getGlobalNumEntries(),bOp->getGlobalNumEntries()); TEST_EQUALITY(bOp2->getNodeNumEntries(),bOp->getNodeNumEntries()); TEST_EQUALITY(bOp2->isFillComplete(),bOp->isFillComplete()); TEST_EQUALITY(bOp2->getDomainMap()->isCompatible(*bOp->getDomainMap()),true); TEST_EQUALITY(bOp2->getRangeMap()->isCompatible(*bOp->getRangeMap()),true); TEST_EQUALITY(bOp2->getDomainMap(0)->isCompatible(*bOp->getDomainMap(0)),true); TEST_EQUALITY(bOp2->getRangeMap(0)->isCompatible(*bOp->getRangeMap(0)),true); TEST_EQUALITY(bOp2->getDomainMap(1)->isCompatible(*bOp->getDomainMap(1)),true); TEST_EQUALITY(bOp2->getRangeMap(1)->isCompatible(*bOp->getRangeMap(1)),true); TEST_EQUALITY(bOp2->getDomainMap()->isSameAs(*bOp->getDomainMap()),true); TEST_EQUALITY(bOp2->getRangeMap()->isSameAs(*bOp->getRangeMap()),true); TEST_EQUALITY(bOp2->getDomainMap(0)->isSameAs(*bOp->getDomainMap(0)),true); TEST_EQUALITY(bOp2->getRangeMap(0)->isSameAs(*bOp->getRangeMap(0)),true); TEST_EQUALITY(bOp2->getDomainMap(1)->isSameAs(*bOp->getDomainMap(1)),true); TEST_EQUALITY(bOp2->getRangeMap(1)->isSameAs(*bOp->getRangeMap(1)),true); #endif // end HAVE_XPETRA_EPETRAEXT #endif // end HAVE_XPETRA_THYRA }