From 9ac189015b5dd0a05dc57448a40753c53fad9175 Mon Sep 17 00:00:00 2001
From: andy <andy>
Date: Mon, 19 Aug 2013 17:55:19 +0100
Subject: [PATCH] ENH: updated cloud function objects - particleCollector

---
 .../CollidingParcel/CollidingParcel.C         | 11 ++-
 .../KinematicParcel/KinematicParcel.C         |  4 +-
 .../CloudFunctionObject/CloudFunctionObject.C |  3 +-
 .../CloudFunctionObject/CloudFunctionObject.H |  3 +-
 .../CloudFunctionObjectList.C                 |  5 +-
 .../CloudFunctionObjectList.H                 |  3 +-
 .../ParticleCollector/ParticleCollector.C     | 76 ++++++++++++-------
 .../ParticleCollector/ParticleCollector.H     | 13 ++--
 8 files changed, 75 insertions(+), 43 deletions(-)

diff --git a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C
index 2e544b69063..f04ac77a15b 100644
--- a/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/CollidingParcel/CollidingParcel.C
@@ -100,6 +100,8 @@ bool Foam::CollidingParcel<ParcelType>::move
                 // Apply correction to position for reduced-D cases
                 meshTools::constrainToMeshCentre(mesh, p.position());
 
+                const point start(p.position());
+
                 // Set the Lagrangian time-step
                 scalar dt = min(dtMax, tEnd);
 
@@ -145,7 +147,14 @@ bool Foam::CollidingParcel<ParcelType>::move
 
                 p.age() += dt;
 
-                td.cloud().functions().postMove(p, cellI, dt, td.keepParticle);
+                td.cloud().functions().postMove
+                (
+                    p,
+                    cellI,
+                    dt,
+                    start,
+                    td.keepParticle
+                );
             }
 
             break;
diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
index f866f69d850..8cf9317c866 100644
--- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
+++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
@@ -276,6 +276,8 @@ bool Foam::KinematicParcel<ParcelType>::move
         // Apply correction to position for reduced-D cases
         meshTools::constrainToMeshCentre(mesh, p.position());
 
+        const point start(p.position());
+
         // Set the Lagrangian time-step
         scalar dt = min(dtMax, tEnd);
 
@@ -320,7 +322,7 @@ bool Foam::KinematicParcel<ParcelType>::move
 
         p.age() += dt;
 
-        td.cloud().functions().postMove(p, cellI, dt, td.keepParticle);
+        td.cloud().functions().postMove(p, cellI, dt, start, td.keepParticle);
     }
 
     return td.keepParticle;
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
index 5a208a4ca86..4935aa7b3d2 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -97,6 +97,7 @@ void Foam::CloudFunctionObject<CloudType>::postMove
     const typename CloudType::parcelType&,
     const label,
     const scalar,
+    const point&,
     bool&
 )
 {
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
index 976fd3867ff..a9b2be35228 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -138,6 +138,7 @@ public:
                 const typename CloudType::parcelType& p,
                 const label cellI,
                 const scalar dt,
+                const point& position0,
                 bool& keepParticle
             );
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
index e0d57b60570..3308cf6228c 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -133,12 +133,13 @@ void Foam::CloudFunctionObjectList<CloudType>::postMove
     const typename CloudType::parcelType& p,
     const label cellI,
     const scalar dt,
