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