diff --git a/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchTools.H b/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchTools.H index 968b0b5244..439c120b45 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchTools.H +++ b/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchTools.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 @@ -221,8 +221,7 @@ public: ); - //- Return parallel consistent point normals for patches (on boundary faces) - // using mesh points. + //- Return parallel consistent point normals for patches using mesh points. template < class Face, @@ -231,10 +230,27 @@ public: class PointType > static tmp pointNormals + ( + const polyMesh&, + const PrimitivePatch& + ); + + + //- Return parallel consistent edge normals for patches using mesh points. + // Supply with patch matching info from matchEdges. + template + < + class Face, + template class FaceList, + class PointField, + class PointType + > + static tmp edgeNormals ( const polyMesh&, const PrimitivePatch&, - const labelList& meshFaces + const labelList& patchEdges, + const labelList& coupledEdges ); diff --git a/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchToolsNormals.C b/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchToolsNormals.C index 02707b9cc5..a5cb7fdbb9 100644 --- a/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchToolsNormals.C +++ b/src/OpenFOAM/meshes/primitiveMesh/PatchTools/PatchToolsNormals.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -79,8 +79,7 @@ Foam::tmp Foam::PatchTools::pointNormals ( const polyMesh& mesh, - const PrimitivePatch& p, - const labelList& meshFaces + const PrimitivePatch& p ) { // Assume patch is smaller than the globalData().coupledPatch() (?) so @@ -224,4 +223,90 @@ Foam::PatchTools::pointNormals } +template +< + class Face, + template class FaceList, + class PointField, + class PointType +> + +Foam::tmp +Foam::PatchTools::edgeNormals +( + const polyMesh& mesh, + const PrimitivePatch& p, + const labelList& patchEdges, + const labelList& coupledEdges +) +{ + // 1. Start off with local normals + + tmp tedgeNormals(new pointField(p.nEdges(), vector::zero)); + pointField& edgeNormals = tedgeNormals(); + { + const labelListList& edgeFaces = p.edgeFaces(); + const vectorField& faceNormals = p.faceNormals(); + + forAll(edgeFaces, edgeI) + { + const labelList& eFaces = edgeFaces[edgeI]; + forAll(eFaces, i) + { + edgeNormals[edgeI] += faceNormals[eFaces[i]]; + } + } + edgeNormals /= mag(edgeNormals)+VSMALL; + } + + + + const globalMeshData& globalData = mesh.globalData(); + const mapDistribute& map = globalData.globalEdgeSlavesMap(); + + + // Convert patch-edge data into cpp-edge data + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + //- Construct with all data in consistent orientation + pointField cppEdgeData(map.constructSize(), vector::zero); + + forAll(patchEdges, i) + { + label patchEdgeI = patchEdges[i]; + label coupledEdgeI = coupledEdges[i]; + cppEdgeData[coupledEdgeI] = edgeNormals[patchEdgeI]; + } + + + // Synchronise + // ~~~~~~~~~~~ + + globalData.syncData + ( + cppEdgeData, + globalData.globalEdgeSlaves(), + globalData.globalEdgeTransformedSlaves(), + map, + globalData.globalTransforms(), + plusEqOp(), // add since normalised later on + mapDistribute::transform() + ); + cppEdgeData /= mag(cppEdgeData)+VSMALL; + + + // Back from cpp-edge to patch-edge data + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + forAll(patchEdges, i) + { + label patchEdgeI = patchEdges[i]; + label coupledEdgeI = coupledEdges[i]; + edgeNormals[patchEdgeI] = cppEdgeData[coupledEdgeI]; + } + + return tedgeNormals; +} + + // ************************************************************************* // diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C index b224ef609d..3eb051006f 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C @@ -1464,15 +1464,7 @@ void Foam::autoLayerDriver::getPatchDisplacement // Determine pointNormal // ~~~~~~~~~~~~~~~~~~~~~ - pointField pointNormals - ( - PatchTools::pointNormals - ( - mesh, - pp, - pp.addressing() - ) - ); + pointField pointNormals(PatchTools::pointNormals(mesh, pp)); // Determine local length scale on patch diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C index bf25526141..d6556a9508 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C @@ -826,15 +826,7 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo // Determine pointNormal // ~~~~~~~~~~~~~~~~~~~~~ - pointField pointNormals - ( - PatchTools::pointNormals - ( - mesh, - pp, - pp.addressing() - ) - ); + pointField pointNormals(PatchTools::pointNormals(mesh, pp)); // pointNormals if (debug&meshRefinement::MESH || debug&meshRefinement::LAYERINFO) @@ -1074,15 +1066,7 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo << featureAngle << " degrees." << endl; scalar featureAngleCos = Foam::cos(degToRad(featureAngle)); - pointField pointNormals - ( - PatchTools::pointNormals - ( - mesh, - pp, - identity(pp.size())+pp.start() - ) - ); + pointField pointNormals(PatchTools::pointNormals(mesh, pp)); forAll(meshPoints, i) {