diff --git a/applications/utilities/mesh/advanced/collapseEdges/Make/options b/applications/utilities/mesh/advanced/collapseEdges/Make/options index 21b17b14c9..73f34b0f85 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/Make/options +++ b/applications/utilities/mesh/advanced/collapseEdges/Make/options @@ -1,5 +1,6 @@ EXE_INC = \ - -I$(LIB_SRC)/dynamicMesh/lnInclude + -I$(LIB_SRC)/dynamicMesh/lnInclude \ + -I$(LIB_SRC)/meshTools/lnInclude EXE_LIBS = \ -ldynamicMesh \ diff --git a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C index f1eb28e594..400191275c 100644 --- a/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C +++ b/applications/utilities/mesh/advanced/collapseEdges/collapseEdges.C @@ -50,6 +50,11 @@ Description #include "PackedBoolList.H" #include "SortableList.H" #include "unitConversion.H" +#include "globalMeshData.H" +#include "globalIndex.H" + +#include "OFstream.H" +#include "meshTools.H" using namespace Foam; @@ -174,37 +179,74 @@ label mergeEdges // Return master point edge needs to be collapsed to (or -1) -label edgeMaster(const PackedBoolList& boundaryPoint, const edge& e) +label edgeMaster +( + const labelList& boundaryPoint, + const bool flipEdge, + const edge& e +) { label masterPoint = -1; - // Collapse edge to boundary point. - if (boundaryPoint.get(e[0])) + label e0 = e[0]; + label e1 = e[1]; + + if (flipEdge) { - if (boundaryPoint.get(e[1])) + e0 = e[1]; + e1 = e[0]; + } + + // Check if one of the points is on a processor + if + ( + boundaryPoint[e0] > 0 + && boundaryPoint[e1] > 0 + ) + { + if (boundaryPoint[e0] != boundaryPoint[e1]) + { + return -1; + } + } + + if (boundaryPoint[e0] > 0) + { + return e0; + } + else if (boundaryPoint[e1] > 0) + { + return e1; + } + + // Collapse edge to boundary point. + if (boundaryPoint[e0] == 0) + { + if (boundaryPoint[e1] == 0) { // Both points on boundary. Choose one to collapse to. // Note: should look at feature edges/points! - masterPoint = e[0]; + masterPoint = e0; } else { - masterPoint = e[0]; + masterPoint = e0; } } else { - if (boundaryPoint.get(e[1])) + if (boundaryPoint[e1] == 0) { - masterPoint = e[1]; + masterPoint = e1; } else { // None on boundary. Choose arbitrary. // Note: should look at geometry? - masterPoint = e[0]; + masterPoint = e0; } } + return masterPoint; } @@ -212,7 +254,7 @@ label edgeMaster(const PackedBoolList& boundaryPoint, const edge& e) label collapseSmallEdges ( const polyMesh& mesh, - const PackedBoolList& boundaryPoint, + const labelList& boundaryPoint, const scalar minLen, edgeCollapser& collapser ) @@ -223,7 +265,17 @@ label collapseSmallEdges // Collapse all edges that are too small. Choose intelligently which // point to collapse edge to. - label nCollapsed = 0; + const globalMeshData& globalData = mesh.globalData(); + const mapDistribute& map = globalData.globalEdgeSlavesMap(); + const labelList& coupledMeshEdges = globalData.coupledPatchMeshEdges(); + const indirectPrimitivePatch& coupledPatch = globalData.coupledPatch(); + const PackedBoolList& cppOrientation = globalData.globalEdgeOrientation(); + + // Store collapse direction in collapseEdge + // -1 -> Do not collapse + // 0 -> Collapse to start point + // 1 -> Collapse to end point + labelList collapseEdge(edges.size(), -1); forAll(edges, edgeI) { @@ -231,15 +283,121 @@ label collapseSmallEdges if (e.mag(points) < minLen) { - label master = edgeMaster(boundaryPoint, e); + collapseEdge[edgeI] = 0; + } + } - if (master != -1) // && collapser.unaffectedEdge(edgeI)) + // Check whether edge point order is reversed from mesh to coupledPatch + PackedBoolList meshToPatchSameOrientation(coupledMeshEdges.size(), true); + + forAll(coupledMeshEdges, eI) + { + const label meshEdgeIndex = coupledMeshEdges[eI]; + + if (collapseEdge[meshEdgeIndex] != -1) + { + const edge& meshEdge = edges[meshEdgeIndex]; + const edge& coupledPatchEdge = coupledPatch.edges()[eI]; + + if + ( + meshEdge[0] == coupledPatch.meshPoints()[coupledPatchEdge[1]] + && meshEdge[1] == coupledPatch.meshPoints()[coupledPatchEdge[0]] + ) + { + meshToPatchSameOrientation[eI] = false; + } + } + } + + + labelList cppEdgeData(coupledMeshEdges.size(), -1); + + forAll(coupledMeshEdges, eI) + { + const label meshEdgeIndex = coupledMeshEdges[eI]; + + if (collapseEdge[meshEdgeIndex] != -1) + { + if (meshToPatchSameOrientation[eI] == cppOrientation[eI]) + { + cppEdgeData[eI] = 0; + } + else + { + cppEdgeData[eI] = 1; + } + } + } + + + // Synchronise cppEdgeData + // Use minEqOp reduction, so that edge will only be collapsed on processor + // boundary if both processors agree to collapse it + globalData.syncData + ( + cppEdgeData, + globalData.globalEdgeSlaves(), + globalData.globalEdgeTransformedSlaves(), + map, + minEqOp