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);
94 PstreamBuffers pBufs(mesh_.
comm());
97 for (
const label patchi : processorPatches_)
101 refCast<const processorPolyPatch>
108 toNeighbour << processorPatchIndices_[patchi];
111 pBufs.finishedSends();
113 for (
const label patchi : processorPatches_)
115 UIPstream fromNeighbour
117 refCast<const processorPolyPatch>
124 fromNeighbour >> processorPatchNeighbours_[patchi];
133 void Foam::globalMeshData::calcSharedPoints()
const 138 || sharedPointLabelsPtr_
139 || sharedPointAddrPtr_
151 const globalPoints parallelPoints(mesh_,
false,
true);
155 forAll(parallelPoints.pointPoints(), i)
157 const labelList& pPoints = parallelPoints.pointPoints()[i];
159 parallelPoints.transformedPointPoints()[i];
161 if (pPoints.size()+transPPoints.size() > 0)
168 const globalIndex masterNumbering(nMaster);
170 nGlobalPoints_ = masterNumbering.totalSize();
177 labelList master(parallelPoints.map().constructSize(), -1);
178 forAll(parallelPoints.pointPoints(), i)
180 const labelList& pPoints = parallelPoints.pointPoints()[i];
182 parallelPoints.transformedPointPoints()[i];
184 if (pPoints.size()+transPPoints.size() > 0)
186 master[i] = masterNumbering.toGlobal(nMaster);
207 parallelPoints.map().reverseDistribute
209 parallelPoints.map().constructSize(),
216 forAll(parallelPoints.pointPoints(), i)
224 sharedPointLabelsPtr_.reset(
new labelList(nMaster));
225 labelList& sharedPointLabels = sharedPointLabelsPtr_();
226 sharedPointAddrPtr_.reset(
new labelList(nMaster));
227 labelList& sharedPointAddr = sharedPointAddrPtr_();
230 forAll(parallelPoints.pointPoints(), i)
235 sharedPointLabels[nMaster] = i;
236 sharedPointAddr[nMaster] = master[i];
246 Pout<<
"globalMeshData : nGlobalPoints_:" << nGlobalPoints_ <<
nl 247 <<
"globalMeshData : sharedPointLabels_:" 248 << sharedPointLabelsPtr_().size() <<
nl 249 <<
"globalMeshData : sharedPointAddr_:" 250 << sharedPointAddrPtr_().size() <<
endl;
255 void Foam::globalMeshData::countSharedEdges
257 const EdgeMap<labelList>& procSharedEdges,
258 EdgeMap<label>& globalShared,
265 const edge&
e = iter.key();
267 auto globalFnd = globalShared.find(
e);
269 if (globalFnd.good())
271 if (globalFnd() == -1)
275 globalFnd() = sharedEdgeI++;
281 if (iter().size() == 1)
284 globalShared.insert(
e, -1);
290 globalShared.insert(
e, sharedEdgeI++);
297 void Foam::globalMeshData::calcSharedEdges()
const 307 || sharedEdgeLabelsPtr_
308 || sharedEdgeAddrPtr_
316 const labelList& sharedPtAddr = sharedPointAddr();
317 const labelList& sharedPtLabels = sharedPointLabels();
321 Map<label> meshToShared(
invertToMap(sharedPtLabels));
327 EdgeMap<labelList> localShared(2*sharedPtAddr.size());
329 const edgeList& edges = mesh_.edges();
333 const edge&
e = edges[edgei];
335 const auto e0Fnd = meshToShared.cfind(
e[0]);
339 const auto e1Fnd = meshToShared.cfind(
e[1]);
349 sharedPtAddr[e0Fnd.val()],
350 sharedPtAddr[e1Fnd.val()]
354 localShared(sharedEdge).push_back(edgei);
369 EdgeMap<label> globalShared(2*nGlobalPoints());
376 label sharedEdgeI = 0;
381 Pout<<
"globalMeshData::calcSharedEdges : Merging in from proc0 : " 382 << localShared.size() <<
endl;
384 countSharedEdges(localShared, globalShared, sharedEdgeI);
392 EdgeMap<labelList> procSharedEdges;
397 Pout<<
"globalMeshData::calcSharedEdges : " 398 <<
"Merging in from proc" 399 << proci <<
" : " << procSharedEdges.size()
402 countSharedEdges(procSharedEdges, globalShared, sharedEdgeI);
410 EdgeMap<label> oldSharedEdges(std::move(globalShared));
411 globalShared.clear();
415 if (iter.val() != -1)
417 globalShared.insert(iter.key(), iter.val());
423 Pout<<
"globalMeshData::calcSharedEdges : Filtered " 424 << oldSharedEdges.size()
425 <<
" down to " << globalShared.size() <<
endl;
445 nGlobalEdges_ = globalShared.size();
447 DynamicList<label> dynSharedEdgeLabels(globalShared.size());
448 DynamicList<label> dynSharedEdgeAddr(globalShared.size());
452 const edge&
e = iter.key();
454 const auto edgeFnd = globalShared.cfind(
e);
460 const labelList& edgeLabels = iter.val();
462 for (
const label edgei : edgeLabels)
465 dynSharedEdgeLabels.
append(edgei);
468 dynSharedEdgeAddr.append(edgeFnd());
474 sharedEdgeLabelsPtr_.reset
476 new labelList(std::move(dynSharedEdgeLabels))
479 sharedEdgeAddrPtr_.reset
481 new labelList(std::move(dynSharedEdgeAddr))
489 Pout<<
"globalMeshData : nGlobalEdges_:" << nGlobalEdges_ <<
nl 490 <<
"globalMeshData : sharedEdgeLabels:" 491 << sharedEdgeLabelsPtr_().size() <<
nl 492 <<
"globalMeshData : sharedEdgeAddr:" 493 << sharedEdgeAddrPtr_().size() <<
endl;
498 void Foam::globalMeshData::calcGlobalPointSlaves()
const 502 Pout<<
"globalMeshData::calcGlobalPointSlaves() :" 503 <<
" calculating coupled master to slave point addressing." 511 globalPoints globalData(mesh_, coupledPatch(),
true,
true);
513 globalPointSlavesPtr_.reset
517 std::move(globalData.pointPoints())
520 globalPointTransformedSlavesPtr_.reset
524 std::move(globalData.transformedPointPoints())
528 globalPointSlavesMapPtr_.reset
532 std::move(globalData.map())
541 void Foam::globalMeshData::calcPointConnectivity
543 List<labelPairList>& allPointConnectivity
546 const globalIndexAndTransform& transforms = globalTransforms();
548 const labelListList& transformedSlaves = globalPointTransformedSlaves();
549 const auto& slavesMap = globalPointSlavesMap();
559 myData[pointi] = transforms.encode
563 transforms.nullTransformIndex()
571 allPointConnectivity.setSize(slavesMap.constructSize());
579 const labelList& pSlaves = slaves[pointi];
580 const labelList& pTransformSlaves = transformedSlaves[pointi];
582 if (pSlaves.size()+pTransformSlaves.size())
586 pConnectivity.setSize(1+pSlaves.size()+pTransformSlaves.size());
590 pConnectivity[connI++] = myData[pointi];
594 pConnectivity[connI++] = myData[pSlaves[i]];
597 forAll(pTransformSlaves, i)
600 label transformI = slavesMap.whichTransform
605 const labelPair&
n = myData[pTransformSlaves[i]];
606 label proci = transforms.processor(
n);
607 label index = transforms.index(
n);
608 pConnectivity[connI++] = transforms.encode
619 allPointConnectivity[pSlaves[i]] = pConnectivity;
621 forAll(pTransformSlaves, i)
623 allPointConnectivity[pTransformSlaves[i]] = pConnectivity;
634 if (pConnectivity.size() == 0)
636 pConnectivity.setSize(1, myData[pointi]);
641 slavesMap.reverseDistribute
644 allPointConnectivity,
654 void Foam::globalMeshData::calcGlobalPointEdges
657 List<labelPairList>& globalPointPoints
660 const edgeList& edges = coupledPatch().edges();
661 const labelListList& pointEdges = coupledPatch().pointEdges();
662 const globalIndex& globalEdgeNumbers = globalEdgeNumbering();
664 const labelListList& transformedSlaves = globalPointTransformedSlaves();
665 const globalIndexAndTransform& transforms = globalTransforms();
669 globalPointEdges.setSize(globalPointSlavesMap().constructSize());
670 globalPointPoints.setSize(globalPointSlavesMap().constructSize());
671 forAll(pointEdges, pointi)
673 const labelList& pEdges = pointEdges[pointi];
674 globalPointEdges[pointi] = globalEdgeNumbers.toGlobal(pEdges);
677 globalPPoints.setSize(pEdges.size());
680 label otherPointi = edges[pEdges[i]].otherVertex(pointi);
681 globalPPoints[i] = transforms.encode
685 transforms.nullTransformIndex()
695 globalPointSlavesMap().distribute
703 globalPointSlavesMap().distribute
713 const labelList& pSlaves = slaves[pointi];
714 const labelList& pTransformSlaves = transformedSlaves[pointi];
719 n += globalPointEdges[pSlaves[i]].size();
721 forAll(pTransformSlaves, i)
723 n += globalPointEdges[pTransformSlaves[i]].size();
728 labelList& globalPEdges = globalPointEdges[pointi];
729 label sz = globalPEdges.
size();
730 globalPEdges.setSize(sz+
n);
733 const labelList& otherData = globalPointEdges[pSlaves[i]];
736 globalPEdges[sz++] = otherData[j];
739 forAll(pTransformSlaves, i)
742 globalPointEdges[pTransformSlaves[i]];
745 globalPEdges[sz++] = otherData[j];
752 globalPointEdges[pSlaves[i]] = globalPEdges;
754 forAll(pTransformSlaves, i)
756 globalPointEdges[pTransformSlaves[i]] = globalPEdges;
764 label sz = globalPPoints.size();
765 globalPPoints.setSize(sz +
n);
770 const labelPairList& otherData = globalPointPoints[pSlaves[i]];
773 globalPPoints[sz++] = otherData[j];
777 forAll(pTransformSlaves, i)
780 label transformI = globalPointSlavesMap().whichTransform
786 globalPointPoints[pTransformSlaves[i]];
791 label proci = transforms.processor(
n);
792 label index = transforms.index(
n);
793 globalPPoints[sz++] = transforms.encode
805 globalPointPoints[pSlaves[i]] = globalPPoints;
807 forAll(pTransformSlaves, i)
809 globalPointPoints[pTransformSlaves[i]] = globalPPoints;
814 globalPointSlavesMap().reverseDistribute
822 globalPointSlavesMap().reverseDistribute
835 Foam::label Foam::globalMeshData::findTransform
839 const label localPoint
842 const globalIndexAndTransform& transforms = globalTransforms();
844 const label remoteProci = transforms.processor(remotePoint);
845 const label remoteIndex = transforms.index(remotePoint);
847 label remoteTransformI = -1;
848 label localTransformI = -1;
851 label proci = transforms.processor(info[i]);
852 label pointi = transforms.index(info[i]);
853 label transformI = transforms.transformIndex(info[i]);
857 localTransformI = transformI;
862 if (proci == remoteProci && pointi == remoteIndex)
864 remoteTransformI = transformI;
872 if (remoteTransformI == -1 || localTransformI == -1)
875 <<
"Problem. Cannot find " << remotePoint
876 <<
" or " << localPoint <<
" " 877 << coupledPatch().localPoints()[localPoint]
880 <<
"remoteTransformI:" << remoteTransformI <<
endl 881 <<
"localTransformI:" << localTransformI
885 return transforms.subtractTransformIndex
893 void Foam::globalMeshData::calcGlobalEdgeSlaves()
const 897 Pout<<
"globalMeshData::calcGlobalEdgeSlaves() :" 898 <<
" calculating coupled master to slave edge addressing." <<
endl;
901 const edgeList& edges = coupledPatch().edges();
902 const globalIndex& globalEdgeNumbers = globalEdgeNumbering();
903 const globalIndexAndTransform& transforms = globalTransforms();
918 List<labelPairList> allPointConnectivity;
919 calcPointConnectivity(allPointConnectivity);
925 List<labelPairList> globalPointPoints;
926 calcGlobalPointEdges(globalPointEdges, globalPointPoints);
939 List<labelPairList> allEdgeConnectivity(edges.size());
943 const edge&
e = edges[edgeI];
944 const labelList& pEdges0 = globalPointEdges[
e[0]];
946 const labelList& pEdges1 = globalPointEdges[
e[1]];
950 DynamicList<labelPair> eEdges(2);
958 transforms.nullTransformIndex()
968 pEdges0[i] == pEdges1[j]
969 && pEdges0[i] != globalEdgeNumbers.toGlobal(edgeI)
981 label transform0 = findTransform
983 allPointConnectivity[
e[0]],
987 label transform1 = findTransform
989 allPointConnectivity[
e[1]],
994 if (transform0 == transform1)
996 label proci = globalEdgeNumbers.whichProcID(pEdges0[i]);
1002 globalEdgeNumbers.toLocal(proci, pEdges0[i]),
1011 allEdgeConnectivity[edgeI].transfer(eEdges);
1014 allEdgeConnectivity[edgeI],
1023 globalEdgeSlavesPtr_.reset(
new labelListList(edges.size()));
1025 List<labelPairList> transformedEdges(edges.size());
1026 forAll(allEdgeConnectivity, edgeI)
1029 if (edgeInfo.size() >= 2)
1031 const labelPair& masterInfo = edgeInfo[0];
1037 transforms.processor(masterInfo)
1040 && (transforms.index(masterInfo) == edgeI)
1044 labelList& eEdges = globalEdgeSlaves[edgeI];
1045 eEdges.
setSize(edgeInfo.size()-1);
1048 trafoEEdges.setSize(edgeInfo.size()-1);
1050 label nonTransformI = 0;
1051 label transformI = 0;
1053 for (label i = 1; i < edgeInfo.size(); i++)
1056 label proci = transforms.processor(info);
1057 label index = transforms.index(info);
1058 label
transform = transforms.transformIndex
1063 if (
transform == transforms.nullTransformIndex())
1065 eEdges[nonTransformI++] = globalEdgeNumbers.toGlobal
1073 trafoEEdges[transformI++] = info;
1077 eEdges.setSize(nonTransformI);
1078 trafoEEdges.setSize(transformI);
1088 globalEdgeSlavesMapPtr_.reset
1097 globalEdgeTransformedSlavesPtr_(),
1109 Pout<<
"globalMeshData::calcGlobalEdgeSlaves() :" 1110 <<
" coupled edges:" << edges.size()
1111 <<
" additional coupled edges:" 1112 << globalEdgeSlavesMapPtr_().constructSize() - edges.size()
1118 void Foam::globalMeshData::calcGlobalEdgeOrientation()
const 1122 Pout<<
"globalMeshData::calcGlobalEdgeOrientation() :" 1123 <<
" calculating edge orientation w.r.t. master edge." <<
endl;
1129 const globalIndex& globalPoints = globalPointNumbering();
1134 const mapDistribute& map = globalPointSlavesMap();
1136 masterPoint.setSize(map.constructSize());
1139 for (label pointi = 0; pointi < coupledPatch().nPoints(); pointi++)
1141 masterPoint[pointi] = globalPoints.toGlobal(pointi);
1146 globalPointSlaves(),
1147 globalPointTransformedSlaves(),
1158 const mapDistribute& map = globalEdgeSlavesMap();
1160 const labelListList& transformedSlaves = globalEdgeTransformedSlaves();
1166 for (label edgeI = 0; edgeI < coupledPatch().nEdges(); edgeI++)
1171 slaves[edgeI].size()
1172 + transformedSlaves[edgeI].size()
1179 const edge&
e = coupledPatch().edges()[edgeI];
1193 minEqOp<labelPair>()
1197 globalEdgeOrientationPtr_.reset
1199 new bitSet(coupledPatch().nEdges())
1201 bitSet& globalEdgeOrientation = globalEdgeOrientationPtr_();
1203 forAll(coupledPatch().edges(), edgeI)
1208 const edge&
e = coupledPatch().edges()[edgeI];
1218 masterEdgeVerts[edgeI]
1223 <<
"problem : my edge:" <<
e 1224 <<
" in master points:" << masterE
1225 <<
" v.s. masterEdgeVerts:" << masterEdgeVerts[edgeI]
1230 globalEdgeOrientation.set(edgeI, (stat == 1));
1235 globalEdgeOrientation.set(edgeI,
true);
1245 Pout<<
"globalMeshData::calcGlobalEdgeOrientation() :" 1246 <<
" finished calculating edge orientation." 1252 void Foam::globalMeshData::calcPointBoundaryFaces
1257 const polyBoundaryMesh&
bMesh = mesh_.boundaryMesh();
1258 const Map<label>& meshPointMap = coupledPatch().meshPointMap();
1264 for (
const polyPatch&
pp :
bMesh)
1268 for (
const face&
f :
pp)
1272 const auto iter = meshPointMap.cfind(
f[fp]);
1275 nPointFaces[iter.val()]++;
1285 pointBoundaryFaces.setSize(coupledPatch().
nPoints());
1286 forAll(nPointFaces, pointi)
1288 pointBoundaryFaces[pointi].setSize(nPointFaces[pointi]);
1297 const polyPatch&
pp =
bMesh[patchi];
1303 const face&
f =
pp[i];
1306 const auto iter = meshPointMap.cfind(
f[fp]);
1311 pp.start() + i - mesh_.nInternalFaces();
1312 pointBoundaryFaces[iter()][nPointFaces[iter()]++] =
1322 void Foam::globalMeshData::calcGlobalPointBoundaryFaces()
const 1326 Pout<<
"globalMeshData::calcGlobalPointBoundaryFaces() :" 1327 <<
" calculating coupled point to boundary face addressing." 1338 calcPointBoundaryFaces(pointBoundaryFaces);
1342 globalBoundaryFaceNumberingPtr_.reset
1344 new globalIndex(mesh_.nBoundaryFaces())
1346 const auto& globalIndices = *globalBoundaryFaceNumberingPtr_;
1350 globalPointBoundaryFacesPtr_.reset
1354 auto& globalPointBoundaryFaces = *globalPointBoundaryFacesPtr_;
1356 forAll(pointBoundaryFaces, pointi)
1358 globalPointBoundaryFaces[pointi] = globalIndices.toGlobal
1361 pointBoundaryFaces[pointi]
1367 globalPointSlavesMap().distribute
1369 globalPointBoundaryFaces,
1378 globalPointTransformedSlaves();
1379 const globalIndexAndTransform& transforms = globalTransforms();
1383 List<labelPairList> transformedFaces(pointSlaves.size());
1386 forAll(pointSlaves, pointi)
1388 const labelList& slaves = pointSlaves[pointi];
1389 const labelList& transformedSlaves = pointTransformSlaves[pointi];
1391 if (slaves.size() > 0)
1393 labelList& myBFaces = globalPointBoundaryFaces[pointi];
1394 label sz = myBFaces.
size();
1400 n += globalPointBoundaryFaces[slaves[i]].size();
1403 myBFaces.setSize(sz+
n);
1408 globalPointBoundaryFaces[slaves[i]];
1413 for (
const label slave : slaveBFaces)
1415 if (!SubList<label>(myBFaces, sz).
found(slave))
1417 myBFaces[
n++] = slave;
1425 if (transformedSlaves.size() > 0)
1427 const labelList& untrafoFaces = globalPointBoundaryFaces[pointi];
1430 label sz = myBFaces.size();
1434 forAll(transformedSlaves, i)
1436 n += globalPointBoundaryFaces[transformedSlaves[i]].size();
1439 myBFaces.setSize(sz+
n);
1441 forAll(transformedSlaves, i)
1443 label transformI = globalPointSlavesMap().whichTransform
1445 transformedSlaves[i]
1449 globalPointBoundaryFaces[transformedSlaves[i]];
1451 for (
const label slave : slaveBFaces)
1454 if (!untrafoFaces.found(slave))
1456 label proci = globalIndices.whichProcID(slave);
1457 label facei = globalIndices.toLocal(proci, slave);
1459 myBFaces[
n++] = transforms.encode
1472 if (slaves.size() + transformedSlaves.size() == 0)
1474 globalPointBoundaryFaces[pointi].clear();
1481 globalPointTransformedBoundaryFacesPtr_.reset
1486 globalPointBoundaryFacesMapPtr_.reset
1491 globalPointBoundaryFaces,
1495 globalPointTransformedBoundaryFacesPtr_(),
1500 globalPointBoundaryFaces.setSize(coupledPatch().
nPoints());
1501 globalPointTransformedBoundaryFacesPtr_().setSize(coupledPatch().
nPoints());
1508 Pout<<
"globalMeshData::calcGlobalPointBoundaryFaces() :" 1509 <<
" coupled points:" << coupledPatch().nPoints()
1510 <<
" local boundary faces:" << globalIndices.localSize()
1511 <<
" additional coupled faces:" 1512 << globalPointBoundaryFacesMapPtr_().constructSize()
1513 - globalIndices.localSize()
1519 void Foam::globalMeshData::calcGlobalPointBoundaryCells()
const 1523 Pout<<
"globalMeshData::calcGlobalPointBoundaryCells() :" 1524 <<
" calculating coupled point to boundary cell addressing." 1534 Map<label> meshCellMap(4*coupledPatch().
nPoints());
1535 DynamicList<label> cellMap(meshCellMap.size());
1540 forAll(coupledPatch().meshPoints(), pointi)
1542 label meshPointi = coupledPatch().meshPoints()[pointi];
1543 const labelList& pCells = mesh_.pointCells(meshPointi);
1545 labelList& bCells = pointBoundaryCells[pointi];
1546 bCells.
setSize(pCells.size());
1550 const label celli = pCells[i];
1551 const auto fnd = meshCellMap.cfind(celli);
1559 meshCellMap.insert(celli, bCelli);
1560 cellMap.append(celli);
1568 boundaryCellsPtr_.reset(
new labelList(std::move(cellMap)));
1569 labelList& boundaryCells = boundaryCellsPtr_();
1579 globalBoundaryCellNumberingPtr_.reset
1581 new globalIndex(boundaryCells.size())
1583 const auto& globalIndices = *globalBoundaryCellNumberingPtr_;
1587 globalPointBoundaryCellsPtr_.reset
1591 auto& globalPointBoundaryCells = *globalPointBoundaryCellsPtr_;
1593 forAll(pointBoundaryCells, pointi)
1595 globalPointBoundaryCells[pointi] = globalIndices.toGlobal
1598 pointBoundaryCells[pointi]
1604 globalPointSlavesMap().distribute
1606 globalPointBoundaryCells,
1614 globalPointTransformedSlaves();
1615 const globalIndexAndTransform& transforms = globalTransforms();
1617 List<labelPairList> transformedCells(pointSlaves.size());
1620 forAll(pointSlaves, pointi)
1622 const labelList& slaves = pointSlaves[pointi];
1623 const labelList& transformedSlaves = pointTransformSlaves[pointi];
1625 if (slaves.size() > 0)
1627 labelList& myBCells = globalPointBoundaryCells[pointi];
1628 label sz = myBCells.
size();
1634 n += globalPointBoundaryCells[slaves[i]].size();
1637 myBCells.setSize(sz+
n);
1642 globalPointBoundaryCells[slaves[i]];
1647 for (
const label slave : slaveBCells)
1649 if (!SubList<label>(myBCells, sz).
found(slave))
1651 myBCells[
n++] = slave;
1659 if (transformedSlaves.size() > 0)
1661 const labelList& untrafoCells = globalPointBoundaryCells[pointi];
1664 label sz = myBCells.size();
1668 forAll(transformedSlaves, i)
1670 n += globalPointBoundaryCells[transformedSlaves[i]].size();
1673 myBCells.setSize(sz+
n);
1675 forAll(transformedSlaves, i)
1677 label transformI = globalPointSlavesMap().whichTransform
1679 transformedSlaves[i]
1683 globalPointBoundaryCells[transformedSlaves[i]];
1685 for (
const label slave : slaveBCells)
1688 if (!untrafoCells.found(slave))
1690 label proci = globalIndices.whichProcID(slave);
1691 label celli = globalIndices.toLocal(proci, slave);
1692 myBCells[
n++] = transforms.encode
1704 if (slaves.size() + transformedSlaves.size() == 0)
1706 globalPointBoundaryCells[pointi].clear();
1713 globalPointTransformedBoundaryCellsPtr_.reset
1718 globalPointBoundaryCellsMapPtr_.reset
1723 globalPointBoundaryCells,
1727 globalPointTransformedBoundaryCellsPtr_(),
1732 globalPointBoundaryCells.setSize(coupledPatch().
nPoints());
1733 globalPointTransformedBoundaryCellsPtr_().setSize(coupledPatch().
nPoints());
1740 Pout<<
"globalMeshData::calcGlobalPointBoundaryCells() :" 1741 <<
" coupled points:" << coupledPatch().nPoints()
1742 <<
" local boundary cells:" << globalIndices.localSize()
1743 <<
" additional coupled cells:" 1744 << globalPointBoundaryCellsMapPtr_().constructSize()
1745 - globalIndices.localSize()
1751 void Foam::globalMeshData::calcGlobalCoPointSlaves()
const 1755 Pout<<
"globalMeshData::calcGlobalCoPointSlaves() :" 1756 <<
" calculating coupled master to collocated" 1757 <<
" slave point addressing." <<
endl;
1764 globalPoints globalData(mesh_, coupledPatch(),
true,
false);
1766 globalCoPointSlavesPtr_.reset
1770 std::move(globalData.pointPoints())
1773 globalCoPointSlavesMapPtr_.reset
1777 std::move(globalData.map())
1785 Pout<<
"globalMeshData::calcGlobalCoPointSlaves() :" 1786 <<
" finished calculating coupled master to collocated" 1787 <<
" slave point addressing." <<
endl;
1797 globalMeshPointAddr_(),
1798 globalMeshFaceAddr_(),
1799 globalMeshCellAddr_(),
1802 processorTopology::
New<processorPolyPatch>
1804 mesh.boundaryMesh(),
1808 processorPatches_(),
1809 processorPatchIndices_(),
1810 processorPatchNeighbours_(),
1812 sharedPointLabelsPtr_(nullptr),
1813 sharedPointAddrPtr_(nullptr),
1814 sharedPointGlobalLabelsPtr_(nullptr),
1816 sharedEdgeLabelsPtr_(nullptr),
1817 sharedEdgeAddrPtr_(nullptr)
1833 nGlobalPoints_ = -1;
1834 sharedPointLabelsPtr_.clear();
1835 sharedPointAddrPtr_.clear();
1836 sharedPointGlobalLabelsPtr_.clear();
1840 sharedEdgeLabelsPtr_.clear();
1841 sharedEdgeAddrPtr_.clear();
1844 coupledPatchPtr_.clear();
1845 coupledPatchMeshEdgesPtr_.clear();
1846 coupledPatchMeshEdgeMapPtr_.clear();
1847 globalTransformsPtr_.clear();
1850 globalPointNumberingPtr_.clear();
1851 globalPointSlavesPtr_.clear();
1852 globalPointTransformedSlavesPtr_.clear();
1853 globalPointSlavesMapPtr_.clear();
1856 globalEdgeNumberingPtr_.clear();
1857 globalEdgeSlavesPtr_.clear();
1858 globalEdgeTransformedSlavesPtr_.clear();
1859 globalEdgeOrientationPtr_.clear();
1860 globalEdgeSlavesMapPtr_.clear();
1863 globalBoundaryFaceNumberingPtr_.clear();
1864 globalPointBoundaryFacesPtr_.clear();
1865 globalPointTransformedBoundaryFacesPtr_.clear();
1866 globalPointBoundaryFacesMapPtr_.clear();
1869 boundaryCellsPtr_.clear();
1870 globalBoundaryCellNumberingPtr_.clear();
1871 globalPointBoundaryCellsPtr_.clear();
1872 globalPointTransformedBoundaryCellsPtr_.clear();
1873 globalPointBoundaryCellsMapPtr_.clear();
1876 globalCoPointSlavesPtr_.clear();
1877 globalCoPointSlavesMapPtr_.clear();
1885 if (!sharedPointGlobalLabelsPtr_)
1887 sharedPointGlobalLabelsPtr_.reset
1889 new labelList(sharedPointLabels().size())
1891 labelList& sharedPointGlobalLabels = sharedPointGlobalLabelsPtr_();
1895 "pointProcAddressing",
1905 Pout<<
"globalMeshData::sharedPointGlobalLabels : " 1906 <<
"Reading pointProcAddressing" <<
endl;
1918 sharedPointGlobalLabels[i] = pointProcAddressing[pointi];
1923 Pout<<
"globalMeshData::sharedPointGlobalLabels :" 1924 <<
" Setting pointProcAddressing to -1" <<
endl;
1926 sharedPointGlobalLabels = -1;
1930 return *sharedPointGlobalLabelsPtr_;
1943 const labelList& pointAddr = sharedPointAddr();
1952 label sharedPointi = pointAddr[i];
1954 sharedPoints[sharedPointi] = mesh_.points()[
pointLabels[i]];
1964 fromProc >> nbrSharedPointAddr >> nbrSharedPoints;
1966 forAll(nbrSharedPointAddr, i)
1968 label sharedPointi = nbrSharedPointAddr[i];
1970 sharedPoints[sharedPointi] = nbrSharedPoints[i];
1996 return sharedPoints;
2006 pointField sharedPoints(mesh_.points(), sharedPointLabels());
2012 scalar tolDim = matchTol_ * mesh_.bounds().mag();
2026 return sharedPoints;
2032 if (nGlobalPoints_ == -1)
2036 return nGlobalPoints_;
2042 if (!sharedPointLabelsPtr_)
2046 return *sharedPointLabelsPtr_;
2052 if (!sharedPointAddrPtr_)
2056 return *sharedPointAddrPtr_;
2062 if (nGlobalEdges_ == -1)
2066 return nGlobalEdges_;
2072 if (!sharedEdgeLabelsPtr_)
2076 return *sharedEdgeLabelsPtr_;
2082 if (!sharedEdgeAddrPtr_)
2086 return *sharedEdgeAddrPtr_;
2092 if (!coupledPatchPtr_)
2094 const polyBoundaryMesh&
bMesh = mesh_.boundaryMesh();
2100 const polyPatch&
pp =
bMesh[patchi];
2104 nCoupled +=
pp.size();
2112 const polyPatch&
pp =
bMesh[patchi];
2116 label facei =
pp.start();
2120 coupledFaces[nCoupled++] = facei++;
2125 coupledPatchPtr_.reset
2140 Pout<<
"globalMeshData::coupledPatch() :" 2141 <<
" constructed coupled faces patch:" 2142 <<
" faces:" << coupledPatchPtr_().size()
2143 <<
" points:" << coupledPatchPtr_().nPoints()
2147 return *coupledPatchPtr_;
2153 if (!coupledPatchMeshEdgesPtr_)
2155 coupledPatchMeshEdgesPtr_.reset
2159 coupledPatch().meshEdges
2167 return *coupledPatchMeshEdgesPtr_;
2174 if (!coupledPatchMeshEdgeMapPtr_)
2178 coupledPatchMeshEdgeMapPtr_.reset
2183 return *coupledPatchMeshEdgeMapPtr_;
2189 if (!globalPointNumberingPtr_)
2194 globalPointNumberingPtr_.reset
2196 new globalIndex(coupledPatch().
nPoints())
2202 return *globalPointNumberingPtr_;
2209 if (!globalTransformsPtr_)
2214 globalTransformsPtr_.reset(
new globalIndexAndTransform(mesh_));
2219 return *globalTransformsPtr_;
2225 if (!globalPointSlavesPtr_)
2227 calcGlobalPointSlaves();
2229 return *globalPointSlavesPtr_;
2236 if (!globalPointTransformedSlavesPtr_)
2238 calcGlobalPointSlaves();
2240 return *globalPointTransformedSlavesPtr_;
2246 if (!globalPointSlavesMapPtr_)
2248 calcGlobalPointSlaves();
2250 return *globalPointSlavesMapPtr_;
2256 if (!globalEdgeNumberingPtr_)
2261 globalEdgeNumberingPtr_.reset
2263 new globalIndex(coupledPatch().nEdges())
2269 return *globalEdgeNumberingPtr_;
2275 if (!globalEdgeSlavesPtr_)
2277 calcGlobalEdgeSlaves();
2279 return *globalEdgeSlavesPtr_;
2286 if (!globalEdgeTransformedSlavesPtr_)
2288 calcGlobalEdgeSlaves();
2290 return *globalEdgeTransformedSlavesPtr_;
2296 if (!globalEdgeOrientationPtr_)
2298 calcGlobalEdgeOrientation();
2300 return *globalEdgeOrientationPtr_;
2306 if (!globalEdgeSlavesMapPtr_)
2308 calcGlobalEdgeSlaves();
2310 return *globalEdgeSlavesMapPtr_;
2317 if (!globalBoundaryFaceNumberingPtr_)
2319 calcGlobalPointBoundaryFaces();
2321 return *globalBoundaryFaceNumberingPtr_;
2328 if (!globalPointBoundaryFacesPtr_)
2330 calcGlobalPointBoundaryFaces();
2332 return *globalPointBoundaryFacesPtr_;
2339 if (!globalPointTransformedBoundaryFacesPtr_)
2341 calcGlobalPointBoundaryFaces();
2343 return *globalPointTransformedBoundaryFacesPtr_;
2350 if (!globalPointBoundaryFacesMapPtr_)
2352 calcGlobalPointBoundaryFaces();
2354 return *globalPointBoundaryFacesMapPtr_;
2360 if (!boundaryCellsPtr_)
2362 calcGlobalPointBoundaryCells();
2364 return *boundaryCellsPtr_;
2371 if (!globalBoundaryCellNumberingPtr_)
2373 calcGlobalPointBoundaryCells();
2375 return *globalBoundaryCellNumberingPtr_;
2382 if (!globalPointBoundaryCellsPtr_)
2384 calcGlobalPointBoundaryCells();
2386 return *globalPointBoundaryCellsPtr_;
2393 if (!globalPointTransformedBoundaryCellsPtr_)
2395 calcGlobalPointBoundaryCells();
2397 return *globalPointTransformedBoundaryCellsPtr_;
2404 if (!globalPointBoundaryCellsMapPtr_)
2406 calcGlobalPointBoundaryCells();
2408 return *globalPointBoundaryCellsMapPtr_;
2414 if (!globalCoPointSlavesPtr_)
2416 calcGlobalCoPointSlaves();
2418 return *globalCoPointSlavesPtr_;
2424 if (!globalCoPointSlavesMapPtr_)
2426 calcGlobalCoPointSlaves();
2428 return *globalCoPointSlavesMapPtr_;
2439 const globalIndex& globalCoupledPoints = globalPointNumbering();
2442 const mapDistribute& pointSlavesMap = globalCoPointSlavesMap();
2452 labelList masterGlobalPoint(cpp.nPoints(), -1);
2453 forAll(masterGlobalPoint, pointi)
2455 const labelList& slavePoints = pointSlaves[pointi];
2456 if (slavePoints.size() > 0)
2458 masterGlobalPoint[pointi] = globalCoupledPoints.toGlobal(pointi);
2475 bitSet isMaster(mesh_.nPoints(),
true);
2476 forAll(pointSlaves, pointi)
2478 if (masterGlobalPoint[pointi] == -1)
2485 masterGlobalPoint[pointi]
2486 == globalCoupledPoints.toGlobal(pointi)
2495 isMaster.unset(cpp.meshPoints()[pointi]);
2499 label myUniquePoints = mesh_.nPoints() - cpp.nPoints() + nMaster;
2509 autoPtr<globalIndex> globalPointsPtr(
new globalIndex(myUniquePoints));
2513 pointToGlobal.setSize(mesh_.nPoints());
2515 uniquePoints.setSize(myUniquePoints);
2518 forAll(isMaster, meshPointi)
2520 if (isMaster[meshPointi])
2522 pointToGlobal[meshPointi] = globalPointsPtr().toGlobal(nMaster);
2523 uniquePoints[nMaster] = meshPointi;
2531 labelList masterToGlobal(pointSlavesMap.constructSize(), -1);
2533 forAll(pointSlaves, pointi)
2535 const labelList& slaves = pointSlaves[pointi];
2537 if (slaves.size() > 0)
2540 label meshPointi = cpp.meshPoints()[pointi];
2541 masterToGlobal[pointi] = pointToGlobal[meshPointi];
2544 masterToGlobal[slaves[i]] = masterToGlobal[pointi];
2550 pointSlavesMap.reverseDistribute(cpp.nPoints(), masterToGlobal);
2553 forAll(pointSlaves, pointi)
2555 label meshPointi = cpp.meshPoints()[pointi];
2557 if (!isMaster[meshPointi])
2559 pointToGlobal[meshPointi] = masterToGlobal[pointi];
2567 return globalPointsPtr;
2581 const mapDistribute& pointSlavesMap = globalCoPointSlavesMap();
2609 forAll(meshPoints, patchPointi)
2611 label meshPointi = meshPoints[patchPointi];
2617 patchToCoupled[patchPointi] = iter();
2618 coupledToGlobalPatch[iter()] = globalPPoints.toGlobal(patchPointi);
2636 pointSlavesMap.
distribute(coupledToGlobalPatch);
2637 forAll(pointSlaves, coupledPointi)
2639 const labelList& slaves = pointSlaves[coupledPointi];
2641 if (slaves.size() > 0)
2645 if (coupledToGlobalPatch[coupledPointi] != -1)
2648 masterI = coupledToGlobalPatch[coupledPointi];
2655 label slavePp = coupledToGlobalPatch[slaves[i]];
2656 if (slavePp != -1 && slavePp < masterI)
2666 coupledToGlobalPatch[coupledPointi] = masterI;
2669 coupledToGlobalPatch[slaves[i]] = masterI;
2684 forAll(meshPoints, patchPointi)
2686 if (patchToCoupled[patchPointi] == -1)
2692 label coupledPointi = patchToCoupled[patchPointi];
2695 globalPPoints.toGlobal(patchPointi)
2696 == coupledToGlobalPatch[coupledPointi]
2705 autoPtr<globalIndex> globalPointsPtr(
new globalIndex(nMasters));
2719 uniqueMeshPoints.
setSize(nMasters);
2726 forAll(meshPoints, patchPointi)
2728 if (patchToCoupled[patchPointi] == -1)
2730 uniqueMeshPoints[nMasters++] = meshPoints[patchPointi];
2734 label coupledPointi = patchToCoupled[patchPointi];
2737 globalPPoints.toGlobal(patchPointi)
2738 == coupledToGlobalPatch[coupledPointi]
2741 globalMaster[coupledPointi] =
2742 globalPointsPtr().toGlobal(nMasters);
2743 uniqueMeshPoints[nMasters++] = meshPoints[patchPointi];
2763 forAll(meshPoints, patchPointi)
2765 if (patchToCoupled[patchPointi] == -1)
2767 pointToGlobal[patchPointi] = globalPointsPtr().toGlobal(nMasters++);
2771 label coupledPointi = patchToCoupled[patchPointi];
2772 pointToGlobal[patchPointi] = globalMaster[coupledPointi];
2776 globalPPoints.toGlobal(patchPointi)
2777 == coupledToGlobalPatch[coupledPointi]
2788 return globalPointsPtr;
2809 scalar tolDim = matchTol_ * mesh_.bounds().mag();
2813 Pout<<
"globalMeshData : merge dist:" << tolDim <<
endl;
2817 const label comm = mesh_.comm();
2828 label* tup = allSizes.begin(3*myProci);
2829 tup[0] = mesh_.nPoints();
2830 tup[1] = mesh_.nFaces();
2831 tup[2] = mesh_.nCells();
2840 for (label proci = 0, idx = 0; proci < numProc; ++proci, idx += 3)
2842 counts[proci] = allSizes[idx];
2844 globalMeshPointAddr_.reset(counts);
2846 for (label proci = 0, idx = 1; proci < numProc; ++proci, idx += 3)
2848 counts[proci] = allSizes[idx];
2850 globalMeshFaceAddr_.reset(counts);
2852 for (label proci = 0, idx = 2; proci < numProc; ++proci, idx += 3)
2854 counts[proci] = allSizes[idx];
2856 globalMeshCellAddr_.reset(counts);
2860 globalMeshPointAddr_.reset(globalIndex::gatherNone{}, mesh_.nPoints());
2861 globalMeshFaceAddr_.reset(globalIndex::gatherNone{}, mesh_.nFaces());
2862 globalMeshCellAddr_.reset(globalIndex::gatherNone{}, mesh_.nCells());
2870 Info<<
"globalMeshData : Total points/faces/cells : (" 2871 << nTotalPoints() <<
' ' 2872 << nTotalFaces() <<
' ' 2873 << 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.
label comm() const noexcept
The communicator used for parallel communication.
label nPoints() const
Number of points supporting patch faces.
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)
static int incrMsgType(int val=1) noexcept
Increment the message tag for standard messages.
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.
void distribute(List< T > &fld, const bool dummyTransform=true, const int tag=UPstream::msgType()) const
Distribute List data using default commsType, default flip/negate operator.
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.
label constructSize() const noexcept
Constructed data size.
const labelListList & globalPointBoundaryCells() const
void resize_nocopy(const label len)
Adjust allocated size of list without necessarily.
static int & msgType() noexcept
Message tag of standard messages.
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.
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.
const Map< label > & meshPointMap() const
Mesh point map.
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_iterator cfind(const Key &key) const
Find and return an const_iterator set at the hashed entry.
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 reverseDistribute(const label constructSize, List< T > &fld, const bool dummyTransform=true, const int tag=UPstream::msgType()) const
Reverse distribute data using default commsType.
refinementData transform(const tensor &, const refinementData val)
No-op rotational transform for base types.
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
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()