/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2013-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 orientFaceZone Group grpMeshManipulationUtilities Description Corrects the orientation of faceZone. - correct in parallel - excludes coupled faceZones from walk - correct for non-manifold faceZones - restarts walk \*---------------------------------------------------------------------------*/ #include "argList.H" #include "Time.H" #include "syncTools.H" #include "patchFaceOrientation.H" #include "PatchEdgeFaceWave.H" #include "orientedSurface.H" #include "globalIndex.H" using namespace Foam; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { argList::addNote ( "Corrects the orientation of faceZone" ); #include "addRegionOption.H" argList::addArgument("faceZone"); argList::addArgument("point", "A point outside of the mesh"); #include "setRootCase.H" #include "createTime.H" #include "createNamedPolyMesh.H" const word zoneName = args[1]; const point outsidePoint = args.get(2); Info<< "Orienting faceZone " << zoneName << " such that " << outsidePoint << " is outside" << nl << endl; const faceZone& fZone = mesh.faceZones()[zoneName]; if (fZone.checkParallelSync()) { FatalErrorInFunction << "Face zone " << fZone.name() << " is not parallel synchronised." << " Any coupled face also needs its coupled version to be included" << " and with opposite flipMap." << exit(FatalError); } const labelList& faceLabels = fZone; const indirectPrimitivePatch patch ( IndirectList(mesh.faces(), faceLabels), mesh.points() ); const bitSet isMasterFace(syncTools::getMasterFaces(mesh)); // Data on all edges and faces List allEdgeInfo(patch.nEdges()); List allFaceInfo(patch.size()); // Make sure we don't walk through // - slaves of coupled faces // - non-manifold edges { const polyBoundaryMesh& bm = mesh.boundaryMesh(); label nProtected = 0; forAll(faceLabels, facei) { const label meshFacei = faceLabels[facei]; const label patchi = bm.whichPatch(meshFacei); if ( patchi != -1 && bm[patchi].coupled() && !isMasterFace[meshFacei] ) { // Slave side. Mark so doesn't get visited. allFaceInfo[facei] = orientedSurface::NOFLIP; nProtected++; } } Info<< "Protected from visiting " << returnReduce(nProtected, sumOp