45 static const int faceEdgeDirs[6][4] =
61 for(
int facePi=0; facePi<6; facePi++)
63 for(
int faceNi=0; faceNi<6; faceNi++)
65 for(
int rot=0; rot<4; rot++)
67 Pair<int>& map = faceFaceRotMap[facePi][faceNi][rot];
69 for(
int Pp=0; Pp<2; Pp++)
71 int Pdir = faceEdgeDirs[facePi][Pp];
72 int Np = (3 - Pp + rot)%4;
73 int Ndir = faceEdgeDirs[faceNi][Np];
78 if (
mag(map[0]) == 2 && map[0]*map[1] < 0)
98 for(
int rot=0; rot<4; rot++)
100 if (faceN[rot] == faceP[0])
102 return faceFaceRotMap[facePi][faceNi][rot];
108 "faceMap(const label facePi, const face& faceP, " 109 "const label faceNi, const face& faceN)" 110 ) <<
"Cannot find point correspondance for faces " 111 << faceP <<
" and " << faceN
126 forAll(topoInternalFaces, topoFacei)
128 label topoPi = topoFaceCell[topoFacei];
129 const labelList& topoPfaces = topoCells[topoPi];
131 bool foundFace =
false;
136 topoPfacei < topoPfaces.
size();
140 if (topoPfaces[topoPfacei] == topoFacei)
150 <<
"Cannot find merge face for block " << topoPi
154 mergeBlock[topoFacei].first() = topoPi;
155 mergeBlock[topoFacei].second() = topoPfacei;
188 return map < 0 ? -i-1 : i;
194 return i >= 0 ? i : ni + i + 1;
294 void Foam::blockMesh::calcMergeInfoFast()
303 Info<<
"Creating block offsets" <<
endl;
306 blockOffsets_.setSize(blocks.
size());
313 blockOffsets_[blockI] = nPoints_;
315 nPoints_ += blocks[blockI].nPoints();
316 nCells_ += blocks[blockI].nCells();
321 Info<<
"Creating merge list using the fast topological search" 326 mergeList_.setSize(nPoints_, -1);
329 const pointField& topoPoints = topology().points();
330 const cellList& topoCells = topology().cells();
331 const faceList& topoFaces = topology().faces();
332 const labelList& topoFaceOwn = topology().faceOwner();
333 const labelList& topoFaceNei = topology().faceNeighbour();
341 topology().nInternalFaces()
367 forAll(topoInternalFaces, topoFacei)
371 Info<<
"Processing face " << topoFacei <<
endl;
374 label blockPi = mergeBlockP[topoFacei].first();
375 label blockPfacei = mergeBlockP[topoFacei].second();
377 label blockNi = mergeBlockN[topoFacei].first();
378 label blockNfacei = mergeBlockN[topoFacei].second();
385 blocks[blockPi].blockShape().faces()[blockPfacei],
387 blocks[blockNi].blockShape().faces()[blockNfacei]
393 Info<<
" Face map for faces " 394 << blocks[blockPi].blockShape().faces()[blockPfacei] <<
" " 395 << blocks[blockNi].blockShape().faces()[blockNfacei] <<
": " 399 const pointField& blockPpoints = blocks[blockPi].points();
400 const pointField& blockNpoints = blocks[blockNi].points();
408 NPnij[0] = Nnij[
mag(fmap[0]) - 1];
409 NPnij[1] = Nnij[
mag(fmap[1]) - 1];
414 <<
"Sub-division mismatch between face " 415 << blockPfacei <<
" of block " << blockPi << Pnij
417 << blockNfacei <<
" of block " << blockNi << Nnij
425 const boundBox bb(topoCells[blockPi].
points(topoFaces, topoPoints));
429 scalar maxSqrDist = 0;
436 facePoint(blockPfacei, blocks[blockPi], i, j);
439 facePointN(blockNfacei, fmap, blocks[blockNi], i, j);
445 blockPpoints[blockPpointi]
446 - blockNpoints[blockNpointi]
450 if (sqrDist > testSqrDist)
453 <<
"Point merge failure between face " 454 << blockPfacei <<
" of block " << blockPi
456 << blockNfacei <<
" of block " << blockNi
458 <<
" Points: " << blockPpoints[blockPpointi]
459 <<
" " << blockNpoints[blockNpointi]
461 <<
" This may be due to inconsistent grading." 465 maxSqrDist =
max(maxSqrDist, sqrDist);
467 label Ppointi = blockPpointi + blockOffsets_[blockPi];
468 label Npointi = blockNpointi + blockOffsets_[blockNi];
470 label minPNi =
min(Ppointi, Npointi);
472 if (mergeList_[Ppointi] != -1)
474 minPNi =
min(minPNi, mergeList_[Ppointi]);
477 if (mergeList_[Npointi] != -1)
479 minPNi =
min(minPNi, mergeList_[Npointi]);
482 mergeList_[Ppointi] = mergeList_[Npointi] = minPNi;
488 Info<<
" Max distance between merge points: " 494 bool changedPointMerge =
false;
499 changedPointMerge =
false;
502 forAll(topoInternalFaces, topoFacei)
504 label blockPi = mergeBlockP[topoFacei].first();
505 label blockPfacei = mergeBlockP[topoFacei].second();
507 label blockNi = mergeBlockN[topoFacei].first();
508 label blockNfacei = mergeBlockN[topoFacei].second();
515 blocks[blockPi].blockShape().faces()[blockPfacei],
517 blocks[blockNi].blockShape().faces()[blockNfacei]
528 facePoint(blockPfacei, blocks[blockPi], i, j);
531 facePointN(blockNfacei, fmap, blocks[blockNi], i, j);
534 blockPpointi + blockOffsets_[blockPi];
537 blockNpointi + blockOffsets_[blockNi];
539 if (mergeList_[Ppointi] != mergeList_[Npointi])
541 changedPointMerge =
true;
544 = mergeList_[Npointi]
545 =
min(mergeList_[Ppointi], mergeList_[Npointi]);
559 <<
"Point merging failed after 100 passes." 563 }
while (changedPointMerge);
567 label nUniqPoints = 0;
569 forAll(mergeList_, pointi)
571 if (mergeList_[pointi] > pointi)
574 <<
"Merge list contains point index out of range" 578 if (mergeList_[pointi] == -1 || mergeList_[pointi] == pointi)
580 mergeList_[pointi] = nUniqPoints++;
584 mergeList_[pointi] = mergeList_[mergeList_[pointi]];
589 nPoints_ = nUniqPoints;
dimensionedScalar sqrt(const dimensionedScalar &ds)
const pointField & points
label size() const
Return the number of elements in the PtrList.
An ordered pair of two objects of type <T> with first() and second() elements.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
dimensioned< scalar > mag(const dimensioned< Type > &)
dimensioned< scalar > magSqr(const dimensioned< Type > &)
const Type & second() const
Return second.
vector span() const
The bounding box span (from minimum to maximum)
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
void size(const label)
Override size to be inconsistent with allocated storage.
errorManipArg< error, int > exit(error &err, const int errNo=1)
label mapij(const int map, const label i, const label j)
label facePoint(const int facei, const block &block, const label i, const label j)
void setBlockFaceCorrespondence(const cellList &topoCells, const faceList::subList &topoInternalFaces, const labelList &topoFaceCell, List< Pair< label > > &mergeBlock)
Ostream & flush(Ostream &os)
Flush stream.
A face is a list of labels corresponding to mesh vertices.
const double e
Elementary charge.
Ostream & endl(Ostream &os)
Add newline and flush stream.
label facePointN(const block &block, const label i, const label j, const label k)
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
const Vector< label > & meshDensity() const
Return the mesh density (number of cells) in the i,j,k directions.
label signIndex(const int map, const label i)
label size() const
Return the number of elements in the UList.
#define FatalErrorIn(functionName)
Report an error message using Foam::FatalError.
A bounding box defined in terms of the points at its extremities.
label vtxLabel(label i, label j, label k) const
Vertex label offset for a particular i,j,k position.
const Type & first() const
Return first.
Pair< label > faceNij(const label facei, const block &block)
A List obtained as a section of another List.
label unsignIndex(const label i, const label ni)
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)