+    const point& position0,
     bool& keepParticle
 )
 {
     forAll(*this, i)
     {
-        this->operator[](i).postMove(p, cellI, dt, keepParticle);
+        this->operator[](i).postMove(p, cellI, dt, position0, keepParticle);
 
         if (!keepParticle)
         {
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
index de9c3afc025..477afe37a58 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2012 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -115,6 +115,7 @@ public:
                 const typename CloudType::parcelType& p,
                 const label cellI,
                 const scalar dt,
+                const point& position0,
                 bool& keepParticle
             );
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
index 128750c3a6b..68d19890dd7 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
@@ -64,13 +64,29 @@ void Foam::ParticleCollector<CloudType>::makeLogFile
 
             outputFilePtr_()
                 << "# Source     : " << type() << nl
-                << "# Total area : " << sum(area) << nl
-                << "# Time";
+                << "# Total area : " << sum(area) << nl;
 
+            outputFilePtr_() << "# Geometry   :" << nl;
             forAll(faces, i)
             {
                 word id = Foam::name(i);
 
+                outputFilePtr_()
+                    << '#' << tab << "point[" << id << "] = "
+                    << faces[i].centre(points) << nl;
+            }
+
+            outputFilePtr_()<< '#' << nl << "# Time";
+
+            forAll(faces, i)
+            {
+                word id = Foam::name(i);
+
+                if (i != 0)
+                {
+                    outputFilePtr_() << "#";
+                }
+
                 outputFilePtr_()
                     << tab << "area[" << id << "]"
                     << tab << "mass[" << id << "]"
@@ -265,13 +281,10 @@ void Foam::ParticleCollector<CloudType>::initConcentricCircles()
 template<class CloudType>
 Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon
 (
-    const point& position,
-    const vector& U,
-    const scalar dt
+    const point& p1,
+    const point& p2
 ) const
 {
-    point end(position + dt*U);
-
     label dummyNearType = -1;
     label dummyNearLabel = -1;
 
@@ -279,10 +292,10 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon
     {
         const label facePoint0 = faces_[faceI][0];
 
-        const point p0 = points_[facePoint0];
+        const point& pf = points_[facePoint0];
 
-        const scalar d1 = normal_ & (position - p0);
-        const scalar d2 = normal_ & (end - p0);
+        const scalar d1 = normal_ & (p1 - pf);
+        const scalar d2 = normal_ & (p2 - pf);
 
         if (sign(d1) == sign(d2))
         {
@@ -291,7 +304,7 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon
         }
 
         // intersection point
-        point pIntersect = position + (d1/(d1 - d2))*dt*U;
+        const point pIntersect = p1 + (d1/(d1 - d2))*(p2 - p1);
 
         const List<face>& tris = faceTris_[faceI];
 
@@ -320,17 +333,14 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelPolygon
 template<class CloudType>
 Foam::label Foam::ParticleCollector<CloudType>::collectParcelConcentricCircles
 (
-    const point& position,
-    const vector& U,
-    const scalar dt
+    const point& p1,
+    const point& p2
 ) const
 {
     label secI = -1;
 
-    point end(position + dt*U);
-
-    const scalar d1 = normal_ & (position - coordSys_.origin());
-    const scalar d2 = normal_ & (end - coordSys_.origin());
+    const scalar d1 = normal_ & (p1 - coordSys_.origin());
+    const scalar d2 = normal_ & (p2 - coordSys_.origin());
 
     if (sign(d1) == sign(d2))
     {
@@ -339,7 +349,7 @@ Foam::label Foam::ParticleCollector<CloudType>::collectParcelConcentricCircles
     }
 
     // intersection point in cylindrical co-ordinate system
-    point pCyl = coordSys_.localPosition(position + (d1/(d1 - d2))*dt*U);
+    const point pCyl = coordSys_.localPosition(p1 + (d1/(d1 - d2))*(p2 - p1));
 
     scalar r = pCyl[0];
 
@@ -408,6 +418,9 @@ void Foam::ParticleCollector<CloudType>::write()
     Field<scalar> faceMassFlowRate(massFlowRate_.size(), 0.0);
     this->getModelProperty("massFlowRate", faceMassFlowRate);
 
+
+    scalar sumTotalMass = 0.0;
+    scalar sumAverageMFR = 0.0;
     forAll(faces_, faceI)
     {
         scalarList allProcMass(Pstream::nProcs());
@@ -420,10 +433,8 @@ void Foam::ParticleCollector<CloudType>::write()
         Pstream::gatherList(allProcMassFlowRate);
         faceMassFlowRate[faceI] += sum(allProcMassFlowRate);
 
-        Info<< "    face " << faceI
-            << ": total mass = " << faceMassTotal[faceI]
-            << "; average mass flow rate = " << faceMassFlowRate[faceI]
-            << nl;
+        sumTotalMass += faceMassTotal[faceI];
+        sumAverageMFR += faceMassFlowRate[faceI];
 
         if (outputFilePtr_.valid())
         {
@@ -435,7 +446,9 @@ void Foam::ParticleCollector<CloudType>::write()
         }
     }
 
-    Info<< endl;
+    Info<< "    sum(total mass) = " << sumTotalMass << nl
+        << "    sum(average mass flow rate) = " << sumAverageMFR << nl
+        << endl;
 
 
     if (surfaceFormat_ != "none")
@@ -554,16 +567,17 @@ Foam::ParticleCollector<CloudType>::ParticleCollector
     }
     else
     {
-        FatalErrorIn
+        FatalIOErrorIn
         (
             "Foam::ParticleCollector<CloudType>::ParticleCollector"
             "("
                 "const dictionary&,"
                 "CloudType&"
-            ")"
+            ")",
+            this->coeffDict()
         )
             << "Unknown mode " << mode << ".  Available options are "
-            << "polygon and concentricCircle" << exit(FatalError);
+            << "polygon and concentricCircle" << exit(FatalIOError);
     }
 
     mass_.setSize(faces_.size(), 0.0);
@@ -620,6 +634,7 @@ void Foam::ParticleCollector<CloudType>::postMove
     const parcelType& p,
     const label cellI,
     const scalar dt,
+    const point& position0,
     bool& keepParticle
 )
 {
@@ -630,16 +645,19 @@ void Foam::ParticleCollector<CloudType>::postMove
 
     label faceI = -1;
 
+    // slightly extend end position to avoid falling within tracking tolerances
+    const point position1 = position0 + 1.0001*(p.position() - position0);
+
     switch (mode_)
     {
         case mtPolygon:
         {
-            faceI = collectParcelPolygon(p.position(), p.U(), dt);
+            faceI = collectParcelPolygon(position0, position1);
             break;
         }
         case mtConcentricCircle:
         {
-            faceI = collectParcelConcentricCircles(p.position(), p.U(), dt);
+            faceI = collectParcelConcentricCircles(position0, position1);
             break;
         }
         default:
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
index 71e65fe6c70..001973fd0fd 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
@@ -50,7 +50,7 @@ namespace Foam
 {
 
 /*---------------------------------------------------------------------------*\
-                       Class ParticleCollector Declaration
+                      Class ParticleCollector Declaration
 \*---------------------------------------------------------------------------*/
 
 template<class CloudType>
@@ -169,17 +169,15 @@ private:
         //- Collect parcels in polygon collectors
         label collectParcelPolygon
         (
-            const point& position,
-            const vector& U,
-            const scalar dt
+            const point& p1,
+            const point& p2
         ) const;
 
         //- Collect parcels in concentric circle collectors
         label collectParcelConcentricCircles
         (
-            const point& position,
-            const vector& U,
-            const scalar dt
+            const point& p1,
+            const point& p2
         ) const;
 
 
@@ -235,6 +233,7 @@ public:
                 const parcelType& p,
                 const label cellI,
                 const scalar dt,
+                const point& position0,
                 bool& keepParticle
             );
 };
-- 
GitLab