From 095f4b03f1517643742e66c95bfcfedf4a05c7c3 Mon Sep 17 00:00:00 2001 From: Will Bainbridge Date: Fri, 28 Oct 2022 12:16:05 +0100 Subject: [PATCH] checkMesh: Added writing of NCC coverage If checkMesh is executed with the -allGeometry option, then surface files containing the NCC coverage will now be written out. Coverage is the ratio between coupled area magnitude and total area magnitude. This is useful for locating parts of the boundary mesh that are in error. Errors (such as folds and pinches) typically manifest as a coverage value that deviates significantly from a value of one. This is comparable to the writing of AMI patches's weight sums, which also used to occur when the -allGeometry option was selected. --- .../manipulation/checkMesh/checkGeometry.C | 150 +++++++++++++++- .../manipulation/checkMesh/checkGeometry.H | 45 +++++ .../manipulation/checkMesh/checkMeshQuality.C | 30 ++++ .../manipulation/checkMesh/checkMeshQuality.H | 45 ++++- .../mesh/manipulation/checkMesh/checkTools.C | 1 + .../mesh/manipulation/checkMesh/checkTools.H | 42 ++++- .../manipulation/checkMesh/checkTopology.C | 2 +- .../manipulation/checkMesh/checkTopology.H | 54 +++++- .../manipulation/checkMesh/printMeshStats.C | 170 ------------------ .../manipulation/checkMesh/printMeshStats.H | 6 - .../intersection/intersectionPatchToPatch.C | 3 +- .../intersection/intersectionPatchToPatch.H | 6 + .../intersection/intersectionPatchToPatchI.H | 14 ++ 13 files changed, 380 insertions(+), 188 deletions(-) delete mode 100644 applications/utilities/mesh/manipulation/checkMesh/printMeshStats.C delete mode 100644 applications/utilities/mesh/manipulation/checkMesh/printMeshStats.H diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C index 91a92da072..030f4a89fd 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C +++ b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.C @@ -1,3 +1,28 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + #include "PatchTools.H" #include "checkGeometry.H" #include "polyMesh.H" @@ -11,12 +36,14 @@ #include "vtkSurfaceWriter.H" #include "setWriter.H" +#include "writeFile.H" +#include "nonConformalCyclicPolyPatch.H" #include "checkTools.H" #include "Time.H" -// Find wedge with opposite orientation. Note: does not actually check that -// it is opposite, only that it has opposite normal and same axis +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + Foam::label Foam::findOppositeWedge ( const polyMesh& mesh, @@ -942,5 +969,124 @@ Foam::label Foam::checkGeometry } } + if (allGeometry) + { + const fileName outputPath = + mesh.time().globalPath() + /functionObjects::writeFile::outputPrefix + /(mesh.name() != polyMesh::defaultRegion ? mesh.name() : word()) + /"checkMesh" + /mesh.time().timeName(); + + const polyBoundaryMesh& patches = mesh.boundaryMesh(); + + // Compute coverage for all orig patches + PtrList patchCoverage(patches.size()); + forAll(patches, nccPatchi) + { + if (isA(patches[nccPatchi])) + { + const nonConformalCyclicPolyPatch& nccPp = + refCast + (patches[nccPatchi]); + + if (nccPp.owner()) + { + const polyPatch& origPp = nccPp.origPatch(); + const polyPatch& nbrOrigPp = nccPp.nbrPatch().origPatch(); + + const patchToPatches::intersection& intersection = + nccPp.intersection(); + + if (!patchCoverage.set(origPp.index())) + { + patchCoverage.set + ( + origPp.index(), + scalarField(origPp.size(), 0) + ); + } + + patchCoverage[origPp.index()] += + intersection.srcCoverage(); + + if (!patchCoverage.set(nbrOrigPp.index())) + { + patchCoverage.set + ( + nbrOrigPp.index(), + scalarField(nbrOrigPp.size(), 0) + ); + } + + patchCoverage[nbrOrigPp.index()] += + intersection.tgtCoverage(); + } + } + } + + // Write out to surface files + forAll(patches, patchi) + { + if (patchCoverage.set(patchi)) + { + const polyPatch& patch = patches[patchi]; + + // Collect the patch geometry + labelList pointToGlobal; + labelList uniqueMeshPointLabels; + autoPtr globalPoints; + autoPtr globalFaces; + faceList mergedFaces; + pointField mergedPoints; + Foam::PatchTools::gatherAndMerge + ( + mesh, + patch.localFaces(), + patch.meshPoints(), + patch.meshPointMap(), + pointToGlobal, + uniqueMeshPointLabels, + globalPoints, + globalFaces, + mergedFaces, + mergedPoints + ); + + // Collect the patch coverage + scalarField mergedCoverage; + globalFaces().gather + ( + UPstream::worldComm, + labelList(UPstream::procID(UPstream::worldComm)), + patchCoverage[patchi], + mergedCoverage + ); + + // Write the surface + if (Pstream::master()) + { + vtkSurfaceWriter + ( + mesh.time().writeFormat(), + mesh.time().writeCompression() + ).write + ( + outputPath, + patch.name() + "_coverage", + mergedPoints, + mergedFaces, + false, + "coverage", + mergedCoverage + ); + } + } + } + } + return noFailedChecks; } + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.H b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.H index d9b75fb389..76f2f06e12 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.H +++ b/applications/utilities/mesh/manipulation/checkMesh/checkGeometry.H @@ -1,14 +1,52 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Description + Routines for checking mesh geometry + +SourceFiles + checkGeometry.C + +\*---------------------------------------------------------------------------*/ + +#ifndef checkGeometry_H +#define checkGeometry_H + #include "label.H" #include "HashSet.H" #include "labelVector.H" #include "setWriter.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + namespace Foam { class polyMesh; class wedgePolyPatch; class surfaceWriter; + //- Find wedge with opposite orientation. Note: does not actually check + // that it is opposite, only that it has opposite normal and same axis. label findOppositeWedge(const polyMesh&, const wedgePolyPatch&); //- Check wedge orientation @@ -23,6 +61,7 @@ namespace Foam //- Check 0th vertex on coupled faces bool checkCoupledPoints(const polyMesh&, const bool report, labelHashSet*); + //- Check the geometry label checkGeometry ( const polyMesh& mesh, @@ -31,3 +70,9 @@ namespace Foam const autoPtr& ); } + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.C b/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.C index a6a01c7336..cb7205c1da 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.C +++ b/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.C @@ -1,3 +1,28 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + #include "checkMeshQuality.H" #include "polyMesh.H" #include "cellSet.H" @@ -6,6 +31,8 @@ #include "surfaceWriter.H" #include "checkTools.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + Foam::label Foam::checkMeshQuality ( const polyMesh& mesh, @@ -38,3 +65,6 @@ Foam::label Foam::checkMeshQuality return noFailedChecks; } + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.H b/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.H index 52507986bf..8e2784b426 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.H +++ b/applications/utilities/mesh/manipulation/checkMesh/checkMeshQuality.H @@ -1,7 +1,44 @@ -#include "polyMesh.H" +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Description + Routines for checking mesh quality + +SourceFiles + checkMeshQuality.C + +\*---------------------------------------------------------------------------*/ + +#ifndef checkMeshQuality_H +#define checkMeshQuality_H + +#include "dictionary.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { + class polyMesh; class surfaceWriter; label checkMeshQuality @@ -11,3 +48,9 @@ namespace Foam const autoPtr& ); } + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkTools.C b/applications/utilities/mesh/manipulation/checkMesh/checkTools.C index 6c37d71fa4..19b461e51a 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkTools.C +++ b/applications/utilities/mesh/manipulation/checkMesh/checkTools.C @@ -44,6 +44,7 @@ License #include "writeFile.H" #include "coordSet.H" +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // void Foam::printMeshStats(const polyMesh& mesh, const bool allTopology) { diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkTools.H b/applications/utilities/mesh/manipulation/checkMesh/checkTools.H index 12b94d3545..2b83d746a0 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkTools.H +++ b/applications/utilities/mesh/manipulation/checkMesh/checkTools.H @@ -1,17 +1,54 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Description + Tools for checking the mesh + +SourceFiles + checkTools.C + +\*---------------------------------------------------------------------------*/ + +#ifndef checkTools_H +#define checkTools_H + #include "scalar.H" #include "indirectPrimitivePatch.H" -#include "setWriter.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { class polyMesh; class surfaceWriter; + class setWriter; class pointSet; class faceSet; class cellSet; class fileName; class polyMesh; + //- Print mesh statistics void printMeshStats(const polyMesh& mesh, const bool allTopology); //- Generate merged surface on master and write. Needs input patch @@ -38,5 +75,8 @@ namespace Foam void mergeAndWrite(const setWriter&, const pointSet&); } +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif // ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C b/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C index d121bd0964..9315b01e5a 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C +++ b/applications/utilities/mesh/manipulation/checkMesh/checkTopology.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org - \\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License diff --git a/applications/utilities/mesh/manipulation/checkMesh/checkTopology.H b/applications/utilities/mesh/manipulation/checkMesh/checkTopology.H index ffad9fee69..17b4e0a960 100644 --- a/applications/utilities/mesh/manipulation/checkMesh/checkTopology.H +++ b/applications/utilities/mesh/manipulation/checkMesh/checkTopology.H @@ -1,18 +1,60 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | Website: https://openfoam.org + \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Description + Tools for checking the mesh + +SourceFiles + checkTopology.C + +\*---------------------------------------------------------------------------*/ + +#ifndef checkTopology_H +#define checkTopology_H + #include "label.H" #include "autoPtr.H" -#include "setWriter.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { class polyMesh; class surfaceWriter; + class setWriter; label checkTopology ( - const polyMesh&, - const bool, - const bool, - const autoPtr&, - const autoPtr& + const polyMesh& mesh, + const bool allTopology, + const bool allGeometry, + const autoPtr& surfWriter, + const autoPtr& setWriter ); } + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/checkMesh/printMeshStats.C b/applications/utilities/mesh/manipulation/checkMesh/printMeshStats.C deleted file mode 100644 index 0db4379218..0000000000 --- a/applications/utilities/mesh/manipulation/checkMesh/printMeshStats.C +++ /dev/null @@ -1,170 +0,0 @@ -#include "printMeshStats.H" -#include "polyMesh.H" -#include "globalMeshData.H" - -#include "hexMatcher.H" -#include "wedgeMatcher.H" -#include "prismMatcher.H" -#include "pyrMatcher.H" -#include "tetWedgeMatcher.H" -#include "tetMatcher.H" -#include "IOmanip.H" - - -void Foam::printMeshStats(const polyMesh& mesh, const bool allTopology) -{ - Info<< "Mesh stats" << nl - << " points: " - << returnReduce(mesh.points().size(), sumOp