diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C index 8358d62aec..3fe61d60da 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C @@ -68,6 +68,19 @@ namespace Foam "multiple", "none" }; + + template<> + const char* Foam::NamedEnum + < + Foam::extendedFeatureEdgeMesh::sideVolumeType, + 4 + >::names[] = + { + "inside", + "outside", + "both", + "neither" + }; } const Foam::NamedEnum @@ -76,6 +89,9 @@ const Foam::NamedEnum const Foam::NamedEnum Foam::extendedFeatureEdgeMesh::edgeStatusNames_; +const Foam::NamedEnum + Foam::extendedFeatureEdgeMesh::sideVolumeTypeNames_; + Foam::scalar Foam::extendedFeatureEdgeMesh::cosNormalAngleTol_ = Foam::cos(degToRad(0.1)); @@ -106,7 +122,9 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh(const IOobject& io) openStart_(0), multipleStart_(0), normals_(0), + normalVolumeTypes_(0), edgeDirections_(0), + normalDirections_(0), edgeNormals_(0), featurePointNormals_(0), featurePointEdges_(0), @@ -144,6 +162,8 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh(const IOobject& io) >> openStart_ >> multipleStart_ >> normals_ + >> normalVolumeTypes_ + >> normalDirections_ >> edgeNormals_ >> featurePointNormals_ >> featurePointEdges_ @@ -196,7 +216,9 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh openStart_(fem.openStart()), multipleStart_(fem.multipleStart()), normals_(fem.normals()), + normalVolumeTypes_(fem.normalVolumeTypes()), edgeDirections_(fem.edgeDirections()), + normalDirections_(fem.normalDirections()), edgeNormals_(fem.edgeNormals()), featurePointNormals_(fem.featurePointNormals()), featurePointEdges_(fem.featurePointEdges()), @@ -224,7 +246,9 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh openStart_(0), multipleStart_(0), normals_(0), + normalVolumeTypes_(0), edgeDirections_(0), + normalDirections_(0), edgeNormals_(0), featurePointNormals_(0), featurePointEdges_(0), @@ -263,7 +287,9 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh openStart_(-1), multipleStart_(-1), normals_(0), + normalVolumeTypes_(0), edgeDirections_(0), + normalDirections_(0), edgeNormals_(0), featurePointNormals_(0), featurePointEdges_(0), @@ -287,6 +313,41 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh regionFeatureEdges, featurePoints ); + + const labelListList& edgeFaces = surf.edgeFaces(); + + normalVolumeTypes_.setSize(normals_.size()); + + // Noting when the normal of a face has been used so not to duplicate + labelList faceMap(surf.size(), -1); + + label nAdded = 0; + + forAll(featureEdges, i) + { + label sFEI = featureEdges[i]; + + // Pick up the faces adjacent to the feature edge + const labelList& eFaces = edgeFaces[sFEI]; + + forAll(eFaces, j) + { + label eFI = eFaces[j]; + + // Check to see if the points have been already used + if (faceMap[eFI] == -1) + { + normalVolumeTypes_[nAdded++] = + ( + surfBaffleRegions[surf[eFI].region()] + ? BOTH + : INSIDE + ); + + faceMap[eFI] = nAdded - 1; + } + } + } } @@ -309,7 +370,9 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh openStart_(-1), multipleStart_(-1), normals_(0), + normalVolumeTypes_(0), edgeDirections_(0), + normalDirections_(0), edgeNormals_(0), featurePointNormals_(0), featurePointEdges_(0), @@ -341,7 +404,9 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh label openStart, label multipleStart, const vectorField& normals, + const PackedList<2>& normalVolumeTypes, const vectorField& edgeDirections, + const labelListList& normalDirections, const labelListList& edgeNormals, const labelListList& featurePointNormals, const labelListList& featurePointEdges, @@ -358,7 +423,9 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh openStart_(openStart), multipleStart_(multipleStart), normals_(normals), + normalVolumeTypes_(normalVolumeTypes), edgeDirections_(edgeDirections), + normalDirections_(normalDirections), edgeNormals_(edgeNormals), featurePointNormals_(featurePointNormals), featurePointEdges_(featurePointEdges), @@ -1300,6 +1367,10 @@ bool Foam::extendedFeatureEdgeMesh::writeData(Ostream& os) const << multipleStart_ << nl << "// normals" << nl << normals_ << nl + << "// normal volume types" << nl + << normalVolumeTypes_ << nl + << "// normalDirections" << nl + << normalDirections_ << nl << "// edgeNormals" << nl << edgeNormals_ << nl << "// featurePointNormals" << nl diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H index b090ad66b1..a0d0930a12 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -61,6 +61,7 @@ SourceFiles #include "treeDataEdge.H" #include "treeDataPoint.H" #include "PrimitivePatch.H" +#include "PackedList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -108,6 +109,17 @@ public: static const Foam::NamedEnum edgeStatusNames_; + //- Normals point to the outside + enum sideVolumeType + { + INSIDE = 0, // mesh inside + OUTSIDE = 1, // mesh outside + BOTH = 2, // e.g. a baffle + NEITHER = 3 // not sure when this may be used + }; + + static const Foam::NamedEnum sideVolumeTypeNames_; + private: @@ -150,9 +162,17 @@ private: // points and edges, unsorted vectorField normals_; + //- + PackedList<2> normalVolumeTypes_; + //- Flat and open edges require the direction of the edge vectorField edgeDirections_; + //- Starting directions for the edges. + // This vector points to the half of the plane defined by the first + // edge normal. + labelListList normalDirections_; + //- Indices of the normals that are adjacent to the feature edges labelListList edgeNormals_; @@ -268,6 +288,7 @@ public: label multipleStart, const vectorField& normals, const vectorField& edgeDirections, + const labelListList& normalDirections, const labelListList& edgeNormals, const labelListList& featurePointNormals, const labelListList& featurePointEdges, @@ -369,9 +390,15 @@ public: // and points inline const vectorField& normals() const; + //- Return + inline const PackedList<2>& normalVolumeTypes() const; + //- Return the edgeDirection vectors inline const vectorField& edgeDirections() const; + //- + inline const labelListList& normalDirections() const; + //- Return the direction of edgeI, pointing away from ptI inline vector edgeDirection(label edgeI, label ptI) const; diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H index cad297e7d5..e6c18f4836 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -90,12 +90,24 @@ inline const Foam::vectorField& Foam::extendedFeatureEdgeMesh::normals() const return normals_; } +inline const Foam::PackedList<2>& +Foam::extendedFeatureEdgeMesh::normalVolumeTypes() const +{ + return normalVolumeTypes_; +} + inline const Foam::vectorField& Foam::extendedFeatureEdgeMesh::edgeDirections() const { return edgeDirections_; } +inline const Foam::labelListList& +Foam::extendedFeatureEdgeMesh::normalDirections() const +{ + return normalDirections_; +} + inline Foam::vector Foam::extendedFeatureEdgeMesh::edgeDirection ( diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshTemplates.C b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshTemplates.C index 3e418153d6..d15d33bc71 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshTemplates.C +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshTemplates.C @@ -27,6 +27,8 @@ License #include "ListListOps.H" #include "unitConversion.H" #include "PackedBoolList.H" +#include "PatchTools.H" +#include "searchableBox.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // @@ -41,7 +43,7 @@ void Foam::extendedFeatureEdgeMesh::sortPointsAndEdges { const pointField& sFeatLocalPts(surf.localPoints()); const edgeList& sFeatEds(surf.edges()); - const labelListList& edgeFaces = surf.edgeFaces(); + const labelListList edgeFaces = PatchTools::sortedEdgeFaces(surf); const vectorField& faceNormals = surf.faceNormals(); const labelListList& pointEdges = surf.pointEdges(); @@ -131,6 +133,7 @@ void Foam::extendedFeatureEdgeMesh::sortPointsAndEdges const labelList& eFaces = edgeFaces[sFEI]; edgeNormals[i].setSize(eFaces.size()); + normalDirections[i].setSize(eFaces.size()); forAll(eFaces, j) { @@ -145,6 +148,22 @@ void Foam::extendedFeatureEdgeMesh::sortPointsAndEdges } edgeNormals[i][j] = faceMap[eFI]; + + const vector cross = (faceNormals[eFI] ^ edgeDirections[i]); + const vector fC0tofE0 = + surf[eFI].centre(surf.points()) + - sFeatLocalPts[fE.start()]; + + normalDirections[i][j] = + ( + ( + (cross/(mag(cross) + VSMALL)) + & (fC0tofE0/(mag(fC0tofE0)+ VSMALL)) + ) + > 0.0 + ? 1 + : -1 + ); } vector fC0tofC1(vector::zero); @@ -258,6 +277,7 @@ void Foam::extendedFeatureEdgeMesh::sortPointsAndEdges inplaceReorder(edMap, edStatus); inplaceReorder(edMap, edgeDirections); inplaceReorder(edMap, edgeNormals); + inplaceReorder(edMap, normalDirections); inplaceRenumber(edMap, regionEdges); forAll(featurePointFeatureEdges, pI) @@ -273,11 +293,13 @@ void Foam::extendedFeatureEdgeMesh::sortPointsAndEdges // Initialise sorted edge related data edgeDirections_ = edgeDirections/(mag(edgeDirections) + VSMALL); edgeNormals_ = edgeNormals; + normalDirections_ = normalDirections; regionEdges_ = regionEdges; // Normals are all now found and indirectly addressed, can also be stored normals_ = vectorField(norms); + // Reorder the feature points by classification List > allPts(3); @@ -355,7 +377,6 @@ void Foam::extendedFeatureEdgeMesh::sortPointsAndEdges // renumbered edges reset(xferMove(pts), xferMove(eds)); - // Generate the featurePointNormals labelListList featurePointNormals(nonFeatureStart_);