From 0b70301136a5b722fd56aaa6601a36fe6b1655da Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Thu, 2 Aug 2018 12:22:39 +0100 Subject: [PATCH] ENH: overset: disallow hole donors. See #810. --- .../cellCellStencil/cellCellStencil.C | 31 +++++++++++++++---- .../cellCellStencil/cellCellStencil.H | 1 + .../inverseDistanceCellCellStencil.C | 11 +++++++ 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C index ab4b416a860..23be9674c62 100644 --- a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.C @@ -170,6 +170,7 @@ void Foam::cellCellStencil::globalCellCells ( const globalIndex& gi, const polyMesh& mesh, + const boolList& isValidDonor, const labelList& selectedCells, labelListList& cellCells, pointListList& cellCellCentres @@ -206,6 +207,14 @@ void Foam::cellCellStencil::globalCellCells nbrCellCentres ); + boolList nbrIsValidDonor; + syncTools::swapBoundaryCellList + ( + mesh, + isValidDonor, + nbrIsValidDonor + ); + // 2. Collect cell and all its neighbours @@ -224,8 +233,11 @@ void Foam::cellCellStencil::globalCellCells label compacti = 0; // First entry is cell itself - stencil[compacti] = globalCellIDs[celli]; - stencilPoints[compacti++] = cellCentres[celli]; + if (isValidDonor[celli]) + { + stencil[compacti] = globalCellIDs[celli]; + stencilPoints[compacti++] = cellCentres[celli]; + } // Other entries are cell neighbours forAll(cFaces, i) @@ -235,10 +247,12 @@ void Foam::cellCellStencil::globalCellCells label own = faceOwner[facei]; label nbrCelli; point nbrCc; + bool isValid = false; if (bFacei >= 0) { nbrCelli = nbrGlobalCellIDs[bFacei]; nbrCc = nbrCellCentres[bFacei]; + isValid = nbrIsValidDonor[bFacei]; } else { @@ -246,20 +260,25 @@ void Foam::cellCellStencil::globalCellCells { nbrCelli = gi.toGlobal(own); nbrCc = cellCentres[own]; + isValid = isValidDonor[own]; } else { label nei = faceNeighbour[facei]; nbrCelli = gi.toGlobal(nei); nbrCc = cellCentres[nei]; + isValid = isValidDonor[nei]; } } - SubList<label> current(stencil, compacti); - if (!current.found(nbrCelli)) + if (isValid) { - stencil[compacti] = nbrCelli; - stencilPoints[compacti++] = nbrCc; + SubList<label> current(stencil, compacti); + if (!current.found(nbrCelli)) + { + stencil[compacti] = nbrCelli; + stencilPoints[compacti++] = nbrCc; + } } } stencil.setSize(compacti); diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H index af415228b89..a40fe172fbd 100644 --- a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H @@ -195,6 +195,7 @@ public: ( const globalIndex& gi, const polyMesh& mesh, + const boolList& isValidDonor, const labelList& selectedCells, labelListList& cellCells, pointListList& cellCellCentres diff --git a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C index 68fbef62780..828f81f0a00 100644 --- a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C +++ b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C @@ -1434,6 +1434,16 @@ void Foam::cellCellStencils::inverseDistance::createStencil // Special value for unused points const vector greatPoint(GREAT, GREAT, GREAT); + boolList isValidDonor(mesh_.nCells(), true); + forAll(cellTypes_, celli) + { + if (cellTypes_[celli] == HOLE) + { + isValidDonor[celli] = false; + } + } + + // Has acceptor been handled already? bitSet doneAcceptor(interpolationCells_.size()); @@ -1513,6 +1523,7 @@ void Foam::cellCellStencils::inverseDistance::createStencil ( globalCells, mesh_, + isValidDonor, donorCells, donorCellCells, donorCellCentres -- GitLab