32 void Foam::blockMesh::calcMergeInfo()
38 Info<<
"Creating block offsets" <<
endl;
41 blockOffsets_.
setSize(blocks.size());
48 blockOffsets_[blocki] = nPoints_;
50 nPoints_ += blocks[blocki].nPoints();
51 nCells_ += blocks[blocki].nCells();
76 forAll(blockFaces, blockFaceLabel)
78 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
79 const pointField& blockPpoints = blocks[blockPlabel].points();
80 const labelList& blockPfaces = blockCells[blockPlabel];
82 bool foundFace =
false;
83 label blockPfaceLabel;
87 blockPfaceLabel < blockPfaces.size();
91 if (blockPfaces[blockPfaceLabel] == blockFaceLabel)
101 <<
"Cannot find merge face for block " << blockPlabel
105 const List<FixedList<label, 4>>& blockPfaceFaces =
106 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
109 curPairs.
setSize(blockPfaceFaces.size());
118 boundBox bb(blockCells[blockPlabel].
points(blockFaces, blockPoints));
119 const scalar mergeSqrDist =
magSqr(10*SMALL*bb.span());
123 scalar sqrMergeTol = GREAT;
125 forAll(blockPfaceFaces, blockPfaceFaceLabel)
127 const FixedList<label, 4>& blockPfaceFacePoints
128 = blockPfaceFaces[blockPfaceFaceLabel];
130 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
132 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel2)
134 if (blockPfaceFacePointLabel != blockPfaceFacePointLabel2)
136 scalar magSqrDist =
magSqr
138 blockPpoints[blockPfaceFacePoints
139 [blockPfaceFacePointLabel]]
140 - blockPpoints[blockPfaceFacePoints
141 [blockPfaceFacePointLabel2]]
144 if (magSqrDist < mergeSqrDist)
147 blockPfaceFacePoints[blockPfaceFacePointLabel]
148 + blockOffsets_[blockPlabel];
151 blockPfaceFacePoints[blockPfaceFacePointLabel2]
152 + blockOffsets_[blockPlabel];
154 label minPP2 =
min(PpointLabel, PpointLabel2);
156 if (mergeList_[PpointLabel] != -1)
158 minPP2 =
min(minPP2, mergeList_[PpointLabel]);
161 if (mergeList_[PpointLabel2] != -1)
163 minPP2 =
min(minPP2, mergeList_[PpointLabel2]);
166 mergeList_[PpointLabel] = mergeList_[PpointLabel2]
171 sqrMergeTol =
min(sqrMergeTol, magSqrDist);
181 if (
topology().isInternalFace(blockFaceLabel))
183 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
184 const pointField& blockNpoints = blocks[blockNlabel].points();
185 const labelList& blockNfaces = blockCells[blockNlabel];
188 label blockNfaceLabel;
192 blockNfaceLabel < blockNfaces.size();
198 blockFaces[blockNfaces[blockNfaceLabel]]
199 == blockFaces[blockFaceLabel]
210 <<
"Cannot find merge face for block " << blockNlabel
214 const List<FixedList<label, 4>>& blockNfaceFaces =
215 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
219 checkFaceCorrespondence_
220 && blockPfaceFaces.size() != blockNfaceFaces.size()
224 <<
"Inconsistent number of faces between block pair "
225 << blockPlabel <<
" and " << blockNlabel
232 forAll(blockPfaceFaces, blockPfaceFaceLabel)
234 const FixedList<label, 4>& blockPfaceFacePoints
235 = blockPfaceFaces[blockPfaceFaceLabel];
238 cp.setSize(blockPfaceFacePoints.size());
241 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
243 forAll(blockNfaceFaces, blockNfaceFaceLabel)
245 const FixedList<label, 4>& blockNfaceFacePoints
246 = blockNfaceFaces[blockNfaceFaceLabel];
248 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
255 [blockPfaceFacePoints[blockPfaceFacePointLabel]]
257 [blockNfaceFacePoints[blockNfaceFacePointLabel]]
263 cp[blockPfaceFacePointLabel] =
264 blockNfaceFacePoints[blockNfaceFacePointLabel];
267 blockPfaceFacePoints[blockPfaceFacePointLabel]
268 + blockOffsets_[blockPlabel];
271 blockNfaceFacePoints[blockNfaceFacePointLabel]
272 + blockOffsets_[blockNlabel];
274 label minPN =
min(PpointLabel, NpointLabel);
276 if (mergeList_[PpointLabel] != -1)
278 minPN =
min(minPN, mergeList_[PpointLabel]);
281 if (mergeList_[NpointLabel] != -1)
283 minPN =
min(minPN, mergeList_[NpointLabel]);
286 mergeList_[PpointLabel] = mergeList_[NpointLabel]
292 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
294 if (
cp[blockPfaceFacePointLabel] == -1)
297 <<
"Inconsistent point locations between block pair "
298 << blockPlabel <<
" and " << blockNlabel <<
nl
299 <<
" probably due to inconsistent grading."
314 bool changedPointMerge =
false;
319 changedPointMerge =
false;
322 forAll(blockinternalFaces, blockFaceLabel)
324 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
325 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
327 const labelList& blockPfaces = blockCells[blockPlabel];
328 const labelList& blockNfaces = blockCells[blockNlabel];
330 const labelListList& curPairs = glueMergePairs[blockFaceLabel];
332 label blockPfaceLabel;
336 blockPfaceLabel < blockPfaces.size();
342 blockFaces[blockPfaces[blockPfaceLabel]]
343 == blockinternalFaces[blockFaceLabel]
351 label blockNfaceLabel;
355 blockNfaceLabel < blockNfaces.size();
361 blockFaces[blockNfaces[blockNfaceLabel]]
362 == blockinternalFaces[blockFaceLabel]
370 const List<FixedList<label, 4>>& blockPfaceFaces =
371 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
373 forAll(blockPfaceFaces, blockPfaceFaceLabel)
375 const FixedList<label, 4>& blockPfaceFacePoints
376 = blockPfaceFaces[blockPfaceFaceLabel];
378 const labelList&
cp = curPairs[blockPfaceFaceLabel];
380 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
383 blockPfaceFacePoints[blockPfaceFacePointLabel]
384 + blockOffsets_[blockPlabel];
387 cp[blockPfaceFacePointLabel]
388 + blockOffsets_[blockNlabel];
392 mergeList_[PpointLabel]
393 != mergeList_[NpointLabel]
396 changedPointMerge =
true;
398 mergeList_[PpointLabel]
399 = mergeList_[NpointLabel]
402 mergeList_[PpointLabel],
403 mergeList_[NpointLabel]
417 <<
"Point merging failed after max number of passes."
421 while (changedPointMerge);
428 forAll(blockinternalFaces, blockFaceLabel)
430 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
431 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
433 const labelList& blockPfaces = blockCells[blockPlabel];
434 const labelList& blockNfaces = blockCells[blockNlabel];
436 const pointField& blockPpoints = blocks[blockPlabel].points();
437 const pointField& blockNpoints = blocks[blockNlabel].points();
439 bool foundFace =
false;
440 label blockPfaceLabel;
444 blockPfaceLabel < blockPfaces.size();
450 blockFaces[blockPfaces[blockPfaceLabel]]
451 == blockinternalFaces[blockFaceLabel]
462 <<
"Cannot find merge face for block " << blockPlabel
467 label blockNfaceLabel;
471 blockNfaceLabel < blockNfaces.size();
477 blockFaces[blockNfaces[blockNfaceLabel]]
478 == blockinternalFaces[blockFaceLabel]
489 <<
"Cannot find merge face for block " << blockNlabel
493 const List<FixedList<label, 4>>& blockPfaceFaces =
494 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
496 const List<FixedList<label, 4>>& blockNfaceFaces =
497 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
499 forAll(blockPfaceFaces, blockPfaceFaceLabel)
501 const FixedList<label, 4>& blockPfaceFacePoints
502 = blockPfaceFaces[blockPfaceFaceLabel];
504 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
507 blockPfaceFacePoints[blockPfaceFacePointLabel]
508 + blockOffsets_[blockPlabel];
510 if (mergeList_[PpointLabel] == -1)
513 <<
"Unable to merge point "
514 << blockPfaceFacePointLabel
515 <<
' ' << blockPpoints[blockPfaceFacePointLabel]
525 forAll(blockNfaceFaces, blockNfaceFaceLabel)
527 const FixedList<label, 4>& blockNfaceFacePoints
528 = blockNfaceFaces[blockNfaceFaceLabel];
530 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
533 blockNfaceFacePoints[blockNfaceFacePointLabel]
534 + blockOffsets_[blockNlabel];
536 if (mergeList_[NpointLabel] == -1)
539 <<
"unable to merge point "
540 << blockNfaceFacePointLabel
541 <<
' ' << blockNpoints[blockNfaceFacePointLabel]
555 label newPointLabel = 0;
557 forAll(mergeList_, pointLabel)
559 if (mergeList_[pointLabel] > pointLabel)
562 <<
"Merge list contains point index out of range"
568 mergeList_[pointLabel] == -1
569 || mergeList_[pointLabel] == pointLabel
572 mergeList_[pointLabel] = newPointLabel;
577 mergeList_[pointLabel] = mergeList_[mergeList_[pointLabel]];
581 nPoints_ = newPointLabel;