From 36137521151f1a0e9d12ba3ec4e3ed57a1e9079c Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Wed, 10 Feb 2010 11:49:53 +0100 Subject: [PATCH 01/29] ENH: add -tri (triangulate) option to foamToSurface, surfaceMeshConvert STYLE: drop surface extraction from foamToStarMesh - retain surfZone names when writing surfaces - remove surface extraction/writing from meshWriter since it now duplicates what the meshedSurface class can do. --- .../foamToStarMesh/foamToStarMesh.C | 50 +---- .../conversion/foamToSurface/foamToSurface.C | 15 ++ .../surfaceMeshConvert/surfaceMeshConvert.C | 57 ++++- src/conversion/meshWriter/meshWriter.C | 7 +- src/conversion/meshWriter/meshWriter.H | 23 +- .../meshWriter/starcd/STARCDMeshWriter.C | 199 +----------------- .../meshWriter/starcd/STARCDMeshWriter.H | 11 - .../surfaceFormats/obj/OBJsurfaceFormat.C | 8 +- .../surfaceFormats/smesh/SMESHsurfaceFormat.C | 8 +- .../starcd/STARCDsurfaceFormat.C | 8 +- .../surfaceFormats/stl/STLsurfaceFormat.C | 8 +- .../surfaceFormats/tri/TRIsurfaceFormat.C | 8 +- .../surfaceFormats/vtk/VTKsurfaceFormat.C | 8 +- .../surfaceFormats/wrl/WRLsurfaceFormat.C | 8 +- .../surfaceFormats/x3d/X3DsurfaceFormat.C | 8 +- 15 files changed, 108 insertions(+), 318 deletions(-) diff --git a/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C b/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C index 9df568f1b5..ad9bb424eb 100644 --- a/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C +++ b/applications/utilities/mesh/conversion/foamToStarMesh/foamToStarMesh.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -39,16 +39,6 @@ Usage Specify an alternative geometry scaling factor. The default is @b 1000 (scale @em [m] to @em [mm]). - @param -surface \n - Extract the surface of the volume mesh only. - This can be useful, for example, for surface morphing in an external - package. - - @param -tri \n - Extract a triangulated surface. - The @b -surface options is implicitly selected. - - Note The cellTable information available in the files @c constant/cellTable and @c constant/polyMesh/cellTableId @@ -87,34 +77,13 @@ int main(int argc, char *argv[]) "noBnd", "suppress writing the .bnd file" ); - argList::addBoolOption - ( - "tri", - "Extract a triangulated surface. Implies -surface" - ); - argList::addBoolOption - ( - "surface", - "extract the surface of the volume mesh only" - ); # include "setRootCase.H" # include "createTime.H" instantList timeDirs = timeSelector::select0(runTime, args); - bool surfaceOnly = false; - if (args.optionFound("surface") || args.optionFound("tri")) - { - surfaceOnly = true; - } - fileName exportName = meshWriter::defaultMeshName; - if (surfaceOnly) - { - exportName = meshWriter::defaultSurfaceName; - } - if (args.optionFound("case")) { exportName += '-' + args.globalCaseName(); @@ -132,7 +101,6 @@ int main(int argc, char *argv[]) # include "createPolyMesh.H" - forAll(timeDirs, timeI) { runTime.setTime(timeDirs[timeI], timeI); @@ -156,21 +124,7 @@ int main(int argc, char *argv[]) meshName += '_' + runTime.timeName(); } - if (surfaceOnly) - { - if (args.optionFound("tri")) - { - writer.writeSurface(meshName, true); - } - else - { - writer.writeSurface(meshName); - } - } - else - { - writer.write(meshName); - } + writer.write(meshName); } Info<< nl << endl; diff --git a/applications/utilities/mesh/conversion/foamToSurface/foamToSurface.C b/applications/utilities/mesh/conversion/foamToSurface/foamToSurface.C index f9a255c502..b1c55e3769 100644 --- a/applications/utilities/mesh/conversion/foamToSurface/foamToSurface.C +++ b/applications/utilities/mesh/conversion/foamToSurface/foamToSurface.C @@ -36,6 +36,9 @@ Usage Specify an alternative geometry scaling factor. Eg, use @b 1000 to scale @em [m] to @em [mm]. + @param -tri \n + Triangulate surface. + \*---------------------------------------------------------------------------*/ #include "argList.H" @@ -62,6 +65,11 @@ int main(int argc, char *argv[]) "scale", "specify geometry scaling factor" ); + argList::addBoolOption + ( + "tri", + "triangulate surface" + ); # include "setRootCase.H" @@ -69,6 +77,7 @@ int main(int argc, char *argv[]) scalar scaleFactor = 0; args.optionReadIfPresent("scale", scaleFactor); + const bool doTriangulate = args.optionFound("tri"); fileName exportName(params[0]); @@ -107,6 +116,12 @@ int main(int argc, char *argv[]) surf.scalePoints(scaleFactor); Info<< "writing " << exportName; + if (doTriangulate) + { + Info<< " triangulated"; + surf.triangulate(); + } + if (scaleFactor <= 0) { Info<< " without scaling" << endl; diff --git a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C index 017085c499..8267db2a49 100644 --- a/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C +++ b/applications/utilities/surface/surfaceMeshConvert/surfaceMeshConvert.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -50,6 +50,9 @@ Usage @param -to \ \n Specify a coordinate System when writing files. + @param -tri \n + Triangulate surface. + Note The filename extensions are used to determine the file format type. @@ -73,13 +76,47 @@ int main(int argc, char *argv[]) argList::validArgs.append("inputFile"); argList::validArgs.append("outputFile"); - argList::addBoolOption("clean"); + argList::addBoolOption + ( + "clean", + "perform some surface checking/cleanup on the input surface" + ); + argList::addOption + ( + "scaleIn", + "scale", + "specify input geometry scaling factor" + ); + argList::addOption + ( + "scaleOut", + "scale", + "specify output geometry scaling factor" + ); + argList::addOption + ( + "dict", + "file", + "specify alternative dictionary for the coordinateSystems descriptions" + ); + argList::addOption + ( + "from", + "system", + "specify the source coordinate system, applied after '-scaleIn'" + ); + argList::addOption + ( + "to", + "system", + "specify the target coordinate system, applied before '-scaleOut'" + ); + argList::addBoolOption + ( + "tri", + "triangulate surface" + ); - argList::addOption("scaleIn", "scale"); - argList::addOption("scaleOut", "scale"); - argList::addOption("dict", "coordinateSystemsDict"); - argList::addOption("from", "sourceCoordinateSystem"); - argList::addOption("to", "targetCoordinateSystem"); argList args(argc, argv); Time runTime(args.rootPath(), args.caseName()); @@ -242,6 +279,12 @@ int main(int argc, char *argv[]) surf.scalePoints(scaleOut); } + if (args.optionFound("tri")) + { + Info<< "triangulate" << endl; + surf.triangulate(); + } + Info<< "writing " << exportName; surf.write(exportName); } diff --git a/src/conversion/meshWriter/meshWriter.C b/src/conversion/meshWriter/meshWriter.C index 67a6054658..a51675adf1 100644 --- a/src/conversion/meshWriter/meshWriter.C +++ b/src/conversion/meshWriter/meshWriter.C @@ -29,6 +29,9 @@ License // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // +Foam::string Foam::meshWriter::defaultMeshName = "meshExport"; + + const Foam::cellModel* Foam::meshWriter::unknownModel = Foam::cellModeller:: lookup ( @@ -64,10 +67,6 @@ lookup ); -Foam::string Foam::meshWriter::defaultMeshName = "meshExport"; -Foam::string Foam::meshWriter::defaultSurfaceName = "surfExport"; - - // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::meshWriter::meshWriter(const polyMesh& mesh, const scalar scaleFactor) diff --git a/src/conversion/meshWriter/meshWriter.H b/src/conversion/meshWriter/meshWriter.H index e86a74cc46..7e367cb67b 100644 --- a/src/conversion/meshWriter/meshWriter.H +++ b/src/conversion/meshWriter/meshWriter.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -85,7 +85,7 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class meshWriter Declaration + Class meshWriter Declaration \*---------------------------------------------------------------------------*/ class meshWriter @@ -133,13 +133,12 @@ public: // Static data members + //- Specify a default mesh name static string defaultMeshName; - static string defaultSurfaceName; - // Constructors - //- Ccreate a writer obejct + //- Create a writer obejct meshWriter ( const polyMesh&, @@ -167,26 +166,14 @@ public: writeBoundary_ = false; } - // Write - //- Write volume mesh - // subclass must to supply this method + //- Write volume mesh. Subclass must supply this method virtual bool write ( const fileName& timeName = fileName::null ) const = 0; - //- Write surface mesh with optional triangulation - // subclass could supply this information - virtual bool writeSurface - ( - const fileName& timeName = fileName::null, - const bool triangulate = false - ) const - { - return false; - } }; diff --git a/src/conversion/meshWriter/starcd/STARCDMeshWriter.C b/src/conversion/meshWriter/starcd/STARCDMeshWriter.C index 630dd20f43..17e6d117dd 100644 --- a/src/conversion/meshWriter/starcd/STARCDMeshWriter.C +++ b/src/conversion/meshWriter/starcd/STARCDMeshWriter.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd. + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -527,201 +527,4 @@ bool Foam::meshWriters::STARCD::write(const fileName& meshName) const } -bool Foam::meshWriters::STARCD::writeSurface -( - const fileName& meshName, - const bool triangulate -) const -{ - fileName baseName(meshName); - - if (baseName.empty()) - { - baseName = meshWriter::defaultSurfaceName; - - if - ( - mesh_.time().timeName() != "0" - && mesh_.time().timeName() != "constant" - ) - { - baseName += "_" + mesh_.time().timeName(); - } - } - - rmFiles(baseName); - - OFstream celFile(baseName + ".cel"); - writeHeader(celFile, "CELL"); - - Info<< "Writing " << celFile.name() << endl; - - // mesh and patch info - const pointField& points = mesh_.points(); - const labelList& owner = mesh_.faceOwner(); - const faceList& meshFaces = mesh_.faces(); - const polyBoundaryMesh& patches = mesh_.boundaryMesh(); - - label shapeId = 3; // shell/baffle element - label typeId = 4; // 4(shell) - - // remember which points need to be written - labelHashSet pointHash; - - // write boundary faces as normal STAR-CD mesh - if (triangulate) - { - // cell Id has no particular meaning - just increment - // use the cellTable id from the patch Number - label cellId = 0; - - forAll(patches, patchI) - { - label patchStart = patches[patchI].start(); - label patchSize = patches[patchI].size(); - - label ctableId = patchI + 1; - - for - ( - label faceI = patchStart; - faceI < (patchStart + patchSize); - ++faceI - ) - { - const face& f = meshFaces[faceI]; - - label nTri = f.nTriangles(points); - faceList triFaces; - - // triangulate polygons, but not quads - if (nTri <= 2) - { - triFaces.setSize(1); - triFaces[0] = f; - } - else - { - triFaces.setSize(nTri); - nTri = 0; - f.triangles(points, nTri, triFaces); - } - - forAll(triFaces, faceI) - { - const labelList& vrtList = triFaces[faceI]; - - celFile - << cellId + 1 << " " - << shapeId << " " - << vrtList.size() << " " - << ctableId << " " - << typeId; - - // must be 3 (triangle) but could be quad - label count = 0; - forAll(vrtList, i) - { - if ((count % 8) == 0) - { - celFile - << nl - << " " << cellId + 1; - } - // remember which points we'll need to write - pointHash.insert(vrtList[i]); - celFile << " " << vrtList[i] + 1; - count++; - } - celFile << endl; - - cellId++; - } - } - } - } - else - { - // cell Id is the OpenFOAM face Id - // use the cellTable id from the face owner - // - allows separation of parts - forAll(patches, patchI) - { - label patchStart = patches[patchI].start(); - label patchSize = patches[patchI].size(); - - for - ( - label faceI = patchStart; - faceI < (patchStart + patchSize); - ++faceI - ) - { - const labelList& vrtList = meshFaces[faceI]; - label cellId = faceI; - - celFile - << cellId + 1 << " " - << shapeId << " " - << vrtList.size() << " " - << cellTableId_[owner[faceI]] << " " - << typeId; - - // likely <= 8 vertices, but prevent overrun anyhow - label count = 0; - forAll(vrtList, i) - { - if ((count % 8) == 0) - { - celFile - << nl - << " " << cellId + 1; - } - // remember which points we'll need to write - pointHash.insert(vrtList[i]); - celFile << " " << vrtList[i] + 1; - count++; - } - celFile << endl; - } - } - } - - OFstream vrtFile(baseName + ".vrt"); - writeHeader(vrtFile, "VERTEX"); - - vrtFile.precision(10); - vrtFile.setf(std::ios::showpoint); // force decimal point for Fortran - - Info<< "Writing " << vrtFile.name() << endl; - - // build sorted table of contents - SortableList