Skip to content

Commit

Permalink
blockMesh: improved the merge tolerance to work better in single-prec…
Browse files Browse the repository at this point in the history
…ision
  • Loading branch information
Henry authored and Henry committed Aug 21, 2010
1 parent ab1f643 commit 136536c
Showing 1 changed file with 111 additions and 100 deletions.
211 changes: 111 additions & 100 deletions applications/utilities/mesh/generation/blockMesh/createMergeList.C
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,14 @@ Foam::labelList Foam::blockMesh::createMergeList()
// point to point distance on the block face.
// At the same time merge collated points on the block's faces
// (removes boundary poles etc.)
// Collated points detected by initally taking a constant factor of
// the size of the block.

boundBox bb(blockCells[blockPlabel].points(blockFaces, blockPoints));
const scalar mergeSqrDist = SMALL*magSqr(bb.span());

// This is an N^2 algorithm

// Co-located points detected by initally taking a constant factor of
// the size of the block face:
boundBox bb(blockFaces[blockFaceLabel].points(blockPoints));
const scalar mergeSqrDist =
SMALL*magSqr(bb.span())/blockPfaceFaces.size();
scalar sqrMergeTol = GREAT;

// This is an N^2 algorithm
forAll(blockPfaceFaces, blockPfaceFaceLabel)
{
const labelList& blockPfaceFacePoints
Expand Down Expand Up @@ -156,129 +154,142 @@ Foam::labelList Foam::blockMesh::createMergeList()

if (topology().isInternalFace(blockFaceLabel))
{
label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
const pointField& blockNpoints = blocks[blockNlabel].points();
const labelList& blockNfaces = blockCells[blockNlabel];
label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
const pointField& blockNpoints = blocks[blockNlabel].points();
const labelList& blockNfaces = blockCells[blockNlabel];

foundFace = false;
label blockNfaceLabel;
for
(
blockNfaceLabel = 0;
blockNfaceLabel < blockNfaces.size();
blockNfaceLabel++
)
{
if
foundFace = false;
label blockNfaceLabel;
for
(
blockFaces[blockNfaces[blockNfaceLabel]]
== blockFaces[blockFaceLabel]
blockNfaceLabel = 0;
blockNfaceLabel < blockNfaces.size();
blockNfaceLabel++
)
{
foundFace = true;
break;
if
(
blockFaces[blockNfaces[blockNfaceLabel]]
== blockFaces[blockFaceLabel]
)
{
foundFace = true;
break;
}
}
}

if (!foundFace)
{
FatalErrorIn("blockMesh::createMergeList()")
if (!foundFace)
{
FatalErrorIn("blockMesh::createMergeList()")
<< "Cannot find merge face for block " << blockNlabel
<< exit(FatalError);
};
<< exit(FatalError);
};

const labelListList& blockNfaceFaces =
const labelListList& blockNfaceFaces =
blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];

if (blockPfaceFaces.size() != blockNfaceFaces.size())
{
FatalErrorIn("blockMesh::createMergeList()")
if (blockPfaceFaces.size() != blockNfaceFaces.size())
{
FatalErrorIn("blockMesh::createMergeList()")
<< "Inconsistent number of faces between block pair "
<< blockPlabel << " and " << blockNlabel
<< exit(FatalError);
}

<< blockPlabel << " and " << blockNlabel
<< exit(FatalError);
}

bool found = false;

// N-squared point search over all points of all faces of
// master block over all point of all faces of slave block
forAll(blockPfaceFaces, blockPfaceFaceLabel)
{
const labelList& blockPfaceFacePoints
= blockPfaceFaces[blockPfaceFaceLabel];
bool found = false;

labelList& cp = curPairs[blockPfaceFaceLabel];
cp.setSize(blockPfaceFacePoints.size());
cp = -1;

forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
// N-squared point search over all points of all faces of
// master block over all point of all faces of slave block
forAll(blockPfaceFaces, blockPfaceFaceLabel)
{
found = false;
const labelList& blockPfaceFacePoints =
blockPfaceFaces[blockPfaceFaceLabel];

forAll(blockNfaceFaces, blockNfaceFaceLabel)
labelList& cp = curPairs[blockPfaceFaceLabel];
cp.setSize(blockPfaceFacePoints.size());
cp = -1;

forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
{
const labelList& blockNfaceFacePoints
= blockNfaceFaces[blockNfaceFaceLabel];
found = false;

forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
forAll(blockNfaceFaces, blockNfaceFaceLabel)
{
if
(
magSqr
(
blockPpoints
[blockPfaceFacePoints[blockPfaceFacePointLabel]]
- blockNpoints
[blockNfaceFacePoints[blockNfaceFacePointLabel]]
) < sqrMergeTol
)
const labelList& blockNfaceFacePoints
= blockNfaceFaces[blockNfaceFaceLabel];

forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
{
// Found a new pair
found = true;
if
(
magSqr
(
blockPpoints
[
blockPfaceFacePoints
[blockPfaceFacePointLabel]
]
- blockNpoints
[
blockNfaceFacePoints
[blockNfaceFacePointLabel]
]
) < sqrMergeTol
)
{
// Found a new pair
found = true;

cp[blockPfaceFacePointLabel] =
cp[blockPfaceFacePointLabel] =
blockNfaceFacePoints[blockNfaceFacePointLabel];

label PpointLabel =
blockPfaceFacePoints[blockPfaceFacePointLabel]
+ blockOffsets_[blockPlabel];

label NpointLabel =
blockNfaceFacePoints[blockNfaceFacePointLabel]
+ blockOffsets_[blockNlabel];

label minPN = min(PpointLabel, NpointLabel);

if (MergeList[PpointLabel] != -1)
{
minPN = min(minPN, MergeList[PpointLabel]);
}

if (MergeList[NpointLabel] != -1)
{
minPN = min(minPN, MergeList[NpointLabel]);
label PpointLabel =
blockPfaceFacePoints
[
blockPfaceFacePointLabel
]
+ blockOffsets_[blockPlabel];

label NpointLabel =
blockNfaceFacePoints
[
blockNfaceFacePointLabel
]
+ blockOffsets_[blockNlabel];

label minPN = min(PpointLabel, NpointLabel);

if (MergeList[PpointLabel] != -1)
{
minPN = min(minPN, MergeList[PpointLabel]);
}

if (MergeList[NpointLabel] != -1)
{
minPN = min(minPN, MergeList[NpointLabel]);
}

MergeList[PpointLabel] =
MergeList[NpointLabel] =
minPN;
}

MergeList[PpointLabel] = MergeList[NpointLabel]
= minPN;
}
}
}
}
forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
{
if (cp[blockPfaceFacePointLabel] == -1)
forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
{
FatalErrorIn("blockMesh::createMergeList()")
<< "Inconsistent point locations between block pair "
<< blockPlabel << " and " << blockNlabel << nl
<< " probably due to inconsistent grading."
<< exit(FatalError);
if (cp[blockPfaceFacePointLabel] == -1)
{
FatalErrorIn("blockMesh::createMergeList()")
<< "Inconsistent point locations between blocks "
<< blockPlabel << " and " << blockNlabel << nl
<< " probably due to inconsistent grading."
<< exit(FatalError);
}
}
}
}
}
}


Expand Down

0 comments on commit 136536c

Please sign in to comment.