From 1083147aa1bad0354cc18e9e580dcf17a1f011fd Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Mon, 22 Jun 2009 11:53:21 +0100
Subject: [PATCH] added proc-local id and orig proc id to particle base class

---
 src/lagrangian/basic/IOPosition/IOPosition.C | 73 +++++++++++++++++++-
 src/lagrangian/basic/IOPosition/IOPosition.H | 36 ++++++----
 src/lagrangian/basic/Particle/Particle.C     | 16 ++++-
 src/lagrangian/basic/Particle/Particle.H     | 19 ++++-
 src/lagrangian/basic/Particle/ParticleI.H    | 70 +++++++++++--------
 src/lagrangian/basic/Particle/ParticleIO.C   | 33 ++++++---
 6 files changed, 185 insertions(+), 62 deletions(-)

diff --git a/src/lagrangian/basic/IOPosition/IOPosition.C b/src/lagrangian/basic/IOPosition/IOPosition.C
index 7865a12105f..810a9fbcf55 100644
--- a/src/lagrangian/basic/IOPosition/IOPosition.C
+++ b/src/lagrangian/basic/IOPosition/IOPosition.C
@@ -22,12 +22,77 @@ License
     along with OpenFOAM; if not, write to the Free Software Foundation,
     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
-Description
-
 \*---------------------------------------------------------------------------*/
 
 #include "IOPosition.H"
 
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<class ParticleType>
+Foam::word Foam::IOPosition<ParticleType>::particlePropertiesName
+(
+    "particleProperties"
+);
+
+// * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * * * //
+
+template<class ParticleType>
+void Foam::IOPosition<ParticleType>::readParticleProperties()
+{
+    IOobject propsDictHeader
+    (
+        particlePropertiesName,
+        cloud_.db().time().timeName(),
+        "uniform"/cloud::prefix/cloud_.name(),
+        cloud_.db(),
+        IOobject::MUST_READ,
+        IOobject::NO_WRITE,
+        false
+    );
+
+    if (propsDictHeader.headerOk())
+    {
+        const IOdictionary propsDict(propsDictHeader);
+
+        word procName("processor" + Foam::name(Pstream::myProcNo()));
+        if (propsDict.found(procName))
+        {
+            propsDict.subDict(procName).lookup("particleCount")
+                >> Particle<ParticleType>::particleCount;
+        }
+    }
+}
+
+
+template<class ParticleType>
+void Foam::IOPosition<ParticleType>::writeParticleProperties() const
+{
+    IOdictionary propsDict
+    (
+        IOobject
+        (
+            particlePropertiesName,
+            cloud_.db().time().timeName(),
+            "uniform"/cloud::prefix/cloud_.name(),
+            cloud_.db(),
+            IOobject::NO_READ,
+            IOobject::NO_WRITE,
+            false
+        )
+    );
+
+    word procName("processor" + Foam::name(Pstream::myProcNo()));
+    propsDict.add(procName, dictionary());
+    propsDict.subDict(procName).add
+    (
+        "particleCount",
+        Particle<ParticleType>::particleCount
+    );
+
+    propsDict.regIOobject::write();
+}
+
+
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
 template<class ParticleType>
