From e775be6e1cd37d92c57cb640d0aec1be5f341214 Mon Sep 17 00:00:00 2001
From: andy <andy>
Date: Mon, 19 May 2014 17:35:27 +0100
Subject: [PATCH] ENH: Parcel tracking - allow track to continue in the event
 of a tracking rescue

---
 .../KinematicParcel/KinematicParcel.C         | 37 ++++++++++++++-----
 .../KinematicParcel/KinematicParcel.H         |  6 ++-
 2 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C b/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcel.C
index 22e01b9a98c..eee3b7e8ecb 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<class ParcelType>
+Foam::label Foam::KinematicParcel<ParcelType>::maxTrackAttempts = 1;
+
+
 // * * * * * * * * * * *  Protected Member Functions * * * * * * * * * * * * //
 
 template<class ParcelType>
@@ -271,7 +277,8 @@ bool Foam::KinematicParcel<ParcelType>::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<ParcelType>::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<ParcelType>::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 63d15118452..2f42d4c02e8 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
-- 
GitLab