Foam::treeBoundBox Foam::treeDataCell::calcCellBb(const label cellI) const { const cellList& cells = mesh_.cells(); const faceList& faces = mesh_.faces(); const pointField& points = mesh_.points(); treeBoundBox cellBb ( vector(GREAT, GREAT, GREAT), vector(-GREAT, -GREAT, -GREAT) ); const cell& cFaces = cells[cellI]; forAll(cFaces, cFaceI) { const face& f = faces[cFaces[cFaceI]]; forAll(f, fp) { const point& p = points[f[fp]]; cellBb.min() = min(cellBb.min(), p); cellBb.max() = max(cellBb.max(), p); } } return cellBb; }
Foam::labelList Foam::meshToMesh::maskCells ( const polyMesh& src, const polyMesh& tgt ) const { boundBox intersectBb ( max(src.bounds().min(), tgt.bounds().min()), min(src.bounds().max(), tgt.bounds().max()) ); intersectBb.inflate(0.01); const cellList& srcCells = src.cells(); const faceList& srcFaces = src.faces(); const pointField& srcPts = src.points(); DynamicList<label> cells(src.size()); forAll(srcCells, srcI) { boundBox cellBb(srcCells[srcI].points(srcFaces, srcPts), false); if (intersectBb.overlaps(cellBb)) { cells.append(srcI); } }
Foam::autoPtr<Foam::mapDistribute> Foam::meshToMeshNew::calcProcMap ( const polyMesh& src, const polyMesh& tgt ) const { // get decomposition of cells on src mesh List<boundBox> procBb(Pstream::nProcs()); if (src.nCells() > 0) { // bounding box for my mesh - do not parallel reduce procBb[Pstream::myProcNo()] = boundBox(src.points(), false); // slightly increase size of bounding boxes to allow for cases where // bounding boxes are perfectly alligned procBb[Pstream::myProcNo()].inflate(0.01); } else { procBb[Pstream::myProcNo()] = boundBox(); } Pstream::gatherList(procBb); Pstream::scatterList(procBb); if (debug) { Info<< "Determining extent of src mesh per processor:" << nl << "\tproc\tbb" << endl; forAll(procBb, procI) { Info<< '\t' << procI << '\t' << procBb[procI] << endl; } } // determine which cells of tgt mesh overlaps src mesh per proc const cellList& cells = tgt.cells(); const faceList& faces = tgt.faces(); const pointField& points = tgt.points(); labelListList sendMap; { // per processor indices into all segments to send List<DynamicList<label> > dynSendMap(Pstream::nProcs()); label iniSize = floor(tgt.nCells()/Pstream::nProcs()); forAll(dynSendMap, procI) { dynSendMap[procI].setCapacity(iniSize); } // work array - whether src processor bb overlaps the tgt cell bounds boolList procBbOverlaps(Pstream::nProcs()); forAll(cells, cellI) { const cell& c = cells[cellI]; // determine bounding box of tgt cell boundBox cellBb(point::max, point::min); forAll(c, faceI) { const face& f = faces[c[faceI]]; forAll(f, fp) { cellBb.min() = min(cellBb.min(), points[f[fp]]); cellBb.max() = max(cellBb.max(), points[f[fp]]); } } // find the overlapping tgt cells on each src processor (void)calcOverlappingProcs(procBb, cellBb, procBbOverlaps); forAll(procBbOverlaps, procI) { if (procBbOverlaps[procI]) { dynSendMap[procI].append(cellI); } } }