BUGFIX: next wall distance may cause seg fault

This commit is contained in:
Henrik Rusche 2017-08-02 18:56:05 +02:00
parent 08a7e2e03b
commit 7fe57ece38
2 changed files with 92 additions and 65 deletions

View file

@ -33,31 +33,16 @@ License
void Foam::nearWallDist::doAll() void Foam::nearWallDist::doAll()
{ {
cellDistFuncs wallUtils(mesh_);
// AJ: make sure to pick up all patches that are specified as a wall
const polyBoundaryMesh& bMesh = wallUtils.mesh().boundaryMesh();
labelHashSet wallPatchIDs(bMesh.size());
forAll(bMesh, patchI)
{
if (bMesh[patchI].isWall())
{
wallPatchIDs.insert(patchI);
}
}
// Get patch ids of walls
// labelHashSet wallPatchIDs(wallUtils.getPatchIDs<wallPolyPatch>());
// Size neighbours array for maximum possible
labelList neighbours(wallUtils.maxPatchSize(wallPatchIDs));
// Correct all cells with face on wall // Correct all cells with face on wall
const volVectorField& cellCentres = mesh_.C(); const volVectorField& cellCentres = mesh_.C();
// HR 12.02.18: Use hashSet to determine nbs
// This should removes a possible error due to wrong sizing since
// getPointNeighbours may still run over AND should be faster
// since the linear search (again getPointNeighbours) is removed.
labelHashSet nbs(20);
// Correct all cells with face on wall
forAll(mesh_.boundary(), patchI) forAll(mesh_.boundary(), patchI)
{ {
fvPatchScalarField& ypatch = operator[](patchI); fvPatchScalarField& ypatch = operator[](patchI);
@ -67,29 +52,45 @@ void Foam::nearWallDist::doAll()
if (patch.isWall()) if (patch.isWall())
{ {
const polyPatch& pPatch = patch.patch(); const polyPatch& pPatch = patch.patch();
const pointField& points = pPatch.points();
const unallocLabelList& faceCells = patch.faceCells(); const unallocLabelList& faceCells = pPatch.faceCells();
// Check cells with face on wall // Check cells with face on wall
forAll(patch, patchFaceI) forAll(patch, patchFaceI)
{ {
label nNeighbours = wallUtils.getPointNeighbours const face& f = pPatch.localFaces()[patchFaceI];
(
pPatch,
patchFaceI,
neighbours
);
label minFaceI = -1; scalar minDist = GREAT;
ypatch[patchFaceI] = wallUtils.smallestDist // Loop over points
( forAll(f, fI)
cellCentres[faceCells[patchFaceI]], {
pPatch, const labelList& pointNbs = pPatch.pointFaces()[f[fI]];
nNeighbours,
neighbours, // Loop over faces sharing current point
minFaceI // This will include the face itself
); forAll(pointNbs, pointNbsI)
{
const label nbr = pointNbs[pointNbsI];
if (nbs.insert(nbr))
{
const pointHit curHit = pPatch[nbr].nearestPoint
(
cellCentres[faceCells[nbr]],
points
);
if (curHit.distance() < minDist)
{
minDist = curHit.distance();
}
}
}
}
ypatch[patchFaceI] = minDist;
nbs.clear();
} }
} }
else else

View file

@ -181,6 +181,12 @@ Foam::label Foam::cellDistFuncs::getPointNeighbours
label faceI = pointNbs[nbI]; label faceI = pointNbs[nbI];
// Check for faceI in edge-neighbours part of neighbours // Check for faceI in edge-neighbours part of neighbours
// HR 12.02.18: Should start the search from the begining
// of the list. Otherwise we may append a face that is
// also an edge neighbour -> Inefficient + sizing may not
// be adequate on processors with very small wall patches.
// Therefore replaced and not used anymore!
if (findIndex(nEdgeNbs, neighbours, faceI) == -1) if (findIndex(nEdgeNbs, neighbours, faceI) == -1)
{ {
neighbours[nNeighbours++] = faceI; neighbours[nNeighbours++] = faceI;
@ -297,11 +303,11 @@ void Foam::cellDistFuncs::correctBoundaryFaceCells
Map<label>& nearestFace Map<label>& nearestFace
) const ) const
{ {
// Size neighbours array for maximum possible (= size of largest patch) // HR 12.02.18: Use hashSet to determine nbs
label maxPointNeighbours = maxPatchSize(patchIDs); // This should removes a possible error due to wrong sizing since
// getPointNeighbours may still run over AND should be faster
labelList neighbours(maxPointNeighbours); // since the linear search (again getPointNeighbours) is removed.
labelHashSet nbs(20);
// Correct all cells with face on wall // Correct all cells with face on wall
const vectorField& cellCentres = mesh().cellCentres(); const vectorField& cellCentres = mesh().cellCentres();
@ -311,37 +317,57 @@ void Foam::cellDistFuncs::correctBoundaryFaceCells
{ {
if (patchIDs.found(patchI)) if (patchIDs.found(patchI))
{ {
const polyPatch& patch = mesh().boundaryMesh()[patchI]; const polyPatch& pPatch = mesh().boundaryMesh()[patchI];
const pointField& points = pPatch.points();
const unallocLabelList& faceCells = pPatch.faceCells();
// Check cells with face on wall forAll(pPatch, patchFaceI)
forAll(patch, patchFaceI)
{ {
label nNeighbours = getPointNeighbours const face& f = pPatch.localFaces()[patchFaceI];
(
patch,
patchFaceI,
neighbours
);
label cellI = faceOwner[patch.start() + patchFaceI];
scalar minDist = GREAT;
label minFaceI = -1; label minFaceI = -1;
wallDistCorrected[cellI] = smallestDist // Loop over points
( forAll(f, fI)
cellCentres[cellI], {
patch, const labelList& pointNbs = pPatch.pointFaces()[f[fI]];
nNeighbours,
neighbours, // Loop over faces sharing current point
minFaceI // This will include the face itself
); forAll(pointNbs, pointNbsI)
{
const label nbr = pointNbs[pointNbsI];
if (nbs.insert(nbr))
{
const pointHit curHit = pPatch[nbr].nearestPoint
(
cellCentres[faceCells[nbr]],
points
);
if (curHit.distance() < minDist)
{
minDist = curHit.distance();
minFaceI = nbr;
}
}
}
}
wallDistCorrected[patchFaceI] = minDist;
// Store wallCell and its nearest neighbour // Store wallCell and its nearest neighbour
nearestFace.insert(cellI, minFaceI); nearestFace.insert
(
faceOwner[pPatch.start() + patchFaceI],
pPatch.start() + minFaceI
);
nbs.clear();
} }
} }
} }
} }