From f7104f4a7e61249f7fc11fcfc82e693b3828cc3d Mon Sep 17 00:00:00 2001
From: graham <g.macpherson@opencfd.co.uk>
Date: Mon, 6 Jul 2009 16:41:51 +0100
Subject: [PATCH] Caching deltaT in the DsmcCloud as it is expensive to
 repeated lookup in the parcel and in submodels.  Approx 20% speed in
 solution.

---
 .../dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C    |  5 ++++-
 .../dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H    | 10 ++++++++++
 .../dsmc/clouds/Templates/DsmcCloud/DsmcCloudI.H   | 14 ++++++++++++++
 .../dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C |  4 ++--
 .../InflowBoundaryModel/FreeStream/FreeStream.C    |  2 +-
 5 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C
index 10cec60dd27..23aa3dc4782 100644
--- a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C
+++ b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.C
@@ -299,7 +299,7 @@ void Foam::DsmcCloud<ParcelType>::collisions()
     // Temporary storage for subCells
     List<DynamicList<label> > subCells(8);
 
-    scalar deltaT = mesh_.time().deltaT().value();
+    scalar deltaT = cachedDeltaT();
 
     label collisionCandidates = 0;
 
@@ -778,6 +778,9 @@ Foam::DsmcCloud<ParcelType>::~DsmcCloud()
 template<class ParcelType>
 void Foam::DsmcCloud<ParcelType>::evolve()
 {
+    // cache the value of deltaT for this timestep
+    storeDeltaT();
+
     typename ParcelType::trackData td(*this);
 
     // Reset the surface data collection fields
diff --git a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H
index fc5cf53d683..76b1dd7e790 100644
--- a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H
+++ b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloud.H
@@ -116,6 +116,10 @@ class DsmcCloud
         //- Random number generator
         Random rndGen_;
 
+        //- In-cloud cache of deltaT, lookup in submodels and parcel is
+        //  expensive
+        scalar cachedDeltaT_;
+
 
         // References to the macroscopic fields
 
@@ -243,6 +247,12 @@ public:
                 //- Return refernce to the random object
                 inline Random& rndGen();
 
+                //- Store (cache) the current value of deltaT
+                inline void storeDeltaT();
+
+                //- Return the cached value of deltaT
+                inline scalar cachedDeltaT() const;
+
 
             // References to the surface data collection fields
 
diff --git a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloudI.H b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloudI.H
index 449650c0a83..3529702fdd6 100644
--- a/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloudI.H
+++ b/src/lagrangian/dsmc/clouds/Templates/DsmcCloud/DsmcCloudI.H
@@ -120,6 +120,20 @@ inline Foam::Random& Foam::DsmcCloud<ParcelType>::rndGen()
 }
 
 
+template<class ParcelType>
+inline void Foam::DsmcCloud<ParcelType>::storeDeltaT()
+{
+    cachedDeltaT_ = mesh().time().deltaT().value();
+}
+
+
+template<class ParcelType>
+inline Foam::scalar Foam::DsmcCloud<ParcelType>::cachedDeltaT() const
+{
+    return cachedDeltaT_;
+}
+
+
 template<class ParcelType>
 inline const Foam::volScalarField& Foam::DsmcCloud<ParcelType>::q() const
 {
diff --git a/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C b/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C
index fae05b0f2ff..c52d92d20fe 100644
--- a/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C
+++ b/src/lagrangian/dsmc/parcels/Templates/DsmcParcel/DsmcParcel.C
@@ -44,7 +44,7 @@ bool Foam::DsmcParcel<ParcelType>::move
     const polyMesh& mesh = td.cloud().pMesh();
     const polyBoundaryMesh& pbMesh = mesh.boundaryMesh();
 
-    const scalar deltaT = mesh.time().deltaT().value();
+    const scalar deltaT = td.cloud().cachedDeltaT();
     scalar tEnd = (1.0 - p.stepFraction())*deltaT;
     const scalar dtMax = tEnd;
 
@@ -145,7 +145,7 @@ void Foam::DsmcParcel<ParcelType>::hitWallPatch
 
     const scalar fA = mag(wpp.faceAreas()[wppLocalFace]);
 
-    const scalar deltaT = td.cloud().mesh().time().deltaT().value();
+    const scalar deltaT = td.cloud().cachedDeltaT();
 
     scalar deltaQ = td.cloud().nParticle()*(preIE - postIE)/(deltaT*fA);
 
diff --git a/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C b/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C
index 807337d7e01..0f0e135e4c9 100644
--- a/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C
+++ b/src/lagrangian/dsmc/submodels/InflowBoundaryModel/FreeStream/FreeStream.C
@@ -126,7 +126,7 @@ void Foam::FreeStream<CloudType>::inflow()
 
     const polyMesh& mesh(cloud.mesh());
 
-    const scalar deltaT = mesh.time().deltaT().value();
+    const scalar deltaT = cloud.cachedDeltaT();
 
     Random& rndGen(cloud.rndGen());
 
-- 
GitLab