From 13fa1b0517a46479f73e7dc90ab4603b3df482fc Mon Sep 17 00:00:00 2001
From: Andrew Heather <>
Date: Mon, 23 Mar 2020 21:18:18 +0000
Subject: [PATCH] ENH: Cloud function objects - pass trackingData into pre|post
 evolve functions

Might also consider passing through the remaining hooks, e.g. for postMove,
postPatch, postFace etc
---
 .../Templates/KinematicCloud/KinematicCloud.C | 28 ++++----
 .../Templates/KinematicCloud/KinematicCloud.H |  6 +-
 .../Templates/ThermoCloud/ThermoCloud.C       |  8 ++-
 .../Templates/ThermoCloud/ThermoCloud.H       |  3 +-
 .../CloudFunctionObject/CloudFunctionObject.C | 24 +++----
 .../CloudFunctionObject/CloudFunctionObject.H | 21 ++++--
 .../CloudFunctionObjectList.C                 | 28 ++++----
 .../CloudFunctionObjectList.H                 | 25 +++++--
 .../FacePostProcessing/FacePostProcessing.C   |  7 --
 .../FacePostProcessing/FacePostProcessing.H   |  7 +-
 .../ParticleCollector/ParticleCollector.C     |  7 --
 .../ParticleCollector/ParticleCollector.H     |  7 +-
 .../ParticleErosion/ParticleErosion.C         | 66 +++++++++++--------
 .../ParticleErosion/ParticleErosion.H         |  9 ++-
 .../ParticleTracks/ParticleTracks.C           | 14 ++--
 .../ParticleTracks/ParticleTracks.H           |  9 ++-
 .../ParticleTrap/ParticleTrap.C               | 17 +++--
 .../ParticleTrap/ParticleTrap.H               | 15 +++--
 .../PatchCollisionDensity.C                   |  7 --
 .../PatchCollisionDensity.H                   | 18 +++--
 .../VoidFraction/VoidFraction.C               | 20 +++---
 .../VoidFraction/VoidFraction.H               | 13 +++-
 22 files changed, 194 insertions(+), 165 deletions(-)

diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
index 63bb2eb7c2b..b7d6d49e4a9 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.C
@@ -104,7 +104,7 @@ void Foam::KinematicCloud<CloudType>::solve
     {
         cloud.storeState();
 
-        cloud.preEvolve();
+        cloud.preEvolve(td);
 
         evolveCloud(cloud, td);
 
@@ -115,7 +115,7 @@ void Foam::KinematicCloud<CloudType>::solve
     }
     else
     {
-        cloud.preEvolve();
+        cloud.preEvolve(td);
 
         evolveCloud(cloud, td);
 
@@ -127,7 +127,7 @@ void Foam::KinematicCloud<CloudType>::solve
 
     cloud.info();
 
-    cloud.postEvolve();
+    cloud.postEvolve(td);
 
     if (solution_.steadyState())
     {
@@ -230,7 +230,10 @@ void Foam::KinematicCloud<CloudType>::evolveCloud
 
 
 template<class CloudType>
-void Foam::KinematicCloud<CloudType>::postEvolve()
+void Foam::KinematicCloud<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     Info<< endl;
 
@@ -243,7 +246,7 @@ void Foam::KinematicCloud<CloudType>::postEvolve()
 
     forces_.cacheFields(false);
 
-    functions_.postEvolve();
+    functions_.postEvolve(td);
 
     solution_.nextIter();
 
@@ -306,8 +309,8 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         IOobject
         (
             cloudName + "Properties",
-            rho.mesh().time().constant(),
-            rho.mesh(),
+            mesh_.time().constant(),
+            mesh_,
             IOobject::MUST_READ_IF_MODIFIED,
             IOobject::NO_WRITE
         )
@@ -506,8 +509,8 @@ Foam::KinematicCloud<CloudType>::KinematicCloud
         IOobject
         (
             name + "Properties",
-            mesh.time().constant(),
-            mesh,
+            mesh_.time().constant(),
+            mesh_,
             IOobject::NO_READ,
             IOobject::NO_WRITE,
             false
@@ -657,7 +660,10 @@ void Foam::KinematicCloud<CloudType>::scaleSources()
 
 
 template<class CloudType>
-void Foam::KinematicCloud<CloudType>::preEvolve()
+void Foam::KinematicCloud<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     // force calculation of mesh dimensions - needed for parallel runs
     // with topology change due to lazy evaluation of valid mesh dimensions
@@ -672,7 +678,7 @@ void Foam::KinematicCloud<CloudType>::preEvolve()
     pAmbient_ = constProps_.dict().template
         getOrDefault<scalar>("pAmbient", pAmbient_);
 
-    functions_.preEvolve();
+    functions_.preEvolve(td);
 }
 
 
diff --git a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
index 2d71032dbb3..4534c2a36a2 100644
--- a/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloud.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2016-2019 OpenCFD Ltd.
+    Copyright (C) 2016-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -273,7 +273,7 @@ protected:
             );
 
             //- Post-evolve
-            void postEvolve();
+            void postEvolve(const typename parcelType::trackingData& td);
 
             //- Reset state of cloud
             void cloudReset(KinematicCloud<CloudType>& c);
@@ -590,7 +590,7 @@ public:
             void scaleSources();
 
             //- Pre-evolve
-            void preEvolve();
+            void preEvolve(const typename parcelType::trackingData& td);
 
             //- Evolve the cloud
             void evolve();
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
index a889876ed18..35a0e140b3d 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -446,9 +447,12 @@ void Foam::ThermoCloud<CloudType>::scaleSources()
 
 
 template<class CloudType>
-void Foam::ThermoCloud<CloudType>::preEvolve()
+void Foam::ThermoCloud<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
-    CloudType::preEvolve();
+    CloudType::preEvolve(td);
 
     this->pAmbient() = thermo_.thermo().p().average().value();
 }
