From 134aaee91a289944d080cbeb4464635cc3c9ef6e Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Fri, 17 Sep 2021 12:20:32 +0200 Subject: [PATCH] ENH: relocated tetBasePtIs adjustment from sampling to polyMeshTetDecomposition --- .../polyMeshTetDecomposition.C | 200 +++++++++++++++++- .../polyMeshTetDecomposition.H | 25 ++- .../surface/isoSurface/isoSurfaceTopo.C | 190 +---------------- .../surface/isoSurface/isoSurfaceTopo.H | 10 +- 4 files changed, 221 insertions(+), 204 deletions(-) diff --git a/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C b/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C index 9b6ef868ce..b912f96cd9 100644 --- a/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C +++ b/src/OpenFOAM/meshes/polyMesh/polyMeshTetDecomposition/polyMeshTetDecomposition.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2019 OpenFOAM Foundation - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -91,6 +91,45 @@ Foam::scalar Foam::polyMeshTetDecomposition::minQuality } +Foam::scalar Foam::polyMeshTetDecomposition::minQuality +( + const polyMesh& mesh, + const label facei, + const label faceBasePtI +) +{ + const scalar ownQuality = + minQuality + ( + mesh, + mesh.cellCentres()[mesh.faceOwner()[facei]], + facei, + true, + faceBasePtI + ); + + if (mesh.isInternalFace(facei)) + { + const scalar neiQuality = + minQuality + ( + mesh, + mesh.cellCentres()[mesh.faceNeighbour()[facei]], + facei, + false, + faceBasePtI + ); + + if (neiQuality < ownQuality) + { + return neiQuality; + } + } + + return ownQuality; +} + + Foam::label Foam::polyMeshTetDecomposition::findSharedBasePoint ( const polyMesh& mesh, @@ -112,10 +151,10 @@ Foam::label Foam::polyMeshTetDecomposition::findSharedBasePoint forAll(f, faceBasePtI) { - scalar minQ = minQuality(mesh, oCc, fI, true, faceBasePtI); - minQ = min(minQ, minQuality(mesh, nCc, fI, false, faceBasePtI)); + scalar ownQuality = minQuality(mesh, oCc, fI, true, faceBasePtI); + scalar neiQuality = minQuality(mesh, nCc, fI, false, faceBasePtI); - if (minQ > tol) + if (min(ownQuality, neiQuality) > tol) { return faceBasePtI; } @@ -594,4 +633,157 @@ Foam::tetIndices Foam::polyMeshTetDecomposition::findTet } +Foam::labelList Foam::polyMeshTetDecomposition::adjustTetBasePtIs +( + const polyMesh& mesh, + const bool report +) +{ + // Determine points used by two faces on the same cell + const cellList& cells = mesh.cells(); + const faceList& faces = mesh.faces(); + const labelList& faceOwn = mesh.faceOwner(); + const labelList& faceNei = mesh.faceNeighbour(); + + + // Get face triangulation base point + labelList tetBasePtIs(mesh.tetBasePtIs()); + + + // Pre-filter: mark all cells with illegal base points + bitSet problemCells(cells.size()); + + forAll(tetBasePtIs, facei) + { + if (tetBasePtIs[facei] == -1) + { + problemCells.set(faceOwn[facei]); + + if (mesh.isInternalFace(facei)) + { + problemCells.set(faceNei[facei]); + } + } + } + + + // Mark all points that are shared by just two faces within an adjacent + // problem cell as problematic + bitSet problemPoints(mesh.points().size()); + + { + // Number of times a point occurs in a cell. + // Used to detect dangling vertices (count = 2) + Map