From 12837a67d50a091c24333d2cb32e9a70ae9d188b Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@Germany>
Date: Mon, 26 Jul 2010 13:18:59 +0200
Subject: [PATCH] ENH: add ZoneMesh::findIndices() method

STYLE: use findIndices instead of findAll for coordinateSystems
---
 .../surfaceMeshConvert/surfaceMeshConvert.C   | 12 ++--
 .../surfaceMeshExport/surfaceMeshExport.C     | 12 ++--
 .../surfaceMeshImport/surfaceMeshImport.C     | 12 ++--
 .../meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C | 63 ++++++++++++++++++-
 .../meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H | 10 ++-
 .../cfdTools/general/porousMedia/porousZone.C | 20 +-----
 .../coordinateSystems/coordinateSystem.C      |  8 +--
 .../coordinateSystems/coordinateSystems.C     | 40 +++++++-----
 .../coordinateSystems/coordinateSystems.H     | 10 ++-
 9 files changed, 123 insertions(+), 64 deletions(-)

diff --git a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
index 248ac3e3d09..3d14464e713 100644
--- a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
+++ b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C
@@ -206,8 +206,8 @@ int main(int argc, char *argv[])
         {
             const word csName = args["from"];
 
-            label csId = csLst.find(csName);
-            if (csId < 0)
+            const label csIndex = csLst.findIndex(csName);
+            if (csIndex < 0)
             {
                 FatalErrorIn(args.executable())
                     << "Cannot find -from " << csName << nl
@@ -215,15 +215,15 @@ int main(int argc, char *argv[])
                     << exit(FatalError);
             }
 
-            fromCsys.reset(new coordinateSystem(csLst[csId]));
+            fromCsys.reset(new coordinateSystem(csLst[csIndex]));
         }
 
         if (args.optionFound("to"))
         {
             const word csName = args["to"];
 
-            label csId = csLst.find(csName);
-            if (csId < 0)
+            const label csIndex = csLst.findIndex(csName);
+            if (csIndex < 0)
             {
                 FatalErrorIn(args.executable())
                     << "Cannot find -to " << csName << nl
@@ -231,7 +231,7 @@ int main(int argc, char *argv[])
                     << exit(FatalError);
             }
 
-            toCsys.reset(new coordinateSystem(csLst[csId]));
+            toCsys.reset(new coordinateSystem(csLst[csIndex]));
         }
 
 
diff --git a/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C b/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C
index 3995031b536..0631f195e2e 100644
--- a/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C
+++ b/applications/utilities/surface/surfaceMeshExport/surfaceMeshExport.C
@@ -195,8 +195,8 @@ int main(int argc, char *argv[])
         {
             const word csName = args["from"];
 
-            label csId = csLst.find(csName);
-            if (csId < 0)
+            const label csIndex = csLst.findIndex(csName);
+            if (csIndex < 0)
             {
                 FatalErrorIn(args.executable())
                     << "Cannot find -from " << csName << nl
@@ -204,15 +204,15 @@ int main(int argc, char *argv[])
                     << exit(FatalError);
             }
 
-            fromCsys.reset(new coordinateSystem(csLst[csId]));
+            fromCsys.reset(new coordinateSystem(csLst[csIndex]));
         }
 
         if (args.optionFound("to"))
         {
             const word csName = args["to"];
 
-            label csId = csLst.find(csName);
-            if (csId < 0)
+            const label csIndex = csLst.findIndex(csName);
+            if (csIndex < 0)
             {
                 FatalErrorIn(args.executable())
                     << "Cannot find -to " << csName << nl
@@ -220,7 +220,7 @@ int main(int argc, char *argv[])
                     << exit(FatalError);
             }
 
-            toCsys.reset(new coordinateSystem(csLst[csId]));
+            toCsys.reset(new coordinateSystem(csLst[csIndex]));
         }
 
 
diff --git a/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C b/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C
index 853becfc89d..3aee72a52d7 100644
--- a/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C
+++ b/applications/utilities/surface/surfaceMeshImport/surfaceMeshImport.C
@@ -208,8 +208,8 @@ int main(int argc, char *argv[])
         {
             const word csName = args["from"];
 
-            label csId = csLst.find(csName);
-            if (csId < 0)
+            const label csIndex = csLst.findIndex(csName);
+            if (csIndex < 0)
             {
                 FatalErrorIn(args.executable())
                     << "Cannot find -from " << csName << nl
@@ -217,15 +217,15 @@ int main(int argc, char *argv[])
                     << exit(FatalError);
             }
 
-            fromCsys.reset(new coordinateSystem(csLst[csId]));
+            fromCsys.reset(new coordinateSystem(csLst[csIndex]));
         }
 
         if (args.optionFound("to"))
         {
             const word csName = args["to"];
 
-            label csId = csLst.find(csName);
-            if (csId < 0)
+            const label csIndex = csLst.findIndex(csName);
+            if (csIndex < 0)
             {
                 FatalErrorIn(args.executable())
                     << "Cannot find -to " << csName << nl
@@ -233,7 +233,7 @@ int main(int argc, char *argv[])
                     << exit(FatalError);
             }
 
-            toCsys.reset(new coordinateSystem(csLst[csId]));
+            toCsys.reset(new coordinateSystem(csLst[csIndex]));
         }
 
 
