30 void Foam::blockMesh::calcMergeInfo()
36 Info<<
"Creating block offsets" <<
endl;
39 blockOffsets_.
setSize(blocks.size());
46 blockOffsets_[blocki] = nPoints_;
48 nPoints_ += blocks[blocki].nPoints();
49 nCells_ += blocks[blocki].nCells();
74 forAll(blockFaces, blockFaceLabel)
76 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
77 const pointField& blockPpoints = blocks[blockPlabel].points();
78 const labelList& blockPfaces = blockCells[blockPlabel];
80 bool foundFace =
false;
81 label blockPfaceLabel;
85 blockPfaceLabel < blockPfaces.size();
89 if (blockPfaces[blockPfaceLabel] == blockFaceLabel)
99 <<
"Cannot find merge face for block " << blockPlabel
103 const List<FixedList<label, 4>>& blockPfaceFaces =
104 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
107 curPairs.
setSize(blockPfaceFaces.size());
116 boundBox bb(blockCells[blockPlabel].
points(blockFaces, blockPoints));
117 const scalar mergeSqrDist =
magSqr(10*small*bb.span());
121 scalar sqrMergeTol = great;
123 forAll(blockPfaceFaces, blockPfaceFaceLabel)
125 const FixedList<label, 4>& blockPfaceFacePoints
126 = blockPfaceFaces[blockPfaceFaceLabel];
128 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
130 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel2)
132 if (blockPfaceFacePointLabel != blockPfaceFacePointLabel2)
134 scalar magSqrDist =
magSqr 136 blockPpoints[blockPfaceFacePoints
137 [blockPfaceFacePointLabel]]
138 - blockPpoints[blockPfaceFacePoints
139 [blockPfaceFacePointLabel2]]
142 if (magSqrDist < mergeSqrDist)
145 blockPfaceFacePoints[blockPfaceFacePointLabel]
146 + blockOffsets_[blockPlabel];
149 blockPfaceFacePoints[blockPfaceFacePointLabel2]
150 + blockOffsets_[blockPlabel];
152 label minPP2 =
min(PpointLabel, PpointLabel2);
154 if (mergeList_[PpointLabel] != -1)
156 minPP2 =
min(minPP2, mergeList_[PpointLabel]);
159 if (mergeList_[PpointLabel2] != -1)
161 minPP2 =
min(minPP2, mergeList_[PpointLabel2]);
164 mergeList_[PpointLabel] = mergeList_[PpointLabel2]
169 sqrMergeTol =
min(sqrMergeTol, magSqrDist);
179 if (
topology().isInternalFace(blockFaceLabel))
181 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
182 const pointField& blockNpoints = blocks[blockNlabel].points();
183 const labelList& blockNfaces = blockCells[blockNlabel];
186 label blockNfaceLabel;
190 blockNfaceLabel < blockNfaces.size();
196 blockFaces[blockNfaces[blockNfaceLabel]]
197 == blockFaces[blockFaceLabel]
208 <<
"Cannot find merge face for block " << blockNlabel
212 const List<FixedList<label, 4>>& blockNfaceFaces =
213 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
217 checkFaceCorrespondence_
218 && blockPfaceFaces.size() != blockNfaceFaces.size()
222 <<
"Inconsistent number of faces between block pair " 223 << blockPlabel <<
" and " << blockNlabel
230 forAll(blockPfaceFaces, blockPfaceFaceLabel)
232 const FixedList<label, 4>& blockPfaceFacePoints
233 = blockPfaceFaces[blockPfaceFaceLabel];
235 labelList& cp = curPairs[blockPfaceFaceLabel];
236 cp.
setSize(blockPfaceFacePoints.size());
239 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
241 forAll(blockNfaceFaces, blockNfaceFaceLabel)
243 const FixedList<label, 4>& blockNfaceFacePoints
244 = blockNfaceFaces[blockNfaceFaceLabel];
246 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
253 [blockPfaceFacePoints[blockPfaceFacePointLabel]]
255 [blockNfaceFacePoints[blockNfaceFacePointLabel]]
261 cp[blockPfaceFacePointLabel] =
262 blockNfaceFacePoints[blockNfaceFacePointLabel];
265 blockPfaceFacePoints[blockPfaceFacePointLabel]
266 + blockOffsets_[blockPlabel];
269 blockNfaceFacePoints[blockNfaceFacePointLabel]
270 + blockOffsets_[blockNlabel];
272 label minPN =
min(PpointLabel, NpointLabel);
274 if (mergeList_[PpointLabel] != -1)
276 minPN =
min(minPN, mergeList_[PpointLabel]);
279 if (mergeList_[NpointLabel] != -1)
281 minPN =
min(minPN, mergeList_[NpointLabel]);
284 mergeList_[PpointLabel] = mergeList_[NpointLabel]
290 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
292 if (cp[blockPfaceFacePointLabel] == -1)
295 <<
"Inconsistent point locations between block pair " 296 << blockPlabel <<
" and " << blockNlabel <<
nl 297 <<
" probably due to inconsistent grading." 312 bool changedPointMerge =
false;
317 changedPointMerge =
false;
320 forAll(blockinternalFaces, blockFaceLabel)
322 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
323 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
325 const labelList& blockPfaces = blockCells[blockPlabel];
326 const labelList& blockNfaces = blockCells[blockNlabel];
328 const labelListList& curPairs = glueMergePairs[blockFaceLabel];
330 label blockPfaceLabel;
334 blockPfaceLabel < blockPfaces.size();
340 blockFaces[blockPfaces[blockPfaceLabel]]
341 == blockinternalFaces[blockFaceLabel]
349 label blockNfaceLabel;
353 blockNfaceLabel < blockNfaces.size();
359 blockFaces[blockNfaces[blockNfaceLabel]]
360 == blockinternalFaces[blockFaceLabel]
368 const List<FixedList<label, 4>>& blockPfaceFaces =
369 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
371 forAll(blockPfaceFaces, blockPfaceFaceLabel)
373 const FixedList<label, 4>& blockPfaceFacePoints
374 = blockPfaceFaces[blockPfaceFaceLabel];
376 const labelList& cp = curPairs[blockPfaceFaceLabel];
378 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
381 blockPfaceFacePoints[blockPfaceFacePointLabel]
382 + blockOffsets_[blockPlabel];
385 cp[blockPfaceFacePointLabel]
386 + blockOffsets_[blockNlabel];
390 mergeList_[PpointLabel]
391 != mergeList_[NpointLabel]
394 changedPointMerge =
true;
396 mergeList_[PpointLabel]
397 = mergeList_[NpointLabel]
400 mergeList_[PpointLabel],
401 mergeList_[NpointLabel]
415 <<
"Point merging failed after max number of passes." 419 while (changedPointMerge);
426 forAll(blockinternalFaces, blockFaceLabel)
428 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
429 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
431 const labelList& blockPfaces = blockCells[blockPlabel];
432 const labelList& blockNfaces = blockCells[blockNlabel];
434 const pointField& blockPpoints = blocks[blockPlabel].points();
435 const pointField& blockNpoints = blocks[blockNlabel].points();
437 bool foundFace =
false;
438 label blockPfaceLabel;
442 blockPfaceLabel < blockPfaces.size();
448 blockFaces[blockPfaces[blockPfaceLabel]]
449 == blockinternalFaces[blockFaceLabel]
460 <<
"Cannot find merge face for block " << blockPlabel
465 label blockNfaceLabel;
469 blockNfaceLabel < blockNfaces.size();
475 blockFaces[blockNfaces[blockNfaceLabel]]
476 == blockinternalFaces[blockFaceLabel]
487 <<
"Cannot find merge face for block " << blockNlabel
491 const List<FixedList<label, 4>>& blockPfaceFaces =
492 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
494 const List<FixedList<label, 4>>& blockNfaceFaces =
495 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
497 forAll(blockPfaceFaces, blockPfaceFaceLabel)
499 const FixedList<label, 4>& blockPfaceFacePoints
500 = blockPfaceFaces[blockPfaceFaceLabel];
502 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
505 blockPfaceFacePoints[blockPfaceFacePointLabel]
506 + blockOffsets_[blockPlabel];
508 if (mergeList_[PpointLabel] == -1)
511 <<
"Unable to merge point " 512 << blockPfaceFacePointLabel
513 <<
' ' << blockPpoints[blockPfaceFacePointLabel]
523 forAll(blockNfaceFaces, blockNfaceFaceLabel)
525 const FixedList<label, 4>& blockNfaceFacePoints
526 = blockNfaceFaces[blockNfaceFaceLabel];
528 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
531 blockNfaceFacePoints[blockNfaceFacePointLabel]
532 + blockOffsets_[blockNlabel];
534 if (mergeList_[NpointLabel] == -1)
537 <<
"unable to merge point " 538 << blockNfaceFacePointLabel
539 <<
' ' << blockNpoints[blockNfaceFacePointLabel]
553 label newPointLabel = 0;
555 forAll(mergeList_, pointLabel)
557 if (mergeList_[pointLabel] > pointLabel)
560 <<
"Merge list contains point index out of range" 566 mergeList_[pointLabel] == -1
567 || mergeList_[pointLabel] == pointLabel
570 mergeList_[pointLabel] = newPointLabel;
575 mergeList_[pointLabel] = mergeList_[mergeList_[pointLabel]];
579 nPoints_ = newPointLabel;
List< labelList > labelListList
A List of labelList.
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
errorManipArg< error, int > exit(error &err, const int errNo=1)
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
virtual const labelList & faceNeighbour() const
Return face neighbour.
PtrList< block > blockList
A PtrList of blocks.
Ostream & endl(Ostream &os)
Add newline and flush stream.
const cellList & cells() const
SubList< face > subList
Declare type of subList.
virtual const pointField & points() const
Return raw points.
vectorField pointField
pointField is a vectorField.
const polyMesh & topology() const
Return the blockMesh topology as a polyMesh.
virtual const labelList & faceOwner() const
Return face owner.
List< label > labelList
A List of labels.
virtual const faceList & faces() const
Return raw faces.
dimensioned< scalar > magSqr(const dimensioned< Type > &)
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
void setSize(const label)
Reset size of List.
Ostream & flush(Ostream &os)
Flush stream.
List< labelListList > labelListListList
A List of labelListList.
const pointField & points() const
The points for the entire mesh.
List< cell > cellList
list of cells