From 6a1b56732771973dfd1ee7ef7b8551959c59eeb7 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 27 Aug 2013 18:11:13 +0100 Subject: [PATCH] ENH: Cloud tracking - handle case where tracking stalls due to stepFraction --- src/lagrangian/basic/particle/particle.C | 4 ++- src/lagrangian/basic/particle/particle.H | 3 ++ .../KinematicParcel/KinematicParcel.C | 30 ++++++++++++++----- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/lagrangian/basic/particle/particle.C b/src/lagrangian/basic/particle/particle.C index 8ffb988d45..c71559d042 100644 --- a/src/lagrangian/basic/particle/particle.C +++ b/src/lagrangian/basic/particle/particle.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -34,6 +34,8 @@ const Foam::scalar Foam::particle::trackingCorrectionTol = 1e-5; const Foam::scalar Foam::particle::lambdaDistanceToleranceCoeff = 1e3*SMALL; +const Foam::scalar Foam::particle::minStepFractionTol = 1e5*SMALL; + namespace Foam { defineTypeNameAndDebug(particle, 0); diff --git a/src/lagrangian/basic/particle/particle.H b/src/lagrangian/basic/particle/particle.H index 15742cacc9..0275cc5fd1 100644 --- a/src/lagrangian/basic/particle/particle.H +++ b/src/lagrangian/basic/particle/particle.H @@ -307,6 +307,9 @@ public: // for the denominator and numerator of lambda static const scalar lambdaDistanceToleranceCoeff; + //- Minimum stepFraction tolerance + static const scalar minStepFractionTol; + // Constructors diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index 8cf9317c86..10bd38d62e 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -271,6 +271,8 @@ bool Foam::KinematicParcel::move scalar tEnd = (1.0 - p.stepFraction())*trackTime; const scalar dtMax = tEnd; + bool moving = true; + while (td.keepParticle && !td.switchProcessor && tEnd > ROOTVSMALL) { // Apply correction to position for reduced-D cases @@ -281,22 +283,36 @@ bool Foam::KinematicParcel::move // Set the Lagrangian time-step scalar dt = min(dtMax, tEnd); - // Remember which cell the parcel is in since this will change if - // a face is hit + // Cache the parcel current cell as this will change if a face is hit const label cellI = p.cell(); const scalar magU = mag(U_); - if (p.active() && magU > ROOTVSMALL) + if (p.active()) { const scalar d = dt*magU; const scalar dCorr = min(d, maxCo*cbrt(V[cellI])); - dt *= - dCorr/d - *p.trackToFace(p.position() + dCorr*U_/magU, td); + dt *= dCorr/d; + + if (moving && (magU > ROOTVSMALL)) + { + dt *= p.trackToFace(p.position() + dCorr*U_/magU, td); + } } tEnd -= dt; - p.stepFraction() = 1.0 - tEnd/trackTime; + + scalar newStepFraction = 1.0 - tEnd/trackTime; + + if + ( + mag(p.stepFraction() - newStepFraction) + < particle::minStepFractionTol + ) + { + moving = false; + } + + p.stepFraction() = newStepFraction; // Avoid problems with extremely small timesteps if (dt > ROOTVSMALL)