36 blockMesh& blocks = *
this;
48 forAll(blockFaces, blockFaceLabel)
50 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
51 const pointField& blockPpoints = blocks[blockPlabel].points();
52 const labelList& blockPfaces = blockCells[blockPlabel];
54 bool foundFace =
false;
55 label blockPfaceLabel;
59 blockPfaceLabel < blockPfaces.size();
65 blockFaces[blockPfaces[blockPfaceLabel]]
66 == blockFaces[blockFaceLabel]
77 <<
"Cannot find merge face for block " << blockPlabel
82 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
85 curPairs.
setSize(blockPfaceFaces.size());
93 boundBox bb(blockFaces[blockFaceLabel].
points(blockPoints));
94 const scalar mergeSqrDist =
95 SMALL*
magSqr(bb.span())/blockPfaceFaces.size();
96 scalar sqrMergeTol = GREAT;
99 forAll(blockPfaceFaces, blockPfaceFaceLabel)
102 = blockPfaceFaces[blockPfaceFaceLabel];
104 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
106 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel2)
108 if (blockPfaceFacePointLabel != blockPfaceFacePointLabel2)
110 scalar magSqrDist =
magSqr
112 blockPpoints[blockPfaceFacePoints
113 [blockPfaceFacePointLabel]]
114 - blockPpoints[blockPfaceFacePoints
115 [blockPfaceFacePointLabel2]]
118 if (magSqrDist < mergeSqrDist)
121 blockPfaceFacePoints[blockPfaceFacePointLabel]
122 + blockOffsets_[blockPlabel];
125 blockPfaceFacePoints[blockPfaceFacePointLabel2]
126 + blockOffsets_[blockPlabel];
128 label minPP2 =
min(PpointLabel, PpointLabel2);
130 if (MergeList[PpointLabel] != -1)
132 minPP2 =
min(minPP2, MergeList[PpointLabel]);
135 if (MergeList[PpointLabel2] != -1)
137 minPP2 =
min(minPP2, MergeList[PpointLabel2]);
140 MergeList[PpointLabel] = MergeList[PpointLabel2]
145 sqrMergeTol =
min(sqrMergeTol, magSqrDist);
155 if (
topology().isInternalFace(blockFaceLabel))
157 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
158 const pointField& blockNpoints = blocks[blockNlabel].points();
159 const labelList& blockNfaces = blockCells[blockNlabel];
162 label blockNfaceLabel;
166 blockNfaceLabel < blockNfaces.size();
172 blockFaces[blockNfaces[blockNfaceLabel]]
173 == blockFaces[blockFaceLabel]
184 <<
"Cannot find merge face for block " << blockNlabel
189 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
191 if (blockPfaceFaces.size() != blockNfaceFaces.size())
194 <<
"Inconsistent number of faces between block pair "
195 << blockPlabel <<
" and " << blockNlabel
204 forAll(blockPfaceFaces, blockPfaceFaceLabel)
207 blockPfaceFaces[blockPfaceFaceLabel];
210 cp.setSize(blockPfaceFacePoints.size());
213 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
217 forAll(blockNfaceFaces, blockNfaceFaceLabel)
220 = blockNfaceFaces[blockNfaceFaceLabel];
222 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
231 [blockPfaceFacePointLabel]
236 [blockNfaceFacePointLabel]
244 cp[blockPfaceFacePointLabel] =
245 blockNfaceFacePoints[blockNfaceFacePointLabel];
250 blockPfaceFacePointLabel
252 + blockOffsets_[blockPlabel];
257 blockNfaceFacePointLabel
259 + blockOffsets_[blockNlabel];
261 label minPN =
min(PpointLabel, NpointLabel);
263 if (MergeList[PpointLabel] != -1)
265 minPN =
min(minPN, MergeList[PpointLabel]);
268 if (MergeList[NpointLabel] != -1)
270 minPN =
min(minPN, MergeList[NpointLabel]);
273 MergeList[PpointLabel] =
274 MergeList[NpointLabel] =
280 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
282 if (cp[blockPfaceFacePointLabel] == -1)
285 <<
"Inconsistent point locations between blocks "
286 << blockPlabel <<
" and " << blockNlabel <<
nl
287 <<
" probably due to inconsistent grading."
302 bool changedPointMerge =
false;
307 changedPointMerge =
false;
310 forAll(blockInternalFaces, blockFaceLabel)
312 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
313 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
315 const labelList& blockPfaces = blockCells[blockPlabel];
316 const labelList& blockNfaces = blockCells[blockNlabel];
318 const labelListList& curPairs = glueMergePairs[blockFaceLabel];
320 bool foundFace =
false;
321 label blockPfaceLabel;
325 blockPfaceLabel < blockPfaces.size();
331 blockFaces[blockPfaces[blockPfaceLabel]]
332 == blockInternalFaces[blockFaceLabel]
341 label blockNfaceLabel;
345 blockNfaceLabel < blockNfaces.size();
351 blockFaces[blockNfaces[blockNfaceLabel]]
352 == blockInternalFaces[blockFaceLabel]
361 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
363 forAll(blockPfaceFaces, blockPfaceFaceLabel)
366 = blockPfaceFaces[blockPfaceFaceLabel];
368 const labelList& cp = curPairs[blockPfaceFaceLabel];
370 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
373 blockPfaceFacePoints[blockPfaceFacePointLabel]
374 + blockOffsets_[blockPlabel];
377 cp[blockPfaceFacePointLabel]
378 + blockOffsets_[blockNlabel];
382 MergeList[PpointLabel]
383 != MergeList[NpointLabel]
386 changedPointMerge =
true;
388 MergeList[PpointLabel]
389 = MergeList[NpointLabel]
392 MergeList[PpointLabel],
393 MergeList[NpointLabel]
404 <<
"Point merging failed after max number of passes."
408 while (changedPointMerge);
411 forAll(blockInternalFaces, blockFaceLabel)
413 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
414 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
416 const labelList& blockPfaces = blockCells[blockPlabel];
417 const labelList& blockNfaces = blockCells[blockNlabel];
419 const pointField& blockPpoints = blocks[blockPlabel].points();
420 const pointField& blockNpoints = blocks[blockNlabel].points();
422 bool foundFace =
false;
423 label blockPfaceLabel;
427 blockPfaceLabel < blockPfaces.size();
433 blockFaces[blockPfaces[blockPfaceLabel]]
434 == blockInternalFaces[blockFaceLabel]
445 <<
"Cannot find merge face for block " << blockPlabel
450 label blockNfaceLabel;
454 blockNfaceLabel < blockNfaces.size();
460 blockFaces[blockNfaces[blockNfaceLabel]]
461 == blockInternalFaces[blockFaceLabel]
472 <<
"Cannot find merge face for block " << blockNlabel
477 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
480 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
482 forAll(blockPfaceFaces, blockPfaceFaceLabel)
485 = blockPfaceFaces[blockPfaceFaceLabel];
487 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
490 blockPfaceFacePoints[blockPfaceFacePointLabel]
491 + blockOffsets_[blockPlabel];
493 if (MergeList[PpointLabel] == -1)
496 <<
"Unable to merge point "
497 << blockPfaceFacePointLabel
498 <<
' ' << blockPpoints[blockPfaceFacePointLabel]
508 forAll(blockNfaceFaces, blockNfaceFaceLabel)
511 = blockNfaceFaces[blockNfaceFaceLabel];
513 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
516 blockNfaceFacePoints[blockNfaceFacePointLabel]
517 + blockOffsets_[blockNlabel];
519 if (MergeList[NpointLabel] == -1)
522 <<
"unable to merge point "
523 << blockNfaceFacePointLabel
524 <<
' ' << blockNpoints[blockNfaceFacePointLabel]
538 label newPointLabel = 0;
540 forAll(MergeList, pointLabel)
542 if (MergeList[pointLabel] > pointLabel)
550 (MergeList[pointLabel] == -1)
551 || MergeList[pointLabel] == pointLabel
554 MergeList[pointLabel] = newPointLabel;
559 MergeList[pointLabel] = MergeList[MergeList[pointLabel]];
563 nPoints_ = newPointLabel;