diff --git a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
index 158e80594e7..47dfcb3949a 100644
--- a/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
+++ b/src/lagrangian/intermediate/clouds/Templates/ThermoCloud/ThermoCloud.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -358,7 +359,7 @@ public:
             void scaleSources();
 
             //- Pre-evolve
-            void preEvolve();
+            void preEvolve(const typename parcelType::trackingData& td);
 
             //- Evolve the cloud
             void evolve();
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
index ed89fc43e4e..57bca3973ff 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2019 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -84,22 +85,21 @@ Foam::CloudFunctionObject<CloudType>::CloudFunctionObject
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::CloudFunctionObject<CloudType>::~CloudFunctionObject()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::CloudFunctionObject<CloudType>::preEvolve()
+void Foam::CloudFunctionObject<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {}
 
 
 template<class CloudType>
-void Foam::CloudFunctionObject<CloudType>::postEvolve()
+void Foam::CloudFunctionObject<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (this->owner().time().writeTime())
     {
@@ -111,7 +111,7 @@ void Foam::CloudFunctionObject<CloudType>::postEvolve()
 template<class CloudType>
 void Foam::CloudFunctionObject<CloudType>::postMove
 (
-    typename CloudType::parcelType&,
+    parcelType&,
     const scalar,
     const point&,
     bool&
@@ -122,7 +122,7 @@ void Foam::CloudFunctionObject<CloudType>::postMove
 template<class CloudType>
 void Foam::CloudFunctionObject<CloudType>::postPatch
 (
-    const typename CloudType::parcelType&,
+    const parcelType&,
     const polyPatch&,
     bool&
 )
@@ -132,7 +132,7 @@ void Foam::CloudFunctionObject<CloudType>::postPatch
 template<class CloudType>
 void Foam::CloudFunctionObject<CloudType>::postFace
 (
-    const typename CloudType::parcelType&,
+    const parcelType&,
     bool&
 )
 {}
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
index 746f03947c9..0949a2ffe18 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObject/CloudFunctionObject.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -63,6 +64,11 @@ class CloudFunctionObject
 :
     public CloudSubModelBase<CloudType>
 {
+private:
+
+        //- Convenience typedef for parcel type
+        typedef typename CloudType::parcelType parcelType;
+
     // Private data
 
         //- Output path
@@ -126,7 +132,7 @@ public:
 
 
     //- Destructor
-    virtual ~CloudFunctionObject();
+    virtual ~CloudFunctionObject() = default;
 
 
     //- Selector
@@ -144,15 +150,18 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve(const typename parcelType::trackingData& td);
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove
             (
-                typename CloudType::parcelType& p,
+                parcelType& p,
                 const scalar dt,
                 const point& position0,
                 bool& keepParticle
@@ -161,7 +170,7 @@ public:
             //- Post-patch hook
             virtual void postPatch
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 const polyPatch& pp,
                 bool& keepParticle
             );
@@ -169,7 +178,7 @@ public:
             //- Post-face hook
             virtual void postFace
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 bool& keepParticle
             );
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
index de2822ed1c2..17130ec921b 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -103,31 +104,30 @@ Foam::CloudFunctionObjectList<CloudType>::CloudFunctionObjectList
 {}
 
 
-// * * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::CloudFunctionObjectList<CloudType>::~CloudFunctionObjectList()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::CloudFunctionObjectList<CloudType>::preEvolve()
+void Foam::CloudFunctionObjectList<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     forAll(*this, i)
     {
-        this->operator[](i).preEvolve();
+        this->operator[](i).preEvolve(td);
     }
 }
 
 
 template<class CloudType>
-void Foam::CloudFunctionObjectList<CloudType>::postEvolve()
+void Foam::CloudFunctionObjectList<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     forAll(*this, i)
     {
-        this->operator[](i).postEvolve();
+        this->operator[](i).postEvolve(td);
     }
 }
 
