autoPtr<mapDistribute> buildMap ( const T& mesh, labelListList& pointPoints ) { pointPoints.setSize(mesh.vertexCount()); globalIndex globalIndexing(mesh.vertexCount()); for ( typename T::Finite_vertices_iterator vit = mesh.finite_vertices_begin(); vit != mesh.finite_vertices_end(); ++vit ) { if (!vit->real()) { continue; } std::list<typename T::Vertex_handle> adjVerts; mesh.finite_adjacent_vertices(vit, std::back_inserter(adjVerts)); DynamicList<label> indices(adjVerts.size()); for ( typename std::list<typename T::Vertex_handle>::const_iterator adjVertI = adjVerts.begin(); adjVertI != adjVerts.end(); ++adjVertI ) { typename T::Vertex_handle vh = *adjVertI; if (!vh->farPoint()) { indices.append ( globalIndexing.toGlobal(vh->procIndex(), vh->index()) ); } } pointPoints[vit->index()].transfer(indices); } List<Map<label>> compactMap; return autoPtr<mapDistribute> ( new mapDistribute ( globalIndexing, pointPoints, compactMap ) ); }
void Pstream::exchange ( const List<Container>& sendBufs, List<Container>& recvBufs, labelListList& sizes, const int tag, const bool block ) { if (!contiguous<T>()) { FatalErrorIn ( "Pstream::exchange(..)" ) << "Continuous data only." << Foam::abort(FatalError); } if (sendBufs.size() != UPstream::nProcs()) { FatalErrorIn ( "Pstream::exchange(..)" ) << "Size of list:" << sendBufs.size() << " does not equal the number of processors:" << UPstream::nProcs() << Foam::abort(FatalError); } sizes.setSize(UPstream::nProcs()); labelList& nsTransPs = sizes[UPstream::myProcNo()]; nsTransPs.setSize(UPstream::nProcs()); forAll(sendBufs, procI) { nsTransPs[procI] = sendBufs[procI].size(); } // Send sizes across. Note: blocks. combineReduce(sizes, UPstream::listEq(), tag); if (Pstream::parRun()) { label startOfRequests = Pstream::nRequests(); // Set up receives // ~~~~~~~~~~~~~~~ recvBufs.setSize(sendBufs.size()); forAll(sizes, procI) { label nRecv = sizes[procI][UPstream::myProcNo()]; if (procI != Pstream::myProcNo() && nRecv > 0) { recvBufs[procI].setSize(nRecv); UIPstream::read ( UPstream::nonBlocking, procI, reinterpret_cast<char*>(recvBufs[procI].begin()), nRecv*sizeof(T), tag ); } } // Set up sends // ~~~~~~~~~~~~ forAll(sendBufs, procI) { if (procI != Pstream::myProcNo() && sendBufs[procI].size() > 0) { if ( !UOPstream::write ( UPstream::nonBlocking, procI, reinterpret_cast<const char*>(sendBufs[procI].begin()), sendBufs[procI].size()*sizeof(T), tag ) ) { FatalErrorIn("Pstream::exchange(..)") << "Cannot send outgoing message. " << "to:" << procI << " nBytes:" << label(sendBufs[procI].size()*sizeof(T)) << Foam::abort(FatalError); } } } // Wait for all to finish // ~~~~~~~~~~~~~~~~~~~~~~ if (block) { Pstream::waitRequests(startOfRequests); } }