checkMesh: Added option to write sets

- the checking for point-connected multiple-regions now also writes the
    conflicting points to a pointSet
  - with the -writeSets option it now also reconstructs & writes pointSets
This commit is contained in:
Henry Weller
2016-07-22 16:53:49 +01:00
parent 5344c7eb26
commit aa30d0e7d5
8 changed files with 255 additions and 65 deletions

View File

@ -1,5 +1,6 @@
EXE_INC = \ EXE_INC = \
-I$(LIB_SRC)/meshTools/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/fileFormats/lnInclude \
-I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/sampling/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \
-I$(LIB_SRC)/surfMesh/lnInclude \ -I$(LIB_SRC)/surfMesh/lnInclude \

View File

@ -8,9 +8,11 @@
#include "wedgePolyPatch.H" #include "wedgePolyPatch.H"
#include "unitConversion.H" #include "unitConversion.H"
#include "polyMeshTetDecomposition.H" #include "polyMeshTetDecomposition.H"
#include "surfaceWriter.H"
#include "checkTools.H"
#include "vtkSurfaceWriter.H" #include "vtkSurfaceWriter.H"
#include "writer.H"
#include "checkTools.H"
#include "cyclicAMIPolyPatch.H" #include "cyclicAMIPolyPatch.H"
#include "Time.H" #include "Time.H"
@ -481,7 +483,8 @@ Foam::label Foam::checkGeometry
( (
const polyMesh& mesh, const polyMesh& mesh,
const bool allGeometry, const bool allGeometry,
const autoPtr<surfaceWriter>& writer const autoPtr<surfaceWriter>& surfWriter,
const autoPtr<writer<scalar>>& setWriter
) )
{ {
label noFailedChecks = 0; label noFailedChecks = 0;
@ -538,6 +541,10 @@ Foam::label Foam::checkGeometry
<< nonAlignedPoints.name() << endl; << nonAlignedPoints.name() << endl;
nonAlignedPoints.instance() = mesh.pointsInstance(); nonAlignedPoints.instance() = mesh.pointsInstance();
nonAlignedPoints.write(); nonAlignedPoints.write();
if (setWriter.valid())
{
mergeAndWrite(setWriter, nonAlignedPoints);
}
} }
} }
} }
@ -568,9 +575,9 @@ Foam::label Foam::checkGeometry
<< " non closed cells to set " << cells.name() << endl; << " non closed cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance(); cells.instance() = mesh.pointsInstance();
cells.write(); cells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), cells); mergeAndWrite(surfWriter(), cells);
} }
} }
} }
@ -584,9 +591,9 @@ Foam::label Foam::checkGeometry
<< aspectCells.name() << endl; << aspectCells.name() << endl;
aspectCells.instance() = mesh.pointsInstance(); aspectCells.instance() = mesh.pointsInstance();
aspectCells.write(); aspectCells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), aspectCells); mergeAndWrite(surfWriter(), aspectCells);
} }
} }
} }
@ -605,9 +612,9 @@ Foam::label Foam::checkGeometry
<< " zero area faces to set " << faces.name() << endl; << " zero area faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -627,9 +634,9 @@ Foam::label Foam::checkGeometry
<< " zero volume cells to set " << cells.name() << endl; << " zero volume cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance(); cells.instance() = mesh.pointsInstance();
cells.write(); cells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), cells); mergeAndWrite(surfWriter(), cells);
} }
} }
} }
@ -650,9 +657,9 @@ Foam::label Foam::checkGeometry
<< " non-orthogonal faces to set " << faces.name() << endl; << " non-orthogonal faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -672,9 +679,9 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl; << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -694,9 +701,9 @@ Foam::label Foam::checkGeometry
<< " skew faces to set " << faces.name() << endl; << " skew faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -718,9 +725,9 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl; << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -751,9 +758,9 @@ Foam::label Foam::checkGeometry
<< "decomposition tets to set " << faces.name() << endl; << "decomposition tets to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -776,6 +783,10 @@ Foam::label Foam::checkGeometry
<< endl; << endl;
points.instance() = mesh.pointsInstance(); points.instance() = mesh.pointsInstance();
points.write(); points.write();
if (setWriter.valid())
{
mergeAndWrite(setWriter, points);
}
} }
} }
@ -795,6 +806,10 @@ Foam::label Foam::checkGeometry
<< " apart) points to set " << nearPoints.name() << endl; << " apart) points to set " << nearPoints.name() << endl;
nearPoints.instance() = mesh.pointsInstance(); nearPoints.instance() = mesh.pointsInstance();
nearPoints.write(); nearPoints.write();
if (setWriter.valid())
{
mergeAndWrite(setWriter, nearPoints);
}
} }
} }
} }
@ -815,9 +830,9 @@ Foam::label Foam::checkGeometry
<< endl; << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -838,9 +853,9 @@ Foam::label Foam::checkGeometry
<< " warped faces to set " << faces.name() << endl; << " warped faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -859,9 +874,9 @@ Foam::label Foam::checkGeometry
<< " under-determined cells to set " << cells.name() << endl; << " under-determined cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance(); cells.instance() = mesh.pointsInstance();
cells.write(); cells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), cells); mergeAndWrite(surfWriter(), cells);
} }
} }
} }
@ -879,9 +894,9 @@ Foam::label Foam::checkGeometry
<< " concave cells to set " << cells.name() << endl; << " concave cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance(); cells.instance() = mesh.pointsInstance();
cells.write(); cells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), cells); mergeAndWrite(surfWriter(), cells);
} }
} }
} }
@ -900,9 +915,9 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl; << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -921,9 +936,9 @@ Foam::label Foam::checkGeometry
<< faces.name() << endl; << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -936,11 +951,16 @@ Foam::label Foam::checkGeometry
const word procAndTime(Foam::name(Pstream::myProcNo()) + "_" + tmName); const word procAndTime(Foam::name(Pstream::myProcNo()) + "_" + tmName);
autoPtr<surfaceWriter> patchWriter; autoPtr<surfaceWriter> patchWriter;
if (!writer.valid()) if (!surfWriter.valid())
{ {
patchWriter.reset(new vtkSurfaceWriter()); patchWriter.reset(new vtkSurfaceWriter());
} }
const surfaceWriter& wr = (writer.valid() ? writer() : patchWriter()); const surfaceWriter& wr =
(
surfWriter.valid()
? surfWriter()
: patchWriter()
);
forAll(pbm, patchi) forAll(pbm, patchi)
{ {

View File

@ -1,6 +1,7 @@
#include "label.H" #include "label.H"
#include "HashSet.H" #include "HashSet.H"
#include "labelVector.H" #include "labelVector.H"
#include "writer.H"
namespace Foam namespace Foam
{ {
@ -26,6 +27,7 @@ namespace Foam
( (
const polyMesh& mesh, const polyMesh& mesh,
const bool allGeometry, const bool allGeometry,
const autoPtr<surfaceWriter>& const autoPtr<surfaceWriter>&,
const autoPtr<writer<scalar>>&
); );
} }

View File

@ -47,7 +47,8 @@ Usage
- \par -writeSets \<surfaceFormat\> - \par -writeSets \<surfaceFormat\>
Reconstruct all cellSets and faceSets geometry and write to Reconstruct all cellSets and faceSets geometry and write to
postProcessing directory according to surfaceFormat postProcessing directory according to surfaceFormat
(e.g. vtk or ensight) (e.g. vtk or ensight). Additionally reconstructs all pointSets and
writes as vtk format.
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
@ -56,7 +57,8 @@ Usage
#include "Time.H" #include "Time.H"
#include "polyMesh.H" #include "polyMesh.H"
#include "globalMeshData.H" #include "globalMeshData.H"
#include "vtkSurfaceWriter.H" #include "surfaceWriter.H"
#include "vtkSetWriter.H"
#include "checkTools.H" #include "checkTools.H"
#include "checkTopology.H" #include "checkTopology.H"
@ -94,7 +96,7 @@ int main(int argc, char *argv[])
argList::addOption argList::addOption
( (
"writeSets", "writeSets",
"<surfaceFormat>" "surfaceFormat",
"reconstruct and write all faceSets and cellSets in selected format" "reconstruct and write all faceSets and cellSets in selected format"
); );
@ -156,10 +158,12 @@ int main(int argc, char *argv[])
} }
autoPtr<surfaceWriter> writer; autoPtr<surfaceWriter> surfWriter;
autoPtr<writer<scalar>> setWriter;
if (writeSets) if (writeSets)
{ {
writer = surfaceWriter::New(surfaceFormat); surfWriter = surfaceWriter::New(surfaceFormat);
setWriter = writer<scalar>::New(vtkSetWriter<scalar>::typeName);
} }
@ -192,15 +196,22 @@ int main(int argc, char *argv[])
mesh, mesh,
allTopology, allTopology,
allGeometry, allGeometry,
writer surfWriter,
setWriter
); );
} }
nFailedChecks += checkGeometry(mesh, allGeometry, writer); nFailedChecks += checkGeometry
(
mesh,
allGeometry,
surfWriter,
setWriter
);
if (meshQuality) if (meshQuality)
{ {
nFailedChecks += checkMeshQuality(mesh, qualDict(), writer); nFailedChecks += checkMeshQuality(mesh, qualDict(), surfWriter);
} }
@ -221,11 +232,17 @@ int main(int argc, char *argv[])
{ {
Info<< "Time = " << runTime.timeName() << nl << endl; Info<< "Time = " << runTime.timeName() << nl << endl;
label nFailedChecks = checkGeometry(mesh, allGeometry, writer); label nFailedChecks = checkGeometry
(
mesh,
allGeometry,
surfWriter,
setWriter
);
if (meshQuality) if (meshQuality)
{ {
nFailedChecks += checkMeshQuality(mesh, qualDict(), writer); nFailedChecks += checkMeshQuality(mesh, qualDict(), surfWriter);
} }

View File

@ -33,6 +33,7 @@ License
#include "tetWedgeMatcher.H" #include "tetWedgeMatcher.H"
#include "tetMatcher.H" #include "tetMatcher.H"
#include "IOmanip.H" #include "IOmanip.H"
#include "pointSet.H"
#include "faceSet.H" #include "faceSet.H"
#include "cellSet.H" #include "cellSet.H"
#include "Time.H" #include "Time.H"
@ -369,6 +370,118 @@ void Foam::mergeAndWrite
/ set.name() / set.name()
); );
mergeAndWrite(mesh, writer, set.name(), setPatch, outputDir); mergeAndWrite(mesh, writer, set.name(), setPatch, outputDir);
} }
void Foam::mergeAndWrite
(
const writer<scalar>& writer,
const pointSet& set
)
{
const polyMesh& mesh = refCast<const polyMesh>(set.db());
pointField mergedPts;
labelList mergedIDs;
if (Pstream::parRun())
{
// Note: we explicitly do not merge the points
// (mesh.globalData().mergePoints etc) since this might
// hide any synchronisation problem
globalIndex globalNumbering(mesh.nPoints());
mergedPts.setSize(returnReduce(set.size(), sumOp<label>()));
mergedIDs.setSize(mergedPts.size());
labelList setPointIDs(set.sortedToc());
// Get renumbered local data
pointField myPoints(mesh.points(), setPointIDs);
labelList myIDs(setPointIDs.size());
forAll(setPointIDs, i)
{
myIDs[i] = globalNumbering.toGlobal(setPointIDs[i]);
}
if (Pstream::master())
{
// Insert master data first
label pOffset = 0;
SubList<point>(mergedPts, myPoints.size(), pOffset) = myPoints;
SubList<label>(mergedIDs, myIDs.size(), pOffset) = myIDs;
pOffset += myPoints.size();
// Receive slave ones
for (int slave=1; slave<Pstream::nProcs(); slave++)
{
IPstream fromSlave(Pstream::scheduled, slave);
pointField slavePts(fromSlave);
labelList slaveIDs(fromSlave);
SubList<point>(mergedPts, slavePts.size(), pOffset) = slavePts;
SubList<label>(mergedIDs, slaveIDs.size(), pOffset) = slaveIDs;
pOffset += slaveIDs.size();
}
}
else
{
// Construct processor stream with estimate of size. Could
// be improved.
OPstream toMaster
(
Pstream::scheduled,
Pstream::masterNo(),
myPoints.byteSize() + myIDs.byteSize()
);
toMaster << myPoints << myIDs;
}
}
else
{
mergedIDs = set.sortedToc();
mergedPts = pointField(mesh.points(), mergedIDs);
}
// Write with scalar pointID
if (Pstream::master())
{
scalarField scalarPointIDs(mergedIDs.size());
forAll(mergedIDs, i)
{
scalarPointIDs[i] = 1.0*mergedIDs[i];
}
coordSet points(set.name(), "distance", mergedPts, mag(mergedPts));
List<const scalarField*> flds(1, &scalarPointIDs);
wordList fldNames(1, "pointID");
// Output e.g. pointSet p0 to
// postProcessing/<time>/p0.vtk
const fileName outputDir
(
set.time().path()
/ (Pstream::parRun() ? ".." : "")
/ "postProcessing"
/ mesh.pointsInstance()
// set.name()
);
mkDir(outputDir);
fileName outputFile(outputDir/writer.getFileName(points, wordList()));
//fileName outputFile(outputDir/set.name());
OFstream os(outputFile);
writer.write(points, fldNames, flds, os);
}
}
// ************************************************************************* //