@@ -70,6 +135,8 @@ bool Foam::IOPosition<ParticleType>::write() const
 template<class ParticleType>
 bool Foam::IOPosition<ParticleType>::writeData(Ostream& os) const
 {
+    writeParticleProperties();
+
     os<< cloud_.size() << nl << token::BEGIN_LIST << nl;
 
     forAllConstIter(typename Cloud<ParticleType>, cloud_, iter)
@@ -90,6 +157,8 @@ void Foam::IOPosition<ParticleType>::readData
     bool checkClass
 )
 {
+    readParticleProperties();
+
     Istream& is = readStream(checkClass ? typeName : "");
 
     token firstToken(is);
diff --git a/src/lagrangian/basic/IOPosition/IOPosition.H b/src/lagrangian/basic/IOPosition/IOPosition.H
index 5123644385f..069dc0135df 100644
--- a/src/lagrangian/basic/IOPosition/IOPosition.H
+++ b/src/lagrangian/basic/IOPosition/IOPosition.H
@@ -59,30 +59,38 @@ class IOPosition
         const Cloud<ParticleType>& cloud_;
 
 
+    // Private member functions
+
+        //- Read particle properties dictionary
+        void readParticleProperties();
+
+        //- Write particle properties dictionary
+        void writeParticleProperties() const;
+
+
 public:
 
-    //- Runtime type name information
-    virtual const word& type() const
-    {
-        return cloud_.type();
-    }
+    // Static data
+
+        //- Runtime type name information
+        virtual const word& type() const
+        {
+            return cloud_.type();
+        }
+
+        //- Name of particle properties dictionary
+        static word particlePropertiesName;
+
 
     // Constructors
 
         //- Construct from cloud
-        IOPosition
-        (
-            const Cloud<ParticleType>&
-        );
+        IOPosition(const Cloud<ParticleType>&);
 
 
     // Member functions
 
-        void readData
-        (
-            Cloud<ParticleType>& c,
-            bool checkClass
-        );
+        void readData(Cloud<ParticleType>& c, bool checkClass);
 
         bool write() const;
 
diff --git a/src/lagrangian/basic/Particle/Particle.C b/src/lagrangian/basic/Particle/Particle.C
index ee85abda689..4b51b88a451 100644
--- a/src/lagrangian/basic/Particle/Particle.C
+++ b/src/lagrangian/basic/Particle/Particle.C
@@ -33,6 +33,12 @@ License
 #include "wallPolyPatch.H"
 #include "transform.H"
 
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+template<class ParticleType>
+Foam::label Foam::Particle<ParticleType>::particleCount = 0;
+
+
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 template<class ParticleType>
@@ -69,7 +75,7 @@ void Foam::Particle<ParticleType>::findFaces
     DynamicList<label>& faceList
 ) const
 {
-    const polyMesh& mesh = cloud_.polyMesh_;
+    const polyMesh& mesh = cloud_.mesh();
     const labelList& faces = mesh.cells()[celli];
     const vector& C = mesh.cellCentres()[celli];
 
@@ -176,7 +182,9 @@ Foam::Particle<ParticleType>::Particle
     position_(position),
     celli_(celli),
     facei_(-1),
-    stepFraction_(0.0)
+    stepFraction_(0.0),
+    origProc_(Pstream::myProcNo()),
+    origId_(particleCount++)
 {}
 
 
@@ -187,7 +195,9 @@ Foam::Particle<ParticleType>::Particle(const Particle<ParticleType>& p)
     position_(p.position_),
     celli_(p.celli_),
     facei_(p.facei_),
-    stepFraction_(p.stepFraction_)
+    stepFraction_(p.stepFraction_),
+    origProc_(p.origProc_),
+    origId_(p.origId_)
 {}
 
 
diff --git a/src/lagrangian/basic/Particle/Particle.H b/src/lagrangian/basic/Particle/Particle.H
index f061c06b68b..71011d72a46 100644
--- a/src/lagrangian/basic/Particle/Particle.H
+++ b/src/lagrangian/basic/Particle/Particle.H
@@ -127,6 +127,12 @@ protected:
         //- Fraction of time-step completed
         scalar stepFraction_;
 
+        //- Originating processor id
+        label origProc_;
+
+        //- Local particle id on originating processor
+        label origId_;
+
 
     // Private member functions
 
@@ -267,11 +273,14 @@ public:
 
     // Static data members
 
+        //- Runtime type information
+        TypeName("Particle");
+
         //- String representation of properties
         static string propHeader;
 
-        //- Runtime type information
-        TypeName("Particle");
+        //- Cumulative particle count used for particle id
+        static label particleCount;
 
 
     // Constructors
@@ -396,6 +405,12 @@ public:
             //-  Return the fraction of time-step completed
             inline scalar stepFraction() const;
 
+            //- Return the originating processor id
+            inline label origProc() const;
+
+            //- Return the particle id on originating processor
+            inline label origId() const;
+
 
         // Track
 
diff --git a/src/lagrangian/basic/Particle/ParticleI.H b/src/lagrangian/basic/Particle/ParticleI.H
index 0eb89127173..65ac64e5251 100644
--- a/src/lagrangian/basic/Particle/ParticleI.H
+++ b/src/lagrangian/basic/Particle/ParticleI.H
@@ -26,15 +26,10 @@ License
 
 #include "polyMesh.H"
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-namespace Foam
-{
-
 // * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
 
 template<class ParticleType>
-inline scalar Particle<ParticleType>::lambda
+inline Foam::scalar Foam::Particle<ParticleType>::lambda
 (
     const vector& from,
     const vector& to,
@@ -182,7 +177,7 @@ inline scalar Particle<ParticleType>::lambda
 
 
 template<class ParticleType>
-inline scalar Particle<ParticleType>::lambda
+inline Foam::scalar Foam::Particle<ParticleType>::lambda
 (
     const vector& from,
     const vector& to,
@@ -234,7 +229,7 @@ inline scalar Particle<ParticleType>::lambda
 
 
 template<class ParticleType>
-inline bool Particle<ParticleType>::inCell() const
+inline bool Foam::Particle<ParticleType>::inCell() const
 {
     DynamicList<label>& faces = cloud_.labels_;
     findFaces(position_, faces);
@@ -244,7 +239,7 @@ inline bool Particle<ParticleType>::inCell() const
 
 
 template<class ParticleType>
-inline bool Particle<ParticleType>::inCell
+inline bool Foam::Particle<ParticleType>::inCell
 (
     const vector& position,
     const label celli,
@@ -261,7 +256,7 @@ inline bool Particle<ParticleType>::inCell
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class ParticleType>
-inline Particle<ParticleType>::trackData::trackData
+inline Foam::Particle<ParticleType>::trackData::trackData
 (
     Cloud<ParticleType>& cloud
 )
@@ -269,8 +264,10 @@ inline Particle<ParticleType>::trackData::trackData
     cloud_(cloud)
 {}
 
+
 template<class ParticleType>
-inline Cloud<ParticleType>& Particle<ParticleType>::trackData::cloud()
+inline Foam::Cloud<ParticleType>&
+Foam::Particle<ParticleType>::trackData::cloud()
 {
     return cloud_;
 }
@@ -279,76 +276,92 @@ inline Cloud<ParticleType>& Particle<ParticleType>::trackData::cloud()
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class ParticleType>
-inline const Cloud<ParticleType>& Particle<ParticleType>::cloud() const
+inline const Foam::Cloud<ParticleType>&
+Foam::Particle<ParticleType>::cloud() const
 {
     return cloud_;
 }
 
 
 template<class ParticleType>
-inline const vector& Particle<ParticleType>::position() const
+inline const Foam::vector& Foam::Particle<ParticleType>::position() const
 {
     return position_;
 }
 
 
 template<class ParticleType>
-inline vector& Particle<ParticleType>::position()
+inline Foam::vector& Foam::Particle<ParticleType>::position()
 {
     return position_;
 }
 
 
 template<class ParticleType>
-inline label Particle<ParticleType>::cell() const
+inline Foam::label Foam::Particle<ParticleType>::cell() const
 {
     return celli_;
 }
 
+
 template<class ParticleType>
-inline label& Particle<ParticleType>::cell()
+inline Foam::label& Foam::Particle<ParticleType>::cell()
 {
     return celli_;
 }
 
 
 template<class ParticleType>
-inline label Particle<ParticleType>::face() const
+inline Foam::label Foam::Particle<ParticleType>::face() const
 {
     return facei_;
 }
 
 
 template<class ParticleType>
-inline bool Particle<ParticleType>::onBoundary() const
+inline bool Foam::Particle<ParticleType>::onBoundary() const
 {
     return facei_ != -1 && facei_ >= cloud_.pMesh().nInternalFaces();
 }
 
 
 template<class ParticleType>
-inline scalar& Particle<ParticleType>::stepFraction()
+inline Foam::scalar& Foam::Particle<ParticleType>::stepFraction()
 {
     return stepFraction_;
 }
 
 
 template<class ParticleType>
-inline scalar Particle<ParticleType>::stepFraction() const
+inline Foam::scalar Foam::Particle<ParticleType>::stepFraction() const
 {
     return stepFraction_;
 }
 
 
 template<class ParticleType>
-inline bool Particle<ParticleType>::softImpact() const
+inline Foam::label Foam::Particle<ParticleType>::origProc() const
+{
+    return origProc_;
+}
+
+
+template<class ParticleType>
+inline Foam::label Foam::Particle<ParticleType>::origId() const
+{
+    return origId_;
+}
+
+
+template<class ParticleType>
+inline bool Foam::Particle<ParticleType>::softImpact() const
 {
     return false;
 }
 
 
 template<class ParticleType>
-inline scalar Particle<ParticleType>::currentTime() const
+inline Foam::scalar Foam::Particle<ParticleType>::currentTime() const
 {
     return
         cloud_.pMesh().time().value()
@@ -357,14 +370,14 @@ inline scalar Particle<ParticleType>::currentTime() const
 
 
 template<class ParticleType>
-inline label Particle<ParticleType>::patch(const label facei) const
+inline Foam::label Foam::Particle<ParticleType>::patch(const label facei) const
 {
     return cloud_.facePatch(facei);
 }
 
 
 template<class ParticleType>
-inline label Particle<ParticleType>::patchFace
+inline Foam::label Foam::Particle<ParticleType>::patchFace
 (
     const label patchi,
     const label facei
@@ -375,21 +388,18 @@ inline label Particle<ParticleType>::patchFace
 
 
 template<class ParticleType>
-inline scalar Particle<ParticleType>::wallImpactDistance(const vector&) const
+inline Foam::scalar
+Foam::Particle<ParticleType>::wallImpactDistance(const vector&) const
 {
     return 0.0;
 }
 
 
 template<class ParticleType>
-inline label Particle<ParticleType>::faceInterpolation() const
+inline Foam::label Foam::Particle<ParticleType>::faceInterpolation() const
 {
     return facei_;
 }
 
 
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-} // End namespace Foam
-
 // ************************************************************************* //
diff --git a/src/lagrangian/basic/Particle/ParticleIO.C b/src/lagrangian/basic/Particle/ParticleIO.C
index 70e635dc947..5865cf5098a 100644
--- a/src/lagrangian/basic/Particle/ParticleIO.C
+++ b/src/lagrangian/basic/Particle/ParticleIO.C
@@ -31,12 +31,11 @@ License
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
 template<class ParticleType>
-Foam::string Foam::Particle<ParticleType>::propHeader = "(Px Py Pz) cellI";
-
+Foam::string Foam::Particle<ParticleType>::propHeader =
+    "(Px Py Pz) cellI origProc origId";
 
 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
 
-// Construct from Istream
 template<class ParticleType>
 Foam::Particle<ParticleType>::Particle
 (
@@ -47,20 +46,26 @@ Foam::Particle<ParticleType>::Particle
 :
     cloud_(cloud),
     facei_(-1),
-    stepFraction_(0.0)
+    stepFraction_(0.0),
+    origProc_(Pstream::myProcNo()),
+    origId_(-1)
 {
     if (is.format() == IOstream::ASCII)
     {
-        is >> position_ >> celli_;
+        is >> position_ >> celli_ >> origProc_ >> origId_;
     }
     else
     {
-        // In binary read both celli_ and facei_, needed for parallel transfer
+        // In binary read all particle data - needed for parallel transfer
         is.read
         (
             reinterpret_cast<char*>(&position_),
-            sizeof(position_) + sizeof(celli_)
-          + sizeof(facei_) + sizeof(stepFraction_)
+            sizeof(position_)
+            + sizeof(celli_)
+            + sizeof(facei_)
+            + sizeof(stepFraction_)
+            + sizeof(origProc_)
+            + sizeof(origId_)
         );
     }
 
@@ -92,7 +97,9 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const Particle<ParticleType>& p)
     if (os.format() == IOstream::ASCII)
     {
         os << p.position_
-           << token::SPACE << p.celli_;
+           << token::SPACE << p.celli_
+           << token::SPACE << p.origProc_
+           << token::SPACE << p.origId_;
     }
     else
     {
@@ -100,8 +107,12 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const Particle<ParticleType>& p)
         os.write
         (
             reinterpret_cast<const char*>(&p.position_),
-            sizeof(p.position_) + sizeof(p.celli_)
-          + sizeof(p.facei_) + sizeof(p.stepFraction_)
+            sizeof(p.position_)
+          + sizeof(p.celli_)
+          + sizeof(p.facei_)
+          + sizeof(p.stepFraction_)
+          + sizeof(p.origProc_)
+          + sizeof(p.origId_)
         );
     }
 
-- 
GitLab