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