ENH: Change concave cell checking to be based on face centres and face

planes, rather than a vertex-by-vertex check.  Assesses concavity as
relevant to the tracking.
This commit is contained in:
graham 2010-03-31 18:10:05 +01:00
parent 3cf4d721eb
commit bb1a2476fd
2 changed files with 27 additions and 35 deletions

View File

@ -649,7 +649,7 @@ public:
labelHashSet* setPtr = NULL
) const;
//- Check for concave cells
//- Check for concave cells by the planes of faces
bool checkConcaveCells
(
const bool report = false,

View File

@ -2111,7 +2111,6 @@ bool Foam::primitiveMesh::checkConcaveCells
const labelList& fOwner = faceOwner();
const vectorField& fAreas = faceAreas();
const pointField& fCentres = faceCentres();
const pointField& pts = points();
label nConcaveCells = 0;
@ -2119,8 +2118,6 @@ bool Foam::primitiveMesh::checkConcaveCells
{
const cell& cFaces = c[cellI];
const labelList& cPoints = cellPoints()[cellI];
bool concave = false;
forAll(cFaces, i)
@ -2134,8 +2131,6 @@ bool Foam::primitiveMesh::checkConcaveCells
const point& fC = fCentres[fI];
const face& f = faces()[fI];
vector fN = fAreas[fI];
fN /= max(mag(fN), VSMALL);
@ -2147,45 +2142,42 @@ bool Foam::primitiveMesh::checkConcaveCells
fN *= -1;
}
// Is any vertex of the cell on the wrong side of the
// plane of this face?
// Is the centre of any other face of the cell on the
// wrong side of the plane of this face?
forAll(cPoints, cPtI)
forAll(cFaces, j)
{
label ptI = cPoints[cPtI];
// Skip points that are on this face
if (findIndex(f, ptI) > -1)
if (j != i)
{
continue;
}
label fJ = cFaces[j];
const point& pt = pts[ptI];
const point& pt = fCentres[fJ];
// If the cell is concave, the point will be on the
// positive normal side of the plane of f, defined by
// its centre and normal, and the angle between (pt -
// fC) and fN will be less than 90 degrees, so the dot
// product will be positive.
// If the cell is concave, the point will be on the
// positive normal side of the plane of f, defined by
// its centre and normal, and the angle between (pt -
// fC) and fN will be less than 90 degrees, so the dot
// product will be positive.
vector pC = (pt - fC);
vector pC = (pt - fC);
pC /= max(mag(pC), VSMALL);
pC /= max(mag(pC), VSMALL);
if ((pC & fN) > -planarCosAngle_)
{
// Concave or planar face
concave = true;
if (setPtr)
if ((pC & fN) > -planarCosAngle_)
{
setPtr->insert(cellI);
// Concave or planar face
concave = true;
if (setPtr)
{
setPtr->insert(cellI);
}
nConcaveCells++;
break;
}
nConcaveCells++;
break;
}
}
}