View File

@ -1,10 +1,12 @@
#include "scalar.H" #include "scalar.H"
#include "indirectPrimitivePatch.H" #include "indirectPrimitivePatch.H"
#include "writer.H"
namespace Foam namespace Foam
{ {
class polyMesh; class polyMesh;
class surfaceWriter; class surfaceWriter;
class pointSet;
class faceSet; class faceSet;
class cellSet; class cellSet;
class fileName; class fileName;
@ -23,11 +25,18 @@ namespace Foam
const fileName& outputDir const fileName& outputDir
); );
//- Write vtk representation of (assembled) faceSet to vtk file in //- Write vtk representation of (assembled) faceSet to surface file in
// postProcessing/ directory // postProcessing/ directory
void mergeAndWrite(const surfaceWriter&, const faceSet&); void mergeAndWrite(const surfaceWriter&, const faceSet&);
//- Write vtk representation of (assembled) cellSet to vtk file in //- Write vtk representation of (assembled) cellSet to surface file in
// postProcessing/ directory // postProcessing/ directory
void mergeAndWrite(const surfaceWriter&, const cellSet&); void mergeAndWrite(const surfaceWriter&, const cellSet&);
//- Write vtk representation of (assembled) pointSet to 'set' file in
// postProcessing/ directory
void mergeAndWrite(const writer<scalar>&, const pointSet&);
} }
// ************************************************************************* //

