64 for(
int facePi=0; facePi<6; facePi++)
66 for(
int faceNi=0; faceNi<6; faceNi++)
68 for(
int rot=0; rot<4; rot++)
72 for(
int Pp=0; Pp<2; Pp++)
75 int Np = (3 - Pp + rot)%4;
81 if (
mag(map[0]) == 2 && map[0]*map[1] < 0)
102 for(
int rot=0; rot<4; rot++)
104 if (faceN[rot] == faceP[0])
111 <<
"Cannot find point correspondence for faces "
112 << faceP <<
" and " << faceN
128 forAll(topoInternalFaces, topoFacei)
130 label topoPi = topoFaceCell[topoFacei];
131 const labelList& topoPfaces = topoCells[topoPi];
133 bool foundFace =
false;
138 topoPfacei < topoPfaces.size();
142 if (topoPfaces[topoPfacei] == topoFacei)
152 <<
"Cannot find merge face for block " << topoPi
156 mergeBlock[topoFacei].first() = topoPi;
157 mergeBlock[topoFacei].second() = topoPfacei;
192 return map < 0 ? -i-1 : i;
199 return i >= 0 ? i : ni + i + 1;
204 inline label
mapij(
const int map,
const label i,
const label j)
304 void Foam::blockMesh::calcTopologicalMerge()
313 Info<<
"Creating block offsets" <<
endl;
316 blockOffsets_.
setSize(blocks.size());
323 blockOffsets_[blocki] = nPoints_;
325 nPoints_ += blocks[blocki].nPoints();
326 nCells_ += blocks[blocki].nCells();
331 Info<<
"Creating merge list (topological search).." <<
flush;
335 mergeList_.
setSize(nPoints_, -1);
353 List<Pair<label>> mergeBlockP(topoInternalFaces.size());
362 List<Pair<label>> mergeBlockN(topoInternalFaces.size());
373 forAll(topoInternalFaces, topoFacei)
377 label blockPi = mergeBlockP[topoFacei].first();
378 label blockPfacei = mergeBlockP[topoFacei].second();
380 label blockNi = mergeBlockN[topoFacei].first();
381 label blockNfacei = mergeBlockN[topoFacei].second();
388 blocks[blockPi].blockShape().
faces()[blockPfacei],
390 blocks[blockNi].blockShape().
faces()[blockNfacei]
395 <<
" Face map for faces "
396 << blocks[blockPi].blockShape().faces()[blockPfacei] <<
" "
397 << blocks[blockNi].blockShape().faces()[blockNfacei] <<
": "
400 const pointField& blockPpoints = blocks[blockPi].points();
401 const pointField& blockNpoints = blocks[blockNi].points();
403 Pair<label> Pnij(
faceNij(blockPfacei, blocks[blockPi]));
407 Pair<label> Nnij(
faceNij(blockNfacei, blocks[blockNi]));
409 NPnij[0] = Nnij[
mag(fmap[0]) - 1];
410 NPnij[1] = Nnij[
mag(fmap[1]) - 1];
415 <<
"Sub-division mismatch between face "
416 << blockPfacei <<
" of block " << blockPi << Pnij
418 << blockNfacei <<
" of block " << blockNi << Nnij
426 const boundBox bb(topoCells[blockPi].
points(topoFaces, topoPoints));
427 const scalar testSqrDist =
magSqr(1
e-6*bb.span());
430 scalar maxSqrDist = 0;
432 for (label j=0; j<Pnij.second(); j++)
434 for (label i=0; i<Pnij.first(); i++)
437 facePoint(blockPfacei, blocks[blockPi], i, j);
440 facePointN(blockNfacei, fmap, blocks[blockNi], i, j);
446 blockPpoints[blockPpointi]
447 - blockNpoints[blockNpointi]
451 if (sqrDist > testSqrDist)
454 <<
"Point merge failure between face "
455 << blockPfacei <<
" of block " << blockPi
457 << blockNfacei <<
" of block " << blockNi
459 <<
" Points: " << blockPpoints[blockPpointi]
460 <<
" " << blockNpoints[blockNpointi]
462 <<
" This may be due to inconsistent grading."
466 maxSqrDist =
max(maxSqrDist, sqrDist);
468 label Ppointi = blockPpointi + blockOffsets_[blockPi];
469 label Npointi = blockNpointi + blockOffsets_[blockNi];
471 label minPNi =
min(Ppointi, Npointi);
473 if (mergeList_[Ppointi] != -1)
475 minPNi =
min(minPNi, mergeList_[Ppointi]);
478 if (mergeList_[Npointi] != -1)
480 minPNi =
min(minPNi, mergeList_[Npointi]);
483 mergeList_[Ppointi] = mergeList_[Npointi] = minPNi;
488 <<
" Max distance between merge points: "
493 bool changedPointMerge =
false;
498 changedPointMerge =
false;
501 forAll(topoInternalFaces, topoFacei)
503 label blockPi = mergeBlockP[topoFacei].first();
504 label blockPfacei = mergeBlockP[topoFacei].second();
506 label blockNi = mergeBlockN[topoFacei].first();
507 label blockNfacei = mergeBlockN[topoFacei].second();
514 blocks[blockPi].blockShape().
faces()[blockPfacei],
516 blocks[blockNi].blockShape().
faces()[blockNfacei]
520 Pair<label> Pnij(
faceNij(blockPfacei, blocks[blockPi]));
522 for (label j=0; j<Pnij.second(); j++)
524 for (label i=0; i<Pnij.first(); i++)
527 facePoint(blockPfacei, blocks[blockPi], i, j);
530 facePointN(blockNfacei, fmap, blocks[blockNi], i, j);
533 blockPpointi + blockOffsets_[blockPi];
536 blockNpointi + blockOffsets_[blockNi];
538 if (mergeList_[Ppointi] != mergeList_[Npointi])
540 changedPointMerge =
true;
543 = mergeList_[Npointi]
544 =
min(mergeList_[Ppointi], mergeList_[Npointi]);
558 <<
"Point merging failed after 100 passes."
562 }
while (changedPointMerge);
570 label nUniqPoints = 0;
572 forAll(mergeList_, pointi)
574 if (mergeList_[pointi] > pointi)
577 <<
"Merge list contains point index out of range"
581 if (mergeList_[pointi] == -1 || mergeList_[pointi] == pointi)
583 mergeList_[pointi] = nUniqPoints++;
587 mergeList_[pointi] = mergeList_[mergeList_[pointi]];
592 nPoints_ = nUniqPoints;