42 const label nCoarseFaces
46 label localnCoarseFaces = nCoarseFaces;
47 bool contAgg = localnCoarseFaces >= nFacesInCoarsestLevel_;
54 const bPatch& coarsePatch = patchLevels_[0];
64 if (eFaces.
size() == 2)
70 const edge edgeCommon =
edge(eFaces[0], eFaces[1]);
72 if (facePairWeight_.found(edgeCommon))
74 facePairWeight_[edgeCommon] += edgeLength;
78 facePairWeight_.insert(edgeCommon, edgeLength);
83 facePairWeight_[edgeCommon] = -1.0;
92 facePairWeight_.insert
94 edge(eFaces[j], eFaces[
k]),
107 const label fineLevelIndex
111 const bPatch& coarsePatch = patchLevels_[fineLevelIndex];
113 const labelList& fineToCoarse = restrictAddressing_[fineLevelIndex];
114 const label nCoarseI =
max(fineToCoarse) + 1;
124 const edge e = iter.key();
125 const edge edgeFeatured
130 fineFeaturedFaces.
insert(edgeFeatured);
135 facePairWeight_.clear();
136 facePairWeight_.resize(coarsePatch.
nEdges());
147 if (eFaces.
size() == 2)
149 const edge edgeCommon =
edge(eFaces[0], eFaces[1]);
151 if (facePairWeight_.found(edgeCommon))
153 facePairWeight_[edgeCommon] += edgeLength;
157 facePairWeight_.insert(edgeCommon, edgeLength);
162 if (fineFeaturedFaces.
found(edgeCommon))
164 facePairWeight_[edgeCommon] = -1.0;
174 facePairWeight_.insert
176 edge(eFaces[j], eFaces[
k]),
193 const bool additionalWeights
201 nFacesInCoarsestLevel_
207 controlDict.lookupOrDefault<scalar>(
"featureAngle", 0)
210 restrictAddressing_(maxLevels_),
211 restrictTopBottomAddressing_(
identity(patch.size())),
212 patchLevels_(maxLevels_),
213 facePairWeight_(patch.size())
227 nFaces_[0] = patch.size();
230 setBasedEdgeWeights();
247 return patchLevels_[i];
253 const label fineLevelIndex
256 const labelList& fineToCoarse = restrictAddressing_[fineLevelIndex];
257 forAll (restrictTopBottomAddressing_, i)
259 restrictTopBottomAddressing_[i] =
260 fineToCoarse[restrictTopBottomAddressing_[i]];
269 const label fineLevelIndex
272 if (
min(fineToCoarse) == -1)
278 if (fineToCoarse.
size() == 0)
283 if (fineToCoarse.
size() != patch.size())
286 <<
"restrict map does not correspond to fine level. " <<
endl
287 <<
" Sizes: restrictMap: " << fineToCoarse.
size()
288 <<
" nEqns: " << patch.size()
292 const label nCoarseI =
max(fineToCoarse)+1;
299 for (
label coarseI = 0; coarseI < nCoarseI; coarseI++)
301 const labelList& fineFaces = coarseToFine[coarseI];
312 if (fineFaces.
size() == 2)
314 const edge e(fineFaces[0], fineFaces[1]);
315 facePairWeight_[
e] = -1.0;
317 else if (fineFaces.
size() == 3)
319 const edge e(fineFaces[0], fineFaces[1]);
320 const edge e1(fineFaces[0], fineFaces[2]);
321 const edge e2(fineFaces[2], fineFaces[1]);
322 facePairWeight_[
e] = -1.0;
323 facePairWeight_[e1] = -1.0;
324 facePairWeight_[e2] = -1.0;
356 label nPairLevels = 0;
357 label nCreatedLevels = 1;
358 label nCoarseFaces = 0;
359 label nCoarseFacesOld = 0;
361 while (nCreatedLevels < maxLevels_)
363 const bPatch& patch = patchLevels_[nCreatedLevels - 1];
365 bool agglomOK =
false;
369 label nCoarseFacesPrev = nCoarseFaces;
371 finalAgglomPtr = agglomerateOneLevel
377 if (nCoarseFaces > 0 && nCoarseFaces != nCoarseFacesPrev)
382 agglomOK = agglomeratePatch
391 restrictAddressing_.set(nCreatedLevels, finalAgglomPtr);
392 mapBaseToTopAgglom(nCreatedLevels);
393 setEdgeWeights(nCreatedLevels);
395 if (nPairLevels % mergeLevels_)
397 combineLevels(nCreatedLevels);
416 nFaces_[nCreatedLevels] = nCoarseFaces;
420 !continueAgglomerating(nCoarseFaces)
421 || (nCoarseFacesOld == nCoarseFaces)
427 nCoarseFacesOld = nCoarseFaces;
430 compactLevels(nCreatedLevels);
440 const label nFineFaces = patch.size();
451 const labelList& fFaces = faceFaces[facei];
453 if (coarseCellMap[facei] < 0)
455 label matchFaceNo = -1;
456 label matchFaceNeibNo = -1;
457 scalar maxFaceWeight = -GREAT;
462 label faceNeig = fFaces[i];
463 const edge edgeCommon =
edge(facei, faceNeig);
466 facePairWeight_[edgeCommon] > maxFaceWeight
467 && coarseCellMap[faceNeig] < 0
468 && facePairWeight_[edgeCommon] != -1.0
473 matchFaceNeibNo = faceNeig;
474 maxFaceWeight = facePairWeight_[edgeCommon];
478 if (matchFaceNo >= 0)
481 coarseCellMap[matchFaceNo] = nCoarseFaces;
482 coarseCellMap[matchFaceNeibNo] = nCoarseFaces;
489 label clusterMatchFaceNo = -1;
490 scalar clusterMaxFaceCoeff = -GREAT;
494 label faceNeig = fFaces[i];
495 const edge edgeCommon =
edge(facei, faceNeig);
498 facePairWeight_[edgeCommon] > clusterMaxFaceCoeff
499 && facePairWeight_[edgeCommon] != -1.0
500 && coarseCellMap[faceNeig] > 0
503 clusterMatchFaceNo = faceNeig;
504 clusterMaxFaceCoeff = facePairWeight_[edgeCommon];
508 if (clusterMatchFaceNo >= 0)
511 coarseCellMap[facei] = coarseCellMap[clusterMatchFaceNo];
516 coarseCellMap[facei] = nCoarseFaces;
525 for (
label facei=0; facei<nFineFaces; facei++)
527 if (coarseCellMap[facei] < 0)
531 <<
" is not part of a cluster"
536 return tcoarseCellMap;
542 label prevLevel = curLevel - 1;
545 nFaces_[prevLevel] = nFaces_[curLevel];
550 const labelList& curResAddr = restrictAddressing_[curLevel];
551 labelList& prevResAddr = restrictAddressing_[prevLevel];
555 prevResAddr[i] = curResAddr[prevResAddr[i]];
559 restrictAddressing_.set(curLevel, NULL);
561 patchLevels_.set(prevLevel, patchLevels_.set(curLevel, NULL));