From c2c9681bff31b3dbd5ca3fc6ab39cd8e0e3c10e2 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs@hunt.opencfd.co.uk>
Date: Mon, 1 Jun 2009 16:25:24 +0100
Subject: [PATCH] optional merging of sub-regions

---
 .../searchableSurfaceCollection.C             | 77 +++++++++++++------
 .../searchableSurfaceCollection.H             |  3 +
 2 files changed, 58 insertions(+), 22 deletions(-)

diff --git a/src/meshTools/searchableSurface/searchableSurfaceCollection.C b/src/meshTools/searchableSurface/searchableSurfaceCollection.C
index 11b37bf97bb..306e78df25f 100644
--- a/src/meshTools/searchableSurface/searchableSurfaceCollection.C
+++ b/src/meshTools/searchableSurface/searchableSurfaceCollection.C
@@ -36,7 +36,12 @@ namespace Foam
 {
 
 defineTypeNameAndDebug(searchableSurfaceCollection, 0);
-addToRunTimeSelectionTable(searchableSurface, searchableSurfaceCollection, dict);
+addToRunTimeSelectionTable
+(
+    searchableSurface,
+    searchableSurfaceCollection,
+    dict
+);
 
 }
 
@@ -63,15 +68,17 @@ void Foam::searchableSurfaceCollection::findNearest
 
     forAll(subGeom_, surfI)
     {
-        // Transform then divide
-        tmp<pointField> localSamples = cmptDivide
+        subGeom_[surfI].findNearest
         (
-            transform_[surfI].localPosition(samples),
-            scale_[surfI]
+            cmptDivide  // Transform then divide
+            (
+                transform_[surfI].localPosition(samples),
+                scale_[surfI]
+            ),
+            localMinDistSqr,
+            hitInfo
         );
 
-        subGeom_[surfI].findNearest(localSamples, localMinDistSqr, hitInfo);
-
         forAll(hitInfo, pointI)
         {
             if (hitInfo[pointI].hit())
@@ -115,7 +122,8 @@ Foam::searchableSurfaceCollection::searchableSurfaceCollection
     instance_(dict.size()),
     scale_(dict.size()),
     transform_(dict.size()),
-    subGeom_(dict.size())
+    subGeom_(dict.size()),
+    mergeSubRegions_(dict.lookup("mergeSubRegions"))
 {
     Info<< "SearchableCollection : " << name() << endl;
 
@@ -181,12 +189,19 @@ const Foam::wordList& Foam::searchableSurfaceCollection::regions() const
         {
             regionOffset_[surfI] = allRegions.size();
 
-            const wordList& subRegions = subGeom_[surfI].regions();
-
-            forAll(subRegions, i)
+            if (mergeSubRegions_)
             {
-                //allRegions.append(subRegions[i] + "_" + Foam::name(surfI));
-                allRegions.append(instance_[surfI] + "_" + subRegions[i]);
+                // Single name regardless how many regions subsurface has
+                allRegions.append(instance_[surfI] + "_" + Foam::name(surfI));
+            }
+            else
+            {
+                const wordList& subRegions = subGeom_[surfI].regions();
+
+                forAll(subRegions, i)
+                {
+                    allRegions.append(instance_[surfI] + "_" + subRegions[i]);
+                }
             }
         }
         regions_.transfer(allRegions.shrink());
@@ -370,7 +385,15 @@ void Foam::searchableSurfaceCollection::getRegion
     {}
     else if (subGeom_.size() == 1)
     {
-        subGeom_[0].getRegion(info, region);
+        if (mergeSubRegions_)
+        {
+            region.setSize(info.size());
+            region = regionOffset_[0];
+        }
+        else
+        {
+            subGeom_[0].getRegion(info, region);
+        }
     }
     else
     {
@@ -429,15 +452,25 @@ void Foam::searchableSurfaceCollection::getRegion
             // Collect points from my surface
             labelList indices(findIndices(nearestSurf, surfI));
 
-            labelList surfRegion;
-            subGeom_[surfI].getRegion
-            (
-                UIndirectList<pointIndexHit>(info, indices),
-                surfRegion
-            );
-            forAll(indices, i)
+            if (mergeSubRegions_)
             {
-                region[indices[i]] = regionOffset_[surfI] + surfRegion[i];
+                forAll(indices, i)
+                {
+                    region[indices[i]] = regionOffset_[surfI];
+                }
+            }
+            else
+            {
+                labelList surfRegion;
+                subGeom_[surfI].getRegion
+                (
+                    UIndirectList<pointIndexHit>(info, indices),
+                    surfRegion
+                );
+                forAll(indices, i)
+                {
+                    region[indices[i]] = regionOffset_[surfI] + surfRegion[i];
+                }
             }
         }
     }
diff --git a/src/meshTools/searchableSurface/searchableSurfaceCollection.H b/src/meshTools/searchableSurface/searchableSurfaceCollection.H
index 9c39923747f..2004bf9400c 100644
--- a/src/meshTools/searchableSurface/searchableSurfaceCollection.H
+++ b/src/meshTools/searchableSurface/searchableSurfaceCollection.H
@@ -40,6 +40,7 @@ SourceFiles
 #include "treeBoundBox.H"
 #include "coordinateSystem.H"
 #include "UPtrList.H"
+#include "Switch.H"
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
@@ -73,6 +74,8 @@ private:
 
             UPtrList<searchableSurface> subGeom_;
 
+            Switch mergeSubRegions_;
+
         //- Region names
         mutable wordList regions_;
         //- From individual regions to collection regions
-- 
GitLab