diff --git a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C
index babb31b6e85..7df85dc6d55 100644
--- a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C
+++ b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C
@@ -26,6 +26,7 @@ License
 #include "ZoneMesh.H"
 #include "entry.H"
 #include "demandDrivenData.H"
+#include "stringListOps.H"
 
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
@@ -241,6 +242,66 @@ Foam::wordList Foam::ZoneMesh<ZoneType, MeshType>::names() const
 }
 
 
+template<class ZoneType, class MeshType>
+Foam::labelList Foam::ZoneMesh<ZoneType, MeshType>::findIndices
+(
+    const keyType& key
+) const
+{
+    labelList indices;
+    if (key.isPattern())
+    {
+        indices = findStrings(key, this->names());
+    }
+    else
+    {
+        indices.setSize(this->size());
+        label nFound = 0;
+        forAll(*this, i)
+        {
+            if (key == operator[](i).name())
+            {
+                indices[nFound++] = i;
+            }
+        }
+        indices.setSize(nFound);
+     }
+
+    return indices;
+}
+
+
+template<class ZoneType, class MeshType>
+Foam::label Foam::ZoneMesh<ZoneType, MeshType>::findIndex
+(
+    const keyType& key
+) const
+{
+    if (key.isPattern())
+    {
+        labelList indices = this->findIndices(key);
+        // return first element
+        if (!indices.empty())
+        {
+            return indices[0];
+        }
+    }
+    else
+    {
+        forAll(*this, i)
+        {
+            if (key == operator[](i).name())
+            {
+                return i;
+            }
+        }
+    }
+
+    // not found
+    return -1;
+}
+
+
 template<class ZoneType, class MeshType>
 Foam::label Foam::ZoneMesh<ZoneType, MeshType>::findZoneID
 (
@@ -265,7 +326,7 @@ Foam::label Foam::ZoneMesh<ZoneType, MeshType>::findZoneID
             << "List of available zone names: " << names() << endl;
     }
 
-    // A dummy return to keep the compiler happy
+    // not found
     return -1;
 }
 
diff --git a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H
index 03b9c216bec..8854d9533b0 100644
--- a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H
+++ b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H
@@ -121,8 +121,8 @@ public:
         //  Return -1 if the object is not in the zone
         const Map<label>& zoneMap() const;
 
-        //- Given a global object index, return the zone it is in.  If
-        //object does not belong to any zones, return -1
+        //- Given a global object index, return the zone it is in.
+        // If object does not belong to any zones, return -1
         label whichZone(const label objectIndex) const;
 
         //- Return a list of zone types
@@ -134,6 +134,12 @@ public:
         //- Find zone index given a name
         label findZoneID(const word& zoneName) const;
 
+        //- Return zone indices for all matches
+        labelList findIndices(const keyType&) const;
+
+        //- Return zone index for the first match, return -1 if not found
+        label findIndex(const keyType&) const;
+
         //- Clear addressing
         void clearAddressing();
 
diff --git a/src/finiteVolume/cfdTools/general/porousMedia/porousZone.C b/src/finiteVolume/cfdTools/general/porousMedia/porousZone.C
index b7aef808507..4e1020a4f10 100644
--- a/src/finiteVolume/cfdTools/general/porousMedia/porousZone.C
+++ b/src/finiteVolume/cfdTools/general/porousMedia/porousZone.C
@@ -71,7 +71,7 @@ Foam::porousZone::porousZone
     key_(key),
     mesh_(mesh),
     dict_(dict),
-    cellZoneIds_(0),
+    cellZoneIds_(mesh_.cellZones().findIndices(key_)),
     coordSys_(dict, mesh),
     porosity_(1),
     intensity_(0),
