33 void Foam::blockMesh::calcGeometricalMerge()
39 Info<<
"Creating block offsets" <<
endl;
42 blockOffsets_.
setSize(blocks.size());
49 blockOffsets_[blocki] = nPoints_;
51 nPoints_ += blocks[blocki].nPoints();
52 nCells_ += blocks[blocki].nCells();
58 Info<<
"Creating merge list (geometric search).." <<
flush;
77 forAll(blockFaces, blockFaceLabel)
79 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
80 const pointField& blockPpoints = blocks[blockPlabel].points();
81 const labelList& blockPfaces = blockCells[blockPlabel];
83 bool foundFace =
false;
84 label blockPfaceLabel;
88 blockPfaceLabel < blockPfaces.size();
92 if (blockPfaces[blockPfaceLabel] == blockFaceLabel)
102 <<
"Cannot find merge face for block " << blockPlabel
106 const List<FixedList<label, 4>>& blockPfaceFaces =
107 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
110 curPairs.
setSize(blockPfaceFaces.size());
119 boundBox bb(blockCells[blockPlabel].
points(blockFaces, blockPoints));
120 const scalar mergeSqrDist =
magSqr(10*SMALL*bb.span());
124 scalar sqrMergeTol = GREAT;
126 forAll(blockPfaceFaces, blockPfaceFaceLabel)
128 const FixedList<label, 4>& blockPfaceFacePoints
129 = blockPfaceFaces[blockPfaceFaceLabel];
131 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
133 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel2)
135 if (blockPfaceFacePointLabel != blockPfaceFacePointLabel2)
137 scalar magSqrDist =
magSqr
139 blockPpoints[blockPfaceFacePoints
140 [blockPfaceFacePointLabel]]
141 - blockPpoints[blockPfaceFacePoints
142 [blockPfaceFacePointLabel2]]
145 if (magSqrDist < mergeSqrDist)
148 blockPfaceFacePoints[blockPfaceFacePointLabel]
149 + blockOffsets_[blockPlabel];
152 blockPfaceFacePoints[blockPfaceFacePointLabel2]
153 + blockOffsets_[blockPlabel];
155 label minPP2 =
min(PpointLabel, PpointLabel2);
157 if (mergeList_[PpointLabel] != -1)
159 minPP2 =
min(minPP2, mergeList_[PpointLabel]);
162 if (mergeList_[PpointLabel2] != -1)
164 minPP2 =
min(minPP2, mergeList_[PpointLabel2]);
167 mergeList_[PpointLabel] = mergeList_[PpointLabel2]
172 sqrMergeTol =
min(sqrMergeTol, magSqrDist);
182 if (
topology().isInternalFace(blockFaceLabel))
184 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
185 const pointField& blockNpoints = blocks[blockNlabel].points();
186 const labelList& blockNfaces = blockCells[blockNlabel];
189 label blockNfaceLabel;
193 blockNfaceLabel < blockNfaces.size();
199 blockFaces[blockNfaces[blockNfaceLabel]]
200 == blockFaces[blockFaceLabel]
211 <<
"Cannot find merge face for block " << blockNlabel
215 const List<FixedList<label, 4>>& blockNfaceFaces =
216 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
220 checkFaceCorrespondence_
221 && blockPfaceFaces.size() != blockNfaceFaces.size()
225 <<
"Inconsistent number of faces between block pair "
226 << blockPlabel <<
" and " << blockNlabel
233 forAll(blockPfaceFaces, blockPfaceFaceLabel)
235 const FixedList<label, 4>& blockPfaceFacePoints
236 = blockPfaceFaces[blockPfaceFaceLabel];
239 cp.setSize(blockPfaceFacePoints.size());
242 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
244 forAll(blockNfaceFaces, blockNfaceFaceLabel)
246 const FixedList<label, 4>& blockNfaceFacePoints
247 = blockNfaceFaces[blockNfaceFaceLabel];
249 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
256 [blockPfaceFacePoints[blockPfaceFacePointLabel]]
258 [blockNfaceFacePoints[blockNfaceFacePointLabel]]
264 cp[blockPfaceFacePointLabel] =
265 blockNfaceFacePoints[blockNfaceFacePointLabel];
268 blockPfaceFacePoints[blockPfaceFacePointLabel]
269 + blockOffsets_[blockPlabel];
272 blockNfaceFacePoints[blockNfaceFacePointLabel]
273 + blockOffsets_[blockNlabel];
275 label minPN =
min(PpointLabel, NpointLabel);
277 if (mergeList_[PpointLabel] != -1)
279 minPN =
min(minPN, mergeList_[PpointLabel]);
282 if (mergeList_[NpointLabel] != -1)
284 minPN =
min(minPN, mergeList_[NpointLabel]);
287 mergeList_[PpointLabel] = mergeList_[NpointLabel]
293 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
295 if (
cp[blockPfaceFacePointLabel] == -1)
298 <<
"Inconsistent point locations between block pair "
299 << blockPlabel <<
" and " << blockNlabel <<
nl
300 <<
" probably due to inconsistent grading."
315 bool changedPointMerge =
false;
320 changedPointMerge =
false;
323 forAll(blockinternalFaces, blockFaceLabel)
325 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
326 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
328 const labelList& blockPfaces = blockCells[blockPlabel];
329 const labelList& blockNfaces = blockCells[blockNlabel];
331 const labelListList& curPairs = glueMergePairs[blockFaceLabel];
333 label blockPfaceLabel;
337 blockPfaceLabel < blockPfaces.size();
343 blockFaces[blockPfaces[blockPfaceLabel]]
344 == blockinternalFaces[blockFaceLabel]
352 label blockNfaceLabel;
356 blockNfaceLabel < blockNfaces.size();
362 blockFaces[blockNfaces[blockNfaceLabel]]
363 == blockinternalFaces[blockFaceLabel]
371 const List<FixedList<label, 4>>& blockPfaceFaces =
372 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
374 forAll(blockPfaceFaces, blockPfaceFaceLabel)
376 const FixedList<label, 4>& blockPfaceFacePoints
377 = blockPfaceFaces[blockPfaceFaceLabel];
379 const labelList&
cp = curPairs[blockPfaceFaceLabel];
381 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
384 blockPfaceFacePoints[blockPfaceFacePointLabel]
385 + blockOffsets_[blockPlabel];
388 cp[blockPfaceFacePointLabel]
389 + blockOffsets_[blockNlabel];
393 mergeList_[PpointLabel]
394 != mergeList_[NpointLabel]
397 changedPointMerge =
true;
399 mergeList_[PpointLabel]
400 = mergeList_[NpointLabel]
403 mergeList_[PpointLabel],
404 mergeList_[NpointLabel]
418 <<
"Point merging failed after max number of passes."
422 while (changedPointMerge);
429 forAll(blockinternalFaces, blockFaceLabel)
431 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
432 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
434 const labelList& blockPfaces = blockCells[blockPlabel];
435 const labelList& blockNfaces = blockCells[blockNlabel];
437 const pointField& blockPpoints = blocks[blockPlabel].points();
438 const pointField& blockNpoints = blocks[blockNlabel].points();
440 bool foundFace =
false;
441 label blockPfaceLabel;
445 blockPfaceLabel < blockPfaces.size();
451 blockFaces[blockPfaces[blockPfaceLabel]]
452 == blockinternalFaces[blockFaceLabel]
463 <<
"Cannot find merge face for block " << blockPlabel
468 label blockNfaceLabel;
472 blockNfaceLabel < blockNfaces.size();
478 blockFaces[blockNfaces[blockNfaceLabel]]
479 == blockinternalFaces[blockFaceLabel]
490 <<
"Cannot find merge face for block " << blockNlabel
494 const List<FixedList<label, 4>>& blockPfaceFaces =
495 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
497 const List<FixedList<label, 4>>& blockNfaceFaces =
498 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
500 forAll(blockPfaceFaces, blockPfaceFaceLabel)
502 const FixedList<label, 4>& blockPfaceFacePoints
503 = blockPfaceFaces[blockPfaceFaceLabel];
505 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
508 blockPfaceFacePoints[blockPfaceFacePointLabel]
509 + blockOffsets_[blockPlabel];
511 if (mergeList_[PpointLabel] == -1)
514 <<
"Unable to merge point "
515 << blockPfaceFacePointLabel
516 <<
' ' << blockPpoints[blockPfaceFacePointLabel]
526 forAll(blockNfaceFaces, blockNfaceFaceLabel)
528 const FixedList<label, 4>& blockNfaceFacePoints
529 = blockNfaceFaces[blockNfaceFaceLabel];
531 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
534 blockNfaceFacePoints[blockNfaceFacePointLabel]
535 + blockOffsets_[blockNlabel];
537 if (mergeList_[NpointLabel] == -1)
540 <<
"unable to merge point "
541 << blockNfaceFacePointLabel
542 <<
' ' << blockNpoints[blockNfaceFacePointLabel]
556 label newPointLabel = 0;
558 forAll(mergeList_, pointLabel)
560 if (mergeList_[pointLabel] > pointLabel)
563 <<
"Merge list contains point index out of range"
569 mergeList_[pointLabel] == -1
570 || mergeList_[pointLabel] == pointLabel
573 mergeList_[pointLabel] = newPointLabel;
578 mergeList_[pointLabel] = mergeList_[mergeList_[pointLabel]];
582 nPoints_ = newPointLabel;