From a64dfb526c01922c67b05ec431c080ef44dd435b Mon Sep 17 00:00:00 2001
From: mattijs <mattijs@hunt.opencfd.co.uk>
Date: Fri, 19 Jun 2009 12:01:29 +0100
Subject: [PATCH] findFaces without allocation

---
 src/lagrangian/basic/Cloud/Cloud.H        |  3 +++
 src/lagrangian/basic/Particle/Particle.C  | 25 +++++++++--------------
 src/lagrangian/basic/Particle/Particle.H  | 14 +++++++------
 src/lagrangian/basic/Particle/ParticleI.H |  6 ++++--
 4 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/src/lagrangian/basic/Cloud/Cloud.H b/src/lagrangian/basic/Cloud/Cloud.H
index f0ca222d910..e298affe7d2 100644
--- a/src/lagrangian/basic/Cloud/Cloud.H
+++ b/src/lagrangian/basic/Cloud/Cloud.H
@@ -78,6 +78,9 @@ class Cloud
         const unallocLabelList& owner_;
         const unallocLabelList& neighbour_;
 
+        //- Temporary storage for addressing. Used in findFaces.
+        mutable DynamicList<label> labels_;
+
 
     // Private member functions
 
diff --git a/src/lagrangian/basic/Particle/Particle.C b/src/lagrangian/basic/Particle/Particle.C
index ea53ec3ee4d..ee85abda689 100644
--- a/src/lagrangian/basic/Particle/Particle.C
+++ b/src/lagrangian/basic/Particle/Particle.C
@@ -36,16 +36,17 @@ License
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 template<class ParticleType>
-Foam::labelList Foam::Particle<ParticleType>::findFaces
+void Foam::Particle<ParticleType>::findFaces
 (
-    const vector& position
+    const vector& position,
+    DynamicList<label>& faceList
 ) const
 {
     const polyMesh& mesh = cloud_.polyMesh_;
     const labelList& faces = mesh.cells()[celli_];
     const vector& C = mesh.cellCentres()[celli_];
 
-    DynamicList<label> faceList(10);
+    faceList.clear();
     forAll(faces, i)
     {
         label facei = faces[i];
@@ -56,26 +57,23 @@ Foam::labelList Foam::Particle<ParticleType>::findFaces
             faceList.append(facei);
         }
     }
-
-    faceList.shrink();
-
-    return faceList;
 }
 
 
 template<class ParticleType>
-Foam::labelList Foam::Particle<ParticleType>::findFaces
+void Foam::Particle<ParticleType>::findFaces
 (
     const vector& position,
     const label celli,
-    const scalar stepFraction
+    const scalar stepFraction,
+    DynamicList<label>& faceList
 ) const
 {
     const polyMesh& mesh = cloud_.polyMesh_;
     const labelList& faces = mesh.cells()[celli];
     const vector& C = mesh.cellCentres()[celli];
 
-    DynamicList<label> faceList(10);
+    faceList.clear();
     forAll(faces, i)
     {
         label facei = faces[i];
@@ -86,10 +84,6 @@ Foam::labelList Foam::Particle<ParticleType>::findFaces
             faceList.append(facei);
         }
     }
-
-    faceList.shrink();
-
-    return faceList;
 }
 
 
@@ -237,7 +231,8 @@ Foam::scalar Foam::Particle<ParticleType>::trackToFace
 {
     const polyMesh& mesh = cloud_.polyMesh_;
 
-    labelList faces = findFaces(endPosition);
+    DynamicList<label>& faces = cloud_.labels_;
+    findFaces(endPosition, faces);
 
     facei_ = -1;
     scalar trackFraction = 0.0;
diff --git a/src/lagrangian/basic/Particle/Particle.H b/src/lagrangian/basic/Particle/Particle.H
index 4d1a8b9be83..f061c06b68b 100644
--- a/src/lagrangian/basic/Particle/Particle.H
+++ b/src/lagrangian/basic/Particle/Particle.H
@@ -151,18 +151,20 @@ protected:
             const label facei
         ) const;
 
-        //- Return the faces between position and cell centre
-        labelList findFaces
+        //- Find the faces between position and cell centre
+        void findFaces
         (
-            const vector& position
+            const vector& position,
+            DynamicList<label>& faceList
         ) const;
 
-        //- Return the faces between position and cell centre
-        labelList findFaces
+        //- Find the faces between position and cell centre
+        void findFaces
         (
             const vector& position,
             const label celli,
-            const scalar stepFraction
+            const scalar stepFraction,
+            DynamicList<label>& faceList
         ) const;
 
 
diff --git a/src/lagrangian/basic/Particle/ParticleI.H b/src/lagrangian/basic/Particle/ParticleI.H
index ce790d67c11..0eb89127173 100644
--- a/src/lagrangian/basic/Particle/ParticleI.H
+++ b/src/lagrangian/basic/Particle/ParticleI.H
@@ -236,7 +236,8 @@ inline scalar Particle<ParticleType>::lambda
 template<class ParticleType>
 inline bool Particle<ParticleType>::inCell() const
 {
-    labelList faces = findFaces(position_);
+    DynamicList<label>& faces = cloud_.labels_;
+    findFaces(position_, faces);
 
     return (!faces.size());
 }
@@ -250,7 +251,8 @@ inline bool Particle<ParticleType>::inCell
     const scalar stepFraction
 ) const
 {
-    labelList faces = findFaces(position, celli, stepFraction);
+    DynamicList<label>& faces = cloud_.labels_;
+    findFaces(position, celli, stepFraction, faces);
 
     return (!faces.size());
 }
-- 
GitLab