From 70a25b9c845f5d04fb8fdaa739fb3aef925c3e7c Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 17 Sep 2013 15:35:40 +0100 Subject: [PATCH] ENH: orientFaceZone: new app for orienting faceZones --- .../manipulation/orientFaceZone/Make/files | 4 + .../manipulation/orientFaceZone/Make/options | 7 + .../manipulation/orientFaceZone/cavity/Allrun | 22 + .../orientFaceZone/cavity/README.txt | 1 + .../cavity/constant/polyMesh/blockMeshDict | 75 ++++ .../cavity/constant/polyMesh/boundary | 41 ++ .../cavity/constant/transportProperties | 21 + .../orientFaceZone/cavity/system/controlDict | 49 +++ .../cavity/system/decomposeParDict | 135 ++++++ .../orientFaceZone/cavity/system/fvSchemes | 60 +++ .../orientFaceZone/cavity/system/fvSolution | 46 +++ .../cavity/system/renumberMeshDict | 110 +++++ .../orientFaceZone/cavity/system/topoSetDict | 64 +++ .../orientFaceZone/orientFaceZone.C | 390 ++++++++++++++++++ .../orientFaceZone/patchFaceOrientation.C | 50 +++ .../orientFaceZone/patchFaceOrientation.H | 176 ++++++++ .../orientFaceZone/patchFaceOrientationI.H | 227 ++++++++++ 17 files changed, 1478 insertions(+) create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/Make/files create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/Make/options create mode 100755 applications/utilities/mesh/manipulation/orientFaceZone/cavity/Allrun create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/README.txt create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/blockMeshDict create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/boundary create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/transportProperties create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/controlDict create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/decomposeParDict create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSchemes create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSolution create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/renumberMeshDict create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/topoSetDict create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/orientFaceZone.C create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/patchFaceOrientation.C create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/patchFaceOrientation.H create mode 100644 applications/utilities/mesh/manipulation/orientFaceZone/patchFaceOrientationI.H diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/Make/files b/applications/utilities/mesh/manipulation/orientFaceZone/Make/files new file mode 100644 index 0000000000..07214af76c --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/Make/files @@ -0,0 +1,4 @@ +patchFaceOrientation.C +orientFaceZone.C + +EXE = $(FOAM_APPBIN)/orientFaceZone diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/Make/options b/applications/utilities/mesh/manipulation/orientFaceZone/Make/options new file mode 100644 index 0000000000..9f08e8d2a8 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/Make/options @@ -0,0 +1,7 @@ +EXE_INC = \ + -I$(LIB_SRC)/meshTools/lnInclude \ + -I$(LIB_SRC)/triSurface/lnInclude + +EXE_LIBS = \ + -lmeshTools \ + -ltriSurface diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/Allrun b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/Allrun new file mode 100755 index 0000000000..11f1cb983e --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/Allrun @@ -0,0 +1,22 @@ +#!/bin/sh +cd ${0%/*} || exit 1 # run from this directory + +# Source tutorial run functions +. $WM_PROJECT_DIR/bin/tools/RunFunctions + +# Get application name +application=`getApplication` + +runApplication blockMesh +# Make random cell numbering to get faceZone orientation random +runApplication renumberMesh -dict system/renumberMeshDict + +# Construct faceZone +runApplication topoSet + +runApplication decomposePar -force -cellDist +runParallel orientFaceZone 2 f0 '(10 0 0)' +runApplication reconstructParMesh -latestTime -mergeTol 1e-6 + + +# ----------------------------------------------------------------- end-of-file diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/README.txt b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/README.txt new file mode 100644 index 0000000000..df42877302 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/README.txt @@ -0,0 +1 @@ +2013-09-16 To test orientFaceZone. Make random orientation. Orient afterwards. diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/blockMeshDict b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/blockMeshDict new file mode 100644 index 0000000000..165a600c7b --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/blockMeshDict @@ -0,0 +1,75 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object blockMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +convertToMeters 0.1; + +vertices +( + (0 0 0) + (1 0 0) + (1 1 0) + (0 1 0) + (0 0 0.1) + (1 0 0.1) + (1 1 0.1) + (0 1 0.1) +); + +blocks +( + hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1) +); + +edges +( +); + +boundary +( + movingWall + { + type wall; + faces + ( + (3 7 6 2) + ); + } + fixedWalls + { + type wall; + faces + ( + (0 4 7 3) + (2 6 5 1) + (1 5 4 0) + ); + } + frontAndBack + { + type empty; + faces + ( + (0 3 2 1) + (4 5 6 7) + ); + } +); + +mergePatchPairs +( +); + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/boundary b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/boundary new file mode 100644 index 0000000000..3d25397906 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/polyMesh/boundary @@ -0,0 +1,41 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 2.2.x | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class polyBoundaryMesh; + location "constant/polyMesh"; + object boundary; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +3 +( + movingWall + { + type wall; + nFaces 20; + startFace 760; + } + fixedWalls + { + type wall; + nFaces 60; + startFace 780; + } + frontAndBack + { + type empty; + inGroups 1(empty); + nFaces 800; + startFace 840; + } +) + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/transportProperties b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/transportProperties new file mode 100644 index 0000000000..fa1c1ca0b1 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/constant/transportProperties @@ -0,0 +1,21 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "constant"; + object transportProperties; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +nu nu [ 0 2 -1 0 0 0 0 ] 0.01; + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/controlDict b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/controlDict new file mode 100644 index 0000000000..f28aaab146 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/controlDict @@ -0,0 +1,49 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object controlDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +application icoFoam; + +startFrom latestTime; + +startTime 0; + +stopAt endTime; + +endTime 0.5; + +deltaT 0.005; + +writeControl timeStep; + +writeInterval 20; + +purgeWrite 0; + +writeFormat ascii; + +writePrecision 6; + +writeCompression off; + +timeFormat general; + +timePrecision 6; + +runTimeModifiable true; + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/decomposeParDict b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/decomposeParDict new file mode 100644 index 0000000000..60454a0a87 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/decomposeParDict @@ -0,0 +1,135 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh decomposition control dictionary"; + object decomposeParDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +numberOfSubdomains 2; + +//- Keep owner and neighbour on same processor for faces in zones: +// preserveFaceZones (heater solid1 solid3); + +//- Keep owner and neighbour on same processor for faces in patches: +// (makes sense only for cyclic patches) +//preservePatches (cyclic_half0 cyclic_half1); + +//- Keep all of faceSet on a single processor. This puts all cells +// connected with a point, edge or face on the same processor. +// (just having face connected cells might not guarantee a balanced +// decomposition) +// The processor can be -1 (the decompositionMethod chooses the processor +// for a good load balance) or explicitly provided (upsets balance). +//singleProcessorFaceSets ((f0 -1)); + + +//- Use the volScalarField named here as a weight for each cell in the +// decomposition. For example, use a particle population field to decompose +// for a balanced number of particles in a lagrangian simulation. +// weightField dsmcRhoNMean; + +//method scotch; +method hierarchical; +// method simple; +// method metis; +// method manual; +// method multiLevel; +// method structured; // does 2D decomposition of structured mesh + +multiLevelCoeffs +{ + // Decomposition methods to apply in turn. This is like hierarchical but + // fully general - every method can be used at every level. + + level0 + { + numberOfSubdomains 64; + //method simple; + //simpleCoeffs + //{ + // n (2 1 1); + // delta 0.001; + //} + method scotch; + } + level1 + { + numberOfSubdomains 4; + method scotch; + } +} + +// Desired output + +simpleCoeffs +{ + n (2 1 1); + delta 0.001; +} + +hierarchicalCoeffs +{ + n (2 1 1); + delta 0.001; + order xyz; +} + +metisCoeffs +{ + /* + processorWeights + ( + 1 + 1 + 1 + 1 + ); + */ +} + +scotchCoeffs +{ + //processorWeights + //( + // 1 + // 1 + // 1 + // 1 + //); + //writeGraph true; + //strategy "b"; +} + +manualCoeffs +{ + dataFile "decompositionData"; +} + +structuredCoeffs +{ + // Patches to do 2D decomposition on. Structured mesh only; cells have + // to be in 'columns' on top of patches. + patches (bottomPatch); +} + +//// Is the case distributed? Note: command-line argument -roots takes +//// precedence +//distributed yes; +//// Per slave (so nProcs-1 entries) the directory above the case. +//roots +//( +// "/tmp" +// "/tmp" +//); + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSchemes b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSchemes new file mode 100644 index 0000000000..c311eb8961 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSchemes @@ -0,0 +1,60 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSchemes; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +ddtSchemes +{ + default Euler; +} + +gradSchemes +{ + default Gauss linear; + grad(p) Gauss linear; +} + +divSchemes +{ + default none; + div(phi,U) Gauss linear; +} + +laplacianSchemes +{ + default none; + laplacian(nu,U) Gauss linear orthogonal; + laplacian((1|A(U)),p) Gauss linear orthogonal; +} + +interpolationSchemes +{ + default linear; + interpolate(HbyA) linear; +} + +snGradSchemes +{ + default orthogonal; +} + +fluxRequired +{ + default no; + p ; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSolution b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSolution new file mode 100644 index 0000000000..cc4750f16c --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/fvSolution @@ -0,0 +1,46 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + location "system"; + object fvSolution; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +solvers +{ + p + { + solver PCG; + preconditioner DIC; + tolerance 1e-06; + relTol 0; + } + + U + { + solver PBiCG; + preconditioner DILU; + tolerance 1e-05; + relTol 0; + } +} + +PISO +{ + nCorrectors 2; + nNonOrthogonalCorrectors 0; + pRefCell 0; + pRefValue 0; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/renumberMeshDict b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/renumberMeshDict new file mode 100644 index 0000000000..addb04236e --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/renumberMeshDict @@ -0,0 +1,110 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: dev | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + note "mesh renumbering dictionary"; + object renumberMeshDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Write maps from renumbered back to original mesh +writeMaps true; + +// Optional entry: sort cells on coupled boundaries to last for use with +// e.g. nonBlockingGaussSeidel. +sortCoupledFaceCells false; + +// Optional entry: renumber on a block-by-block basis. It uses a +// blockCoeffs dictionary to construct a decompositionMethod to do +// a block subdivision) and then applies the renumberMethod to each +// block in turn. This can be used in large cases to keep the blocks +// fitting in cache with all the the cache misses bunched at the end. +// This number is the approximate size of the blocks - this gets converted +// to a number of blocks that is the input to the decomposition method. +//blockSize 1000; + +// Optional entry: sort points into internal and boundary points +//orderPoints false; + + + +//method CuthillMcKee; +//method Sloan; +//method manual; +method random; +//method structured; +//method spring; +//method zoltan; // only if compiled with zoltan support + +//CuthillMcKeeCoeffs +//{ +// // Reverse CuthillMcKee (RCM) or plain +// reverse true; +//} + +manualCoeffs +{ + // In system directory: new-to-original (i.e. order) labelIOList + dataFile "cellMap"; +} + + +// For extruded (i.e. structured in one direction) meshes +structuredCoeffs +{ + // Patches that mesh was extruded from. These determine the starting + // layer of cells + patches (movingWall); + // Method to renumber the starting layer of cells + method random; + + // Renumber in columns (depthFirst) or in layers + depthFirst true; + + // Optional: reverse ordering + //reverse false; +} + + +springCoeffs +{ + // Maximum jump of cell indices. Is fraction of number of cells + maxCo 0.01; + + // Limit the amount of movement; the fraction maxCo gets decreased + // with every iteration + freezeFraction 0.999; + + // Maximum number of iterations + maxIter 1000; +} + + +blockCoeffs +{ + method scotch; + //method hierarchical; + //hierarchicalCoeffs + //{ + // n (1 2 1); + // delta 0.001; + // order xyz; + //} +} + + +zoltanCoeffs +{ + ORDER_METHOD LOCAL_HSFC; +} + + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/topoSetDict b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/topoSetDict new file mode 100644 index 0000000000..fca42b45f8 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/cavity/system/topoSetDict @@ -0,0 +1,64 @@ +/*--------------------------------*- C++ -*----------------------------------*\ +| ========= | | +| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | +| \\ / O peration | Version: 2.2.1 | +| \\ / A nd | Web: www.OpenFOAM.org | +| \\/ M anipulation | | +\*---------------------------------------------------------------------------*/ +FoamFile +{ + version 2.0; + format ascii; + class dictionary; + object topoSetDict; +} +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +actions +( + // Get 'T' of faces + { + name f0; + type faceSet; + action new; + source boxToFace; + sourceInfo + { + boxes + ( + (0.0499 -100 -100)(0.0501 100 100) + (0.03 0.0499 -100)(0.05 0.0501 100) + ); + } + } + +// // Pick up some cells +// { +// name c0; +// type cellSet; +// action new; +// source boxToCell; +// sourceInfo +// { +// boxes +// ( +// (-100 -100 -100)(0.05 0.05 100) +// (0.05 0.05 -100)(100 100 100) +// ); +// } +// } + + // Convert faceSet to faceZone + { + name f0; + type faceZoneSet; + action new; + source setToFaceZone; + sourceInfo + { + faceSet f0; + } + } +); + +// ************************************************************************* // diff --git a/applications/utilities/mesh/manipulation/orientFaceZone/orientFaceZone.C b/applications/utilities/mesh/manipulation/orientFaceZone/orientFaceZone.C new file mode 100644 index 0000000000..5f1a985116 --- /dev/null +++ b/applications/utilities/mesh/manipulation/orientFaceZone/orientFaceZone.C @@ -0,0 +1,390 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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 + +Description + Corrects 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::validArgs.append("faceZone"); + argList::validArgs.append("outsidePoint"); + +# include "setRootCase.H" +# include "createTime.H" +# include "createPolyMesh.H" + + const word zoneName = args[1]; + const point outsidePoint = args.argRead(2); + + Info<< "Orienting faceZone " << zoneName + << " such that " << outsidePoint << " is outside" + << nl << endl; + + + const faceZone& fZone = mesh.faceZones()[zoneName]; + + if (fZone.checkParallelSync()) + { + FatalErrorIn(args.executable()) + << "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 PackedBoolList 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