@@ -83,24 +83,6 @@ Foam::porousZone::porousZone
 {
     Info<< "Creating porous zone: " << key_ << endl;
 
-    if (key_.isPattern())
-    {
-        cellZoneIds_ = findStrings
-        (
-            key_,
-            mesh_.cellZones().names()
-        );
-    }
-    else
-    {
-        const label zoneId = mesh_.cellZones().findZoneID(key_);
-        if (zoneId != -1)
-        {
-            cellZoneIds_.setSize(1);
-            cellZoneIds_[0] = zoneId;
-        }
-    }
-
     bool foundZone = !cellZoneIds_.empty();
     reduce(foundZone, orOp<bool>());
 
diff --git a/src/meshTools/coordinateSystems/coordinateSystem.C b/src/meshTools/coordinateSystems/coordinateSystem.C
index 0a5fe400f7e..1fbe52dfe9f 100644
--- a/src/meshTools/coordinateSystems/coordinateSystem.C
+++ b/src/meshTools/coordinateSystems/coordinateSystem.C
@@ -142,17 +142,17 @@ Foam::coordinateSystem::coordinateSystem
         keyType key(entryPtr->stream());
 
         const coordinateSystems& lst = coordinateSystems::New(obr);
-        const label id = lst.find(key);
+        const label index = lst.findIndex(key);
 
         if (debug)
         {
             Info<< "coordinateSystem::coordinateSystem"
                 "(const dictionary&, const objectRegistry&):"
                 << nl << "using global coordinate system: "
-                << key << "=" << id << endl;
+                << key << "=" << index << endl;
         }
 
-        if (id < 0)
+        if (index < 0)
         {
             FatalErrorIn
             (
@@ -165,7 +165,7 @@ Foam::coordinateSystem::coordinateSystem
 
         // copy coordinateSystem, but assign the name as the typeName
         // to avoid strange things in writeDict()
-        operator=(lst[id]);
+        operator=(lst[index]);
         name_ = typeName_();
     }
     else
diff --git a/src/meshTools/coordinateSystems/coordinateSystems.C b/src/meshTools/coordinateSystems/coordinateSystems.C
index 4d829004081..82b52fc7232 100644
--- a/src/meshTools/coordinateSystems/coordinateSystems.C
+++ b/src/meshTools/coordinateSystems/coordinateSystems.C
@@ -100,58 +100,64 @@ const Foam::coordinateSystems& Foam::coordinateSystems::New
 
 Foam::label Foam::coordinateSystems::find(const keyType& key) const
 {
+    return findIndex(key);
+}
+
+
+Foam::labelList Foam::coordinateSystems::findIndices(const keyType& key) const
+{
+    labelList indices;
     if (key.isPattern())
     {
-        labelList allFound = findAll(key);
-        // return first element
-        if (!allFound.empty())
-        {
-            return allFound[0];
-        }
+        indices = findStrings(key, toc());
     }
     else
     {
+        indices.setSize(size());
+        label nFound = 0;
         forAll(*this, i)
         {
             if (key == operator[](i).name())
             {
-                return i;
+                indices[nFound++] = i;
             }
         }
+        indices.setSize(nFound);
     }
 
-    return -1;
+    return indices;
 }
 
 
-Foam::labelList Foam::coordinateSystems::findAll(const keyType& key) const
+Foam::label Foam::coordinateSystems::findIndex(const keyType& key) const
 {
-    labelList allFound;
     if (key.isPattern())
     {
-        allFound = findStrings(key, toc());
+        labelList indices = findIndices(key);
+        // return first element
+        if (!indices.empty())
+        {
+            return indices[0];
+        }
     }
     else
     {
-        allFound.setSize(size());
-        label nFound = 0;
         forAll(*this, i)
         {
             if (key == operator[](i).name())
             {
-                allFound[nFound++] = i;
+                return i;
             }
         }
-        allFound.setSize(nFound);
     }
 
-    return allFound;
+    return -1;
 }
 
 
 bool Foam::coordinateSystems::found(const keyType& key) const
 {
-    return find(key) >= 0;
+    return findIndex(key) != -1;
 }
 
 
diff --git a/src/meshTools/coordinateSystems/coordinateSystems.H b/src/meshTools/coordinateSystems/coordinateSystems.H
index 2976a6f94ef..46ca3a4e73e 100644
--- a/src/meshTools/coordinateSystems/coordinateSystems.H
+++ b/src/meshTools/coordinateSystems/coordinateSystems.H
@@ -97,12 +97,16 @@ public:
 
     // Member Functions
 
+        //- Find and return indices for all matches
+        labelList findIndices(const keyType& key) const;
+
+        //- Find and return index for the first match, return -1 if not found
+        label findIndex(const keyType& key) const;
+
         //- Find and return index for the first match, returns -1 if not found
+        // @deprecated use findIndex() instead (deprecated Jul 2010)
         label find(const keyType& key) const;
 
-        //- Find and return indices for all matches
-        labelList findAll(const keyType& key) const;
-
         //- Search for given key
         bool found(const keyType& key) const;
 
-- 
GitLab