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
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)
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
213 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
215 if (blockPfaceFaces.size() != blockNfaceFaces.size())
218 <<
"Inconsistent number of faces between block pair " 219 << blockPlabel <<
" and " << blockNlabel
226 forAll(blockPfaceFaces, blockPfaceFaceLabel)
229 = blockPfaceFaces[blockPfaceFaceLabel];
231 labelList& cp = curPairs[blockPfaceFaceLabel];
232 cp.
setSize(blockPfaceFacePoints.size());
235 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
237 forAll(blockNfaceFaces, blockNfaceFaceLabel)
240 = blockNfaceFaces[blockNfaceFaceLabel];
242 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
249 [blockPfaceFacePoints[blockPfaceFacePointLabel]]
251 [blockNfaceFacePoints[blockNfaceFacePointLabel]]
257 cp[blockPfaceFacePointLabel] =
258 blockNfaceFacePoints[blockNfaceFacePointLabel];
261 blockPfaceFacePoints[blockPfaceFacePointLabel]
262 + blockOffsets_[blockPlabel];
265 blockNfaceFacePoints[blockNfaceFacePointLabel]
266 + blockOffsets_[blockNlabel];
268 label minPN =
min(PpointLabel, NpointLabel);
270 if (mergeList_[PpointLabel] != -1)
272 minPN =
min(minPN, mergeList_[PpointLabel]);
275 if (mergeList_[NpointLabel] != -1)
277 minPN =
min(minPN, mergeList_[NpointLabel]);
280 mergeList_[PpointLabel] = mergeList_[NpointLabel]
286 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
288 if (cp[blockPfaceFacePointLabel] == -1)
291 <<
"Inconsistent point locations between block pair " 292 << blockPlabel <<
" and " << blockNlabel <<
nl 293 <<
" probably due to inconsistent grading." 308 bool changedPointMerge =
false;
313 changedPointMerge =
false;
316 forAll(blockInternalFaces, blockFaceLabel)
318 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
319 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
321 const labelList& blockPfaces = blockCells[blockPlabel];
322 const labelList& blockNfaces = blockCells[blockNlabel];
324 const labelListList& curPairs = glueMergePairs[blockFaceLabel];
326 label blockPfaceLabel;
330 blockPfaceLabel < blockPfaces.size();
336 blockFaces[blockPfaces[blockPfaceLabel]]
337 == blockInternalFaces[blockFaceLabel]
345 label blockNfaceLabel;
349 blockNfaceLabel < blockNfaces.size();
355 blockFaces[blockNfaces[blockNfaceLabel]]
356 == blockInternalFaces[blockFaceLabel]
365 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
367 forAll(blockPfaceFaces, blockPfaceFaceLabel)
370 = blockPfaceFaces[blockPfaceFaceLabel];
372 const labelList& cp = curPairs[blockPfaceFaceLabel];
374 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
377 blockPfaceFacePoints[blockPfaceFacePointLabel]
378 + blockOffsets_[blockPlabel];
381 cp[blockPfaceFacePointLabel]
382 + blockOffsets_[blockNlabel];
386 mergeList_[PpointLabel]
387 != mergeList_[NpointLabel]
390 changedPointMerge =
true;
392 mergeList_[PpointLabel]
393 = mergeList_[NpointLabel]
396 mergeList_[PpointLabel],
397 mergeList_[NpointLabel]
411 <<
"Point merging failed after max number of passes." 415 while (changedPointMerge);
422 forAll(blockInternalFaces, blockFaceLabel)
424 label blockPlabel = faceOwnerBlocks[blockFaceLabel];
425 label blockNlabel = faceNeighbourBlocks[blockFaceLabel];
427 const labelList& blockPfaces = blockCells[blockPlabel];
428 const labelList& blockNfaces = blockCells[blockNlabel];
430 const pointField& blockPpoints = blocks[blockPlabel].points();
431 const pointField& blockNpoints = blocks[blockNlabel].points();
433 bool foundFace =
false;
434 label blockPfaceLabel;
438 blockPfaceLabel < blockPfaces.size();
444 blockFaces[blockPfaces[blockPfaceLabel]]
445 == blockInternalFaces[blockFaceLabel]
456 <<
"Cannot find merge face for block " << blockPlabel
461 label blockNfaceLabel;
465 blockNfaceLabel < blockNfaces.size();
471 blockFaces[blockNfaces[blockNfaceLabel]]
472 == blockInternalFaces[blockFaceLabel]
483 <<
"Cannot find merge face for block " << blockNlabel
488 blocks[blockPlabel].boundaryPatches()[blockPfaceLabel];
491 blocks[blockNlabel].boundaryPatches()[blockNfaceLabel];
493 forAll(blockPfaceFaces, blockPfaceFaceLabel)
496 = blockPfaceFaces[blockPfaceFaceLabel];
498 forAll(blockPfaceFacePoints, blockPfaceFacePointLabel)
501 blockPfaceFacePoints[blockPfaceFacePointLabel]
502 + blockOffsets_[blockPlabel];
504 if (mergeList_[PpointLabel] == -1)
507 <<
"Unable to merge point " 508 << blockPfaceFacePointLabel
509 <<
' ' << blockPpoints[blockPfaceFacePointLabel]
519 forAll(blockNfaceFaces, blockNfaceFaceLabel)
522 = blockNfaceFaces[blockNfaceFaceLabel];
524 forAll(blockNfaceFacePoints, blockNfaceFacePointLabel)
527 blockNfaceFacePoints[blockNfaceFacePointLabel]
528 + blockOffsets_[blockNlabel];
530 if (mergeList_[NpointLabel] == -1)
533 <<
"unable to merge point " 534 << blockNfaceFacePointLabel
535 <<
' ' << blockNpoints[blockNfaceFacePointLabel]
549 label newPointLabel = 0;
551 forAll(mergeList_, pointLabel)
553 if (mergeList_[pointLabel] > pointLabel)
556 <<
"Merge list contains point index out of range" 562 mergeList_[pointLabel] == -1
563 || mergeList_[pointLabel] == pointLabel
566 mergeList_[pointLabel] = newPointLabel;
571 mergeList_[pointLabel] = mergeList_[mergeList_[pointLabel]];
575 nPoints_ = newPointLabel;
const polyMesh & topology() const
Return the blockMesh topology as a polyMesh.
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.
PtrList< block > blockList
A PtrList of blocks.
Ostream & endl(Ostream &os)
Add newline and flush stream.
SubList< face > subList
Declare type of subList.
const cellList & cells() const
virtual const pointField & points() const
Return raw points.
vectorField pointField
pointField is a vectorField.
List< label > labelList
A List of labels.
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.
virtual const labelList & faceNeighbour() const
Return face neighbour.
List< labelListList > labelListListList
A List of labelListList.
const pointField & points() const
The points for the entire mesh.
virtual const labelList & faceOwner() const
Return face owner.
virtual const faceList & faces() const
Return raw faces.
List< cell > cellList
list of cells