From 6eb1f6fefc338fdc04609811fa7a14e1e4f90628 Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Mon, 8 Oct 2018 17:11:37 +0100
Subject: [PATCH] ENH: searchableSurface: handle multiple surfaces. Fixes #1034

---
 .../searchableSurfacesQueries.C               | 55 +++++++++++--------
 1 file changed, 33 insertions(+), 22 deletions(-)

diff --git a/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C b/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C
index f5c48914a27..df5234dc1ae 100644
--- a/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C
+++ b/src/meshTools/searchableSurfaces/searchableSurfacesQueries/searchableSurfacesQueries.C
@@ -516,37 +516,48 @@ void Foam::searchableSurfacesQueries::findNearest
             //    - current surface     : info+normal1
             forAll(near, i)
             {
-                if (info[i].hit() && normal[i] != vector::zero)
+                if (info[i].hit())
                 {
-                    if (mag(normal[i]&normal1[i]) < 1.0-1e-6)
+                    if (normal[i] != vector::zero)
                     {
-                        plane pl0(near[i], normal[i], false);
-                        plane pl1(info[i].hitPoint(), normal1[i], false);
+                        // Have previous hit. Find intersection
+                        if (mag(normal[i]&normal1[i]) < 1.0-1e-6)
+                        {
+                            plane pl0(near[i], normal[i], false);
+                            plane pl1(info[i].hitPoint(), normal1[i], false);
 
-                        plane::ray r(pl0.planeIntersect(pl1));
-                        vector n = r.dir() / mag(r.dir());
+                            plane::ray r(pl0.planeIntersect(pl1));
+                            vector n = r.dir() / mag(r.dir());
 
-                        // Calculate vector to move onto intersection line
-                        vector d(r.refPoint()-near[i]);
-                        d -= (d&n)*n;
+                            // Calculate vector to move onto intersection line
+                            vector d(r.refPoint()-near[i]);
+                            d -= (d&n)*n;
 
-                        // Trim the max distance
-                        scalar magD = mag(d);
-                        if (magD > SMALL)
-                        {
-                            scalar maxDist = Foam::sqrt(distSqr[i]);
-                            if (magD > maxDist)
+                            // Trim the max distance
+                            scalar magD = mag(d);
+                            if (magD > SMALL)
                             {
-                                // Clip
-                                d /= magD;
-                                d *= maxDist;
+                                scalar maxDist = Foam::sqrt(distSqr[i]);
+                                if (magD > maxDist)
+                                {
+                                    // Clip
+                                    d /= magD;
+                                    d *= maxDist;
+                                }
+
+                                near[i] += d;
+                                normal[i] = normal1[i];
+                                constraint[i].applyConstraint(normal1[i]);
                             }
-
-                            near[i] += d;
-                            normal[i] = normal1[i];
-                            constraint[i].applyConstraint(normal1[i]);
                         }
                     }
+                    else
+                    {
+                        // First hit
+                        near[i] = info[i].hitPoint();
+                        normal[i] = normal1[i];
+                        constraint[i].applyConstraint(normal1[i]);
+                    }
                 }
             }
 
-- 
GitLab