diff --git a/applications/test/patchRegion/Make/files b/applications/test/patchRegion/Make/files
new file mode 100644
index 0000000000..80ccdd7e7c
--- /dev/null
+++ b/applications/test/patchRegion/Make/files
@@ -0,0 +1,3 @@
+Test-patchRegion.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-patchRegion
diff --git a/applications/test/patchRegion/Make/options b/applications/test/patchRegion/Make/options
new file mode 100644
index 0000000000..d27c95d033
--- /dev/null
+++ b/applications/test/patchRegion/Make/options
@@ -0,0 +1,7 @@
+EXE_INC = \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude
+
+EXE_LIBS = \
+ -lfiniteVolume \
+ -lmeshTools
diff --git a/applications/test/patchRegion/README b/applications/test/patchRegion/README
new file mode 100644
index 0000000000..64bd086d43
--- /dev/null
+++ b/applications/test/patchRegion/README
@@ -0,0 +1,2 @@
+2013-05-27 Detect 'pinches' in patch (i.e., non-manifold on point). Run on
+cavity_pinched subdirectory.
diff --git a/applications/test/patchRegion/Test-patchRegion.C b/applications/test/patchRegion/Test-patchRegion.C
new file mode 100644
index 0000000000..2df8b3a8b0
--- /dev/null
+++ b/applications/test/patchRegion/Test-patchRegion.C
@@ -0,0 +1,157 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Description
+ Detect point pinches
+
+\*---------------------------------------------------------------------------*/
+
+#include "argList.H"
+#include "PatchTools.H"
+#include "Time.H"
+#include "polyMesh.H"
+#include "patchEdgeFaceRegions.H"
+#include "PatchEdgeFaceWave.H"
+#include "globalIndex.H"
+#include "syncTools.H"
+
+using namespace Foam;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+// Main program:
+
+int main(int argc, char *argv[])
+{
+ argList::validArgs.append("patch");
+
+# include "setRootCase.H"
+# include "createTime.H"
+
+ const word patchName = args[1];
+
+# include "createPolyMesh.H"
+
+ Info<< "Mesh read in = "
+ << runTime.cpuTimeIncrement()
+ << " s\n" << endl << endl;
+
+
+ const polyBoundaryMesh& pbm = mesh.boundaryMesh();
+ label patchI = pbm.findPatchID(patchName);
+ const polyPatch& patch = pbm[patchI];
+
+ Info<< "Patch:" << patch.name() << endl;
+
+
+
+ // Data on all edges and faces
+ List allEdgeInfo(patch.nEdges());
+ List allFaceInfo(patch.size());
+
+ // Determine parallel global indexing
+ const globalIndex globalNumbering(patch.size());
+
+ DynamicList changedEdges(4*patch.size());
+ DynamicList changedInfo(changedEdges.size());
+
+ forAll(patch, faceI)
+ {
+ const labelList& fEdges = patch.faceEdges()[faceI];
+
+ label globalFaceI = globalNumbering.toGlobal(faceI);
+
+ forAll(fEdges, i)
+ {
+ changedEdges.append(fEdges[i]);
+ changedInfo.append
+ (
+ patchEdgeFaceRegions(labelPair(globalFaceI, globalFaceI))
+ );
+ }
+ }
+
+ // Walk
+ PatchEdgeFaceWave
+ <
+ primitivePatch,
+ patchEdgeFaceRegions
+ > calc
+ (
+ mesh,
+ patch,
+ changedEdges,
+ changedInfo,
+ allEdgeInfo,
+ allFaceInfo,
+ returnReduce(patch.nEdges(), sumOp())
+ );
+
+
+ Info<< "Time now = " << runTime.timeName() << endl;
+
+
+ // Detect points with multiple regions
+ labelList duplicateRegion(patch.nPoints(), -1);
+ {
+ labelList currentRegion(patch.nPoints(), -1);
+
+ forAll(patch.localFaces(), faceI)
+ {
+ const face& f = patch.localFaces()[faceI];
+
+ forAll(f, fp)
+ {
+ label faceRegion = allFaceInfo[faceI].regions()[fp];
+
+ label pointI = f[fp];
+
+ if (currentRegion[pointI] == -1)
+ {
+ currentRegion[pointI] = faceRegion;
+ }
+ else if (currentRegion[pointI] != faceRegion)
+ {
+ if (duplicateRegion[pointI] == -1)
+ {
+ Pout<< "Multi region point:"
+ << patch.localPoints()[pointI]
+ << " with region:" << currentRegion[pointI]
+ << " and region:" << faceRegion
+ << endl;
+ duplicateRegion[pointI] = currentRegion[pointI];
+ }
+ }
+ }
+ }
+ }
+
+
+ Info<< "End\n" << endl;
+
+ return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/test/patchRegion/cavity_pinched/README.txt b/applications/test/patchRegion/cavity_pinched/README.txt
new file mode 100644
index 0000000000..be28e421e9
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/README.txt
@@ -0,0 +1,17 @@
+constant/
+ cavity blockMesh
+ point (0.05 0.05 0.01) moved to (0.05 0.05 0.001)
+
+0.005/
+ collapseEdges with
+
+ collapseEdgesCoeffs.minimumEdgeLength 0.0011;
+
+ so it collapses the one edge
+
+
+processor*/0.005/
+ decomposePar
+
+
+mpirun -np 2 Test-patchRegion -parallel
diff --git a/applications/test/patchRegion/cavity_pinched/constant/polyMesh/blockMeshDict b/applications/test/patchRegion/cavity_pinched/constant/polyMesh/blockMeshDict
new file mode 100644
index 0000000000..165a600c7b
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/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/test/patchRegion/cavity_pinched/constant/transportProperties b/applications/test/patchRegion/cavity_pinched/constant/transportProperties
new file mode 100644
index 0000000000..fa1c1ca0b1
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/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/test/patchRegion/cavity_pinched/system/collapseDict b/applications/test/patchRegion/cavity_pinched/system/collapseDict
new file mode 100644
index 0000000000..a059a67f14
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/system/collapseDict
@@ -0,0 +1,89 @@
+/*--------------------------------*- 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 collapseDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// If on, after collapsing check the quality of the mesh. If bad faces are
+// generated then redo the collapsing with stricter filtering.
+controlMeshQuality off;
+
+
+collapseEdgesCoeffs
+{
+ // Edges shorter than this absolute value will be merged
+ minimumEdgeLength 0.0011;
+
+ // The maximum angle between two edges that share a point attached to
+ // no other edges
+ maximumMergeAngle 30;
+}
+
+
+//collapseFacesCoeffs
+//{
+// // The initial face length factor
+// initialFaceLengthFactor 0.5;
+//
+// // If the face can't be collapsed to an edge, and it has a span less than
+// // the target face length multiplied by this coefficient, collapse it
+// // to a point.
+// maxCollapseFaceToPointSideLengthCoeff 0.3;
+//
+// // Allow early collapse of edges to a point
+// allowEarlyCollapseToPoint on;
+//
+// // Fraction to premultiply maxCollapseFaceToPointSideLengthCoeff by if
+// // allowEarlyCollapseToPoint is enabled
+// allowEarlyCollapseCoeff 0.2;
+//
+// // Defining how close to the midpoint (M) of the projected
+// // vertices line a projected vertex (X) can be before making this
+// // an invalid edge collapse
+// //
+// // X---X-g----------------M----X-----------g----X--X
+// //
+// // Only allow a collapse if all projected vertices are outwith
+// // guardFraction (g) of the distance form the face centre to the
+// // furthest vertex in the considered direction
+// guardFraction 0.1;
+//}
+//
+//
+//controlMeshQualityCoeffs
+//{
+// // Name of the dictionary that has the mesh quality coefficients used
+// // by motionSmoother::checkMesh
+// #include "meshQualityDict";
+//
+// // The amount that minimumEdgeLength will be reduced by for each
+// // edge if that edge's collapse generates a poor quality face
+// edgeReductionFactor 0.5;
+//
+// // The amount that initialFaceLengthFactor will be reduced by for each
+// // face if its collapse generates a poor quality face
+// faceReductionFactor $initialFaceLengthFactor;
+//
+// // Maximum number of smoothing iterations for the reductionFactors
+// maximumSmoothingIterations 2;
+//
+// // Maximum number of outer iterations is mesh quality checking is enabled
+// maximumIterations 10;
+//
+// // Maximum number of iterations deletion of a point can cause a bad face
+// // to be constructed before it is forced to not be deleted
+// maxPointErrorCount 5;
+//}
+
+
+// ************************************************************************* //
diff --git a/applications/test/patchRegion/cavity_pinched/system/controlDict b/applications/test/patchRegion/cavity_pinched/system/controlDict
new file mode 100644
index 0000000000..4fc602f95c
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/system/controlDict
@@ -0,0 +1,54 @@
+/*--------------------------------*- 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;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+DebugSwitches
+{
+ PatchEdgeFaceWave 1;
+}
+
+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/test/patchRegion/cavity_pinched/system/decomposeParDict b/applications/test/patchRegion/cavity_pinched/system/decomposeParDict
new file mode 100644
index 0000000000..8f0581f952
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/system/decomposeParDict
@@ -0,0 +1,138 @@
+/*--------------------------------*- 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 (movingWall);
+
+ // Method to use on the 2D subset
+ method scotch;
+}
+
+//// 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/test/patchRegion/cavity_pinched/system/fvSchemes b/applications/test/patchRegion/cavity_pinched/system/fvSchemes
new file mode 100644
index 0000000000..c311eb8961
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/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/test/patchRegion/cavity_pinched/system/fvSolution b/applications/test/patchRegion/cavity_pinched/system/fvSolution
new file mode 100644
index 0000000000..a0130726c4
--- /dev/null
+++ b/applications/test/patchRegion/cavity_pinched/system/fvSolution
@@ -0,0 +1,59 @@
+/*--------------------------------*- 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;
+
+ solver GAMG;
+ smoother GaussSeidel;
+ nPreSweeps 0;
+ nPostSweeps 2;
+ cacheAgglomeration on;
+ agglomerator faceAreaPair;
+ nCellsInCoarsestLevel 3;
+ mergeLevels 1;
+
+ processorAgglomerator none; //procFaces;
+ //nAgglomeratingCells 20;
+
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ U
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-05;
+ relTol 0;
+ }
+}
+
+PISO
+{
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 0;
+ pRefCell 0;
+ pRefValue 0;
+}
+
+
+// ************************************************************************* //