52 x[i] =
min(x[i], y[j]);
74 bool Foam::localPointRegion::isDuplicate
90 if (f0[fp0] != f1[fp1])
97 fp1 = f1.fcIndex(fp1);
101 fp1 = f1.rcIndex(fp1);
109 void Foam::localPointRegion::countPointRegions
111 const polyMesh&
mesh,
113 const Map<label>& candidateFace,
119 labelList minPointRegion(mesh.nPoints(), -1);
121 meshPointMap_.
resize(candidateFace.size()/100);
123 DynamicList<labelList> pointRegions(meshPointMap_.size());
126 meshFaceMap_.resize(meshPointMap_.size());
130 label faceI = iter.key();
132 if (!mesh.isInternalFace(faceI))
134 const face&
f = mesh.faces()[faceI];
136 if (minRegion[faceI].empty())
139 <<
"Face from candidateFace without minRegion set." <<
endl
140 <<
"Face:" << faceI <<
" fc:" << mesh.faceCentres()[faceI]
146 label pointI = f[fp];
151 if (candidatePoint[pointI])
153 label region = minRegion[faceI][fp];
155 if (minPointRegion[pointI] == -1)
157 minPointRegion[pointI] = region;
159 else if (minPointRegion[pointI] != region)
163 if (iter != meshPointMap_.end())
165 labelList& regions = pointRegions[iter()];
168 label sz = regions.
size();
169 regions.setSize(sz+1);
170 regions[sz] = region;
175 label localPointI = meshPointMap_.size();
176 meshPointMap_.insert(pointI, localPointI);
178 regions[0] = minPointRegion[pointI];
180 pointRegions.append(regions);
183 label meshFaceMapI = meshFaceMap_.size();
184 meshFaceMap_.insert(faceI, meshFaceMapI);
190 minPointRegion.clear();
196 label faceI = iter.key();
198 if (mesh.isInternalFace(faceI))
200 const face& f = mesh.faces()[faceI];
206 if (candidatePoint[f[fp]] && meshPointMap_.found(f[fp]))
208 label meshFaceMapI = meshFaceMap_.size();
209 meshFaceMap_.insert(faceI, meshFaceMapI);
217 pointRegions.shrink();
218 pointRegions_.setSize(pointRegions.size());
221 pointRegions_[i].transfer(pointRegions[i]);
225 faceRegions_.setSize(meshFaceMap_.size());
228 faceRegions_[iter()].labelList::transfer(minRegion[iter.key()]);
250 void Foam::localPointRegion::calcPointRegions
252 const polyMesh& mesh,
256 label nBnd = mesh.nFaces()-mesh.nInternalFaces();
257 const labelList& faceOwner = mesh.faceOwner();
258 const labelList& faceNeighbour = mesh.faceNeighbour();
274 Map<label> candidateFace(2*nBnd);
275 label candidateFaceI = 0;
277 Map<label> candidateCell(nBnd);
278 label candidateCellI = 0;
280 forAll(mesh.faces(), faceI)
282 const face& f = mesh.faces()[faceI];
286 if (candidatePoint[f[fp]])
289 if (candidateFace.insert(faceI, candidateFaceI))
295 if (candidateCell.insert(faceOwner[faceI], candidateCellI))
300 if (mesh.isInternalFace(faceI))
302 label nei = faceNeighbour[faceI];
303 if (candidateCell.insert(nei, candidateCellI))
317 globalIndex globalCells(mesh.nCells());
327 label faceI = iter.key();
328 const face& f = mesh.faces()[faceI];
330 if (mesh.isInternalFace(faceI))
332 label globOwn = globalCells.toGlobal(faceOwner[faceI]);
333 label globNei = globalCells.toGlobal(faceNeighbour[faceI]);
334 minRegion[faceI].setSize(f.size(),
min(globOwn, globNei));
338 label globOwn = globalCells.toGlobal(faceOwner[faceI]);
339 minRegion[faceI].setSize(f.size(), globOwn);
352 Map<label> minPointValue(100);
356 minPointValue.clear();
358 label cellI = iter.key();
359 const cell& cFaces = mesh.cells()[cellI];
364 label faceI = cFaces[cFaceI];
366 if (minRegion[faceI].size())
368 const face& f = mesh.faces()[faceI];
372 label pointI = f[fp];
375 if (iter == minPointValue.end())
377 minPointValue.insert(pointI, minRegion[faceI][fp]);
381 label currentMin = iter();
382 iter() =
min(currentMin, minRegion[faceI][fp]);
391 label faceI = cFaces[cFaceI];
393 if (minRegion[faceI].size())
395 const face& f = mesh.faces()[faceI];
399 label minVal = minPointValue[f[fp]];
401 if (minVal != minRegion[faceI][fp])
403 minRegion[faceI][fp] = minVal;
433 countPointRegions(mesh, candidatePoint, candidateFace, minRegion);
464 if (!patches[patchI].coupled())
475 calcPointRegions(mesh, candidatePoint);
493 forAll(candidatePoints, i)
495 candidatePoint[candidatePoints[i]] =
true;
498 calcPointRegions(mesh, candidatePoint);
519 labelList duplicateFace(allPatch.size(), -1);
520 label nDuplicateFaces = 0;
525 const face& f = allPatch.localFaces()[bFaceI];
533 label otherFaceI = pFaces[i];
535 if (otherFaceI > bFaceI)
537 const face& otherF = allPatch.localFaces()[otherFaceI];
539 if (isDuplicate(f, otherF,
true))
543 "findDuplicateFaces(const primitiveMesh&"
544 ", const labelList&)"
546 <<
" has local points:" << f
547 <<
" which are in same order as face:"
549 <<
" with local points:" << otherF
552 else if (isDuplicate(f, otherF,
false))
559 duplicateFace[bFaceI] != -1
560 || duplicateFace[otherFaceI] != -1
565 "findDuplicateFaces(const primitiveMesh&"
566 ", const labelList&)"
567 ) <<
"One of two duplicate faces already marked"
568 <<
" as duplicate." <<
nl
569 <<
"This means that three or more faces share"
570 <<
" the same points and this is illegal." <<
nl
571 <<
"Face:" << meshFace0
572 <<
" with local points:" << f
573 <<
" which are in same order as face:"
575 <<
" with local points:" << otherF
579 duplicateFace[bFaceI] = otherFaceI;
580 duplicateFace[otherFaceI] = bFaceI;
587 return duplicateFace;
602 newMap.insert(newFaceI, iter());
616 newMap.insert(newPointI, iter());