From 1a2ef02caa445b22419dfe941315fc8c8ed31ff5 Mon Sep 17 00:00:00 2001 From: mattijs Date: Fri, 11 Oct 2013 12:00:14 +0100 Subject: [PATCH] ENH: autoHexMeshDriver: parallel consistent behaviour --- .../autoHexMeshDriver/autoLayerDriver.C | 10 +- .../autoHexMeshDriver/autoLayerDriver.H | 16 +- .../autoHexMeshDriver/autoLayerDriverShrink.C | 146 ++++++++++++------ 3 files changed, 117 insertions(+), 55 deletions(-) diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C index 7713abee57..685e043fdb 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.C @@ -1328,7 +1328,7 @@ void Foam::autoLayerDriver::calculateLayerThickness // Synchronize displacement among coupled patches. void Foam::autoLayerDriver::syncPatchDisplacement ( - const motionSmoother& meshMover, + const indirectPrimitivePatch& pp, const scalarField& minThickness, pointField& patchDisp, labelList& patchNLayers, @@ -1336,7 +1336,7 @@ void Foam::autoLayerDriver::syncPatchDisplacement ) const { const fvMesh& mesh = meshRefiner_.mesh(); - const labelList& meshPoints = meshMover.patch().meshPoints(); + const labelList& meshPoints = pp.meshPoints(); label nChangedTotal = 0; @@ -1578,7 +1578,7 @@ void Foam::autoLayerDriver::getPatchDisplacement // Make sure displacement is equal on both sides of coupled patches. syncPatchDisplacement ( - meshMover, + pp, minThickness, patchDisp, patchNLayers, @@ -1776,7 +1776,7 @@ Foam::label Foam::autoLayerDriver::truncateDisplacement { syncPatchDisplacement ( - meshMover, + pp, minThickness, patchDisp, patchNLayers, @@ -2865,7 +2865,7 @@ void Foam::autoLayerDriver::addLayers // Make sure displacement is equal on both sides of coupled patches. syncPatchDisplacement ( - meshMover, + pp, minThickness, patchDisp, patchNLayers, diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H index 6a7272ad13..df7ea815a0 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriver.H @@ -257,7 +257,7 @@ class autoLayerDriver //- Synchronize displacement among coupled patches. void syncPatchDisplacement ( - const motionSmoother& meshMover, + const indirectPrimitivePatch& pp, const scalarField& minThickness, pointField& patchDisp, labelList& patchNLayers, @@ -443,8 +443,11 @@ class autoLayerDriver // large feature angle void handleFeatureAngleLayerTerminations ( - const indirectPrimitivePatch& pp, const scalar minCos, + const PackedBoolList& isMasterPoint, + const indirectPrimitivePatch& pp, + const labelList& meshEdges, + List& extrudeStatus, pointField& patchDisp, labelList& patchNLayers, @@ -456,10 +459,13 @@ class autoLayerDriver // in the layer mesh and stop any layer growth at these points. void findIsolatedRegions ( - const indirectPrimitivePatch& pp, - const PackedBoolList& isMasterEdge, - const labelList& meshEdges, const scalar minCosLayerTermination, + const PackedBoolList& isMasterPoint, + const PackedBoolList& isMasterEdge, + const indirectPrimitivePatch& pp, + const labelList& meshEdges, + const scalarField& minThickness, + List& extrudeStatus, pointField& patchDisp, labelList& patchNLayers diff --git a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C index bb6058c46f..6b4a8fa722 100644 --- a/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C +++ b/src/mesh/autoMesh/autoHexMesh/autoHexMeshDriver/autoLayerDriverShrink.C @@ -137,7 +137,7 @@ void Foam::autoLayerDriver::smoothField isMasterEdge, meshEdges, meshPoints, - pp.edges(), + edges, invSumWeight, field, average @@ -305,7 +305,7 @@ void Foam::autoLayerDriver::smoothPatchNormals isMasterEdge, meshEdges, meshPoints, - pp.edges(), + edges, invSumWeight, normals, average @@ -321,7 +321,6 @@ void Foam::autoLayerDriver::smoothPatchNormals meshPoints, mag(normals-average)() ); - Info<< " Iteration " << iter << " residual " << resid << endl; } @@ -384,8 +383,6 @@ void Foam::autoLayerDriver::smoothNormals invSumWeight ); - Info<< "shrinkMeshDistance : Smoothing normals in interior ..." << endl; - for (label iter = 0; iter < nSmoothDisp; iter++) { vectorField average(mesh.nPoints()); @@ -410,7 +407,6 @@ void Foam::autoLayerDriver::smoothNormals isMasterPoint, mag(normals-average)() ); - Info<< " Iteration " << iter << " residual " << resid << endl; } @@ -495,14 +491,18 @@ bool Foam::autoLayerDriver::isMaxEdge // large feature angle void Foam::autoLayerDriver::handleFeatureAngleLayerTerminations ( - const indirectPrimitivePatch& pp, const scalar minCos, + const PackedBoolList& isMasterPoint, + const indirectPrimitivePatch& pp, + const labelList& meshEdges, List& extrudeStatus, pointField& patchDisp, labelList& patchNLayers, label& nPointCounter ) const { + const fvMesh& mesh = meshRefiner_.mesh(); + // Mark faces that have all points extruded // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -523,15 +523,60 @@ void Foam::autoLayerDriver::handleFeatureAngleLayerTerminations } + + label nOldPointCounter = nPointCounter; + // Detect situation where two featureedge-neighbouring faces are partly or // not extruded and the edge itself is extruded. In this case unmark the // edge for extrusion. - forAll(pp.edgeFaces(), edgeI) - { - const labelList& eFaces = pp.edgeFaces()[edgeI]; - if (eFaces.size() == 2) + List > edgeFaceNormals(pp.nEdges()); + List > edgeFaceExtrude(pp.nEdges()); + + const labelListList& edgeFaces = pp.edgeFaces(); + const vectorField& faceNormals = pp.faceNormals(); + const labelList& meshPoints = pp.meshPoints(); + + forAll(edgeFaces, edgeI) + { + const labelList& eFaces = edgeFaces[edgeI]; + + edgeFaceNormals[edgeI].setSize(eFaces.size()); + edgeFaceExtrude[edgeI].setSize(eFaces.size()); + forAll(eFaces, i) + { + label faceI = eFaces[i]; + edgeFaceNormals[edgeI][i] = faceNormals[faceI]; + edgeFaceExtrude[edgeI][i] = extrudedFaces[faceI]; + } + } + + syncTools::syncEdgeList + ( + mesh, + meshEdges, + edgeFaceNormals, + globalMeshData::ListPlusEqOp >(), // combine operator + List() // null value + ); + + syncTools::syncEdgeList + ( + mesh, + meshEdges, + edgeFaceExtrude, + globalMeshData::ListPlusEqOp >(), // combine operator + List() // null value + ); + + + forAll(edgeFaceNormals, edgeI) + { + const List& eFaceNormals = edgeFaceNormals[edgeI]; + const List& eFaceExtrude = edgeFaceExtrude[edgeI]; + + if (eFaceNormals.size() == 2) { const edge& e = pp.edges()[edgeI]; label v0 = e[0]; @@ -543,10 +588,10 @@ void Foam::autoLayerDriver::handleFeatureAngleLayerTerminations || extrudeStatus[v1] != NOEXTRUDE ) { - if (!extrudedFaces[eFaces[0]] || !extrudedFaces[eFaces[1]]) + if (!eFaceExtrude[0] || !eFaceExtrude[1]) { - const vector& n0 = pp.faceNormals()[eFaces[0]]; - const vector& n1 = pp.faceNormals()[eFaces[1]]; + const vector& n0 = eFaceNormals[0]; + const vector& n1 = eFaceNormals[1]; if ((n0 & n1) < minCos) { @@ -561,7 +606,10 @@ void Foam::autoLayerDriver::handleFeatureAngleLayerTerminations ) ) { - nPointCounter++; + if (isMasterPoint[meshPoints[v0]]) + { + nPointCounter++; + } } if ( @@ -574,13 +622,20 @@ void Foam::autoLayerDriver::handleFeatureAngleLayerTerminations ) ) { - nPointCounter++; + if (isMasterPoint[meshPoints[v1]]) + { + nPointCounter++; + } } } } } } } + + Info<< "Added " + << returnReduce(nPointCounter-nOldPointCounter, sumOp