From 730231446a250e6a245095f0a21d448f99d8b982 Mon Sep 17 00:00:00 2001
From: Andrew Heather <a.heather@opencfd.co.uk>
Date: Wed, 14 Dec 2016 15:28:55 +0000
Subject: [PATCH] ENH: extractEulerianParticles function object parallel and
 usability updates

---
 .../eulerianParticle/eulerianParticle.C       | 10 +--
 .../eulerianParticle/eulerianParticle.H       |  4 +-
 .../eulerianParticleTemplates.C               |  6 +-
 .../extractEulerianParticles.C                | 64 ++++++-------------
 .../extractEulerianParticles.H                |  8 +--
 5 files changed, 31 insertions(+), 61 deletions(-)

diff --git a/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.C b/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.C
index 3d925f78d92..49c2b61433f 100644
--- a/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.C
+++ b/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.C
@@ -32,7 +32,7 @@ using namespace Foam::constant;
 
 Foam::functionObjects::eulerianParticle::eulerianParticle()
 :
-    globalFaceIHit(-1),
+    faceIHit(-1),
     VC(vector::zero),
     VU(vector::zero),
     V(0),
@@ -48,7 +48,7 @@ Foam::Ostream& Foam::operator<<
     const functionObjects::eulerianParticle& p
 )
 {
-    os  << p.globalFaceIHit << token::SPACE
+    os  << p.faceIHit << token::SPACE
         << p.VC << token::SPACE
         << p.VU << token::SPACE
         << p.V << token::SPACE
@@ -64,7 +64,7 @@ Foam::Istream& Foam::operator>>
     functionObjects::eulerianParticle& p
 )
 {
-    is  >> p.globalFaceIHit
+    is  >> p.faceIHit
         >> p.VC
         >> p.VU
         >> p.V
@@ -81,7 +81,7 @@ void Foam::functionObjects::eulerianParticle::write(Ostream& os) const
     vector C = VC/(V + ROOTVSMALL);
 
     os  << time << token::SPACE
-        << globalFaceIHit << token::SPACE
+        << faceIHit << token::SPACE
         << C << token::SPACE
         << pDiameter << token::SPACE
         << U << token::SPACE
@@ -97,7 +97,7 @@ Foam::dictionary Foam::functionObjects::eulerianParticle::writeDict() const
 
     dictionary dict;
     dict.add("time", time);
-    dict.add("meshFace", globalFaceIHit);
+    dict.add("meshFace", faceIHit);
     dict.add("position", C);
     dict.add("diameter", pDiameter);
     dict.add("U", U);
diff --git a/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.H b/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.H
index f90e83f122a..2a65297a423 100644
--- a/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.H
+++ b/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticle.H
@@ -78,7 +78,7 @@ public:
         //  identify the index of the coarse face of the surface agglomeration
         //  Note: value of -1 used to indicate that the particle has not
         //        been initialised
-        label globalFaceIHit;
+        label faceIHit;
 
         //- Volume multiplied by face centres [m4]
         vector VC;
@@ -115,7 +115,7 @@ public:
         )
         {
             return
-                a.globalFaceIHit == b.globalFaceIHit
+                a.faceIHit == b.faceIHit
              && a.VC == b.VC
              && a.VU == b.VU
              && a.V == b.V
diff --git a/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticleTemplates.C b/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticleTemplates.C
index d0fbee15fef..c4f525e0911 100644
--- a/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticleTemplates.C
+++ b/src/functionObjects/field/extractEulerianParticles/eulerianParticle/eulerianParticleTemplates.C
@@ -40,15 +40,15 @@ class sumParticleOp
         const eulerianParticle& p1
     ) const
     {
-        if ((p0.globalFaceIHit != -1) && (p1.globalFaceIHit == -1))
+        if ((p0.faceIHit != -1) && (p1.faceIHit == -1))
         {
             return p0;
         }
-        else if ((p0.globalFaceIHit == -1) && (p1.globalFaceIHit != -1))
+        else if ((p0.faceIHit == -1) && (p1.faceIHit != -1))
         {
             return p1;
         }
-        else if ((p0.globalFaceIHit != -1) && (p1.globalFaceIHit != -1))
+        else if ((p0.faceIHit != -1) && (p1.faceIHit != -1))
         {
             // Choose particle with the largest collected volume and
             // accumulate total volume
diff --git a/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C b/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C
index 5414b5eb490..f71fcbeef46 100644
--- a/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C
+++ b/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.C
@@ -57,7 +57,7 @@ namespace functionObjects
 Foam::fileName
 Foam::functionObjects::extractEulerianParticles::dictBaseFileDir() const
 {
-    fileName baseDir(".."); //  = obr_.time().path();
+    fileName baseDir(".."); //  = mesh_.time().path();
 
     if (Pstream::parRun())
     {
@@ -83,7 +83,7 @@ void Foam::functionObjects::extractEulerianParticles::checkFaceZone()
     {
         FatalErrorInFunction
             << "Unable to find faceZone " << faceZoneName_
-            << ".  Available faceZones are: "
+            << ".  Available faceZones are: " << mesh_.faceZones().names()
             << exit(FatalError);
     }
 
@@ -109,9 +109,6 @@ void Foam::functionObjects::extractEulerianParticles::checkFaceZone()
     // Initialise old iteration blocked faces
     // Note: for restart, this info needs to be written/read
     regions0_.setSize(fz.size(), -1);
-
-    // Create global addressing for faceZone
-    globalFaces_ = globalIndex(fz.size());
 }
 
 
@@ -169,26 +166,8 @@ void Foam::functionObjects::extractEulerianParticles::initialiseBins()
     {
         fineToCoarseAddr_ = ppa.restrictTopBottomAddressing();
         nCoarseFaces = max(fineToCoarseAddr_) + 1;
-
-        // Set coarse face centres as area average of fine face centres
-        const vectorField& faceCentres = mesh_.faceCentres();
-        const vectorField& faceAreas = mesh_.faceAreas();
-        coarsePosition_.setSize(nCoarseFaces);
-        coarsePosition_ = vector::zero;
-        scalarField coarseArea(nCoarseFaces, 0);
-        forAll(fz, i)
-        {
-            const label facei = fz[i];
-            const label coarseFacei = fineToCoarseAddr_[i];
-            const scalar magSf = mag(faceAreas[facei]);
-            coarseArea[coarseFacei] += magSf;
-            coarsePosition_[coarseFacei] += magSf*faceCentres[facei];
-        }
-
-        coarsePosition_ /= coarseArea + ROOTVSMALL;
     }
 
-    // Create global addressing for coarse face addressing
     globalCoarseFaces_ = globalIndex(nCoarseFaces);
 
     Info<< "Created " << returnReduce(nCoarseFaces, sumOp<label>())
@@ -302,20 +281,15 @@ void Foam::functionObjects::extractEulerianParticles::collectParticles
         }
 
         Map<label>::const_iterator iter = regionToParticleMap_.find(regioni);
+        eulerianParticle p = particles_[iter()];
 
-        eulerianParticle p;
-        if (iter != Map<label>::end())
+        if (p.faceIHit != -1 && nInjectorLocations_)
         {
-            // Particle on local processor
-            p = particles_[iter()];
-
-            if (nInjectorLocations_)
-            {
-                // Use coarse face index and position for output
-                p.globalFaceIHit = fineToCoarseAddr_[p.globalFaceIHit];
-                p.VC = p.V*coarsePosition_[p.globalFaceIHit];
-            }
+            // Use coarse face index for tag output
+            label coarseFacei = fineToCoarseAddr_[p.faceIHit];
+            p.faceIHit = globalCoarseFaces_.toGlobal(coarseFacei);
         }
+
         reduce(p, sumParticleOp<eulerianParticle>());
 
         const scalar pDiameter = cbrt(6.0*p.V/constant::mathematical::pi);
@@ -330,8 +304,9 @@ void Foam::functionObjects::extractEulerianParticles::collectParticles
                 label tag = -1;
                 if (nInjectorLocations_)
                 {
-                    tag = p.globalFaceIHit;
+                    tag = p.faceIHit;
                 }
+
                 injectedParticle* ip = new injectedParticle
                 (
                     mesh_,
@@ -525,10 +500,10 @@ void Foam::functionObjects::extractEulerianParticles::accumulateParticleInfo
             const label meshFacei = fz[localFacei];
             eulerianParticle& p = particles_[particlei];
 
-            if (p.globalFaceIHit < 0)
+            if (p.faceIHit < 0)
             {
                 // New particle - does not exist in particles_ list
-                p.globalFaceIHit = globalFaces_.toGlobal(localFacei);
+                p.faceIHit = localFacei;
                 p.V = 0;
                 p.VC = vector::zero;
                 p.VU = vector::zero;
@@ -569,7 +544,6 @@ Foam::functionObjects::extractEulerianParticles::extractEulerianParticles
     phiName_("phi"),
     nInjectorLocations_(0),
     fineToCoarseAddr_(),
-    coarsePosition_(),
     globalCoarseFaces_(),
     regions0_(),
     nRegions0_(0),
@@ -610,13 +584,13 @@ bool Foam::functionObjects::extractEulerianParticles::read
     if (fvMeshFunctionObject::read(dict) && writeFile::read(dict))
     {
         dict.lookup("faceZone") >> faceZoneName_;
-        dict.readIfPresent("nLocations", nInjectorLocations_);
         dict.lookup("alpha") >> alphaName_;
-        dict.readIfPresent("alphaThreshold", alphaThreshold_);
-        dict.lookup("U") >> UName_;
-        dict.lookup("rho") >> rhoName_;
-        dict.lookup("phi") >> phiName_;
 
+        dict.readIfPresent("alphaThreshold", alphaThreshold_);
+        dict.readIfPresent("U", UName_);
+        dict.readIfPresent("rho", rhoName_);
+        dict.readIfPresent("phi", phiName_);
+        dict.readIfPresent("nLocations", nInjectorLocations_);
         dict.readIfPresent("minDiameter", minDiameter_);
         dict.readIfPresent("maxDiameter", maxDiameter_);
 
@@ -641,7 +615,7 @@ bool Foam::functionObjects::extractEulerianParticles::execute()
     Log << type() << " " << name() << " output:" << nl;
 
     const volScalarField& alpha =
-        obr_.lookupObject<volScalarField>(alphaName_);
+        mesh_.lookupObject<volScalarField>(alphaName_);
 
     const surfaceScalarField alphaf
     (
@@ -663,6 +637,8 @@ bool Foam::functionObjects::extractEulerianParticles::execute()
     // Split the  faceZone according to the blockedFaces
     // - Returns a list of (disconnected) region index per face zone face
     regionSplit2D regionFaceIDs(mesh_, patch, blockedFaces);
+
+    // Global number of regions
     const label nRegionsNew = regionFaceIDs.nRegions();
 
     // Calculate the addressing between the old and new region information
diff --git a/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.H b/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.H
index 7b440f067a0..3e5e9070120 100644
--- a/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.H
+++ b/src/functionObjects/field/extractEulerianParticles/extractEulerianParticles/extractEulerianParticles.H
@@ -113,9 +113,6 @@ protected:
             //- Patch face indices where faceZone face intersect patch
             labelList patchFaceIDs_;
 
-            //- Global face addressing
-            globalIndex globalFaces_;
-
 
         // Field names
 
@@ -140,12 +137,9 @@ protected:
             //- Number of sample locations to generate
             label nInjectorLocations_;
 
-            //- Agglomeration addressing from fine to coarse
+            //- Agglomeration addressing from fine to coarse (local proc only)
             labelList fineToCoarseAddr_;
 
-            //- Coarse face positions
-            vectorField coarsePosition_;
-
             //- Global coarse face addressing
             globalIndex globalCoarseFaces_;
 
-- 
GitLab