From f7cbb0672beada63b88806ed62e4665868a23465 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 10 Mar 2022 14:32:19 +0100 Subject: [PATCH] ENH: globalIndex gather for PatchTools::gatherAndMerge (#2402) - lower memory overhead, simpler code and eliminates need for ListListOps::combineOffset() - optional handling of local faces/points for re-using in different contexts STYLE: labelUList instead of labelList for globalMesh mergePoints STYLE: adjust verbose information from mergePoints - also report the current new-point location --- src/OpenFOAM/meshes/meshTools/mergePoints.C | 47 ++++--- .../polyMesh/globalMeshData/globalMeshData.C | 8 +- .../polyMesh/globalMeshData/globalMeshData.H | 2 +- .../primitiveMesh/PatchTools/PatchTools.H | 15 ++- .../PatchTools/PatchToolsGatherAndMerge.C | 83 ++++++------ .../PrimitivePatch/PrimitivePatch.H | 6 + .../surfaceFieldValue/surfaceFieldValue.C | 119 +++++------------- 7 files changed, 129 insertions(+), 151 deletions(-) diff --git a/src/OpenFOAM/meshes/meshTools/mergePoints.C b/src/OpenFOAM/meshes/meshTools/mergePoints.C index e095952f24..b5d6049755 100644 --- a/src/OpenFOAM/meshes/meshTools/mergePoints.C +++ b/src/OpenFOAM/meshes/meshTools/mergePoints.C @@ -89,12 +89,12 @@ Foam::label Foam::mergePoints Field sortedTol(nPoints); - forAll(order, sortI) + forAll(order, sorti) { - const point_type& pt = points[order[sortI]]; + const point_type& pt = points[order[sorti]]; // Use scalar precision - sortedTol[sortI] = + sortedTol[sorti] = 2*mergeTol* ( mag(scalar(pt.x() - compareOrigin.x())) @@ -109,11 +109,16 @@ Foam::label Foam::mergePoints label pointi = order[0]; pointMap[pointi] = newPointi++; - for (label sortI = 1; sortI < order.size(); ++sortI) + /// if (verbose) + /// { + /// Pout<< "Foam::mergePoints : [0] Uniq point " << pointi << endl; + /// } + + for (label sorti = 1; sorti < order.size(); ++sorti) { // Get original point index - const label pointi = order[sortI]; - const scalar mag2 = magSqrDist[order[sortI]]; + const label pointi = order[sorti]; + const scalar mag2 = magSqrDist[order[sorti]]; // Convert to scalar precision // NOTE: not yet using point_type template parameter @@ -130,13 +135,13 @@ Foam::label Foam::mergePoints for ( - label prevSortI = sortI - 1; - prevSortI >= 0 - && (mag(magSqrDist[order[prevSortI]] - mag2) <= sortedTol[sortI]); - --prevSortI + label prevSorti = sorti - 1; + prevSorti >= 0 + && (mag(magSqrDist[order[prevSorti]] - mag2) <= sortedTol[sorti]); + --prevSorti ) { - const label prevPointi = order[prevSortI]; + const label prevPointi = order[prevSorti]; // Convert to scalar precision // NOTE: not yet using point_type template parameter @@ -164,16 +169,22 @@ Foam::label Foam::mergePoints if (verbose) { - Pout<< "Foam::mergePoints : Merging points " - << pointi << " and " << equalPointi - << " with coordinates:" << points[pointi] - << " and " << points[equalPointi] - << endl; + Pout<< "Foam::mergePoints : [" << pointMap[pointi] + << "] Point " << pointi << " duplicate of " << equalPointi + << " : coordinates:" << points[pointi] + << " and " << points[equalPointi] << endl; } } else { // Differs. Store new point. + + /// if (verbose) + /// { + /// Pout<< "Foam::mergePoints : [" << newPointi + /// << "] Uniq point " << pointi << endl; + /// } + pointMap[pointi] = newPointi++; } } @@ -200,7 +211,7 @@ bool Foam::mergePoints typename PointList::const_reference origin ) { - const label nUnique = mergePoints + const label nUnique = Foam::mergePoints ( points, mergeTol, @@ -209,7 +220,7 @@ bool Foam::mergePoints origin ); - newPoints.setSize(nUnique); + newPoints.resize_nocopy(nUnique); forAll(pointMap, pointi) { newPoints[pointMap[pointi]] = points[pointi]; diff --git a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C index d08c7be033..a16d392b28 100644 --- a/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C +++ b/src/OpenFOAM/meshes/polyMesh/globalMeshData/globalMeshData.C @@ -138,7 +138,7 @@ void Foam::globalMeshData::calcSharedPoints() const // Calculate all shared points (exclude points that are only // on two coupled patches). This does all the hard work. - globalPoints parallelPoints(mesh_, false, true); + const globalPoints parallelPoints(mesh_, false, true); // Count the number of master points label nMaster = 0; @@ -155,7 +155,7 @@ void Foam::globalMeshData::calcSharedPoints() const } // Allocate global numbers - globalIndex masterNumbering(nMaster); + const globalIndex masterNumbering(nMaster); nGlobalPoints_ = masterNumbering.totalSize(); @@ -2472,7 +2472,7 @@ Foam::autoPtr Foam::globalMeshData::mergePoints Foam::autoPtr Foam::globalMeshData::mergePoints ( - const labelList& meshPoints, + const labelUList& meshPoints, const Map