diff --git a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C index 3f278e8c5..a0a5fd744 100644 --- a/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C +++ b/src/lagrangian/intermediate/submodels/CloudFunctionObjects/ParticleCollector/ParticleCollector.C @@ -290,9 +290,6 @@ void Foam::ParticleCollector::collectParcelPolygon const point& p2 ) const { - label dummyNearType = -1; - label dummyNearLabel = -1; - forAll(faces_, facei) { const label facePoint0 = faces_[facei][0]; @@ -311,24 +308,31 @@ void Foam::ParticleCollector::collectParcelPolygon // Intersection point const point pIntersect = p1 + (d1/(d1 - d2))*(p2 - p1); - const List& tris = faceTris_[facei]; - - // Identify if point is within poly bounds - forAll(tris, triI) + // Identify if point is within the bounds of the face. Create triangles + // between the intersection point and each edge of the face. If all the + // triangle normals point in the same direction as the face normal, then + // the particle is within the face. Note that testing for pointHits on + // the face's decomposed triangles does not work due to ambiguity along + // the diagonals. + const face& f = faces_[facei]; + const vector n = f.normal(points_); + bool inside = true; + for (label i = 0; i < f.size(); ++ i) { - const face& tri = tris[triI]; - triPointRef t - ( - points_[tri[0]], - points_[tri[1]], - points_[tri[2]] - ); - - if (t.classify(pIntersect, dummyNearType, dummyNearLabel)) + const label j = f.fcIndex(i); + const triPointRef t(pIntersect, points_[f[i]], points_[f[j]]); + if ((n & t.normal()) < 0) { - hitFaceIDs_.append(facei); + inside = false; + break; } } + + // Add to the list of hits + if (inside) + { + hitFaceIDs_.append(facei); + } } } @@ -654,28 +658,24 @@ void Foam::ParticleCollector::postMove return; } - // Slightly extend end position to avoid falling within tracking tolerances - const point position1 = position0 + 1.0001*(p.position() - position0); - hitFaceIDs_.clear(); switch (mode_) { case mtPolygon: { - collectParcelPolygon(position0, position1); + collectParcelPolygon(position0, p.position()); break; } case mtConcentricCircle: { - collectParcelConcentricCircles(position0, position1); + collectParcelConcentricCircles(position0, p.position()); break; } default: {} } - forAll(hitFaceIDs_, i) { label facei = hitFaceIDs_[i];