From adfc2de66e35bae5a7788cbed57b01ad72baafb9 Mon Sep 17 00:00:00 2001 From: graham <g.macpherson@opencfd.co.uk> Date: Thu, 7 Apr 2011 11:23:18 +0100 Subject: [PATCH] ENH: Moving the calculation of the lambda denominator/numerator upwards. Expensive to look it up in the lambda function, passing from trackToFace as an argument. --- src/lagrangian/basic/particle/particle.C | 2 ++ src/lagrangian/basic/particle/particle.H | 13 ++++++--- src/lagrangian/basic/particle/particleI.H | 19 ++++++------- .../basic/particle/particleTemplates.C | 27 ++++++++++++++++--- 4 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/lagrangian/basic/particle/particle.C b/src/lagrangian/basic/particle/particle.C index 38c45bf57f9..f3566c93e65 100644 --- a/src/lagrangian/basic/particle/particle.C +++ b/src/lagrangian/basic/particle/particle.C @@ -32,6 +32,8 @@ Foam::label Foam::particle::particleCount_ = 0; const Foam::scalar Foam::particle::trackingCorrectionTol = 1e-5; +const Foam::scalar Foam::particle::lambdaDistanceToleranceCoeff = 1e3*SMALL; + namespace Foam { defineTypeNameAndDebug(particle, 0); diff --git a/src/lagrangian/basic/particle/particle.H b/src/lagrangian/basic/particle/particle.H index df64e7b9e7a..06d32c321c2 100644 --- a/src/lagrangian/basic/particle/particle.H +++ b/src/lagrangian/basic/particle/particle.H @@ -164,7 +164,8 @@ protected: DynamicList<label>& faceList, const tetPointRef& tet, const FixedList<vector, 4>& tetAreas, - const FixedList<label, 4>& tetPlaneBasePtIs + const FixedList<label, 4>& tetPlaneBasePtIs, + const scalar tol ) const; //- Find the lambda value for the line to-from across the @@ -178,7 +179,8 @@ protected: const label tetPlaneBasePtI, const label cellI, const label tetFaceI, - const label tetPtI + const label tetPtI, + const scalar tol ) const; //- Find the lambda value for a moving tri face @@ -191,7 +193,8 @@ protected: const label tetPlaneBasePtI, const label cellI, const label tetFaceI, - const label tetPtI + const label tetPtI, + const scalar tol ) const; //- Modify the tet owner data by crossing triI @@ -291,6 +294,10 @@ public: // 'rescue' it from a tracking problem static const scalar trackingCorrectionTol; + //- Fraction of the cell volume to use in determining tolerance values + // for the denominator and numerator of lambda + static const scalar lambdaDistanceToleranceCoeff; + // Constructors diff --git a/src/lagrangian/basic/particle/particleI.H b/src/lagrangian/basic/particle/particleI.H index a11018a5d5a..6107df0c4ef 100644 --- a/src/lagrangian/basic/particle/particleI.H +++ b/src/lagrangian/basic/particle/particleI.H @@ -34,7 +34,8 @@ inline void Foam::particle::findTris DynamicList<label>& faceList, const tetPointRef& tet, const FixedList<vector, 4>& tetAreas, - const FixedList<label, 4>& tetPlaneBasePtIs + const FixedList<label, 4>& tetPlaneBasePtIs, + const scalar tol ) const { faceList.clear(); @@ -52,7 +53,8 @@ inline void Foam::particle::findTris tetPlaneBasePtIs[i], cellI_, tetFaceI_, - tetPtI_ + tetPtI_, + tol ); if ((lambda > 0.0) && (lambda < 1.0)) @@ -72,7 +74,8 @@ inline Foam::scalar Foam::particle::tetLambda const label tetPlaneBasePtI, const label cellI, const label tetFaceI, - const label tetPtI + const label tetPtI, + const scalar tol ) const { const pointField& pPts = mesh_.points(); @@ -88,7 +91,8 @@ inline Foam::scalar Foam::particle::tetLambda tetPlaneBasePtI, cellI, tetFaceI, - tetPtI + tetPtI, + tol ); } @@ -102,8 +106,6 @@ inline Foam::scalar Foam::particle::tetLambda // delta-length in the direction of n times the face area to a fraction of // the cell volume. - scalar tol = 1e3*SMALL*mesh_.cellVolumes()[cellI]; - if (mag(lambdaDenominator) < tol) { if (mag(lambdaNumerator) < tol) @@ -147,7 +149,8 @@ inline Foam::scalar Foam::particle::movingTetLambda const label tetPlaneBasePtI, const label cellI, const label tetFaceI, - const label tetPtI + const label tetPtI, + const scalar tol ) const { const pointField& pPts = mesh_.points(); @@ -299,8 +302,6 @@ inline Foam::scalar Foam::particle::movingTetLambda } - scalar tol = 1e3*SMALL*mesh_.cellVolumes()[cellI]; - if (mag(lambdaDenominator) < tol) { if (mag(lambdaNumerator) < tol) diff --git a/src/lagrangian/basic/particle/particleTemplates.C b/src/lagrangian/basic/particle/particleTemplates.C index e77376150a0..cb58c216532 100644 --- a/src/lagrangian/basic/particle/particleTemplates.C +++ b/src/lagrangian/basic/particle/particleTemplates.C @@ -286,6 +286,11 @@ Foam::scalar Foam::particle::trackToFace // be a different tet to the one that the particle occupies. tetIndices faceHitTetIs; + // What tolerance is appropriate the minimum lambda numerator and + // denominator for tracking in this cell. + scalar lambdaDistanceTolerance = + lambdaDistanceToleranceCoeff*mesh_.cellVolumes()[cellI_]; + do { if (triI != -1) @@ -371,7 +376,15 @@ Foam::scalar Foam::particle::trackToFace tetPlaneBasePtIs[2] = basePtI; tetPlaneBasePtIs[3] = basePtI; - findTris(endPosition, tris, tet, tetAreas, tetPlaneBasePtIs); + findTris + ( + endPosition, + tris, + tet, + tetAreas, + tetPlaneBasePtIs, + lambdaDistanceTolerance + ); // Reset variables for new track triI = -1; @@ -415,7 +428,8 @@ Foam::scalar Foam::particle::trackToFace tetPlaneBasePtIs[tI], cellI_, tetFaceI_, - tetPtI_ + tetPtI_, + lambdaDistanceTolerance ); if (lam < lambdaMin) @@ -704,6 +718,9 @@ void Foam::particle::hitWallFaces const Foam::cell& thisCell = mesh_.cells()[cellI_]; + scalar lambdaDistanceTolerance = + lambdaDistanceToleranceCoeff*mesh_.cellVolumes()[cellI_]; + const polyBoundaryMesh& patches = mesh_.boundaryMesh(); forAll(thisCell, cFI) @@ -755,7 +772,8 @@ void Foam::particle::hitWallFaces f[tetIs.faceBasePt()], cellI_, fI, - tetIs.tetPt() + tetIs.tetPt(), + lambdaDistanceTolerance ); if ((tetClambda <= 0.0) || (tetClambda >= 1.0)) @@ -781,7 +799,8 @@ void Foam::particle::hitWallFaces f[tetIs.faceBasePt()], cellI_, fI, - tetIs.tetPt() + tetIs.tetPt(), + lambdaDistanceTolerance ); pointHit hitInfo(vector::zero); -- GitLab