@@ -135,7 +135,7 @@ void Foam::CloudFunctionObjectList<CloudType>::postEvolve()
 template<class CloudType>
 void Foam::CloudFunctionObjectList<CloudType>::postMove
 (
-    typename CloudType::parcelType& p,
+    parcelType& p,
     const scalar dt,
     const point& position0,
     bool& keepParticle
@@ -156,7 +156,7 @@ void Foam::CloudFunctionObjectList<CloudType>::postMove
 template<class CloudType>
 void Foam::CloudFunctionObjectList<CloudType>::postPatch
 (
-    const typename CloudType::parcelType& p,
+    const parcelType& p,
     const polyPatch& pp,
     bool& keepParticle
 )
@@ -176,7 +176,7 @@ void Foam::CloudFunctionObjectList<CloudType>::postPatch
 template<class CloudType>
 void Foam::CloudFunctionObjectList<CloudType>::postFace
 (
-    const typename CloudType::parcelType& p,
+    const parcelType& p,
     bool& keepParticle
 )
 {
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
index 4354bf451c1..41e0a28df4b 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/CloudFunctionObjectList/CloudFunctionObjectList.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -55,6 +56,12 @@ class CloudFunctionObjectList
 :
     public PtrList<CloudFunctionObject<CloudType>>
 {
+private:
+
+        //- Convenience typedef for parcel type
+        typedef typename CloudType::parcelType parcelType;
+
+
 protected:
 
     // Protected Data
@@ -86,7 +93,7 @@ public:
 
 
     //- Destructor
-    virtual ~CloudFunctionObjectList();
+    virtual ~CloudFunctionObjectList() = default;
 
 
     // Member Functions
@@ -106,15 +113,21 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove
             (
-                typename CloudType::parcelType& p,
+                parcelType& p,
                 const scalar dt,
                 const point& position0,
                 bool& keepParticle
@@ -123,7 +136,7 @@ public:
             //- Post-patch hook
             virtual void postPatch
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 const polyPatch& pp,
                 bool& keepParticle
             );
@@ -131,7 +144,7 @@ public:
             //- Post-face hook
             virtual void postFace
             (
-                const typename CloudType::parcelType& p,
+                const parcelType& p,
                 bool& keepParticle
             );
 };
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
index ba9b0ffc9b7..a5e187ca062 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.C
@@ -347,13 +347,6 @@ Foam::FacePostProcessing<CloudType>::FacePostProcessing
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::FacePostProcessing<CloudType>::~FacePostProcessing()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H
index 5c8c81f3bd4..087b116d401 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/FacePostProcessing/FacePostProcessing.H
@@ -149,19 +149,14 @@ public:
 
 
     //- Destructor
-    virtual ~FacePostProcessing();
+    virtual ~FacePostProcessing() = default;
 
 
     // Member Functions
 
-    // Access
-
         //- Should data be reset on write?
         inline bool resetOnWrite() const;
 
-
-    // Evaluation
-
         //- Post-face hook
         virtual void postFace(const parcelType& p, bool& keepParticle);
 };
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
index 94b5b2a5064..3764a682ace 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C
@@ -636,13 +636,6 @@ Foam::ParticleCollector<CloudType>::ParticleCollector
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::ParticleCollector<CloudType>::~ParticleCollector()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
index afd837efa2b..b4bdd2ce3eb 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.H
@@ -273,19 +273,14 @@ public:
 
 
     //- Destructor
-    virtual ~ParticleCollector();
+    virtual ~ParticleCollector() = default;
 
 
     // Member Functions
 
-    // Access
-
         //- Should data be reset on write?
         inline bool resetOnWrite() const;
 
-
-    // Evaluation
-
         //- Post-move hook
         virtual void postMove
         (
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C
index 289fc93fde5..a0aaae32024 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.C
@@ -30,6 +30,37 @@ License
 
 // * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
 
+template<class CloudType>
+void Foam::ParticleErosion<CloudType>::resetQ()
+{
+    if (QPtr_.valid())
+    {
+        QPtr_->primitiveFieldRef() = 0.0;
+    }
+    else
+    {
+        const fvMesh& mesh = this->owner().mesh();
+
+        QPtr_.reset
+        (
+            new volScalarField
+            (
+                IOobject
+                (
+                    this->owner().name() + "Q",
+                    mesh.time().timeName(),
+                    mesh,
+                    IOobject::READ_IF_PRESENT,
+                    IOobject::NO_WRITE
+                ),
+                mesh,
+                dimensionedScalar(dimVolume, Zero)
+            )
+        );
+    }
+}
+
+
 template<class CloudType>
 Foam::label Foam::ParticleErosion<CloudType>::applyToPatch
 (
@@ -103,8 +134,8 @@ Foam::ParticleErosion<CloudType>::ParticleErosion
 
     patchIDs_ = uniqIds.sortedToc();
 
-    // trigger creation of the Q field
-    preEvolve();
+    // Trigger creation of the Q field
+    resetQ();
 }
 
 
@@ -126,33 +157,12 @@ Foam::ParticleErosion<CloudType>::ParticleErosion
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::ParticleErosion<CloudType>::preEvolve()
+void Foam::ParticleErosion<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
-    if (QPtr_.valid())
-    {
-        QPtr_->primitiveFieldRef() = 0.0;
-    }
-    else
-    {
-        const fvMesh& mesh = this->owner().mesh();
-
-        QPtr_.reset
-        (
-            new volScalarField
-            (
-                IOobject
-                (
-                    this->owner().name() + "Q",
-                    mesh.time().timeName(),
-                    mesh,
-                    IOobject::READ_IF_PRESENT,
-                    IOobject::NO_WRITE
-                ),
-                mesh,
-                dimensionedScalar(dimVolume, Zero)
-            )
-        );
-    }
+    resetQ();
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H
index a9b54bf79b3..2a818fa7d91 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleErosion/ParticleErosion.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -85,6 +86,9 @@ protected:
 
     // Protected Member Functions
 
+        //- Create|read|reset the Q field
+        void resetQ();
+
         //- Returns local patchi if patch is in patchIds_ list
         label applyToPatch(const label globalPatchi) const;
 
@@ -130,7 +134,10 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-patch hook
             virtual void postPatch
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C
index 2730359b5e0..52f75c099a7 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.C
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -86,17 +86,13 @@ Foam::ParticleTracks<CloudType>::ParticleTracks
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::ParticleTracks<CloudType>::~ParticleTracks()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::ParticleTracks<CloudType>::preEvolve()
+void Foam::ParticleTracks<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (!cloudPtr_.valid())
     {
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H
index 05b156554d0..3bd704aeb0a 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTracks/ParticleTracks.H
@@ -6,7 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
-    Copyright (C) 2019 OpenCFD Ltd.
+    Copyright (C) 2019-2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -118,7 +118,7 @@ public:
 
 
     //- Destructor
-    virtual ~ParticleTracks();
+    virtual ~ParticleTracks() = default;
 
 
     // Member Functions
@@ -144,7 +144,10 @@ public:
     // Evaluation
 
         //- Pre-evolve hook
-        virtual void preEvolve();
+        virtual void preEvolve
+        (
+            const typename parcelType::trackingData& td
+        );
 
         //- Post-face hook
         virtual void postFace(const parcelType& p, bool& keepParticle);
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C
index e0c5c2e462d..6e4f0b4d2f4 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.C
@@ -64,17 +64,13 @@ Foam::ParticleTrap<CloudType>::ParticleTrap
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::ParticleTrap<CloudType>::~ParticleTrap()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::ParticleTrap<CloudType>::preEvolve()
+void Foam::ParticleTrap<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (alphaPtr_ == nullptr)
     {
@@ -97,7 +93,10 @@ void Foam::ParticleTrap<CloudType>::preEvolve()
 
 
 template<class CloudType>
-void Foam::ParticleTrap<CloudType>::postEvolve()
+void Foam::ParticleTrap<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     gradAlphaPtr_.clear();
 }
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H
index 3a02c963e2c..500dd9d595d 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleTrap/ParticleTrap.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2012-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -119,7 +120,7 @@ public:
 
 
     //- Destructor
-    virtual ~ParticleTrap();
+    virtual ~ParticleTrap() = default;
 
 
     // Member Functions
@@ -127,15 +128,21 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove
             (
-                typename CloudType::parcelType& p,
+                parcelType& p,
                 const scalar dt,
                 const point& position0,
                 bool& keepParticle
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
index 9b7665d7c17..e61404fb013 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.C
@@ -136,13 +136,6 @@ Foam::PatchCollisionDensity<CloudType>::PatchCollisionDensity
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::PatchCollisionDensity<CloudType>::~PatchCollisionDensity()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
index 5e97b8811f4..f9ae499115f 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/PatchCollisionDensity/PatchCollisionDensity.H
@@ -120,20 +120,18 @@ public:
 
 
     //- Destructor
-    virtual ~PatchCollisionDensity();
+    virtual ~PatchCollisionDensity() = default;
 
 
     // Member Functions
 
-        // Evaluation
-
-            //- Post-patch hook
-            virtual void postPatch
-            (
-                const parcelType& p,
-                const polyPatch& pp,
-                bool& keepParticle
-            );
+        //- Post-patch hook
+        virtual void postPatch
+        (
+            const parcelType& p,
+            const polyPatch& pp,
+            bool& keepParticle
+        );
 };
 
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C
index c5a8c56d3dc..67028c47e69 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.C
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -70,17 +71,13 @@ Foam::VoidFraction<CloudType>::VoidFraction
 {}
 
 
-// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
-
-template<class CloudType>
-Foam::VoidFraction<CloudType>::~VoidFraction()
-{}
-
-
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
 template<class CloudType>
-void Foam::VoidFraction<CloudType>::preEvolve()
+void Foam::VoidFraction<CloudType>::preEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     if (thetaPtr_.valid())
     {
@@ -111,7 +108,10 @@ void Foam::VoidFraction<CloudType>::preEvolve()
 
 
 template<class CloudType>
-void Foam::VoidFraction<CloudType>::postEvolve()
+void Foam::VoidFraction<CloudType>::postEvolve
+(
+    const typename parcelType::trackingData& td
+)
 {
     volScalarField& theta = thetaPtr_();
 
@@ -119,7 +119,7 @@ void Foam::VoidFraction<CloudType>::postEvolve()
 
     theta.primitiveFieldRef() /= mesh.time().deltaTValue()*mesh.V();
 
-    CloudFunctionObject<CloudType>::postEvolve();
+    CloudFunctionObject<CloudType>::postEvolve(td);
 }
 
 
diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H
index 79590532e9c..b8761066838 100644
--- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H
+++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/VoidFraction/VoidFraction.H
@@ -6,6 +6,7 @@
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
     Copyright (C) 2011-2017 OpenFOAM Foundation
+    Copyright (C) 2020 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -107,7 +108,7 @@ public:
 
 
     //- Destructor
-    virtual ~VoidFraction();
+    virtual ~VoidFraction() = default;
 
 
     // Member Functions
@@ -115,10 +116,16 @@ public:
         // Evaluation
 
             //- Pre-evolve hook
-            virtual void preEvolve();
+            virtual void preEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-evolve hook
-            virtual void postEvolve();
+            virtual void postEvolve
+            (
+                const typename parcelType::trackingData& td
+            );
 
             //- Post-move hook
             virtual void postMove
-- 
GitLab