From 1c1a69cabc6b32b95f91fc7c974bf161450c2f4a Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Thu, 26 Jan 2017 15:34:51 +0000
Subject: [PATCH] patchInjectionBase: Improved particle positioning

Patch contributed by Timo Niemi, VTT.
Resolves bug-report https://bugs.openfoam.org/view.php?id=2442
---
 .../PatchInjection/patchInjectionBase.C        | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/patchInjectionBase.C b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/patchInjectionBase.C
index b1bd72bdaad..293010fd137 100644
--- a/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/patchInjectionBase.C
+++ b/src/lagrangian/intermediate/submodels/Kinematic/InjectionModel/PatchInjection/patchInjectionBase.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2013-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2013-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -201,16 +201,26 @@ void Foam::patchInjectionBase::setPositionAndCell
             // Position perturbed away from face (into domain)
             const scalar a = rnd.position(scalar(0.1), scalar(0.5));
             const vector& pc = mesh.cellCentres()[cellOwner];
-            const vector d = mag(pf - pc)*patchNormal_[facei];
+            const vector d =
+                mag((pf - pc) & patchNormal_[facei])*patchNormal_[facei];
 
             position = pf - a*d;
 
-            //Try to find tetFacei and tetPti in the current position
+            // Try to find tetFacei and tetPti in the current position
             mesh.findTetFacePt(cellOwner, position, tetFacei, tetPti);
 
-            //Search failed, choose a random position
+            // tetFacei and tetPti not found, check if the cell has changed
             if (tetFacei == -1 ||tetPti == -1)
             {
+                mesh.findCellFacePt(position, cellOwner, tetFacei, tetPti);
+            }
+
+            // Both searches failed, choose a random position within
+            // the original cell
+            if (tetFacei == -1 ||tetPti == -1)
+            {
+                // Reset cellOwner
+                cellOwner = cellOwners_[facei];
                 const scalarField& V = mesh.V();
 
                 // Construct cell tet indices
-- 
GitLab