polyMeshFromShapeMesh: Change patch face matching to be vertex ordering independent

This simplifies the specification of patch faces in blockMeshDict which
now do need not have any particular ordering of the block vertices.
This commit is contained in:
Henry Weller
2015-08-06 16:51:56 +01:00
parent b2a7bf3e5e
commit 65e8e2273b
4 changed files with 70 additions and 30 deletions

View File

@ -28,7 +28,7 @@ License
#include "triPointRef.H"
#include "mathematicalConstants.H"
#include "Swap.H"
#include "const_circulator.H"
#include "ConstCirculator.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -69,7 +69,7 @@ Foam::scalar Foam::face::edgeCos
label leftEdgeI = left(index);
label rightEdgeI = right(index);
// note negate on left edge to get correct left-pointing edge.
// Note negate on left edge to get correct left-pointing edge.
return -(edges[leftEdgeI] & edges[rightEdgeI]);
}
@ -237,7 +237,7 @@ Foam::label Foam::face::split
minIndex = index;
}
// go to next candidate
// Go to next candidate
index = fcIndex(index);
}
@ -254,7 +254,7 @@ Foam::label Foam::face::split
}
else
{
// folded around
// Folded around
diff = minIndex + size() - startIndex;
}
@ -300,10 +300,6 @@ Foam::face::face(const triFace& f)
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
// return
// 0: no match
// +1: identical
// -1: same face, but different orientation
int Foam::face::compare(const face& a, const face& b)
{
// Basic rule: we assume that the sequence of labels in each list
@ -330,8 +326,8 @@ int Foam::face::compare(const face& a, const face& b)
}
}
const_circulator<face> aCirc(a);
const_circulator<face> bCirc(b);
ConstCirculator<face> aCirc(a);
ConstCirculator<face> bCirc(b);
// Rotate face b until its element matches the starting element of face a.
do
@ -406,6 +402,49 @@ int Foam::face::compare(const face& a, const face& b)
}
bool Foam::face::sameVertices(const face& a, const face& b)
{
label sizeA = a.size();
label sizeB = b.size();
// Trivial reject: faces are different size
if (sizeA != sizeB)
{
return false;
}
// Check faces with a single vertex
else if (sizeA == 1)
{
if (a[0] == b[0])
{
return true;
}
else
{
return false;
}
}
forAll(a, i)
{
bool found = false;
forAll(b, j)
{
if (a[i] == b[j])
{
found = true;
break;
}
}
if (!found) return false;
}
return true;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
Foam::label Foam::face::collapse()
@ -572,7 +611,7 @@ Foam::vector Foam::face::normal(const pointField& p) const
Foam::face Foam::face::reverseFace() const
{
// reverse the label list and return
// Reverse the label list and return
// The starting points of the original and reverse face are identical.
const labelList& f = *this;
@ -731,7 +770,7 @@ Foam::edgeList Foam::face::edges() const
e[pointI] = edge(points[pointI], points[pointI + 1]);
}
// add last edge
// Add last edge
e.last() = edge(points.last(), points[0]);
return e;
@ -746,37 +785,37 @@ int Foam::face::edgeDirection(const edge& e) const
{
if (operator[](rcIndex(i)) == e.end())
{
// reverse direction
// Reverse direction
return -1;
}
else if (operator[](fcIndex(i)) == e.end())
{
// forward direction
// Forward direction
return 1;
}
// no match
// No match
return 0;
}
else if (operator[](i) == e.end())
{
if (operator[](rcIndex(i)) == e.start())
{
// forward direction
// Forward direction
return 1;
}
else if (operator[](fcIndex(i)) == e.start())
{
// reverse direction
// Reverse direction
return -1;
}
// no match
// No match
return 0;
}
}
// not found
// Not found
return 0;
}

View File

@ -371,6 +371,9 @@ public:
// -1: same face, but different orientation
static int compare(const face&, const face&);
//- Return true if the faces have the same vertices
static bool sameVertices(const face&, const face&);
// Friend Operators

View File

@ -233,6 +233,7 @@ private:
cellList& cells
);
// Geometry checks
//- Check non-orthogonality

View File

@ -21,9 +21,6 @@ License
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Description
Create polyMesh from cell and patch shapes
\*---------------------------------------------------------------------------*/
#include "polyMesh.H"
@ -102,7 +99,7 @@ Foam::labelList Foam::polyMesh::facePatchFaceCells
forAll(cellFaces, cellFace)
{
if (cellFaces[cellFace] == curFace)
if (face::sameVertices(cellFaces[cellFace], curFace))
{
// Found the cell corresponding to this face
FaceCells[fI] = facePointCells[cellI];
@ -175,7 +172,7 @@ void Foam::polyMesh::setTopology
// Initialise number of faces to 0
nFaces = 0;
// set reference to point-cell addressing
// Set reference to point-cell addressing
labelListList PointCells = cellShapePointCells(cellsAsShapes);
bool found = false;
@ -340,7 +337,7 @@ void Foam::polyMesh::setTopology
forAll(facesOfCellInside, cellFaceI)
{
if (facesOfCellInside[cellFaceI] == curFace)
if (face::sameVertices(facesOfCellInside[cellFaceI], curFace))
{
if (cells[cellInside][cellFaceI] >= 0)
{
@ -385,7 +382,7 @@ void Foam::polyMesh::setTopology
<< abort(FatalError);
}
// increment the counter of faces
// Increment the counter of faces
nFaces++;
}
@ -501,7 +498,7 @@ Foam::polyMesh::polyMesh
IOobject::AUTO_WRITE
),
*this,
boundaryFaces.size() + 1 // add room for a default patch
boundaryFaces.size() + 1 // Add room for a default patch
),
bounds_(points_, syncPar),
comm_(UPstream::worldComm),
@ -587,7 +584,7 @@ Foam::polyMesh::polyMesh
// completed, as they hold a subList of the face list
forAll(boundaryFaces, patchI)
{
// add the patch to the list
// Add the patch to the list
boundary_.set
(
patchI,
@ -785,7 +782,7 @@ Foam::polyMesh::polyMesh
IOobject::AUTO_WRITE
),
*this,
boundaryFaces.size() + 1 // add room for a default patch
boundaryFaces.size() + 1 // Add room for a default patch
),
bounds_(points_, syncPar),
comm_(UPstream::worldComm),
@ -876,7 +873,7 @@ Foam::polyMesh::polyMesh
patchDict.set("nFaces", patchSizes[patchI]);
patchDict.set("startFace", patchStarts[patchI]);
// add the patch to the list
// Add the patch to the list
boundary_.set
(
patchI,