64 void Foam::globalMeshData::initProcAddr()
67 processorPatchIndices_ = -1;
70 processorPatchNeighbours_ = -1;
76 label nNeighbours = 0;
80 if (isA<processorPolyPatch>(mesh_.
boundaryMesh()[patchi]))
82 processorPatches_[nNeighbours] = patchi;
83 processorPatchIndices_[patchi] = nNeighbours++;
86 processorPatches_.
resize(nNeighbours);
91 PstreamBuffers pBufs(mesh_.
comm());
94 for (
const label patchi : processorPatches_)
98 refCast<const processorPolyPatch>
105 toNeighbour << processorPatchIndices_[patchi];
108 pBufs.finishedSends();
110 for (
const label patchi : processorPatches_)
112 UIPstream fromNeighbour
114 refCast<const processorPolyPatch>
121 fromNeighbour >> processorPatchNeighbours_[patchi];
127 void Foam::globalMeshData::calcSharedPoints()
const 132 || sharedPointLabelsPtr_
133 || sharedPointAddrPtr_
142 const globalPoints parallelPoints(mesh_,
false,
true);
146 forAll(parallelPoints.pointPoints(), i)
148 const labelList& pPoints = parallelPoints.pointPoints()[i];
150 parallelPoints.transformedPointPoints()[i];
152 if (pPoints.size()+transPPoints.size() > 0)
159 const globalIndex masterNumbering(nMaster);
161 nGlobalPoints_ = masterNumbering.totalSize();
168 labelList master(parallelPoints.map().constructSize(), -1);
169 forAll(parallelPoints.pointPoints(), i)
171 const labelList& pPoints = parallelPoints.pointPoints()[i];
173 parallelPoints.transformedPointPoints()[i];
175 if (pPoints.size()+transPPoints.size() > 0)
177 master[i] = masterNumbering.toGlobal(nMaster);
198 parallelPoints.map().reverseDistribute
200 parallelPoints.map().constructSize(),
207 forAll(parallelPoints.pointPoints(), i)
215 sharedPointLabelsPtr_.reset(
new labelList(nMaster));
216 labelList& sharedPointLabels = sharedPointLabelsPtr_();
217 sharedPointAddrPtr_.reset(
new labelList(nMaster));
218 labelList& sharedPointAddr = sharedPointAddrPtr_();
221 forAll(parallelPoints.pointPoints(), i)
226 sharedPointLabels[nMaster] = i;
227 sharedPointAddr[nMaster] = master[i];
234 Pout<<
"globalMeshData : nGlobalPoints_:" << nGlobalPoints_ <<
nl 235 <<
"globalMeshData : sharedPointLabels_:" 236 << sharedPointLabelsPtr_().size() <<
nl 237 <<
"globalMeshData : sharedPointAddr_:" 238 << sharedPointAddrPtr_().size() <<
endl;
243 void Foam::globalMeshData::countSharedEdges
245 const EdgeMap<labelList>& procSharedEdges,
246 EdgeMap<label>& globalShared,
253 const edge&
e = iter.key();
255 auto globalFnd = globalShared.find(
e);
257 if (globalFnd.good())
259 if (globalFnd() == -1)
263 globalFnd() = sharedEdgeI++;
269 if (iter().size() == 1)
272 globalShared.insert(
e, -1);
278 globalShared.insert(
e, sharedEdgeI++);
285 void Foam::globalMeshData::calcSharedEdges()
const 295 || sharedEdgeLabelsPtr_
296 || sharedEdgeAddrPtr_
304 const labelList& sharedPtAddr = sharedPointAddr();
305 const labelList& sharedPtLabels = sharedPointLabels();
309 Map<label> meshToShared(
invertToMap(sharedPtLabels));
315 EdgeMap<labelList> localShared(2*sharedPtAddr.size());
317 const edgeList& edges = mesh_.edges();
321 const edge&
e = edges[edgei];
323 const auto e0Fnd = meshToShared.cfind(
e[0]);
327 const auto e1Fnd = meshToShared.cfind(
e[1]);
337 sharedPtAddr[e0Fnd.val()],
338 sharedPtAddr[e1Fnd.val()]
342 localShared(sharedEdge).push_back(edgei);
357 EdgeMap<label> globalShared(2*nGlobalPoints());
361 label sharedEdgeI = 0;
366 Pout<<
"globalMeshData::calcSharedEdges : Merging in from proc0 : " 367 << localShared.size() <<
endl;
369 countSharedEdges(localShared, globalShared, sharedEdgeI);
377 EdgeMap<labelList> procSharedEdges;
382 Pout<<
"globalMeshData::calcSharedEdges : " 383 <<
"Merging in from proc" 384 << proci <<
" : " << procSharedEdges.size()
387 countSharedEdges(procSharedEdges, globalShared, sharedEdgeI);
395 EdgeMap<label> oldSharedEdges(std::move(globalShared));
396 globalShared.clear();
400 if (iter.val() != -1)
402 globalShared.insert(iter.key(), iter.val());
408 Pout<<
"globalMeshData::calcSharedEdges : Filtered " 409 << oldSharedEdges.size()
410 <<
" down to " << globalShared.size() <<
endl;
430 nGlobalEdges_ = globalShared.size();
432 DynamicList<label> dynSharedEdgeLabels(globalShared.size());
433 DynamicList<label> dynSharedEdgeAddr(globalShared.size());
437 const edge&
e = iter.key();
439 const auto edgeFnd = globalShared.cfind(
e);
445 const labelList& edgeLabels = iter.val();
447 for (
const label edgei : edgeLabels)
450 dynSharedEdgeLabels.
append(edgei);
453 dynSharedEdgeAddr.append(edgeFnd());
459 sharedEdgeLabelsPtr_.reset
461 new labelList(std::move(dynSharedEdgeLabels))
464 sharedEdgeAddrPtr_.reset
466 new labelList(std::move(dynSharedEdgeAddr))
471 Pout<<
"globalMeshData : nGlobalEdges_:" << nGlobalEdges_ <<
nl 472 <<
"globalMeshData : sharedEdgeLabels:" 473 << sharedEdgeLabelsPtr_().size() <<
nl 474 <<
"globalMeshData : sharedEdgeAddr:" 475 << sharedEdgeAddrPtr_().size() <<
endl;
480 void Foam::globalMeshData::calcGlobalPointSlaves()
const 484 Pout<<
"globalMeshData::calcGlobalPointSlaves() :" 485 <<
" calculating coupled master to slave point addressing." 490 globalPoints globalData(mesh_, coupledPatch(),
true,
true);
492 globalPointSlavesPtr_.reset
496 std::move(globalData.pointPoints())
499 globalPointTransformedSlavesPtr_.reset
503 std::move(globalData.transformedPointPoints())
507 globalPointSlavesMapPtr_.reset
511 std::move(globalData.map())
517 void Foam::globalMeshData::calcPointConnectivity
519 List<labelPairList>& allPointConnectivity
522 const globalIndexAndTransform& transforms = globalTransforms();
524 const labelListList& transformedSlaves = globalPointTransformedSlaves();
528 labelPairList myData(globalPointSlavesMap().constructSize());
531 myData[pointi] = transforms.encode
535 transforms.nullTransformIndex()
539 globalPointSlavesMap().distribute(myData);
543 allPointConnectivity.setSize(globalPointSlavesMap().constructSize());
551 const labelList& pSlaves = slaves[pointi];
552 const labelList& pTransformSlaves = transformedSlaves[pointi];
554 if (pSlaves.size()+pTransformSlaves.size())
558 pConnectivity.setSize(1+pSlaves.size()+pTransformSlaves.size());
562 pConnectivity[connI++] = myData[pointi];
566 pConnectivity[connI++] = myData[pSlaves[i]];
569 forAll(pTransformSlaves, i)
572 label transformI = globalPointSlavesMap().whichTransform
577 const labelPair&
n = myData[pTransformSlaves[i]];
578 label proci = transforms.processor(
n);
579 label index = transforms.index(
n);
580 pConnectivity[connI++] = transforms.encode
591 allPointConnectivity[pSlaves[i]] = pConnectivity;
593 forAll(pTransformSlaves, i)
595 allPointConnectivity[pTransformSlaves[i]] = pConnectivity;
606 if (pConnectivity.size() == 0)
608 pConnectivity.setSize(1, myData[pointi]);
613 globalPointSlavesMap().reverseDistribute
621 void Foam::globalMeshData::calcGlobalPointEdges
624 List<labelPairList>& globalPointPoints
627 const edgeList& edges = coupledPatch().edges();
628 const labelListList& pointEdges = coupledPatch().pointEdges();
629 const globalIndex& globalEdgeNumbers = globalEdgeNumbering();
631 const labelListList& transformedSlaves = globalPointTransformedSlaves();
632 const globalIndexAndTransform& transforms = globalTransforms();
636 globalPointEdges.setSize(globalPointSlavesMap().constructSize());
637 globalPointPoints.setSize(globalPointSlavesMap().constructSize());
638 forAll(pointEdges, pointi)
640 const labelList& pEdges = pointEdges[pointi];
641 globalPointEdges[pointi] = globalEdgeNumbers.toGlobal(pEdges);
644 globalPPoints.setSize(pEdges.size());
647 label otherPointi = edges[pEdges[i]].otherVertex(pointi);
648 globalPPoints[i] = transforms.encode
652 transforms.nullTransformIndex()
658 globalPointSlavesMap().distribute(globalPointEdges);
659 globalPointSlavesMap().distribute(globalPointPoints);
663 const labelList& pSlaves = slaves[pointi];
664 const labelList& pTransformSlaves = transformedSlaves[pointi];
669 n += globalPointEdges[pSlaves[i]].size();
671 forAll(pTransformSlaves, i)
673 n += globalPointEdges[pTransformSlaves[i]].size();
678 labelList& globalPEdges = globalPointEdges[pointi];
679 label sz = globalPEdges.
size();
680 globalPEdges.setSize(sz+
n);
683 const labelList& otherData = globalPointEdges[pSlaves[i]];
686 globalPEdges[sz++] = otherData[j];
689 forAll(pTransformSlaves, i)
692 globalPointEdges[pTransformSlaves[i]];
695 globalPEdges[sz++] = otherData[j];
702 globalPointEdges[pSlaves[i]] = globalPEdges;
704 forAll(pTransformSlaves, i)
706 globalPointEdges[pTransformSlaves[i]] = globalPEdges;
714 label sz = globalPPoints.size();
715 globalPPoints.setSize(sz +
n);
720 const labelPairList& otherData = globalPointPoints[pSlaves[i]];
723 globalPPoints[sz++] = otherData[j];
727 forAll(pTransformSlaves, i)
730 label transformI = globalPointSlavesMap().whichTransform
736 globalPointPoints[pTransformSlaves[i]];
741 label proci = transforms.processor(
n);
742 label index = transforms.index(
n);
743 globalPPoints[sz++] = transforms.encode
755 globalPointPoints[pSlaves[i]] = globalPPoints;
757 forAll(pTransformSlaves, i)
759 globalPointPoints[pTransformSlaves[i]] = globalPPoints;
764 globalPointSlavesMap().reverseDistribute
770 globalPointSlavesMap().reverseDistribute
778 Foam::label Foam::globalMeshData::findTransform
782 const label localPoint
785 const globalIndexAndTransform& transforms = globalTransforms();
787 const label remoteProci = transforms.processor(remotePoint);
788 const label remoteIndex = transforms.index(remotePoint);
790 label remoteTransformI = -1;
791 label localTransformI = -1;
794 label proci = transforms.processor(info[i]);
795 label pointi = transforms.index(info[i]);
796 label transformI = transforms.transformIndex(info[i]);
800 localTransformI = transformI;
805 if (proci == remoteProci && pointi == remoteIndex)
807 remoteTransformI = transformI;
815 if (remoteTransformI == -1 || localTransformI == -1)
818 <<
"Problem. Cannot find " << remotePoint
819 <<
" or " << localPoint <<
" " 820 << coupledPatch().localPoints()[localPoint]
823 <<
"remoteTransformI:" << remoteTransformI <<
endl 824 <<
"localTransformI:" << localTransformI
828 return transforms.subtractTransformIndex
836 void Foam::globalMeshData::calcGlobalEdgeSlaves()
const 840 Pout<<
"globalMeshData::calcGlobalEdgeSlaves() :" 841 <<
" calculating coupled master to slave edge addressing." <<
endl;
844 const edgeList& edges = coupledPatch().edges();
845 const globalIndex& globalEdgeNumbers = globalEdgeNumbering();
846 const globalIndexAndTransform& transforms = globalTransforms();
859 List<labelPairList> allPointConnectivity;
860 calcPointConnectivity(allPointConnectivity);
866 List<labelPairList> globalPointPoints;
867 calcGlobalPointEdges(globalPointEdges, globalPointPoints);
880 List<labelPairList> allEdgeConnectivity(edges.size());
884 const edge&
e = edges[edgeI];
885 const labelList& pEdges0 = globalPointEdges[
e[0]];
887 const labelList& pEdges1 = globalPointEdges[
e[1]];
891 DynamicList<labelPair> eEdges(2);
899 transforms.nullTransformIndex()
909 pEdges0[i] == pEdges1[j]
910 && pEdges0[i] != globalEdgeNumbers.toGlobal(edgeI)
922 label transform0 = findTransform
924 allPointConnectivity[
e[0]],
928 label transform1 = findTransform
930 allPointConnectivity[
e[1]],
935 if (transform0 == transform1)
937 label proci = globalEdgeNumbers.whichProcID(pEdges0[i]);
943 globalEdgeNumbers.toLocal(proci, pEdges0[i]),
952 allEdgeConnectivity[edgeI].transfer(eEdges);
955 allEdgeConnectivity[edgeI],
966 List<labelPairList> transformedEdges(edges.size());
967 forAll(allEdgeConnectivity, edgeI)
970 if (edgeInfo.size() >= 2)
972 const labelPair& masterInfo = edgeInfo[0];
978 transforms.processor(masterInfo)
981 && (transforms.index(masterInfo) == edgeI)
985 labelList& eEdges = globalEdgeSlaves[edgeI];
986 eEdges.
setSize(edgeInfo.size()-1);
989 trafoEEdges.setSize(edgeInfo.size()-1);
991 label nonTransformI = 0;
992 label transformI = 0;
994 for (label i = 1; i < edgeInfo.size(); i++)
997 label proci = transforms.processor(info);
998 label index = transforms.index(info);
999 label
transform = transforms.transformIndex
1004 if (
transform == transforms.nullTransformIndex())
1006 eEdges[nonTransformI++] = globalEdgeNumbers.toGlobal
1014 trafoEEdges[transformI++] = info;
1018 eEdges.setSize(nonTransformI);
1019 trafoEEdges.setSize(transformI);
1029 globalEdgeSlavesMapPtr_.reset
1038 globalEdgeTransformedSlavesPtr_(),
1047 Pout<<
"globalMeshData::calcGlobalEdgeSlaves() :" 1048 <<
" coupled edges:" << edges.size()
1049 <<
" additional coupled edges:" 1050 << globalEdgeSlavesMapPtr_().constructSize() - edges.size()
1056 void Foam::globalMeshData::calcGlobalEdgeOrientation()
const 1060 Pout<<
"globalMeshData::calcGlobalEdgeOrientation() :" 1061 <<
" calculating edge orientation w.r.t. master edge." <<
endl;
1064 const globalIndex& globalPoints = globalPointNumbering();
1069 const mapDistribute& map = globalPointSlavesMap();
1071 masterPoint.setSize(map.constructSize());
1074 for (label pointi = 0; pointi < coupledPatch().nPoints(); pointi++)
1076 masterPoint[pointi] = globalPoints.toGlobal(pointi);
1081 globalPointSlaves(),
1082 globalPointTransformedSlaves(),
1093 const mapDistribute& map = globalEdgeSlavesMap();
1095 const labelListList& transformedSlaves = globalEdgeTransformedSlaves();
1101 for (label edgeI = 0; edgeI < coupledPatch().nEdges(); edgeI++)
1106 slaves[edgeI].size()
1107 + transformedSlaves[edgeI].size()
1114 const edge&
e = coupledPatch().edges()[edgeI];
1128 minEqOp<labelPair>()
1132 globalEdgeOrientationPtr_.reset
1134 new bitSet(coupledPatch().nEdges())
1136 bitSet& globalEdgeOrientation = globalEdgeOrientationPtr_();
1138 forAll(coupledPatch().edges(), edgeI)
1143 const edge&
e = coupledPatch().edges()[edgeI];
1153 masterEdgeVerts[edgeI]
1158 <<
"problem : my edge:" <<
e 1159 <<
" in master points:" << masterE
1160 <<
" v.s. masterEdgeVerts:" << masterEdgeVerts[edgeI]
1165 globalEdgeOrientation.set(edgeI, (stat == 1));
1170 globalEdgeOrientation.set(edgeI,
true);
1177 Pout<<
"globalMeshData::calcGlobalEdgeOrientation() :" 1178 <<
" finished calculating edge orientation." 1184 void Foam::globalMeshData::calcPointBoundaryFaces
1189 const polyBoundaryMesh&
bMesh = mesh_.boundaryMesh();
1190 const Map<label>& meshPointMap = coupledPatch().meshPointMap();
1196 for (
const polyPatch&
pp :
bMesh)
1200 for (
const face&
f :
pp)
1204 const auto iter = meshPointMap.cfind(
f[fp]);
1207 nPointFaces[iter.val()]++;
1217 pointBoundaryFaces.setSize(coupledPatch().
nPoints());
1218 forAll(nPointFaces, pointi)
1220 pointBoundaryFaces[pointi].setSize(nPointFaces[pointi]);
1229 const polyPatch&
pp =
bMesh[patchi];
1235 const face&
f =
pp[i];
1238 const auto iter = meshPointMap.cfind(
f[fp]);
1243 pp.start() + i - mesh_.nInternalFaces();
1244 pointBoundaryFaces[iter()][nPointFaces[iter()]++] =
1254 void Foam::globalMeshData::calcGlobalPointBoundaryFaces()
const 1258 Pout<<
"globalMeshData::calcGlobalPointBoundaryFaces() :" 1259 <<
" calculating coupled point to boundary face addressing." 1267 calcPointBoundaryFaces(pointBoundaryFaces);
1271 globalBoundaryFaceNumberingPtr_.reset
1273 new globalIndex(mesh_.nBoundaryFaces())
1275 const auto& globalIndices = *globalBoundaryFaceNumberingPtr_;
1279 globalPointBoundaryFacesPtr_.reset
1283 auto& globalPointBoundaryFaces = *globalPointBoundaryFacesPtr_;
1285 forAll(pointBoundaryFaces, pointi)
1287 globalPointBoundaryFaces[pointi] = globalIndices.toGlobal
1290 pointBoundaryFaces[pointi]
1296 globalPointSlavesMap().distribute
1298 globalPointBoundaryFaces,
1307 globalPointTransformedSlaves();
1308 const globalIndexAndTransform& transforms = globalTransforms();
1312 List<labelPairList> transformedFaces(pointSlaves.size());
1315 forAll(pointSlaves, pointi)
1317 const labelList& slaves = pointSlaves[pointi];
1318 const labelList& transformedSlaves = pointTransformSlaves[pointi];
1320 if (slaves.size() > 0)
1322 labelList& myBFaces = globalPointBoundaryFaces[pointi];
1323 label sz = myBFaces.
size();
1329 n += globalPointBoundaryFaces[slaves[i]].size();
1332 myBFaces.setSize(sz+
n);
1337 globalPointBoundaryFaces[slaves[i]];
1342 for (
const label slave : slaveBFaces)
1344 if (!SubList<label>(myBFaces, sz).
found(slave))
1346 myBFaces[
n++] = slave;
1354 if (transformedSlaves.size() > 0)
1356 const labelList& untrafoFaces = globalPointBoundaryFaces[pointi];
1359 label sz = myBFaces.size();
1363 forAll(transformedSlaves, i)
1365 n += globalPointBoundaryFaces[transformedSlaves[i]].size();
1368 myBFaces.setSize(sz+
n);
1370 forAll(transformedSlaves, i)
1372 label transformI = globalPointSlavesMap().whichTransform
1374 transformedSlaves[i]
1378 globalPointBoundaryFaces[transformedSlaves[i]];
1380 for (
const label slave : slaveBFaces)
1383 if (!untrafoFaces.found(slave))
1385 label proci = globalIndices.whichProcID(slave);
1386 label facei = globalIndices.toLocal(proci, slave);
1388 myBFaces[
n++] = transforms.encode
1401 if (slaves.size() + transformedSlaves.size() == 0)
1403 globalPointBoundaryFaces[pointi].clear();
1410 globalPointTransformedBoundaryFacesPtr_.reset
1415 globalPointBoundaryFacesMapPtr_.reset
1420 globalPointBoundaryFaces,
1424 globalPointTransformedBoundaryFacesPtr_(),
1429 globalPointBoundaryFaces.setSize(coupledPatch().
nPoints());
1430 globalPointTransformedBoundaryFacesPtr_().setSize(coupledPatch().
nPoints());
1434 Pout<<
"globalMeshData::calcGlobalPointBoundaryFaces() :" 1435 <<
" coupled points:" << coupledPatch().nPoints()
1436 <<
" local boundary faces:" << globalIndices.localSize()
1437 <<
" additional coupled faces:" 1438 << globalPointBoundaryFacesMapPtr_().constructSize()
1439 - globalIndices.localSize()
1445 void Foam::globalMeshData::calcGlobalPointBoundaryCells()
const 1449 Pout<<
"globalMeshData::calcGlobalPointBoundaryCells() :" 1450 <<
" calculating coupled point to boundary cell addressing." 1460 Map<label> meshCellMap(4*coupledPatch().
nPoints());
1461 DynamicList<label> cellMap(meshCellMap.size());
1466 forAll(coupledPatch().meshPoints(), pointi)
1468 label meshPointi = coupledPatch().meshPoints()[pointi];
1469 const labelList& pCells = mesh_.pointCells(meshPointi);
1471 labelList& bCells = pointBoundaryCells[pointi];
1472 bCells.
setSize(pCells.size());
1476 const label celli = pCells[i];
1477 const auto fnd = meshCellMap.cfind(celli);
1485 meshCellMap.insert(celli, bCelli);
1486 cellMap.append(celli);
1494 boundaryCellsPtr_.reset(
new labelList(std::move(cellMap)));
1495 labelList& boundaryCells = boundaryCellsPtr_();
1501 globalBoundaryCellNumberingPtr_.reset
1503 new globalIndex(boundaryCells.size())
1505 const auto& globalIndices = *globalBoundaryCellNumberingPtr_;
1509 globalPointBoundaryCellsPtr_.reset
1513 auto& globalPointBoundaryCells = *globalPointBoundaryCellsPtr_;
1515 forAll(pointBoundaryCells, pointi)
1517 globalPointBoundaryCells[pointi] = globalIndices.toGlobal
1520 pointBoundaryCells[pointi]
1526 globalPointSlavesMap().distribute
1528 globalPointBoundaryCells,
1536 globalPointTransformedSlaves();
1537 const globalIndexAndTransform& transforms = globalTransforms();
1539 List<labelPairList> transformedCells(pointSlaves.size());
1542 forAll(pointSlaves, pointi)
1544 const labelList& slaves = pointSlaves[pointi];
1545 const labelList& transformedSlaves = pointTransformSlaves[pointi];
1547 if (slaves.size() > 0)
1549 labelList& myBCells = globalPointBoundaryCells[pointi];
1550 label sz = myBCells.
size();
1556 n += globalPointBoundaryCells[slaves[i]].size();
1559 myBCells.setSize(sz+
n);
1564 globalPointBoundaryCells[slaves[i]];
1569 for (
const label slave : slaveBCells)
1571 if (!SubList<label>(myBCells, sz).
found(slave))
1573 myBCells[
n++] = slave;
1581 if (transformedSlaves.size() > 0)
1583 const labelList& untrafoCells = globalPointBoundaryCells[pointi];
1586 label sz = myBCells.size();
1590 forAll(transformedSlaves, i)
1592 n += globalPointBoundaryCells[transformedSlaves[i]].size();
1595 myBCells.setSize(sz+
n);
1597 forAll(transformedSlaves, i)
1599 label transformI = globalPointSlavesMap().whichTransform
1601 transformedSlaves[i]
1605 globalPointBoundaryCells[transformedSlaves[i]];
1607 for (
const label slave : slaveBCells)
1610 if (!untrafoCells.found(slave))
1612 label proci = globalIndices.whichProcID(slave);
1613 label celli = globalIndices.toLocal(proci, slave);
1614 myBCells[
n++] = transforms.encode
1626 if (slaves.size() + transformedSlaves.size() == 0)
1628 globalPointBoundaryCells[pointi].clear();
1635 globalPointTransformedBoundaryCellsPtr_.reset
1640 globalPointBoundaryCellsMapPtr_.reset
1645 globalPointBoundaryCells,
1649 globalPointTransformedBoundaryCellsPtr_(),
1654 globalPointBoundaryCells.setSize(coupledPatch().
nPoints());
1655 globalPointTransformedBoundaryCellsPtr_().setSize(coupledPatch().
nPoints());
1659 Pout<<
"globalMeshData::calcGlobalPointBoundaryCells() :" 1660 <<
" coupled points:" << coupledPatch().nPoints()
1661 <<
" local boundary cells:" << globalIndices.localSize()
1662 <<
" additional coupled cells:" 1663 << globalPointBoundaryCellsMapPtr_().constructSize()
1664 - globalIndices.localSize()
1670 void Foam::globalMeshData::calcGlobalCoPointSlaves()
const 1674 Pout<<
"globalMeshData::calcGlobalCoPointSlaves() :" 1675 <<
" calculating coupled master to collocated" 1676 <<
" slave point addressing." <<
endl;
1680 globalPoints globalData(mesh_, coupledPatch(),
true,
false);
1682 globalCoPointSlavesPtr_.reset
1686 std::move(globalData.pointPoints())
1689 globalCoPointSlavesMapPtr_.reset
1693 std::move(globalData.map())
1699 Pout<<
"globalMeshData::calcGlobalCoPointSlaves() :" 1700 <<
" finished calculating coupled master to collocated" 1701 <<
" slave point addressing." <<
endl;
1711 globalMeshPointAddr_(),
1712 globalMeshFaceAddr_(),
1713 globalMeshCellAddr_(),
1716 processorTopology::
New<processorPolyPatch>
1718 mesh.boundaryMesh(),
1722 processorPatches_(),
1723 processorPatchIndices_(),
1724 processorPatchNeighbours_(),
1726 sharedPointLabelsPtr_(nullptr),
1727 sharedPointAddrPtr_(nullptr),
1728 sharedPointGlobalLabelsPtr_(nullptr),
1730 sharedEdgeLabelsPtr_(nullptr),
1731 sharedEdgeAddrPtr_(nullptr)
1747 nGlobalPoints_ = -1;
1748 sharedPointLabelsPtr_.clear();
1749 sharedPointAddrPtr_.clear();
1750 sharedPointGlobalLabelsPtr_.clear();
1754 sharedEdgeLabelsPtr_.clear();
1755 sharedEdgeAddrPtr_.clear();
1758 coupledPatchPtr_.clear();
1759 coupledPatchMeshEdgesPtr_.clear();
1760 coupledPatchMeshEdgeMapPtr_.clear();
1761 globalTransformsPtr_.clear();
1764 globalPointNumberingPtr_.clear();
1765 globalPointSlavesPtr_.clear();
1766 globalPointTransformedSlavesPtr_.clear();
1767 globalPointSlavesMapPtr_.clear();
1770 globalEdgeNumberingPtr_.clear();
1771 globalEdgeSlavesPtr_.clear();
1772 globalEdgeTransformedSlavesPtr_.clear();
1773 globalEdgeOrientationPtr_.clear();
1774 globalEdgeSlavesMapPtr_.clear();
1777 globalBoundaryFaceNumberingPtr_.clear();
1778 globalPointBoundaryFacesPtr_.clear();
1779 globalPointTransformedBoundaryFacesPtr_.clear();
1780 globalPointBoundaryFacesMapPtr_.clear();
1783 boundaryCellsPtr_.clear();
1784 globalBoundaryCellNumberingPtr_.clear();
1785 globalPointBoundaryCellsPtr_.clear();
1786 globalPointTransformedBoundaryCellsPtr_.clear();
1787 globalPointBoundaryCellsMapPtr_.clear();
1790 globalCoPointSlavesPtr_.clear();
1791 globalCoPointSlavesMapPtr_.clear();
1799 if (!sharedPointGlobalLabelsPtr_)
1801 sharedPointGlobalLabelsPtr_.reset
1803 new labelList(sharedPointLabels().size())
1805 labelList& sharedPointGlobalLabels = sharedPointGlobalLabelsPtr_();
1809 "pointProcAddressing",
1819 Pout<<
"globalMeshData::sharedPointGlobalLabels : " 1820 <<
"Reading pointProcAddressing" <<
endl;
1832 sharedPointGlobalLabels[i] = pointProcAddressing[pointi];
1837 Pout<<
"globalMeshData::sharedPointGlobalLabels :" 1838 <<
" Setting pointProcAddressing to -1" <<
endl;
1840 sharedPointGlobalLabels = -1;
1844 return *sharedPointGlobalLabelsPtr_;
1854 const labelList& pointAddr = sharedPointAddr();
1863 label sharedPointi = pointAddr[i];
1865 sharedPoints[sharedPointi] = mesh_.points()[
pointLabels[i]];
1875 fromProc >> nbrSharedPointAddr >> nbrSharedPoints;
1877 forAll(nbrSharedPointAddr, i)
1879 label sharedPointi = nbrSharedPointAddr[i];
1881 sharedPoints[sharedPointi] = nbrSharedPoints[i];
1905 return sharedPoints;
1912 pointField sharedPoints(mesh_.points(), sharedPointLabels());
1918 scalar tolDim = matchTol_ * mesh_.bounds().mag();
1929 return sharedPoints;
1935 if (nGlobalPoints_ == -1)
1939 return nGlobalPoints_;
1945 if (!sharedPointLabelsPtr_)
1949 return *sharedPointLabelsPtr_;
1955 if (!sharedPointAddrPtr_)
1959 return *sharedPointAddrPtr_;
1965 if (nGlobalEdges_ == -1)
1969 return nGlobalEdges_;
1975 if (!sharedEdgeLabelsPtr_)
1979 return *sharedEdgeLabelsPtr_;
1985 if (!sharedEdgeAddrPtr_)
1989 return *sharedEdgeAddrPtr_;
1995 if (!coupledPatchPtr_)
1997 const polyBoundaryMesh&
bMesh = mesh_.boundaryMesh();
2003 const polyPatch&
pp =
bMesh[patchi];
2007 nCoupled +=
pp.size();
2015 const polyPatch&
pp =
bMesh[patchi];
2019 label facei =
pp.start();
2023 coupledFaces[nCoupled++] = facei++;
2028 coupledPatchPtr_.reset
2043 Pout<<
"globalMeshData::coupledPatch() :" 2044 <<
" constructed coupled faces patch:" 2045 <<
" faces:" << coupledPatchPtr_().size()
2046 <<
" points:" << coupledPatchPtr_().nPoints()
2050 return *coupledPatchPtr_;
2056 if (!coupledPatchMeshEdgesPtr_)
2058 coupledPatchMeshEdgesPtr_.reset
2062 coupledPatch().meshEdges
2070 return *coupledPatchMeshEdgesPtr_;
2077 if (!coupledPatchMeshEdgeMapPtr_)
2081 coupledPatchMeshEdgeMapPtr_.reset
2086 return *coupledPatchMeshEdgeMapPtr_;
2092 if (!globalPointNumberingPtr_)
2094 globalPointNumberingPtr_.
reset 2096 new globalIndex(coupledPatch().
nPoints())
2099 return *globalPointNumberingPtr_;
2106 if (!globalTransformsPtr_)
2110 return *globalTransformsPtr_;
2116 if (!globalPointSlavesPtr_)
2118 calcGlobalPointSlaves();
2120 return *globalPointSlavesPtr_;
2127 if (!globalPointTransformedSlavesPtr_)
2129 calcGlobalPointSlaves();
2131 return *globalPointTransformedSlavesPtr_;
2137 if (!globalPointSlavesMapPtr_)
2139 calcGlobalPointSlaves();
2141 return *globalPointSlavesMapPtr_;
2147 if (!globalEdgeNumberingPtr_)
2149 globalEdgeNumberingPtr_.
reset 2154 return *globalEdgeNumberingPtr_;
2160 if (!globalEdgeSlavesPtr_)
2162 calcGlobalEdgeSlaves();
2164 return *globalEdgeSlavesPtr_;
2171 if (!globalEdgeTransformedSlavesPtr_)
2173 calcGlobalEdgeSlaves();
2175 return *globalEdgeTransformedSlavesPtr_;
2181 if (!globalEdgeOrientationPtr_)
2183 calcGlobalEdgeOrientation();
2185 return *globalEdgeOrientationPtr_;
2191 if (!globalEdgeSlavesMapPtr_)
2193 calcGlobalEdgeSlaves();
2195 return *globalEdgeSlavesMapPtr_;
2202 if (!globalBoundaryFaceNumberingPtr_)
2204 calcGlobalPointBoundaryFaces();
2206 return *globalBoundaryFaceNumberingPtr_;
2213 if (!globalPointBoundaryFacesPtr_)
2215 calcGlobalPointBoundaryFaces();
2217 return *globalPointBoundaryFacesPtr_;
2224 if (!globalPointTransformedBoundaryFacesPtr_)
2226 calcGlobalPointBoundaryFaces();
2228 return *globalPointTransformedBoundaryFacesPtr_;
2235 if (!globalPointBoundaryFacesMapPtr_)
2237 calcGlobalPointBoundaryFaces();
2239 return *globalPointBoundaryFacesMapPtr_;
2245 if (!boundaryCellsPtr_)
2247 calcGlobalPointBoundaryCells();
2249 return *boundaryCellsPtr_;
2256 if (!globalBoundaryCellNumberingPtr_)
2258 calcGlobalPointBoundaryCells();
2260 return *globalBoundaryCellNumberingPtr_;
2267 if (!globalPointBoundaryCellsPtr_)
2269 calcGlobalPointBoundaryCells();
2271 return *globalPointBoundaryCellsPtr_;
2278 if (!globalPointTransformedBoundaryCellsPtr_)
2280 calcGlobalPointBoundaryCells();
2282 return *globalPointTransformedBoundaryCellsPtr_;
2289 if (!globalPointBoundaryCellsMapPtr_)
2291 calcGlobalPointBoundaryCells();
2293 return *globalPointBoundaryCellsMapPtr_;
2299 if (!globalCoPointSlavesPtr_)
2301 calcGlobalCoPointSlaves();
2303 return *globalCoPointSlavesPtr_;
2309 if (!globalCoPointSlavesMapPtr_)
2311 calcGlobalCoPointSlaves();
2313 return *globalCoPointSlavesMapPtr_;
2324 const globalIndex& globalCoupledPoints = globalPointNumbering();
2327 const mapDistribute& pointSlavesMap = globalCoPointSlavesMap();
2335 labelList masterGlobalPoint(cpp.nPoints(), -1);
2336 forAll(masterGlobalPoint, pointi)
2338 const labelList& slavePoints = pointSlaves[pointi];
2339 if (slavePoints.size() > 0)
2341 masterGlobalPoint[pointi] = globalCoupledPoints.toGlobal(pointi);
2358 bitSet isMaster(mesh_.nPoints(),
true);
2359 forAll(pointSlaves, pointi)
2361 if (masterGlobalPoint[pointi] == -1)
2368 masterGlobalPoint[pointi]
2369 == globalCoupledPoints.toGlobal(pointi)
2378 isMaster.unset(cpp.meshPoints()[pointi]);
2382 label myUniquePoints = mesh_.nPoints() - cpp.nPoints() + nMaster;
2392 autoPtr<globalIndex> globalPointsPtr(
new globalIndex(myUniquePoints));
2396 pointToGlobal.setSize(mesh_.nPoints());
2398 uniquePoints.setSize(myUniquePoints);
2401 forAll(isMaster, meshPointi)
2403 if (isMaster[meshPointi])
2405 pointToGlobal[meshPointi] = globalPointsPtr().toGlobal(nMaster);
2406 uniquePoints[nMaster] = meshPointi;
2414 labelList masterToGlobal(pointSlavesMap.constructSize(), -1);
2416 forAll(pointSlaves, pointi)
2418 const labelList& slaves = pointSlaves[pointi];
2420 if (slaves.size() > 0)
2423 label meshPointi = cpp.meshPoints()[pointi];
2424 masterToGlobal[pointi] = pointToGlobal[meshPointi];
2427 masterToGlobal[slaves[i]] = masterToGlobal[pointi];
2433 pointSlavesMap.reverseDistribute(cpp.nPoints(), masterToGlobal);
2436 forAll(pointSlaves, pointi)
2438 label meshPointi = cpp.meshPoints()[pointi];
2440 if (!isMaster[meshPointi])
2442 pointToGlobal[meshPointi] = masterToGlobal[pointi];
2447 return globalPointsPtr;
2461 const mapDistribute& pointSlavesMap = globalCoPointSlavesMap();
2479 const globalIndex globalPPoints(meshPoints.size());
2481 labelList patchToCoupled(meshPoints.size(), -1);
2482 labelList coupledToGlobalPatch(pointSlavesMap.constructSize(), -1);
2486 forAll(meshPoints, patchPointi)
2488 label meshPointi = meshPoints[patchPointi];
2490 const auto iter = cpp.meshPointMap().cfind(meshPointi);
2494 patchToCoupled[patchPointi] = iter();
2495 coupledToGlobalPatch[iter()] = globalPPoints.toGlobal(patchPointi);
2513 pointSlavesMap.distribute(coupledToGlobalPatch);
2514 forAll(pointSlaves, coupledPointi)
2516 const labelList& slaves = pointSlaves[coupledPointi];
2518 if (slaves.size() > 0)
2522 if (coupledToGlobalPatch[coupledPointi] != -1)
2525 masterI = coupledToGlobalPatch[coupledPointi];
2532 label slavePp = coupledToGlobalPatch[slaves[i]];
2533 if (slavePp != -1 && slavePp < masterI)
2543 coupledToGlobalPatch[coupledPointi] = masterI;
2546 coupledToGlobalPatch[slaves[i]] = masterI;
2551 pointSlavesMap.reverseDistribute(cpp.nPoints(), coupledToGlobalPatch);
2561 forAll(meshPoints, patchPointi)
2563 if (patchToCoupled[patchPointi] == -1)
2569 label coupledPointi = patchToCoupled[patchPointi];
2572 globalPPoints.toGlobal(patchPointi)
2573 == coupledToGlobalPatch[coupledPointi]
2582 autoPtr<globalIndex> globalPointsPtr(
new globalIndex(nMasters));
2594 pointToGlobal.setSize(meshPoints.size());
2596 uniqueMeshPoints.setSize(nMasters);
2600 labelList globalMaster(cpp.nPoints(), -1);
2603 forAll(meshPoints, patchPointi)
2605 if (patchToCoupled[patchPointi] == -1)
2607 uniqueMeshPoints[nMasters++] = meshPoints[patchPointi];
2611 label coupledPointi = patchToCoupled[patchPointi];
2614 globalPPoints.toGlobal(patchPointi)
2615 == coupledToGlobalPatch[coupledPointi]
2618 globalMaster[coupledPointi] =
2619 globalPointsPtr().toGlobal(nMasters);
2620 uniqueMeshPoints[nMasters++] = meshPoints[patchPointi];
2640 forAll(meshPoints, patchPointi)
2642 if (patchToCoupled[patchPointi] == -1)
2644 pointToGlobal[patchPointi] = globalPointsPtr().toGlobal(nMasters++);
2648 label coupledPointi = patchToCoupled[patchPointi];
2649 pointToGlobal[patchPointi] = globalMaster[coupledPointi];
2653 globalPPoints.toGlobal(patchPointi)
2654 == coupledToGlobalPatch[coupledPointi]
2662 return globalPointsPtr;
2683 scalar tolDim = matchTol_ * mesh_.bounds().mag();
2687 Pout<<
"globalMeshData : merge dist:" << tolDim <<
endl;
2691 const label comm = mesh_.comm();
2702 label* tup = allSizes.begin(3*myProci);
2703 tup[0] = mesh_.nPoints();
2704 tup[1] = mesh_.nFaces();
2705 tup[2] = mesh_.nCells();
2714 for (label proci = 0, idx = 0; proci < numProc; ++proci, idx += 3)
2716 counts[proci] = allSizes[idx];
2718 globalMeshPointAddr_.reset(counts);
2720 for (label proci = 0, idx = 1; proci < numProc; ++proci, idx += 3)
2722 counts[proci] = allSizes[idx];
2724 globalMeshFaceAddr_.reset(counts);
2726 for (label proci = 0, idx = 2; proci < numProc; ++proci, idx += 3)
2728 counts[proci] = allSizes[idx];
2730 globalMeshCellAddr_.reset(counts);
2734 globalMeshPointAddr_.reset(globalIndex::gatherNone{}, mesh_.nPoints());
2735 globalMeshFaceAddr_.reset(globalIndex::gatherNone{}, mesh_.nFaces());
2736 globalMeshCellAddr_.reset(globalIndex::gatherNone{}, mesh_.nCells());
2744 Info<<
"globalMeshData : Total points/faces/cells : (" 2745 << nTotalPoints() <<
' ' 2746 << nTotalFaces() <<
' ' 2747 << nTotalCells() <<
')' <<
endl;
const labelList & sharedPointLabels() const
Return indices of local points that are globally shared.
const Map< label > & coupledPatchMeshEdgeMap() const
Return map from mesh edges to coupledPatch edges.
void reset(const label localSize, const label comm=UPstream::worldComm, const bool parallel=UPstream::parRun())
Reset from local size, using gather/broadcast with default/specified communicator if parallel...
label comm() const noexcept
The communicator used for parallel communication.
const labelListList & globalPointSlaves() const
void size(const label n)
Older name for setAddressableSize.
const mapDistribute & globalCoPointSlavesMap() const
const labelListList & globalPointTransformedSlaves() const
pointField geometricSharedPoints() const
Like sharedPoints but keeps cyclic points separate. (does geometric merging; uses matchTol_*bb as mer...
errorManipArg< error, int > exit(error &err, const int errNo=1)
const globalIndex & globalBoundaryCellNumbering() const
Numbering of boundary cells is according to boundaryCells()
labelList pointLabels(nPoints, -1)
void resize(const label len)
Adjust allocated size of list.
const labelList & sharedPointGlobalLabels() const
Return shared point global labels. Tries to read 'pointProcAddressing' and returns list or -1 if none...
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
void append(const T &val)
Append an element at the end of the list.
List< edge > edgeList
List of edge.
const labelListList & globalPointTransformedBoundaryFaces() const
const mapDistribute & globalEdgeSlavesMap() const
static const Foam::scalar matchTol_
Geometric tolerance (fraction of bounding box)
constexpr char nl
The newline '\n' character (0x0a)
void clearOut()
Remove all demand driven data.
UIndirectList< label > labelUIndList
UIndirectList of labels.
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Ostream & endl(Ostream &os)
Add newline and flush stream.
static void mpiAllGather(char *allData, int count, const label communicator=worldComm)
Gather/scatter identically-sized char data.
static bool & parRun() noexcept
Test if this a parallel run.
const mapDistribute & globalPointSlavesMap() const
tmp< DimensionedField< TypeR, GeoMesh > > New(const tmp< DimensionedField< TypeR, GeoMesh >> &tf1, const word &name, const dimensionSet &dimensions, const bool initCopy=false)
Global function forwards to reuseTmpDimensionedField::New.
const bitSet & globalEdgeOrientation() const
Is my edge same orientation as master edge.
const labelListList & globalPointBoundaryCells() const
void resize_nocopy(const label len)
Adjust allocated size of list without necessarily.
List< labelPair > labelPairList
List of labelPair.
autoPtr< globalIndex > mergePoints(labelList &pointToGlobal, labelList &uniquePoints) const
Helper for merging (collocated!) mesh point data.
const labelListList & globalEdgeSlaves() const
static int myProcNo(const label communicator=worldComm)
Rank of this process in the communicator (starting from masterNo()). Can be negative if the process i...
const labelList & coupledPatchMeshEdges() const
Return map from coupledPatch edges to mesh edges.
PrimitivePatch< IndirectList< face >, const pointField & > indirectPrimitivePatch
A PrimitivePatch with an IndirectList for the faces, const reference for the point field...
List< labelList > labelListList
List of labelList.
const labelListList & globalPointBoundaryFaces() const
const dimensionedScalar me
Electron mass.
static bool less(const vector &x, const vector &y)
To compare normals.
UList< label > labelUList
A UList of labels.
static void broadcast(Type &value, const label comm=UPstream::worldComm)
Broadcast content (contiguous or non-contiguous) to all communicator ranks. Does nothing in non-paral...
Various functions to operate on Lists.
#define forAll(list, i)
Loop across all elements in list.
const labelList & boundaryCells() const
From boundary cell to mesh cell.
static label commWarn(const label communicator) noexcept
Alter communicator debugging setting. Warns for use of any communicator differing from specified...
label nGlobalEdges() const
Return number of globally shared edges.
List helper to append y elements onto the end of x.
A list of faces which address into the list of points.
Calculates a unique integer (label so might not have enough room - 2G max) for processor + local inde...
const globalIndex & globalEdgeNumbering() const
static label nProcs(const label communicator=worldComm)
Number of ranks in parallel run (for given communicator). It is 1 for serial run. ...
label nGlobalPoints() const
Return number of globally shared points.
static void recv(Type &value, const int fromProcNo, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm, IOstreamOption::streamFormat fmt=IOstreamOption::BINARY)
Receive and deserialize a value. Uses operator>> for de-serialization.
vectorField pointField
pointField is a vectorField.
const labelList & sharedEdgeAddr() const
Return addressing into the complete globally shared edge list.
const dimensionedScalar e
Elementary charge.
void setSize(const label n)
Alias for resize()
const globalIndexAndTransform & globalTransforms() const
Global transforms numbering.
"scheduled" (MPI standard) : (MPI_Send, MPI_Recv)
static int compare(const Pair< label > &a, const Pair< label > &b)
Compare Pairs.
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
void sort(UList< T > &list)
Sort the list.
static void combineReduce(T &value, const CombineOp &cop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce) applying cop to inplace combine value from different processors...
static constexpr int masterNo() noexcept
Relative rank for the master process - is always 0.
label size() const noexcept
The number of entries in the list.
const globalIndex & globalPointNumbering() const
Numbering of coupled points is according to coupledPatch.
static bool is_parallel(const label communicator=worldComm)
True if parallel algorithm or exchange is required.
label inplaceMergePoints(PointList &points, const scalar mergeTol, const bool verbose, labelList &pointToUnique)
Inplace merge points, preserving the original point order. All points closer/equal mergeTol are to be...
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
errorManip< error > abort(error &err)
void reset(const dimensionSet &ds)
Copy assign the exponents from the dimensionSet.
int debug
Static debugging option.
Pair< label > labelPair
A pair of labels.
~globalMeshData()
Destructor.
defineTypeNameAndDebug(combustionModel, 0)
Geometric merging of points. See below.
Define the processor-processor connection table by walking a list of patches and detecting the proces...
void movePoints(const pointField &newPoints)
Update for moving points.
const indirectPrimitivePatch & coupledPatch() const
Return patch of all coupled faces.
const labelListList & globalPointTransformedBoundaryCells() const
void operator()(T &x, const T &y) const
Class containing processor-to-processor mapping information.
A bitSet stores bits (elements with only two states) in packed internal format and supports a variety...
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
void updateMesh()
Change global mesh data given a topological change. Does a.
messageStream Info
Information stream (stdout output on master, null elsewhere)
static rangeType subProcs(const label communicator=worldComm)
Range of process indices for sub-processes.
List< label > labelList
A List of labels.
const mapDistribute & globalPointBoundaryFacesMap() const
dimensionSet transform(const dimensionSet &ds)
Return the argument; transformations do not change the dimensions.
const labelList & sharedPointAddr() const
Return addressing into the complete globally shared points list.
bool send()
Send buffer contents now and not in destructor [advanced usage]. Returns true on success.
Defines the attributes of an object for which implicit objectRegistry management is supported...
pointField sharedPoints() const
Collect coordinates of shared points on all processors. (does parallel communication!) ...
PrimitivePatch< List< face >, const pointField > bMesh
Holder of faceList and points. (v.s. e.g. primitivePatch which references points) ...
Map< label > invertToMap(const labelUList &values)
Create inverse mapping, which is a lookup table into the given list.
const mapDistribute & globalPointBoundaryCellsMap() const
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
const labelList & sharedEdgeLabels() const
Return indices of local edges that are globally shared.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
forAllConstIters(mixture.phases(), phase)
const labelListList & globalCoPointSlaves() const
A HashTable to objects of type <T> with a label key.
const labelListList & globalEdgeTransformedSlaves() const
globalMeshData(const globalMeshData &)=delete
No copy construct.
static constexpr const zero Zero
Global zero (0)
const globalIndex & globalBoundaryFaceNumbering() const
Numbering of boundary faces is face-mesh.nInternalFaces()