diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.C
new file mode 100644
index 0000000000..66c48bdeac
--- /dev/null
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.C
@@ -0,0 +1,192 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "searchableBoxFeatures.H"
+#include "addToRunTimeSelectionTable.H"
+#include "treeBoundBox.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+defineTypeNameAndDebug(searchableBoxFeatures, 0);
+addToRunTimeSelectionTable
+(
+ searchableSurfaceFeatures,
+ searchableBoxFeatures,
+ dict
+);
+
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::searchableBoxFeatures::searchableBoxFeatures
+(
+ const searchableSurface& surface,
+ const dictionary& dict
+)
+:
+ searchableSurfaceFeatures(surface, dict),
+ mode_(extendedFeatureEdgeMesh::sideVolumeTypeNames_[dict.lookup("mode")])
+{
+ Info<< indent
+ << " Mesh mode = "
+ << extendedFeatureEdgeMesh::sideVolumeTypeNames_[mode_]
+ << endl;
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::searchableBoxFeatures::~searchableBoxFeatures()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::autoPtr
+Foam::searchableBoxFeatures::features() const
+{
+ autoPtr features;
+
+ vectorField faceNormals(List(treeBoundBox::faceNormals));
+
+ vectorField edgeDirections(12);
+ labelListList normalDirections(12);
+
+ labelListList edgeNormals(12);
+ forAll(edgeNormals, eI)
+ {
+ edgeNormals[eI].setSize(2, 0);
+ }
+ edgeNormals[0][0] = 2; edgeNormals[0][1] = 4;
+ edgeNormals[1][0] = 1; edgeNormals[1][1] = 4;
+ edgeNormals[2][0] = 3; edgeNormals[2][1] = 4;
+ edgeNormals[3][0] = 0; edgeNormals[3][1] = 4;
+ edgeNormals[4][0] = 2; edgeNormals[4][1] = 5;
+ edgeNormals[5][0] = 1; edgeNormals[5][1] = 5;
+ edgeNormals[6][0] = 3; edgeNormals[6][1] = 5;
+ edgeNormals[7][0] = 0; edgeNormals[7][1] = 5;
+ edgeNormals[8][0] = 0; edgeNormals[8][1] = 2;
+ edgeNormals[9][0] = 2; edgeNormals[9][1] = 1;
+ edgeNormals[10][0] = 1; edgeNormals[10][1] = 3;
+ edgeNormals[11][0] = 3; edgeNormals[11][1] = 0;
+
+ forAll(edgeDirections, eI)
+ {
+ edgeDirections[eI] =
+ surface().points()()[treeBoundBox::edges[eI].end()]
+ - surface().points()()[treeBoundBox::edges[eI].start()];
+
+ normalDirections[eI] = labelList(2, 0);
+ for (label j = 0; j < 2; ++j)
+ {
+ const vector cross =
+ (faceNormals[edgeNormals[eI][j]] ^ edgeDirections[eI]);
+ const vector fC0tofE0 =
+ 0.5*(max(surface().points()() + min(surface().points()())))
+ - surface().points()()[treeBoundBox::edges[eI].start()];
+
+ normalDirections[eI][j] =
+ (
+ (
+ (cross/(mag(cross) + VSMALL))
+ & (fC0tofE0/(mag(fC0tofE0)+ VSMALL))
+ )
+ > 0.0
+ ? 1
+ : -1
+ );
+ }
+ }
+
+ labelListList featurePointNormals(8);
+ labelListList featurePointEdges(8);
+ forAll(featurePointNormals, pI)
+ {
+ labelList& ftPtEdges = featurePointEdges[pI];
+ ftPtEdges.setSize(3, 0);
+
+ label edgeI = 0;
+ forAll(treeBoundBox::edges, eI)
+ {
+ const edge& e = treeBoundBox::edges[eI];
+
+ if (e.start() == pI)
+ {
+ ftPtEdges[edgeI++] = eI;
+ }
+ else if (e.end() == pI)
+ {
+ ftPtEdges[edgeI++] = eI;
+ }
+ }
+
+ labelList& ftPtNormals = featurePointNormals[pI];
+ ftPtNormals.setSize(3, 0);
+
+ ftPtNormals[0] = edgeNormals[ftPtEdges[0]][0];
+ ftPtNormals[1] = edgeNormals[ftPtEdges[0]][1];
+ ftPtNormals[2] = edgeNormals[ftPtEdges[1]][0];
+ }
+
+ labelList regionEdges;
+
+ features.set
+ (
+ new extendedFeatureEdgeMesh
+ (
+ IOobject
+ (
+ surface().name(),
+ surface().instance(),
+ "extendedFeatureEdgeMesh",
+ surface().db(),
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE
+ ),
+ surface().points(),
+ treeBoundBox::edges,
+ 8, 8, 8,
+ 12, 12, 12, 12,
+ faceNormals,
+ PackedList<2>(12, mode_), // Need to be input by user
+ edgeDirections,
+ normalDirections,
+ edgeNormals,
+ featurePointNormals,
+ featurePointEdges,
+ regionEdges
+ )
+ );
+
+ return features;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.H
new file mode 100644
index 0000000000..ac93079ba0
--- /dev/null
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.H
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Class
+ Foam::searchableBoxFeatures
+
+Description
+
+SourceFiles
+ searchableBoxFeatures.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef searchableBoxFeatures_H
+#define searchableBoxFeatures_H
+
+#include "searchableSurfaceFeatures.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class searchableBoxFeatures Declaration
+\*---------------------------------------------------------------------------*/
+
+class searchableBoxFeatures
+:
+ public searchableSurfaceFeatures
+{
+private:
+
+ // Private Member Data
+
+ //- Which side of the box to mesh
+ const extendedFeatureEdgeMesh::sideVolumeType mode_;
+
+
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ searchableBoxFeatures(const searchableBoxFeatures&);
+
+ //- Disallow default bitwise assignment
+ void operator=(const searchableBoxFeatures&);
+
+
+public:
+
+ //- Runtime type information
+ TypeName("searchableBoxFeatures");
+
+
+ // Constructors
+
+ //- Construct from searchable surface and dictionary
+ searchableBoxFeatures
+ (
+ const searchableSurface& surface,
+ const dictionary& dict
+ );
+
+
+ //- Destructor
+ virtual ~searchableBoxFeatures();
+
+
+ // Member Functions
+
+ //- Return true for a searchable box having features
+ virtual bool hasFeatures() const
+ {
+ return true;
+ }
+
+ //- Return an extendedFeatureEdgeMesh containing the features
+ virtual autoPtr features() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableSurfaceFeatures.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableSurfaceFeatures.C
new file mode 100644
index 0000000000..413f720d77
--- /dev/null
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableSurfaceFeatures.C
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "searchableSurfaceFeatures.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+defineTypeNameAndDebug(searchableSurfaceFeatures, 0);
+defineRunTimeSelectionTable(searchableSurfaceFeatures, dict);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr
+Foam::searchableSurfaceFeatures::New
+(
+ const searchableSurface& surface,
+ const dictionary& dict
+)
+{
+ word searchableSurfaceFeaturesType = surface.type() + "Features";
+
+ dictConstructorTable::iterator cstrIter =
+ dictConstructorTablePtr_->find(searchableSurfaceFeaturesType);
+
+ if (cstrIter == dictConstructorTablePtr_->end())
+ {
+ FatalErrorIn
+ (
+ "searchableSurfaceFeatures::New(const word&,"
+ " const searchableSurface&, const dictionary&)"
+ ) << "Unknown searchableSurfaceFeatures type "
+ << searchableSurfaceFeaturesType << endl << endl
+ << "Valid searchableSurfaceFeatures types : " << endl
+ << dictConstructorTablePtr_->sortedToc()
+ << exit(FatalError);
+ }
+
+ return autoPtr(cstrIter()(surface, dict));
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::searchableSurfaceFeatures::searchableSurfaceFeatures
+(
+ const searchableSurface& surface,
+ const dictionary& dict
+)
+:
+ surface_(surface),
+ dict_(dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::searchableSurfaceFeatures::~searchableSurfaceFeatures()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableSurfaceFeatures.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableSurfaceFeatures.H
new file mode 100644
index 0000000000..9e6fdb3543
--- /dev/null
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableSurfaceFeatures.H
@@ -0,0 +1,155 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Class
+ Foam::searchableSurfaceFeatures
+
+Description
+ Decorator that returns the features of a searchable surface.
+
+SourceFiles
+ searchableSurfaceFeatures.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef searchableSurfaceFeatures_H
+#define searchableSurfaceFeatures_H
+
+#include "typeInfo.H"
+#include "runTimeSelectionTables.H"
+#include "searchableSurface.H"
+#include "extendedFeatureEdgeMesh.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class searchableSurfaceFeatures Declaration
+\*---------------------------------------------------------------------------*/
+
+class searchableSurfaceFeatures
+{
+ // Private data
+
+ const searchableSurface& surface_;
+
+ const dictionary& dict_;
+
+
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ searchableSurfaceFeatures(const searchableSurfaceFeatures&);
+
+ //- Disallow default bitwise assignment
+ void operator=(const searchableSurfaceFeatures&);
+
+
+public:
+
+ //- Runtime type information
+ TypeName("searchableSurfaceFeatures");
+
+ // Declare run-time constructor selection table
+
+ // For the dictionary constructor
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ searchableSurfaceFeatures,
+ dict,
+ (
+ const searchableSurface& surface,
+ const dictionary& dict
+ ),
+ (surface, dict)
+ );
+
+
+ // Constructors
+
+ //- Construct from components
+ searchableSurfaceFeatures
+ (
+ const searchableSurface& surface,
+ const dictionary& dict
+ );
+
+ //- Clone
+ virtual autoPtr clone() const
+ {
+ notImplemented("autoPtr clone() const");
+ return autoPtr(NULL);
+ }
+
+
+ // Selectors
+
+ //- Return a reference to the selected searchableSurfaceFeatures
+ static autoPtr New
+ (
+ const searchableSurface& surface,
+ const dictionary& dict
+ );
+
+
+ //- Destructor
+ virtual ~searchableSurfaceFeatures();
+
+
+ // Member Functions
+
+ //- Return a reference to the searchable surface
+ const searchableSurface& surface() const
+ {
+ return surface_;
+ }
+
+ //- Return a reference to the dictionary
+ const dictionary& dict() const
+ {
+ return dict_;
+ }
+
+ //- Return whether this searchable surface has features
+ virtual bool hasFeatures() const = 0;
+
+ //- Return an extendedFeatureEdgeMesh containing the features
+ virtual autoPtr features() const
+ {
+ return autoPtr();
+ }
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/triSurfaceMeshFeatures.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/triSurfaceMeshFeatures.C
new file mode 100644
index 0000000000..3230f0cbc6
--- /dev/null
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/triSurfaceMeshFeatures.C
@@ -0,0 +1,102 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "triSurfaceMeshFeatures.H"
+#include "addToRunTimeSelectionTable.H"
+#include "triSurfaceMesh.H"
+#include "surfaceFeatures.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+defineTypeNameAndDebug(triSurfaceMeshFeatures, 0);
+addToRunTimeSelectionTable
+(
+ searchableSurfaceFeatures,
+ triSurfaceMeshFeatures,
+ dict
+);
+
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::triSurfaceMeshFeatures::triSurfaceMeshFeatures
+(
+ const searchableSurface& surface,
+ const dictionary& dict
+)
+:
+ searchableSurfaceFeatures(surface, dict),
+ includedAngle_(readScalar(dict.lookup("includedAngle")))
+{
+ Info<< indent
+ << " Included angle = " << includedAngle_
+ << endl;
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::triSurfaceMeshFeatures::~triSurfaceMeshFeatures()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::autoPtr
+Foam::triSurfaceMeshFeatures::features() const
+{
+ autoPtr features;
+
+ const triSurfaceMesh& surfMesh = refCast(surface());
+
+ surfaceFeatures sFeat(surfMesh, includedAngle_);
+
+ boolList surfBaffleRegions(surfMesh.patches().size(), false);
+
+ features.set
+ (
+ new extendedFeatureEdgeMesh
+ (
+ sFeat,
+ surface().db(),
+ surface().name() + ".extendedFeatureEdgeMesh",
+ surfBaffleRegions
+ )
+ );
+
+ return features;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/triSurfaceMeshFeatures.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/triSurfaceMeshFeatures.H
new file mode 100644
index 0000000000..190b7859ce
--- /dev/null
+++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/triSurfaceMeshFeatures.H
@@ -0,0 +1,109 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / 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 .
+
+Class
+ Foam::triSurfaceMeshFeatures
+
+Description
+
+SourceFiles
+ triSurfaceMeshFeatures.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef triSurfaceMeshFeatures_H
+#define triSurfaceMeshFeatures_H
+
+#include "searchableSurfaceFeatures.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class triSurfaceMeshFeatures Declaration
+\*---------------------------------------------------------------------------*/
+
+class triSurfaceMeshFeatures
+:
+ public searchableSurfaceFeatures
+{
+private:
+
+ // Private Member Data
+
+ const scalar includedAngle_;
+
+
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ triSurfaceMeshFeatures(const triSurfaceMeshFeatures&);
+
+ //- Disallow default bitwise assignment
+ void operator=(const triSurfaceMeshFeatures&);
+
+
+public:
+
+ //- Runtime type information
+ TypeName("triSurfaceMeshFeatures");
+
+
+ // Constructors
+
+ //- Construct from dictionary (used by searchableSurface)
+ triSurfaceMeshFeatures
+ (
+ const searchableSurface& surface,
+ const dictionary& dict
+ );
+
+
+ //- Destructor
+ virtual ~triSurfaceMeshFeatures();
+
+
+ // Member Functions
+
+ //- Return true for a triSurfaceMesh having features
+ virtual bool hasFeatures() const
+ {
+ return true;
+ }
+
+ //- Return an extendedFeatureEdgeMesh containing the features
+ virtual autoPtr features() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/etc/caseDicts/foamyHexMeshDict b/etc/caseDicts/foamyHexMeshDict
new file mode 100644
index 0000000000..849ea336e6
--- /dev/null
+++ b/etc/caseDicts/foamyHexMeshDict
@@ -0,0 +1,124 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: dev |
+| \\ / A nd | Web: www.OpenFOAM.org |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+#inputMode merge;
+
+surfaceConformation
+{
+ locationInMesh (0 0 0);
+ pointPairDistanceCoeff 0.1;
+ mixedFeaturePointPPDistanceCoeff 5.0;
+ featurePointExclusionDistanceCoeff 0.65;
+ featureEdgeExclusionDistanceCoeff 0.65;
+ surfaceSearchDistanceCoeff 5;
+ maxSurfaceProtrusionCoeff 0.1;
+ maxQuadAngle 125;
+ surfaceConformationRebuildFrequency 10;
+ specialiseFeaturePoints on;
+
+ conformationControls
+ {
+ edgeSearchDistCoeff 5;
+ surfacePtReplaceDistCoeff 0.5;
+ surfacePtExclusionDistanceCoeff 0.5;
+ maxIterations 15;
+ iterationToInitialHitRatioLimit 0.001;
+ }
+
+ additionalFeatures
+ {}
+}
+
+
+initialPoints
+{
+ minimumSurfaceDistanceCoeff 0.55;
+ fixInitialPoints false;
+
+ initialPointsMethod autoDensity;
+ autoDensityCoeffs
+ {
+ minLevels 4;
+ maxSizeRatio 5.0;
+ sampleResolution 5;
+ surfaceSampleResolution 5;
+ }
+}
+
+
+motionControl
+{
+ maxSmoothingIterations 100;
+
+ cellAspectRatioControl
+ {
+ aspectRatio 1.0;
+ aspectRatioDirection (1 0 0);
+ }
+
+ relaxationModel adaptiveLinear;
+ adaptiveLinearCoeffs
+ {
+ relaxationStart 1.0;
+ relaxationEnd 0.0;
+ }
+
+ objOutput no;
+ timeChecks no;
+
+ maxLoadUnbalance 0.2;
+
+ alignmentAcceptanceAngle 48;
+
+ pointInsertionCriteria
+ {
+ cellCentreDistCoeff 1.75;
+ faceAreaRatioCoeff 0.0025;
+ acceptanceAngle 21.5;
+ }
+
+ pointRemovalCriteria
+ {
+ cellCentreDistCoeff 0.65;
+ }
+
+ faceAreaWeightModel piecewiseLinearRamp;
+ piecewiseLinearRampCoeffs
+ {
+ lowerAreaFraction 0.5;
+ upperAreaFraction 1.0;
+ }
+}
+
+
+polyMeshFiltering
+{
+ filterEdges on;
+ filterFaces off;
+ writeTetDualMesh false;
+}
+
+
+meshQualityControls
+{
+ maxNonOrtho 65;
+ maxBoundarySkewness 50;
+ maxInternalSkewness 10;
+ maxConcave 80;
+ minVol -1E30;
+ minTetQuality 1e-30;
+ minArea -1;
+ minTwist 0.02;
+ minDeterminant 0.001;
+ minFaceWeight 0.02;
+ minVolRatio 0.01;
+ minTriangleTwist -1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/flange/system/foamyHexMeshDict b/tutorials/mesh/foamyHexMesh/flange/system/foamyHexMeshDict
index 91d3059bd8..6b15b6063c 100644
--- a/tutorials/mesh/foamyHexMesh/flange/system/foamyHexMeshDict
+++ b/tutorials/mesh/foamyHexMesh/flange/system/foamyHexMeshDict
@@ -47,8 +47,8 @@ surfaceConformation
{
flange
{
- featureMethod extendedFeatureEdgeMesh;
- extendedFeatureEdgeMesh "flange.extendedFeatureEdgeMesh";
+ featureMethod extractFeatures;
+ includedAngle 140;
}
}
}
diff --git a/tutorials/mesh/foamyHexMesh/flange/system/surfaceFeatureExtractDict b/tutorials/mesh/foamyHexMesh/flange/system/surfaceFeatureExtractDict
deleted file mode 100644
index 520df11958..0000000000
--- a/tutorials/mesh/foamyHexMesh/flange/system/surfaceFeatureExtractDict
+++ /dev/null
@@ -1,38 +0,0 @@
-/*--------------------------------*- 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 surfaceFeatureExtractDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-flange.obj
-{
- extractionMethod extractFromSurface;
-
- extractFromSurfaceCoeffs
- {
- // Mark edges whose adjacent surface normals are at an angle less
- // than includedAngle as features
- // - 0 : selects no edges
- // - 180: selects all edges
- includedAngle 100;
- }
-
-
- // Write options
-
- // Write features to obj format for postprocessing
- writeObj yes;
-}
-
-
-// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/simpleShapes/Allrun b/tutorials/mesh/foamyHexMesh/simpleShapes/Allrun
index c37109987b..ccecbaaa76 100755
--- a/tutorials/mesh/foamyHexMesh/simpleShapes/Allrun
+++ b/tutorials/mesh/foamyHexMesh/simpleShapes/Allrun
@@ -35,7 +35,7 @@ runApplication surfaceFeatureExtract
# Generate aligned points (in constant/internalDelaunayVertices) and a
# mesh from that.
-runApplication cvMesh
+runApplication foamyHexMesh
# Generate some sets for a bit of mesh inspection
runApplication topoSet -time 0:100
diff --git a/tutorials/mesh/foamyHexMesh/simpleShapes/system/cvMeshDict b/tutorials/mesh/foamyHexMesh/simpleShapes/system/cvMeshDict
deleted file mode 100644
index 8c7b7e6480..0000000000
--- a/tutorials/mesh/foamyHexMesh/simpleShapes/system/cvMeshDict
+++ /dev/null
@@ -1,368 +0,0 @@
-/*--------------------------------*- 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 cvMeshDict;
-}
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-
-/*
-
-Control dictionary for cvMesh - polyhedral mesh generator.
-
-cvMesh phases:
-1. fill volume with initial points (initialPoints subdictionary). An option
- is to reread from previous set of points.
-
-2. internal point motion (motionControl subdictionary)
-
-3. every once in a while add point duplets/triplets to conform to
- surfaces and features (surfaceConformation subdictionary)
-
-4. back to 2
-
-5. construct polyMesh.
- - filter (polyMeshFiltering subdictionary)
- - check (meshQualityControls subdictionary) and undo filtering
-
-
-See also cvControls.H in the conformalVoronoiMesh library
-
-*/
-
-
-// Important:
-// ----------
-// Any scalar with a name Coeff specifies a value that will be implemented
-// as a faction of the target cell size
-// Any scalar with a name Size specifies an absolute size.
-
-
-// Geometry. Definition of all surfaces. All surfaces are of class
-// searchableSurface.
-// Surfaces need to be (almost) closed - use closedTriSurfaceMesh
-// if they are not topologically closed. Surfaces need to be oriented so
-// the space to be meshed is always on the inside of all surfaces. Use e.g.
-// surfaceOrient.
-geometry
-{
- // Internal shape
- coneAndSphere_clean_orient.obj
- {
- name coneAndSphere;
- type triSurfaceMesh;
- }
-
- // Outside of domain
- domain_clean_orient.stl
- {
- name domain;
- type triSurfaceMesh;
- regions
- {
- ascii{ name domain_patch0; }
- }
- }
-
-}
-
-
-// Controls for conforming to the surfaces.
-surfaceConformation
-{
- // A point inside surfaces that is inside mesh.
- locationInMesh (0 -0.5 0);
-
- // How far apart are point-duplets generated. Balance this between
- // - very low distance: little chance of interference from other
- // surfaces
- // - largish distance: less non-orthogonality in final cell
- // (circumcentre far away from centroid)
- pointPairDistanceCoeff 0.1;
-
- // Mixed feature edges - both inside and outside edges. Recreated
- // by inserting triplets of points to recreate a single edge. Done for
- // all edges emanating from point. triplets of points get inserted
- // mixedFeaturePointPPDistanceCoeff distance away from feature point.
- mixedFeaturePointPPDistanceCoeff 5.0;
-
- // Distance to a feature point within which surface and edge
- // conformation points are excluded - fraction of the local target
- // cell size
- featurePointExclusionDistanceCoeff 0.6;
-
- // Distance to an existing feature edge conformation location
- // within which other edge conformation location are excluded -
- // fraction of the local target cell size
- featureEdgeExclusionDistanceCoeff 0.6;
-
- // Optimisation: do not check for surface intersection (of dual edges)
- // for points near to surface.
- surfaceSearchDistanceCoeff 2.5;
-
- // Maximum allowable protrusion through the surface before
- // conformation points are added - fraction of the local target
- // cell size. These small protusions are (hopefully) done by mesh filtering
- // instead.
- maxSurfaceProtrusionCoeff 0.1;
-
- // If feature edge with large angle (so more than 125 degrees) introduce
- // additional points to create two half angled cells (= mitering).
- maxQuadAngle 125;
-
- // Frequency to redo surface conformation (expensive).
- surfaceConformationRebuildFrequency 10;
-
- // Specialised feature point handling
- specialiseFeaturePoints on;
-
- // Initial and intermediate controls
- conformationControls
- {
- // We've got a point poking through the surface. Don't do any
- // surface conformation if near feature edge (since feature edge
- // conformation should have priority)
-
- // distance to search for near feature edges
- edgeSearchDistCoeff 2;
-
- // Proximity to a feature edge where a surface hit is
- // not created, only the edge conformation is created
- // - fraction of the local target cell size. Coarse
- // conformation, initial protrusion tests.
- surfacePtReplaceDistCoeff 0.5;
-
-
- surfacePtExclusionDistanceCoeff 0.5;
-
- // Stop either at maxIterations or if the number of surface pokes
- // is very small (iterationToInitialHitRatioLimit * initial number)
- // Note: perhaps iterationToInitialHitRatioLimit should be absolute
- // count?
- maxIterations 15;
-
- iterationToInitialHitRatioLimit 0.001;
- }
-
- // Geometry to mesh to
- geometryToConformTo
- {
- coneAndSphere
- {
- featureMethod extendedFeatureEdgeMesh;
- extendedFeatureEdgeMesh "coneAndSphere_clean_orient.extendedFeatureEdgeMesh";
- }
-
- domain
- {
- featureMethod extendedFeatureEdgeMesh;
- extendedFeatureEdgeMesh "domain_clean_orient.extendedFeatureEdgeMesh";
- }
- }
-
- additionalFeatures
- {}
-}
-
-
-// Controls for seeding initial points and general control of the target
-// cell size (used everywhere)
-initialPoints
-{
- // Do not place point closer than minimumSurfaceDistanceCoeff
- // to the surface. Is fraction of local target cell size (see below)
- minimumSurfaceDistanceCoeff 0.55;
-
- initialPointsMethod autoDensity;
- // initialPointsMethod uniformGrid;
- // initialPointsMethod bodyCentredCubic;
- // initialPointsMethod pointFile;
-
- // Take boundbox of all geometry. Samples with this box. If too much
- // samples (due to target cell size) in box split box.
- autoDensityCoeffs
- {
- minCellSizeLimit 0.1;
- // Initial number of refinement levels. Needs to be enough to pick
- // up features due to size ratio. If not enough it will take longer
- // to determine point seeding.
- minLevels 4;
- // Split box if ratio of min to max cell size larger than maxSizeRatio
- maxSizeRatio 5.0;
- // Per box sample 3x3x3 internally
- sampleResolution 3;
- // Additionally per face of the box sample 3
- surfaceSampleResolution 3;
- }
-
- uniformGridCoeffs
- {
- // Absolute cell size.
- initialCellSize 0.0015;
- randomiseInitialGrid yes;
- randomPerturbationCoeff 0.02;
- }
-
- bodyCentredCubicCoeffs
- {
- initialCellSize 0.0015;
- randomiseInitialGrid no;
- randomPerturbationCoeff 0.1;
- }
-
- pointFileCoeffs
- {
- // Reads points from file. Still rejects points that are too
- // close to the surface (minimumSurfaceDistanceCoeff) or on the
- // wrong side of the surfaces.
- pointFile "constant/internalDelaunayVertices";
- }
-}
-
-
-// Control size of voronoi cells i.e. distance between points. This
-// determines the target cell size which is used everywhere.
-// It determines the cell size given a location. It then uses all
-// the rules
-// - defaultCellSize
-// - cellSizeControlGeometry
-// to determine target cell size. Rule with highest priority wins. If same
-// priority smallest cell size wins.
-motionControl
-{
- // Absolute cell size of back ground mesh. This is the maximum cell size.
- defaultCellSize 0.1;
-
- minimumCellSizeCoeff 0;
-
- // For background cell size and alignment grid
- maxSmoothingIterations 100;
-
- maxRefinementIterations 0;
-
- shapeControlFunctions
- {
- coneAndSphere
- {
- type searchableSurfaceControl;
- priority 1;
- mode bothSides;
-
- surfaceCellSizeFunction uniformValue;
- uniformValueCoeffs
- {
- surfaceCellSizeCoeff 0.75;
- }
-
- cellSizeFunction uniform;
- uniformCoeffs
- {}
- }
-
- domain
- {
- type searchableSurfaceControl;
- priority 1;
- mode bothSides;
-
- surfaceCellSizeFunction uniformValue;
- uniformValueCoeffs
- {
- surfaceCellSizeCoeff 1;
- }
-
- cellSizeFunction uniform;
- uniformCoeffs
- {}
- }
- }
-
- cellAspectRatioControl
- {
- aspectRatio 1.0;
- aspectRatioDirection (0 0 0);
- }
-
- // Underrelaxation for point motion. Simulated annealing: starts off at 1
- // and lowers to 0 (at simulation endTime) to converge points.
- // adaptiveLinear is preferred choice.
- // Points move by e.g. 10% of tet size.
- relaxationModel adaptiveLinear; //rampHoldFall
-
- adaptiveLinearCoeffs
- {
- relaxationStart 1.0;
- relaxationEnd 0.0;
- }
-
- // Output lots and lots of .obj files
- objOutput no;
-
- // Timing and memory usage.
- timeChecks no;
-
- // For each delaunay edge (between two vertices, becomes
- // the Voronoi face normal) snap to the alignment direction if within
- // alignmentAcceptanceAngle. Slightly > 45 is a good choice - prevents
- // flipping.
- alignmentAcceptanceAngle 48;
-
- // When to insert points. Not advisable change to
- // these settings.
- pointInsertionCriteria
- {
- // If edge larger than 1.75 target cell size
- // (so tets too large/stretched) insert point
- cellCentreDistCoeff 1.75;
- // Do not insert point if voronoi face (on edge) very small.
- faceAreaRatioCoeff 0.0025;
- // Insert point only if edge closely aligned to local alignment
- // direction.
- acceptanceAngle 21.5;
- }
-
- // Opposite: remove point if mesh too compressed. Do not change these
- // settings.
- pointRemovalCriteria
- {
- cellCentreDistCoeff 0.65;
- }
-
- // How to determine the point motion. All edges got some direction.
- // Sum all edge contributions to determine point motion. Weigh by
- // face area so motion is preferentially determined by large faces
- // (or more importantly ignore contribution from small faces).
- // Do not change these settings.
- faceAreaWeightModel piecewiseLinearRamp;
-
- piecewiseLinearRampCoeffs
- {
- lowerAreaFraction 0.5;
- upperAreaFraction 1.0;
- }
-}
-
-
-// After simulation, when converting to polyMesh, filter out small faces/edges.
-// Do not change. See cvControls.H
-polyMeshFiltering
-{
- filterEdges on;
- filterFaces on;
- writeTetDualMesh false;
-}
-
-
-#include "meshQualityDict";
-
-
-// ************************************************************************* //
diff --git a/tutorials/mesh/foamyHexMesh/simpleShapes/system/foamyHexMeshDict b/tutorials/mesh/foamyHexMesh/simpleShapes/system/foamyHexMeshDict
new file mode 100644
index 0000000000..5f14ff9d46
--- /dev/null
+++ b/tutorials/mesh/foamyHexMesh/simpleShapes/system/foamyHexMeshDict
@@ -0,0 +1,203 @@
+/*--------------------------------*- 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 foamyHexMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Include defaults parameters from master dictionary
+#include "$WM_PROJECT_DIR/etc/caseDicts/foamyHexMeshDict"
+
+geometry
+{
+ // Internal shape
+ coneAndSphere_clean_orient.obj
+ {
+ name coneAndSphere;
+ type triSurfaceMesh;
+ }
+
+ // Outside of domain
+ domain_clean_orient.stl
+ {
+ name domain;
+ type triSurfaceMesh;
+ regions
+ {
+ ascii{ name domain_patch0; }
+ }
+ }
+
+}
+
+
+// Controls for conforming to the surfaces.
+surfaceConformation
+{
+ // A point inside surfaces that is inside mesh.
+ locationInMesh (0 -0.5 0);
+
+ // Geometry to mesh to
+ geometryToConformTo
+ {
+ coneAndSphere
+ {
+ featureMethod extractFeatures;
+ includedAngle 140;
+ featureMethod extendedFeatureEdgeMesh;
+ extendedFeatureEdgeMesh "coneAndSphere_clean_orient.extendedFeatureEdgeMesh";
+ }
+
+ domain
+ {
+ featureMethod extractFeatures;
+ includedAngle 125;
+ featureMethod extendedFeatureEdgeMesh;
+ extendedFeatureEdgeMesh "domain_clean_orient.extendedFeatureEdgeMesh";
+ }
+ }
+
+ additionalFeatures
+ {}
+}
+
+
+// Controls for seeding initial points and general control of the target
+// cell size (used everywhere)
+initialPoints
+{
+ initialPointsMethod autoDensity;
+ // initialPointsMethod uniformGrid;
+ // initialPointsMethod bodyCentredCubic;
+ // initialPointsMethod pointFile;
+
+ // Take boundbox of all geometry. Samples with this box. If too much
+ // samples (due to target cell size) in box split box.
+ autoDensityCoeffs
+ {
+ minCellSizeLimit 0.1;
+ // Initial number of refinement levels. Needs to be enough to pick
+ // up features due to size ratio. If not enough it will take longer
+ // to determine point seeding.
+ minLevels 4;
+ // Split box if ratio of min to max cell size larger than maxSizeRatio
+ maxSizeRatio 5.0;
+ // Per box sample 3x3x3 internally
+ sampleResolution 3;
+ // Additionally per face of the box sample 3
+ surfaceSampleResolution 3;
+ }
+
+ uniformGridCoeffs
+ {
+ // Absolute cell size.
+ initialCellSize 0.0015;
+ randomiseInitialGrid yes;
+ randomPerturbationCoeff 0.02;
+ }
+
+ bodyCentredCubicCoeffs
+ {
+ initialCellSize 0.0015;
+ randomiseInitialGrid no;
+ randomPerturbationCoeff 0.1;
+ }
+
+ pointFileCoeffs
+ {
+ // Reads points from file. Still rejects points that are too
+ // close to the surface (minimumSurfaceDistanceCoeff) or on the
+ // wrong side of the surfaces.
+ pointFile "constant/internalDelaunayVertices";
+ }
+}
+
+
+// Control size of voronoi cells i.e. distance between points. This
+// determines the target cell size which is used everywhere.
+// It determines the cell size given a location. It then uses all
+// the rules
+// - defaultCellSize
+// - cellSizeControlGeometry
+// to determine target cell size. Rule with highest priority wins. If same
+// priority smallest cell size wins.
+motionControl
+{
+ // Absolute cell size of back ground mesh. This is the maximum cell size.
+ defaultCellSize 0.1;
+
+ minimumCellSizeCoeff 0;
+
+ // For background cell size and alignment grid
+ maxSmoothingIterations 100;
+
+ maxRefinementIterations 0;
+
+ shapeControlFunctions
+ {
+ coneAndSphere
+ {
+ type searchableSurfaceControl;
+ priority 1;
+ mode bothSides;
+
+ surfaceCellSizeFunction uniformValue;
+ uniformValueCoeffs
+ {
+ surfaceCellSizeCoeff 0.75;
+ }
+
+ cellSizeFunction uniform;
+ uniformCoeffs
+ {}
+ }
+
+ domain
+ {
+ type searchableSurfaceControl;
+ priority 1;
+ mode bothSides;
+
+ surfaceCellSizeFunction uniformValue;
+ uniformValueCoeffs
+ {
+ surfaceCellSizeCoeff 1;
+ }
+
+ cellSizeFunction uniform;
+ uniformCoeffs
+ {}
+ }
+ }
+
+ // Output lots and lots of .obj files
+ objOutput no;
+
+ // Timing and memory usage.
+ timeChecks no;
+}
+
+
+// After simulation, when converting to polyMesh, filter out small faces/edges.
+// Do not change. See cvControls.H
+polyMeshFiltering
+{
+ filterEdges on;
+ filterFaces on;
+ writeTetDualMesh false;
+}
+
+
+#include "meshQualityDict";
+
+
+// ************************************************************************* //