View File

@ -43,7 +43,8 @@ Foam::label Foam::checkTopology
const polyMesh& mesh, const polyMesh& mesh,
const bool allTopology, const bool allTopology,
const bool allGeometry, const bool allGeometry,
const autoPtr<surfaceWriter>& writer const autoPtr<surfaceWriter>& surfWriter,
const autoPtr<writer<scalar>>& setWriter
) )
{ {
label noFailedChecks = 0; label noFailedChecks = 0;
@ -129,9 +130,9 @@ Foam::label Foam::checkTopology
<< " illegal cells to set " << cells.name() << endl; << " illegal cells to set " << cells.name() << endl;
cells.instance() = mesh.pointsInstance(); cells.instance() = mesh.pointsInstance();
cells.write(); cells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), cells); mergeAndWrite(surfWriter(), cells);
} }
} }
@ -154,6 +155,10 @@ Foam::label Foam::checkTopology
<< " unused points to set " << points.name() << endl; << " unused points to set " << points.name() << endl;
points.instance() = mesh.pointsInstance(); points.instance() = mesh.pointsInstance();
points.write(); points.write();
if (setWriter.valid())
{
mergeAndWrite(setWriter, points);
}
} }
} }
@ -172,9 +177,9 @@ Foam::label Foam::checkTopology
<< " unordered faces to set " << faces.name() << endl; << " unordered faces to set " << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -192,9 +197,9 @@ Foam::label Foam::checkTopology
<< faces.name() << endl; << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -213,9 +218,9 @@ Foam::label Foam::checkTopology
<< endl; << endl;
cells.instance() = mesh.pointsInstance(); cells.instance() = mesh.pointsInstance();
cells.write(); cells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), cells); mergeAndWrite(surfWriter(), cells);
} }
} }
@ -237,9 +242,9 @@ Foam::label Foam::checkTopology
<< faces.name() << endl; << faces.name() << endl;
faces.instance() = mesh.pointsInstance(); faces.instance() = mesh.pointsInstance();
faces.write(); faces.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), faces); mergeAndWrite(surfWriter(), faces);
} }
} }
} }
@ -292,9 +297,9 @@ Foam::label Foam::checkTopology
<< endl; << endl;
oneCells.instance() = mesh.pointsInstance(); oneCells.instance() = mesh.pointsInstance();
oneCells.write(); oneCells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), oneCells); mergeAndWrite(surfWriter(), oneCells);
} }
} }
@ -308,9 +313,9 @@ Foam::label Foam::checkTopology
<< endl; << endl;
twoCells.instance() = mesh.pointsInstance(); twoCells.instance() = mesh.pointsInstance();
twoCells.write(); twoCells.write();
if (writer.valid()) if (surfWriter.valid())
{ {
mergeAndWrite(writer(), twoCells); mergeAndWrite(surfWriter(), twoCells);
} }
} }
} }
@ -349,6 +354,13 @@ Foam::label Foam::checkTopology
ctr.write(); ctr.write();
// Points in multiple regions
pointSet points
(
mesh,
"multiRegionPoints",
mesh.nPoints()/1000
);
// Is region disconnected // Is region disconnected
boolList regionDisconnected(rs.nRegions(), true); boolList regionDisconnected(rs.nRegions(), true);
@ -386,6 +398,7 @@ Foam::label Foam::checkTopology
regionDisconnected[regionI] = false; regionDisconnected[regionI] = false;
regionDisconnected[pRegion] = false; regionDisconnected[pRegion] = false;
pRegion = -2; pRegion = -2;
points.insert(f[fp]);
} }
} }
} }
@ -437,6 +450,19 @@ Foam::label Foam::checkTopology
cellRegions[i].write(); cellRegions[i].write();
} }
label nPoints = returnReduce(points.size(), sumOp<label>());
if (nPoints)
{
Info<< " <<Writing " << nPoints
<< " points that are in multiple regions to set "
<< points.name() << endl;
points.write();
if (setWriter.valid())
{
mergeAndWrite(setWriter, points);
}
}
} }
} }

View File

@ -1,5 +1,6 @@
#include "label.H" #include "label.H"
#include "autoPtr.H" #include "autoPtr.H"
#include "writer.H"
namespace Foam namespace Foam
{ {
@ -11,6 +12,7 @@ namespace Foam
const polyMesh&, const polyMesh&,
const bool, const bool,
const bool, const bool,
const autoPtr<surfaceWriter>& const autoPtr<surfaceWriter>&,
const autoPtr<writer<scalar>>&
); );
} }