38 void Foam::refinementFeatures::read
40 const objectRegistry& io,
41 const PtrList<dictionary>& featDicts
46 const dictionary&
dict = featDicts[featI];
50 meshRefinement::get<fileName>
67 "extendedFeatureEdgeMesh",
74 const fileName fName(typeFilePath<extendedFeatureEdgeMesh>(extFeatObj));
85 Info<<
"Read extendedFeatureEdgeMesh " << extFeatObj.name()
87 eMeshPtr().writeStats(
Info);
91 set(featI,
new extendedFeatureEdgeMesh(extFeatObj, eMeshPtr()));
100 io.time().constant(),
108 const fileName fName(typeFilePath<featureEdgeMesh>(featObj));
113 <<
"Could not open " << featObj.objectPath()
119 const edgeMesh& eMesh = eMeshPtr();
123 Info<<
"Read edgeMesh " << featObj.name() <<
nl
125 eMesh.writeStats(
Info);
133 labelList oldToNew(eMesh.points().size(), -1);
134 DynamicField<point> newPoints(eMesh.points().size());
135 forAll(pointEdges, pointi)
137 if (pointEdges[pointi].size() > 2)
139 oldToNew[pointi] = newPoints.size();
140 newPoints.append(eMesh.points()[pointi]);
145 label nFeatures = newPoints.size();
148 if (oldToNew[pointi] == -1)
150 oldToNew[pointi] = newPoints.size();
151 newPoints.append(eMesh.points()[pointi]);
156 const edgeList& edges = eMesh.edges();
160 const edge&
e = edges[edgeI];
161 newEdges[edgeI] = edge
172 extendedEdgeMesh eeMesh
184 List<extendedEdgeMesh::sideVolumeType>(0),
198 set(featI,
new extendedFeatureEdgeMesh(featObj, eeMesh));
201 const extendedEdgeMesh& eMesh = operator[](featI);
203 if (
dict.found(
"levels"))
205 List<Tuple2<scalar, label>> distLevels(
dict.lookup(
"levels"));
210 <<
" : levels should be at least size 1" <<
endl
211 <<
"levels : " <<
dict.lookup(
"levels")
215 distances_[featI].
setSize(distLevels.size());
216 levels_[featI].
setSize(distLevels.size());
220 distances_[featI][j] = distLevels[j].first();
221 levels_[featI][j] = distLevels[j].second();
223 if (levels_[featI][j] < 0)
226 <<
"Feature " << featFileName
227 <<
" has illegal refinement level " << levels_[featI][j]
236 (distances_[featI][j] <= distances_[featI][j-1])
237 || (levels_[featI][j] > levels_[featI][j-1])
241 <<
" : Refinement should be specified in order"
242 <<
" of increasing distance"
243 <<
" (and decreasing refinement level)." <<
endl
244 <<
"Distance:" << distances_[featI][j]
245 <<
" refinementLevel:" << levels_[featI][j]
258 meshRefinement::get<label>
272 Info<<
"Refinement level according to distance to "
273 << featFileName <<
" (" << eMesh.points().size() <<
" points, "
274 << eMesh.edges().size() <<
" edges)." <<
endl;
277 Info<<
" level " << levels_[featI][j]
278 <<
" for all cells within " << distances_[featI][j]
279 <<
" metre." <<
endl;
286 void Foam::refinementFeatures::buildTrees(
const label featI)
288 const extendedEdgeMesh& eMesh = operator[](featI);
290 const edgeList& edges = eMesh.edges();
307 new indexedOctree<treeDataEdge>
329 new indexedOctree<treeDataPoint>
331 treeDataPoint(
points, featurePoints),
342 void Foam::refinementFeatures::findHigherLevel
349 const labelList& levels = levels_[featI];
360 label candidateI = 0;
366 if (levels[levelI] > maxLevel[pointi])
368 candidates[candidateI] = pt[pointi];
369 candidateMap[candidateI] = pointi;
370 candidateDistSqr[candidateI] =
sqr(distances[levelI]);
376 candidates.setSize(candidateI);
377 candidateMap.setSize(candidateI);
378 candidateDistSqr.setSize(candidateI);
381 const indexedOctree<treeDataEdge>& tree = edgeTrees_[featI];
383 List<pointIndexHit> nearInfo(candidates.size());
384 forAll(candidates, candidateI)
386 nearInfo[candidateI] = tree.findNearest
388 candidates[candidateI],
389 candidateDistSqr[candidateI]
394 forAll(nearInfo, candidateI)
396 if (nearInfo[candidateI].hit())
402 mag(nearInfo[candidateI].hitPoint()-candidates[candidateI])
405 label pointi = candidateMap[candidateI];
408 maxLevel[pointi] = levels[minDistI+1];
419 if (!regionEdgeTreesPtr_)
421 regionEdgeTreesPtr_.reset
423 new PtrList<indexedOctree<treeDataEdge>>(size())
425 PtrList<indexedOctree<treeDataEdge>>& trees = regionEdgeTreesPtr_();
429 const extendedEdgeMesh& eMesh = operator[](featI);
431 const edgeList& edges = eMesh.edges();
448 new indexedOctree<treeDataEdge>
466 return *regionEdgeTreesPtr_;
480 distances_(featDicts.size()),
481 levels_(featDicts.size()),
482 edgeTrees_(featDicts.size()),
483 pointTrees_(featDicts.size()),
571 const scalar maxRatio,
579 os<<
"Checking for size." <<
endl;
582 bool hasError =
false;
589 for (label j = i+1; j < size(); j++)
594 scalar ratio = bb.
mag()/bb2.
mag();
596 if (ratio > maxRatio || ratio < 1.0/maxRatio)
603 <<
" bounds differ from " << em2.
name()
604 <<
" by more than a factor 100:" <<
nl
605 <<
" bounding box : " << bb <<
nl
606 <<
" bounding box : " << bb2
622 <<
" bounds not fully contained in mesh"<<
nl
623 <<
" bounding box : " << bb <<
nl
624 <<
" mesh bounding box : " <<
meshBb
644 List<pointIndexHit>& nearInfo,
648 nearFeature.setSize(
samples.size());
650 nearInfo.setSize(
samples.size());
652 nearNormal.setSize(
samples.size());
657 const indexedOctree<treeDataEdge>& tree = edgeTrees_[featI];
659 if (tree.shapes().size() > 0)
666 if (nearInfo[sampleI].hit())
672 distSqr = nearestDistSqr[sampleI];
679 nearFeature[sampleI] = featI;
684 tree.shapes().edgeLabels()[info.index()]
687 const treeDataEdge& td = tree.shapes();
688 const edge&
e = td.edges()[nearInfo[sampleI].index()];
690 nearNormal[sampleI] =
e.unitVec(td.points());
703 List<pointIndexHit>& nearInfo,
707 nearFeature.setSize(
samples.size());
709 nearInfo.setSize(
samples.size());
711 nearNormal.setSize(
samples.size());
715 const PtrList<indexedOctree<treeDataEdge>>& regionTrees =
718 forAll(regionTrees, featI)
720 const indexedOctree<treeDataEdge>& regionTree = regionTrees[featI];
727 if (nearInfo[sampleI].hit())
733 distSqr = nearestDistSqr[sampleI];
741 const treeDataEdge& td = regionTree.shapes();
743 nearFeature[sampleI] = featI;
748 regionTree.shapes().edgeLabels()[info.index()]
751 const edge&
e = td.edges()[nearInfo[sampleI].index()];
753 nearNormal[sampleI] =
e.unitVec(td.points());
826 forAll(pointTrees_, featI)
830 if (tree.
shapes().pointLabels().size() > 0)
837 if (nearFeature[sampleI] != -1)
843 distSqr = nearestDistSqr[sampleI];
850 nearFeature[sampleI] = featI;
864 void Foam::refinementFeatures::findHigherLevel
876 findHigherLevel(pt, featI, maxLevel);
883 scalar overallMax = -GREAT;
886 overallMax =
max(overallMax,
max(distances_[featI]));