diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C index 22e01b9a..eee3b7e8 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -28,6 +28,12 @@ License #include "IntegrationScheme.H" #include "meshTools.H" +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +template +Foam::label Foam::KinematicParcel::maxTrackAttempts = 1; + + // * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * // template @@ -271,7 +277,8 @@ bool Foam::KinematicParcel::move scalar tEnd = (1.0 - p.stepFraction())*trackTime; const scalar dtMax = tEnd; - bool moving = true; + bool tracking = true; + label nTrackingStalled = 0; while (td.keepParticle && !td.switchProcessor && tEnd > ROOTVSMALL) { @@ -287,7 +294,7 @@ bool Foam::KinematicParcel::move const label cellI = p.cell(); const scalar magU = mag(U_); - if (p.active() && moving && (magU > ROOTVSMALL)) + if (p.active() && tracking && (magU > ROOTVSMALL)) { const scalar d = dt*magU; const scalar dCorr = min(d, maxCo*cellLengthScale[cellI]); @@ -300,13 +307,25 @@ bool Foam::KinematicParcel::move scalar newStepFraction = 1.0 - tEnd/trackTime; - if - ( - mag(p.stepFraction() - newStepFraction) - < particle::minStepFractionTol - ) + if (tracking) { - moving = false; + if + ( + mag(p.stepFraction() - newStepFraction) + < particle::minStepFractionTol + ) + { + nTrackingStalled++; + + if (nTrackingStalled > maxTrackAttempts) + { + tracking = false; + } + } + else + { + nTrackingStalled = 0; + } } p.stepFraction() = newStepFraction; diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H index 63d15118..2f42d4c0 100644 --- a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H +++ b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -218,6 +218,10 @@ public: }; + //- Number of particle tracking attempts before we assume that it stalls + static label maxTrackAttempts; + + protected: // Protected data diff --git a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C index 32427cba..8ae6f5fe 100644 --- a/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C +++ b/src/lagrangian/intermediate/parcels/Templates/ReactingParcel/ReactingParcel.C @@ -60,14 +60,14 @@ void Foam::ReactingParcel::calcPhaseChange typedef typename TrackData::cloudType::reactingCloudType reactingCloudType; PhaseChangeModel& phaseChange = td.cloud().phaseChange(); - if (!phaseChange.active()) + if (!phaseChange.active() || (YPhase < SMALL)) { return; } scalar Tvap = phaseChange.Tvap(YComponents); - if (T < Tvap || YPhase < SMALL) + if (T < Tvap) { return; }