/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | foam-extend: Open Source CFD \\ / O peration | Version: 4.0 \\ / A nd | Web: http://www.foam-extend.org \\/ M anipulation | For copyright notice see file Copyright ------------------------------------------------------------------------------- License This file is part of foam-extend. foam-extend 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. foam-extend 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 foam-extend. If not, see . Application blockMesh Description A multi-block mesh generator. Uses the block mesh description found in \a constant/polyMesh/blockMeshDict (or \a constant/\/polyMesh/blockMeshDict). Usage - blockMesh [OPTION] \param -blockTopology \n Write the topology as a set of edges in OBJ format. \param -region \ \n Specify an alternative mesh region. \param -dict \ \n Specify alternative dictionary for the block mesh description. \*---------------------------------------------------------------------------*/ #include "objectRegistry.H" #include "foamTime.H" #include "IOdictionary.H" #include "IOPtrList.H" #include "blockMesh.H" #include "preservePatchTypes.H" #include "emptyPolyPatch.H" #include "cellSet.H" #include "argList.H" #include "OSspecific.H" #include "OFstream.H" #include "Pair.H" #include "mapPolyMesh.H" #include "polyTopoChanger.H" #include "slidingInterface.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // Main program: int main(int argc, char *argv[]) { argList::noParallel(); argList::validOptions.insert("blockTopology", ""); argList::validOptions.insert("dict", "dictionary"); # include "addRegionOption.H" # include "setRootCase.H" # include "createTime.H" const word dictName("blockMeshDict"); word regionName; fileName polyMeshDir; if (args.optionFound("region")) { // constant//polyMesh/blockMeshDict regionName = args.option("region"); polyMeshDir = regionName/polyMesh::meshSubDir; Info<< nl << "Generating mesh for region " << regionName << endl; } else { // constant/polyMesh/blockMeshDict regionName = polyMesh::defaultRegion; polyMeshDir = polyMesh::meshSubDir; } autoPtr meshDictIoPtr; if (args.optionFound("dict")) { fileName dictPath(args.option("dict")); meshDictIoPtr.set ( new IOobject ( ( isDir(dictPath) ? dictPath/dictName : dictPath ), runTime, IOobject::MUST_READ, IOobject::NO_WRITE, false ) ); } else { meshDictIoPtr.set ( new IOobject ( dictName, runTime.constant(), polyMeshDir, runTime, IOobject::MUST_READ, IOobject::NO_WRITE, false ) ); } if (!meshDictIoPtr->headerOk()) { FatalErrorIn(args.executable()) << "Cannot open mesh description file\n " << meshDictIoPtr->objectPath() << nl << exit(FatalError); } Info<< nl << "Creating block mesh from\n " << meshDictIoPtr->objectPath() << nl << endl; blockMesh::verbose(true); IOdictionary meshDict(meshDictIoPtr()); blockMesh blocks(meshDict, regionName); if (args.optionFound("blockTopology")) { // Write mesh as edges. { fileName objMeshFile("blockTopology.obj"); OFstream str(runTime.path()/objMeshFile); Info<< nl << "Dumping block structure as Lightwave obj format" << " to " << objMeshFile << endl; blocks.writeTopology(str); } // Write centres of blocks { fileName objCcFile("blockCentres.obj"); OFstream str(runTime.path()/objCcFile); Info<< nl << "Dumping block centres as Lightwave obj format" << " to " << objCcFile << endl; const polyMesh& topo = blocks.topology(); const pointField& cellCentres = topo.cellCentres(); forAll(cellCentres, cellI) { //point cc = b.blockShape().centre(b.points()); const point& cc = cellCentres[cellI]; str << "v " << cc.x() << ' ' << cc.y() << ' ' << cc.z() << nl; } } Info<< nl << "end" << endl; return 0; } Info<< nl << "Creating polyMesh from blockMesh" << endl; word defaultFacesName = "defaultFaces"; word defaultFacesType = emptyPolyPatch::typeName; polyMesh mesh ( IOobject ( regionName, runTime.constant(), runTime ), xferCopy(blocks.points()), // could we re-use space? blocks.cells(), blocks.patches(), blocks.patchNames(), blocks.patchDicts(), defaultFacesName, defaultFacesType ); // Read in a list of dictionaries for the merge patch pairs if (meshDict.found("mergePatchPairs")) { List > mergePatchPairs ( meshDict.lookup("mergePatchPairs") ); # include "mergePatchPairs.H" } else { Info<< nl << "There are no merge patch pairs edges" << endl; } // Set any cellZones (note: cell labelling unaffected by above // mergePatchPairs) label nZones = blocks.numZonedBlocks(); if (nZones > 0) { Info<< nl << "Adding cell zones" << endl; // Map from zoneName to cellZone index HashTable