/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 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 . Application topoSet Group grpMeshManipulationUtilities Description Operates on cellSets/faceSets/pointSets through a dictionary. \*---------------------------------------------------------------------------*/ #include "argList.H" #include "Time.H" #include "polyMesh.H" #include "topoSetSource.H" #include "globalMeshData.H" #include "timeSelector.H" #include "IOobjectList.H" #include "cellZoneSet.H" #include "faceZoneSet.H" #include "pointZoneSet.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // void printMesh(const Time& runTime, const polyMesh& mesh) { Info<< "Time:" << runTime.timeName() << " cells:" << mesh.globalData().nTotalCells() << " faces:" << mesh.globalData().nTotalFaces() << " points:" << mesh.globalData().nTotalPoints() << " patches:" << mesh.boundaryMesh().size() << " bb:" << mesh.bounds() << nl; } template void removeZone ( ZoneMesh& zones, const word& setName ) { label zoneID = zones.findZoneID(setName); if (zoneID != -1) { Info<< "Removing zone " << setName << " at index " << zoneID << endl; // Shuffle to last position labelList oldToNew(zones.size()); label newI = 0; forAll(oldToNew, i) { if (i != zoneID) { oldToNew[i] = newI++; } } oldToNew[zoneID] = newI; zones.reorder(oldToNew); // Remove last element zones.setSize(zones.size()-1); zones.clearAddressing(); zones.write(); } } // Physically remove a set void removeSet ( const polyMesh& mesh, const word& setType, const word& setName ) { // Remove the file IOobjectList objects ( mesh, mesh.time().findInstance ( polyMesh::meshSubDir/"sets", word::null, IOobject::READ_IF_PRESENT, mesh.facesInstance() ), polyMesh::meshSubDir/"sets" ); if (objects.found(setName)) { // Remove file fileName object = objects[setName]->objectPath(); Info<< "Removing file " << object << endl; rm(object); } // See if zone if (setType == cellZoneSet::typeName) { removeZone ( const_cast(mesh.cellZones()), setName ); } else if (setType == faceZoneSet::typeName) { removeZone ( const_cast(mesh.faceZones()), setName ); } else if (setType == pointZoneSet::typeName) { removeZone ( const_cast(mesh.pointZones()), setName ); } } polyMesh::readUpdateState meshReadUpdate(polyMesh& mesh) { polyMesh::readUpdateState stat = mesh.readUpdate(); switch(stat) { case polyMesh::UNCHANGED: { Info<< " mesh not changed." << endl; break; } case polyMesh::POINTS_MOVED: { Info<< " points moved; topology unchanged." << endl; break; } case polyMesh::TOPO_CHANGE: { Info<< " topology changed; patches unchanged." << nl << " "; printMesh(mesh.time(), mesh); break; } case polyMesh::TOPO_PATCH_CHANGE: { Info<< " topology changed and patches changed." << nl << " "; printMesh(mesh.time(), mesh); break; } default: { FatalErrorInFunction << "Illegal mesh update state " << stat << abort(FatalError); break; } } return stat; } int main(int argc, char *argv[]) { timeSelector::addOptions(true, false); #include "addDictOption.H" #include "addRegionOption.H" argList::addBoolOption ( "noSync", "do not synchronise selection across coupled patches" ); #include "setRootCase.H" #include "createTime.H" instantList timeDirs = timeSelector::selectIfPresent(runTime, args); #include "createNamedPolyMesh.H" const bool noSync = args.optionFound("noSync"); const word dictName("topoSetDict"); #include "setSystemMeshDictionaryIO.H" Info<< "Reading " << dictName << "\n" << endl; IOdictionary topoSetDict(dictIO); // Read set construct info from dictionary PtrList actions(topoSetDict.lookup("actions")); forAll(timeDirs, timeI) { runTime.setTime(timeDirs[timeI], timeI); Info<< "Time = " << runTime.timeName() << endl; // Optionally re-read mesh meshReadUpdate(mesh); // Execute all actions forAll(actions, i) { const dictionary& dict = actions[i]; const word setName(dict.lookup("name")); const word actionName(dict.lookup("action")); const word setType(dict.lookup("type")); topoSetSource::setAction action = topoSetSource::toAction ( actionName ); autoPtr currentSet; if ( (action == topoSetSource::NEW) || (action == topoSetSource::CLEAR) ) { currentSet = topoSet::New(setType, mesh, setName, 10000); Info<< "Created " << currentSet().type() << " " << setName << endl; } else if (action == topoSetSource::REMOVE) { //? } else { currentSet = topoSet::New ( setType, mesh, setName, IOobject::MUST_READ ); Info<< "Read set " << currentSet().type() << " " << setName << " with size " << returnReduce(currentSet().size(), sumOp