// Calculate geometrically collocated points, Requires PackedList to be // sized and initalised! Foam::label Foam::autoSnapDriver::getCollocatedPoints ( const scalar tol, const pointField& points, PackedBoolList& isCollocatedPoint ) { labelList pointMap; label nUnique = mergePoints ( points, // points tol, // mergeTol false, // verbose pointMap ); bool hasMerged = (nUnique < points.size()); if (!returnReduce(hasMerged, orOp<bool>())) { return 0; } // Determine which merged points are referenced more than once label nCollocated = 0; // Per old point the newPoint. Or -1 (not set yet) or -2 (already seen // twice) labelList firstOldPoint(nUnique, -1); forAll(pointMap, oldPointI) { label newPointI = pointMap[oldPointI]; if (firstOldPoint[newPointI] == -1) { // First use of oldPointI. Store. firstOldPoint[newPointI] = oldPointI; } else if (firstOldPoint[newPointI] == -2) { // Third or more reference of oldPointI -> non-manifold isCollocatedPoint.set(oldPointI, 1u); nCollocated++; } else { // Second reference of oldPointI -> non-manifold isCollocatedPoint.set(firstOldPoint[newPointI], 1u); nCollocated++; isCollocatedPoint.set(oldPointI, 1u); nCollocated++; // Mark with special value to save checking next time round firstOldPoint[newPointI] = -2; } }
// Pass1: relabel edges // ~~~~~~~~~~~~~~~~~~~~ forAll(dynEdges, i) { edge& e = dynEdges[i]; e[0] = mapPointId[e[0]]; e[1] = mapPointId[e[1]]; usedPoints.set(e[0]); usedPoints.set(e[1]); }
void dynamicRefineFvMesh::calculateProtectedCells ( PackedBoolList& unrefineableCell ) const { if (protectedCell_.empty()) { unrefineableCell.clear(); return; } const labelList& cellLevel = meshCutter_.cellLevel(); unrefineableCell = protectedCell_; // Get neighbouring cell level labelList neiLevel(nFaces()-nInternalFaces()); for (label faceI = nInternalFaces(); faceI < nFaces(); faceI++) { neiLevel[faceI-nInternalFaces()] = cellLevel[faceOwner()[faceI]]; } syncTools::swapBoundaryFaceList(*this, neiLevel, false); while (true) { // Pick up faces on border of protected cells boolList seedFace(nFaces(), false); forAll(faceNeighbour(), faceI) { label own = faceOwner()[faceI]; bool ownProtected = (unrefineableCell.get(own) == 1); label nei = faceNeighbour()[faceI]; bool neiProtected = (unrefineableCell.get(nei) == 1); if (ownProtected && (cellLevel[nei] > cellLevel[own])) { seedFace[faceI] = true; } else if (neiProtected && (cellLevel[own] > cellLevel[nei])) { seedFace[faceI] = true; } } for (label faceI = nInternalFaces(); faceI < nFaces(); faceI++) { label own = faceOwner()[faceI]; bool ownProtected = (unrefineableCell.get(own) == 1); if ( ownProtected && (neiLevel[faceI-nInternalFaces()] > cellLevel[own]) ) { seedFace[faceI] = true; } } syncTools::syncFaceList(*this, seedFace, orEqOp<bool>(), false); // Extend unrefineableCell bool hasExtended = false; for (label faceI = 0; faceI < nInternalFaces(); faceI++) { if (seedFace[faceI]) { label own = faceOwner()[faceI]; if (unrefineableCell.get(own) == 0) { unrefineableCell.set(own, 1); hasExtended = true; } label nei = faceNeighbour()[faceI]; if (unrefineableCell.get(nei) == 0) { unrefineableCell.set(nei, 1); hasExtended = true; } } } for (label faceI = nInternalFaces(); faceI < nFaces(); faceI++) { if (seedFace[faceI]) { label own = faceOwner()[faceI]; if (unrefineableCell.get(own) == 0) { unrefineableCell.set(own, 1); hasExtended = true; } } } if (!returnReduce(hasExtended, orOp<bool>())) { break; } }