From 3e7964f18a13e2c34acae450b044d0a6ae605ae1 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs> Date: Fri, 3 Jan 2014 15:43:45 +0000 Subject: [PATCH] ENH: refinementFeatures: searching for nearest region edge --- .../refinementFeatures/refinementFeatures.C | 116 +++++++++++++++++- .../refinementFeatures/refinementFeatures.H | 23 +++- 2 files changed, 137 insertions(+), 2 deletions(-) diff --git a/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.C b/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.C index b2b974de02f..320f3b3d1c3 100644 --- a/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.C +++ b/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -313,6 +313,58 @@ void Foam::refinementFeatures::buildTrees(const label featI) } +const Foam::PtrList<Foam::indexedOctree<Foam::treeDataEdge> >& +Foam::refinementFeatures::regionEdgeTrees() const +{ + if (!regionEdgeTreesPtr_.valid()) + { + regionEdgeTreesPtr_.reset + ( + new PtrList<indexedOctree<treeDataEdge> >(size()) + ); + PtrList<indexedOctree<treeDataEdge> >& trees = regionEdgeTreesPtr_(); + + forAll(*this, featI) + { + const extendedEdgeMesh& eMesh = operator[](featI); + const pointField& points = eMesh.points(); + const edgeList& edges = eMesh.edges(); + + // Calculate bb of all points + treeBoundBox bb(points); + + // Random number generator. Bit dodgy since not exactly random ;-) + Random rndGen(65431); + + // Slightly extended bb. Slightly off-centred just so on symmetric + // geometry there are less face/edge aligned items. + bb = bb.extend(rndGen, 1e-4); + bb.min() -= point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + bb.max() += point(ROOTVSMALL, ROOTVSMALL, ROOTVSMALL); + + trees.set + ( + featI, + new indexedOctree<treeDataEdge> + ( + treeDataEdge + ( + false, // do not cache bb + edges, + points, + eMesh.regionEdges() + ), + bb, // overall search domain + 8, // maxLevel + 10, // leafsize + 3.0 // duplicity + ) + ); + } + } + return regionEdgeTreesPtr_(); +} + // Find maximum level of a shell. void Foam::refinementFeatures::findHigherLevel @@ -543,6 +595,68 @@ void Foam::refinementFeatures::findNearestEdge } +void Foam::refinementFeatures::findNearestRegionEdge +( + const pointField& samples, + const scalarField& nearestDistSqr, + labelList& nearFeature, + List<pointIndexHit>& nearInfo, + vectorField& nearNormal +) const +{ + nearFeature.setSize(samples.size()); + nearFeature = -1; + nearInfo.setSize(samples.size()); + nearInfo = pointIndexHit(); + nearNormal.setSize(samples.size()); + nearNormal = vector::zero; + + + const PtrList<indexedOctree<treeDataEdge> >& regionTrees = + regionEdgeTrees(); + + forAll(regionTrees, featI) + { + const indexedOctree<treeDataEdge>& regionTree = regionTrees[featI]; + + forAll(samples, sampleI) + { + const point& sample = samples[sampleI]; + + scalar distSqr; + if (nearInfo[sampleI].hit()) + { + distSqr = magSqr(nearInfo[sampleI].hitPoint()-sample); + } + else + { + distSqr = nearestDistSqr[sampleI]; + } + + // Find anything closer than current best + pointIndexHit info = regionTree.findNearest(sample, distSqr); + + if (info.hit()) + { + const treeDataEdge& td = regionTree.shapes(); + + nearFeature[sampleI] = featI; + nearInfo[sampleI] = pointIndexHit + ( + info.hit(), + info.hitPoint(), + regionTree.shapes().edgeLabels()[info.index()] + ); + + const edge& e = td.edges()[nearInfo[sampleI].index()]; + nearNormal[sampleI] = e.vec(td.points()); + nearNormal[sampleI] /= mag(nearNormal[sampleI])+VSMALL; + } + } + } +} + + //void Foam::refinementFeatures::findNearestPoint //( // const pointField& samples, diff --git a/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.H b/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.H index 7d27090b147..5c923508b8b 100644 --- a/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.H +++ b/src/mesh/autoMesh/autoHexMesh/refinementFeatures/refinementFeatures.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -69,6 +69,10 @@ private: //- Features points PtrList<indexedOctree<treeDataPoint> > pointTrees_; + //- Region edge trees (demand driven) + mutable autoPtr<PtrList<indexedOctree<treeDataEdge> > > + regionEdgeTreesPtr_; + // Private Member Functions @@ -100,6 +104,8 @@ protected: } + const PtrList<indexedOctree<treeDataEdge> >& regionEdgeTrees() const; + public: // Constructors @@ -149,6 +155,21 @@ public: vectorField& nearNormal ) const; + //- Find nearest point on nearest region edge. Sets + // - nearFeature: index of feature mesh + // - nearInfo : location on feature edge and edge index + // (note: not feature edge index but index into + // edges() directly) + // - nearNormal : local feature edge normal + void findNearestRegionEdge + ( + const pointField& samples, + const scalarField& nearestDistSqr, + labelList& nearFeature, + List<pointIndexHit>& nearInfo, + vectorField& nearNormal + ) const; + //- Find nearest feature point. Sets // - nearFeature: index of feature mesh // - nearInfo : location on feature point and point index. -- GitLab