diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C index 0c983bfdd8c30eb9acdd8568ccabaa8321589e40..62d0c02afe63e1249e0300fd95f54a09e8a18223 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMesh.C @@ -240,7 +240,10 @@ void Foam::conformalVoronoiMesh::insertSurfacePointPairs const Foam::point& surfacePt(surfaceHit.hitPoint()); - if (geometryToConformTo_.isBaffle(featureIndex, surfaceHit)) + extendedFeatureEdgeMesh::sideVolumeType meshableSide = + geometryToConformTo_.meshableSide(featureIndex, surfaceHit); + + if (meshableSide == extendedFeatureEdgeMesh::BOTH) { createBafflePointPair ( @@ -250,7 +253,7 @@ void Foam::conformalVoronoiMesh::insertSurfacePointPairs pts ); } - else + else if (meshableSide == extendedFeatureEdgeMesh::INSIDE) { createPointPair ( @@ -260,6 +263,25 @@ void Foam::conformalVoronoiMesh::insertSurfacePointPairs pts ); } + else if (meshableSide == extendedFeatureEdgeMesh::OUTSIDE) + { + createPointPair + ( + pointPairDistance(surfacePt), + surfacePt, + -normal, + pts + ); + } + else + { + WarningIn + ( + "Foam::conformalVoronoiMesh::insertSurfacePointPairs" + "(const pointIndexHitAndFeatureList&, const fileName)" + ) << meshableSide << ", bad" + << endl; + } } insertPoints(pts, true); diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C index cb60543a6b108836053d6f75ff7acaadbd8c4dfb..8be496816f11bbd9eb8cf95b1be6b14eda63b6f3 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshConformToSurface.C @@ -989,8 +989,9 @@ bool Foam::conformalVoronoiMesh::surfaceLocationConformsToInside { vectorField norm(1); - allGeometry_[info.second()].getNormal + geometryToConformTo_.getNormal ( + info.second(), List<pointIndexHit>(1, info.first()), norm ); @@ -1133,8 +1134,9 @@ bool Foam::conformalVoronoiMesh::dualCellSurfaceAllIntersections { vectorField norm(1); - allGeometry_[hitSurfaceIntersection].getNormal + geometryToConformTo_.getNormal ( + hitSurfaceIntersection, List<pointIndexHit>(1, infoIntersection), norm ); diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C index 6dcf8275dec7cb6f8309bad1e16c03c8bae30a01..1cdd66490d576f5ecd8ee502c3bb065a0baae585 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformalVoronoiMesh/conformalVoronoiMeshFeaturePoints.C @@ -179,7 +179,7 @@ void Foam::conformalVoronoiMesh::createEdgePointGroupByCirculating const labelList& edNormalIs = feMesh.edgeNormals()[edgeI]; const labelList& feNormalDirections = feMesh.normalDirections()[edgeI]; - const PackedList<2>& normalVolumeTypes = feMesh.normalVolumeTypes(); + const List<sideVolumeType>& normalVolumeTypes = feMesh.normalVolumeTypes(); const_circulator<labelList> circ(edNormalIs); const_circulator<labelList> circNormalDirs(feNormalDirections); @@ -197,10 +197,8 @@ void Foam::conformalVoronoiMesh::createEdgePointGroupByCirculating if (circ.size()) do { - const sideVolumeType volType = - sideVolumeType(normalVolumeTypes[circ()]); - const sideVolumeType nextVolType = - sideVolumeType(normalVolumeTypes[circ.next()]); + const sideVolumeType volType = normalVolumeTypes[circ()]; + const sideVolumeType nextVolType = normalVolumeTypes[circ.next()]; const vector& normal = feNormals[circ()]; const vector& nextNormal = feNormals[circ.next()]; diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C index e1afeb1d60e82b1c42330f3c049e2ec1ff6d2589..8c466e96932b7d24f022f954367ffe0fd5238f35 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.C @@ -53,7 +53,10 @@ void Foam::conformationSurfaces::hasBoundedVolume if ( surface.hasVolumeType() - && !baffleSurfaces_[regionOffset_[s]] + && ( + normalVolumeTypes_[regionOffset_[s]] + != extendedFeatureEdgeMesh::BOTH + ) ) { pointField pts(1, locationInMesh_); @@ -87,7 +90,11 @@ void Foam::conformationSurfaces::hasBoundedVolume + regionOffset_[s]; // Don't include baffle surfaces in the calculation - if (!baffleSurfaces_[patchID]) + if + ( + normalVolumeTypes_[patchID] + != extendedFeatureEdgeMesh::BOTH + ) { sum += triSurf[sI].normal(surfPts); } @@ -256,7 +263,7 @@ Foam::conformationSurfaces::conformationSurfaces locationInMesh_(surfaceConformationDict.lookup("locationInMesh")), surfaces_(), allGeometryToSurfaces_(), - baffleSurfaces_(), + normalVolumeTypes_(), patchNames_(), regionOffset_(), patchInfo_(), @@ -283,7 +290,7 @@ Foam::conformationSurfaces::conformationSurfaces allGeometryToSurfaces_.setSize(allGeometry_.size(), -1); - baffleSurfaces_.setSize(nSurf, false); + normalVolumeTypes_.setSize(nSurf); // Features may be attached to host surfaces or independent features_.setSize(nSurf + nAddFeat); @@ -294,8 +301,8 @@ Foam::conformationSurfaces::conformationSurfaces PtrList<dictionary> globalPatchInfo(nSurf); List<Map<autoPtr<dictionary> > > regionPatchInfo(nSurf); - boolList globalBaffleSurfaces(nSurf, false); - List<Map<bool> > regionBaffleSurface(nSurf); + List<sideVolumeType> globalVolumeTypes(nSurf); + List<Map<sideVolumeType> > regionVolumeTypes(nSurf); label surfI = 0; @@ -324,12 +331,15 @@ Foam::conformationSurfaces::conformationSurfaces const dictionary& surfaceSubDict(surfacesDict.subDict(surfaceName)); - globalBaffleSurfaces[surfI] = Switch + globalVolumeTypes[surfI] = ( - surfaceSubDict.lookupOrDefault("baffleSurface", false) + extendedFeatureEdgeMesh::sideVolumeTypeNames_ + [ + surfaceSubDict.lookupOrDefault<word>("meshableSide", "inside") + ] ); - if (!globalBaffleSurfaces[surfI]) + if (!globalVolumeTypes[surfI]) { if (!allGeometry_[surfaces_[surfI]].hasVolumeType()) { @@ -384,22 +394,20 @@ Foam::conformationSurfaces::conformationSurfaces regionI, regionDict.subDict("patchInfo").clone() ); - -// Info<< " patchInfo: " -// << regionPatchInfo[surfI][regionI] << endl; } - if (regionDict.found("baffleSurface")) - { - regionBaffleSurface[surfI].insert - ( - regionI, - regionDict.lookup("baffleSurface") - ); - -// Info<< " baffle: " -// << regionBaffleSurface[surfI][regionI] << endl; - } + regionVolumeTypes[surfI].insert + ( + regionI, + extendedFeatureEdgeMesh::sideVolumeTypeNames_ + [ + regionDict.lookupOrDefault<word> + ( + "meshableSide", + "inside" + ) + ] + ); readFeatures(regionDict, regionName, featureI); } @@ -420,7 +428,7 @@ Foam::conformationSurfaces::conformationSurfaces // Rework surface specific information into information per global region patchInfo_.setSize(nRegions); - baffleSurfaces_.setSize(nRegions, false); + normalVolumeTypes_.setSize(nRegions); forAll(surfaces_, surfI) { @@ -430,7 +438,7 @@ Foam::conformationSurfaces::conformationSurfaces for (label i = 0; i < nRegions; i++) { label globalRegionI = regionOffset_[surfI] + i; - baffleSurfaces_[globalRegionI] = globalBaffleSurfaces[surfI]; + normalVolumeTypes_[globalRegionI] = globalVolumeTypes[surfI]; if (globalPatchInfo.set(surfI)) { patchInfo_.set @@ -441,12 +449,12 @@ Foam::conformationSurfaces::conformationSurfaces } } - forAllConstIter(Map<bool>, regionBaffleSurface[surfI], iter) + forAllConstIter(Map<sideVolumeType>, regionVolumeTypes[surfI], iter) { label globalRegionI = regionOffset_[surfI] + iter.key(); - baffleSurfaces_[globalRegionI] = - regionBaffleSurface[surfI][iter.key()]; + normalVolumeTypes_[globalRegionI] = + regionVolumeTypes[surfI][iter.key()]; } const Map<autoPtr<dictionary> >& localInfo = regionPatchInfo[surfI]; @@ -516,7 +524,7 @@ Foam::conformationSurfaces::conformationSurfaces Info<< "Names = " << allGeometry_.names() << endl; Info<< "Surfaces = " << surfaces_ << endl; Info<< "AllGeom to Surfaces = " << allGeometryToSurfaces_ << endl; - Info<< "Baffle Surfaces = " << baffleSurfaces_ << endl; + Info<< "Volume types = " << normalVolumeTypes_ << endl; Info<< "Patch names = " << patchNames_ << endl; Info<< "Region Offset = " << regionOffset_ << endl; @@ -610,7 +618,7 @@ Foam::Field<bool> Foam::conformationSurfaces::wellInside const label regionI = regionOffset_[s]; - if (!baffleSurfaces_[regionI]) + if (normalVolumeTypes_[regionI] != extendedFeatureEdgeMesh::BOTH) { // if (surface.hasVolumeType()) // { @@ -653,9 +661,7 @@ Foam::Field<bool> Foam::conformationSurfaces::wellInside //Check if the points are inside the surface by the given distance squared labelList hitSurfaces; - List<pointIndexHit> hitInfo; - searchableSurfacesQueries::findNearest ( allGeometry_, @@ -698,7 +704,7 @@ Foam::Field<bool> Foam::conformationSurfaces::wellInside // inside, therefore, if this is a testForInside = true call, the // result is false. If this is a testForInside = false call, then // the result is true. - if (baffleSurfaces_[regionI]) + if (normalVolumeTypes_[regionI] == extendedFeatureEdgeMesh::BOTH) { continue; } @@ -709,9 +715,27 @@ Foam::Field<bool> Foam::conformationSurfaces::wellInside if (surfaceVolumeTests[s][i] == volumeType::OUTSIDE) // if (surfaceVolumeTests[s][i] != volumeType::INSIDE) { - insidePoint[i] = false; - - break; + if + ( + normalVolumeTypes_[regionI] + == extendedFeatureEdgeMesh::INSIDE + ) + { + insidePoint[i] = false; + break; + } + } + else if (surfaceVolumeTests[s][i] == volumeType::INSIDE) + { + if + ( + normalVolumeTypes_[regionI] + == extendedFeatureEdgeMesh::OUTSIDE + ) + { + insidePoint[i] = false; + break; + } } } } @@ -757,7 +781,7 @@ Foam::Field<bool> Foam::conformationSurfaces::wellOutside const label regionI = regionOffset_[s]; - if (!baffleSurfaces_[regionI]) + if (normalVolumeTypes_[regionI] != extendedFeatureEdgeMesh::BOTH) { surface.getVolumeType(samplePts, surfaceVolumeTests[s]); } @@ -773,9 +797,7 @@ Foam::Field<bool> Foam::conformationSurfaces::wellOutside //Check if the points are inside the surface by the given distance squared labelList hitSurfaces; - List<pointIndexHit> hitInfo; - searchableSurfacesQueries::findNearest ( allGeometry_, @@ -795,13 +817,12 @@ Foam::Field<bool> Foam::conformationSurfaces::wellOutside // If the point is within range of the surface, then it can't be // well (in|out)side outsidePoint[i] = false; - //continue; } forAll(surfaces_, s) { -// const searchableSurface& surface(allGeometry_[surfaces_[s]]); + const searchableSurface& surface(allGeometry_[surfaces_[s]]); // if // ( @@ -814,20 +835,42 @@ Foam::Field<bool> Foam::conformationSurfaces::wellOutside const label regionI = regionOffset_[s]; +// Info<< s << " " << surfaces_[s] << " " << surface.name() << " " +// << normalVolumeTypes_[regionI] << " " +// << surfaceVolumeTests[s][i] << endl; + // If one of the pattern tests is failed, then the point cannot be // inside, therefore, if this is a testForInside = true call, the // result is false. If this is a testForInside = false call, then // the result is true. - if (baffleSurfaces_[regionI]) + if (normalVolumeTypes_[regionI] == extendedFeatureEdgeMesh::BOTH) { continue; } if (surfaceVolumeTests[s][i] == volumeType::OUTSIDE) { - outsidePoint[i] = true; - - break; + if + ( + normalVolumeTypes_[regionI] + == extendedFeatureEdgeMesh::INSIDE + ) + { + outsidePoint[i] = true; + break; + } + } + else if (surfaceVolumeTests[s][i] == volumeType::INSIDE) + { + if + ( + normalVolumeTypes_[regionI] + == extendedFeatureEdgeMesh::OUTSIDE + ) + { + outsidePoint[i] = true; + break; + } } } } @@ -1281,7 +1324,8 @@ Foam::label Foam::conformationSurfaces::getPatchID } -bool Foam::conformationSurfaces::isBaffle +Foam::extendedFeatureEdgeMesh::sideVolumeType +Foam::conformationSurfaces::meshableSide ( const label hitSurface, const pointIndexHit& surfHit @@ -1291,10 +1335,33 @@ bool Foam::conformationSurfaces::isBaffle if (patchID == -1) { - return false; + return extendedFeatureEdgeMesh::NEITHER; } - return baffleSurfaces_[patchID]; + return normalVolumeTypes_[patchID]; +} + + +void Foam::conformationSurfaces::getNormal +( + const label hitSurface, + const List<pointIndexHit>& surfHit, + vectorField& normal +) const +{ + allGeometry_[hitSurface].getNormal + ( + surfHit, + normal + ); + + const label patchID = regionOffset_[allGeometryToSurfaces_[hitSurface]]; + + // Now flip sign of normal depending on mesh side + if (normalVolumeTypes_[patchID] == extendedFeatureEdgeMesh::OUTSIDE) + { + normal *= -1; + } } diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H index d7682bb1ab38252a0059bb06b430b4e7344c708a..377d031f17b19ff880d33db68004152b411e8b15 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/conformationSurfaces/conformationSurfaces.H @@ -52,6 +52,8 @@ namespace Foam class conformationSurfaces { + typedef extendedFeatureEdgeMesh::sideVolumeType sideVolumeType; + // Private data const Time& runTime_; @@ -78,7 +80,7 @@ class conformationSurfaces //- A boolean value for each surface to be conformed to specifying if it // is to be treated as a baffle - boolList baffleSurfaces_; + List<sideVolumeType> normalVolumeTypes_; //- A flat list of all of the names of the patches from all of the // surfaces to be reproduced in the meshed geometry @@ -337,12 +339,19 @@ public: label findPatch(const point& pt) const; //- Is the surface a baffle. - bool isBaffle + extendedFeatureEdgeMesh::sideVolumeType meshableSide ( const label hitSurface, const pointIndexHit& surfHit ) const; + void getNormal + ( + const label hitSurface, + const List<pointIndexHit>& surfHit, + vectorField& normal + ) const; + // Write diff --git a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.C b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.C index 66c48bdeac5b38e03432dcd7af1893c1054efae0..a72630ad36a2d35132ea962ad6344935e71ab37c 100644 --- a/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.C +++ b/applications/utilities/mesh/generation/foamyHexMesh/conformalVoronoiMesh/searchableSurfaceFeatures/searchableBoxFeatures.C @@ -52,10 +52,16 @@ Foam::searchableBoxFeatures::searchableBoxFeatures ) : searchableSurfaceFeatures(surface, dict), - mode_(extendedFeatureEdgeMesh::sideVolumeTypeNames_[dict.lookup("mode")]) + mode_ + ( + extendedFeatureEdgeMesh::sideVolumeTypeNames_ + [ + dict.lookupOrDefault<word>("meshableSide", "INSIDE") + ] + ) { Info<< indent - << " Mesh mode = " + << " Meshable region = " << extendedFeatureEdgeMesh::sideVolumeTypeNames_[mode_] << endl; } diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C index 35b0338d465dd4a149a6c2c68c76af1534d40d98..50e3e3e4580ecf06293a338ecb4231aecd6d2a37 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.C @@ -399,7 +399,7 @@ Foam::extendedFeatureEdgeMesh::extendedFeatureEdgeMesh label openStart, label multipleStart, const vectorField& normals, - const PackedList<2>& normalVolumeTypes, + const List<sideVolumeType>& normalVolumeTypes, const vectorField& edgeDirections, const labelListList& normalDirections, const labelListList& edgeNormals, diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H index 7948279087998d9d71531e36c3ca023c54aeba09..ead6ef63ca14c53fec333d4b5559a402c95f9d8d 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMesh.H @@ -61,7 +61,6 @@ SourceFiles #include "treeDataEdge.H" #include "treeDataPoint.H" #include "PrimitivePatch.H" -#include "PackedList.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -163,7 +162,7 @@ private: vectorField normals_; //- - PackedList<2> normalVolumeTypes_; + List<sideVolumeType> normalVolumeTypes_; //- Flat and open edges require the direction of the edge vectorField edgeDirections_; @@ -287,7 +286,7 @@ public: label openStart, label multipleStart, const vectorField& normals, - const PackedList<2>& normalVolumeTypes, + const List<sideVolumeType>& normalVolumeTypes, const vectorField& edgeDirections, const labelListList& normalDirections, const labelListList& edgeNormals, @@ -392,7 +391,7 @@ public: inline const vectorField& normals() const; //- Return - inline const PackedList<2>& normalVolumeTypes() const; + inline const List<sideVolumeType>& normalVolumeTypes() const; //- Return the edgeDirection vectors inline const vectorField& edgeDirections() const; diff --git a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H index 849fce602561c57e9d4423e6fe452be7f9e79793..a0ba24daaef63c0f4df630f93366db24e74cf10a 100644 --- a/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H +++ b/src/edgeMesh/extendedFeatureEdgeMesh/extendedFeatureEdgeMeshI.H @@ -90,7 +90,7 @@ inline const Foam::vectorField& Foam::extendedFeatureEdgeMesh::normals() const return normals_; } -inline const Foam::PackedList<2>& +inline const Foam::List<Foam::extendedFeatureEdgeMesh::sideVolumeType>& Foam::extendedFeatureEdgeMesh::normalVolumeTypes() const { return normalVolumeTypes_;