43 void Foam::faMeshDecomposition::distributeFaces()
45 const word& polyMeshRegionName =
mesh().
name();
47 Info<<
"\nCalculating distribution of finiteArea faces" <<
endl;
51 for (label proci = 0; proci <
nProcs(); ++proci)
67 processorDb.timeName(),
85 ioAddr.rename(
"faceProcAddressing");
89 faceProcAddressingHash.
reserve(fvFaceProcAddressing.size());
99 if (hasGlobalFaceZones_)
102 ioAddr.rename(
"owner");
105 for (
int i = 0; i < ownerSize; ++i)
107 faceProcAddressingHash.insert(fvFaceProcAddressing[i]);
112 faceProcAddressingHash.insert
114 static_cast<labelList&>(fvFaceProcAddressing)
121 const label index = (
faceLabels()[facei] + 1);
123 if (faceProcAddressingHash.found(index))
125 faceToProc_[facei] = proci;
130 Info<<
"\nFinished decomposition in " 131 << decompositionTime.elapsedCpuTime()
141 const label nProcessors,
146 nProcs_(nProcessors),
148 hasGlobalFaceZones_(false),
149 faceToProc_(nFaces()),
150 procFaceLabels_(nProcs_),
151 procMeshEdgesMap_(nProcs_),
152 procNInternalEdges_(nProcs_,
Zero),
153 procPatchEdgeLabels_(nProcs_),
154 procPatchPointAddressing_(nProcs_),
155 procPatchEdgeAddressing_(nProcs_),
156 procEdgeAddressing_(nProcs_),
157 procFaceAddressing_(nProcs_),
158 procBoundaryAddressing_(nProcs_),
159 procPatchSize_(nProcs_),
160 procPatchStartIndex_(nProcs_),
161 procNeighbourProcessors_(nProcs_),
162 procProcessorPatchSize_(nProcs_),
163 procProcessorPatchStartIndex_(nProcs_),
164 globallySharedPoints_(),
165 cyclicParallel_(false)
179 if (params.
found(
"globalFaceZones"))
181 hasGlobalFaceZones_ =
true;
191 const word& polyMeshRegionName =
mesh().
name();
193 Info<<
"\nDistributing faces to processors" <<
endl;
199 forAll(faceToProc_, facei)
201 const label proci = faceToProc_[facei];
203 if (proci < 0 || proci >= nProcs_)
206 <<
"Invalid processor label " << proci
207 <<
" for face " << facei <<
nl 212 ++nLocalFaces[proci];
217 forAll(nLocalFaces, proci)
219 procFaceAddressing_[proci].resize(nLocalFaces[proci]);
220 nLocalFaces[proci] = 0;
224 forAll(faceToProc_, facei)
226 const label proci = faceToProc_[facei];
227 const label localFacei = nLocalFaces[proci];
228 ++nLocalFaces[proci];
230 procFaceAddressing_[proci][localFacei] = facei;
236 for (label procI = 0; procI < nProcs(); procI++)
242 time().caseName()/(
"processor" +
Foam::name(procI)),
252 processorDb.timeName(),
270 ioAddr.rename(
"pointProcAddressing");
273 Map<label> fvFaceProcAddressingHash;
277 ioAddr.rename(
"faceProcAddressing");
280 fvFaceProcAddressingHash =
invertToMap(fvFaceProcAddressing);
284 const labelList& curProcFaceAddressing = procFaceAddressing_[procI];
286 labelList& curFaceLabels = procFaceLabels_[procI];
288 curFaceLabels =
labelList(curProcFaceAddressing.size(), -1);
290 forAll(curProcFaceAddressing, faceI)
292 curFaceLabels[faceI] =
293 fvFaceProcAddressingHash.find
295 faceLabels()[curProcFaceAddressing[faceI]] + 1
307 const Map<label>& map =
patch.meshPointMap();
309 EdgeMap<label> edgesHash;
311 const label nIntEdges =
patch.nInternalEdges();
313 for (label edgei = 0; edgei < nIntEdges; ++edgei)
315 edgesHash.insert(
patch.edges()[edgei], edgesHash.size());
321 const label size =
boundary()[patchi].labelList::size();
323 for (label edgei=0; edgei < size; ++edgei)
335 const labelList& procMeshPoints = procPatch.meshPoints();
336 const edgeList& procEdges = procPatch.edges();
338 labelList& curPatchPointAddressing = procPatchPointAddressing_[procI];
339 curPatchPointAddressing.
resize(procMeshPoints.size(), -1);
341 forAll(procMeshPoints, pointi)
343 curPatchPointAddressing[pointi] =
344 map[fvPointProcAddressing[procMeshPoints[pointi]]];
347 labelList& curPatchEdgeAddressing = procPatchEdgeAddressing_[procI];
348 curPatchEdgeAddressing.
resize(procEdges.size(), -1);
350 Map<label>& curMap = procMeshEdgesMap_[procI];
352 curMap.reserve(procEdges.size());
356 edge curGlobalEdge(curPatchPointAddressing, procEdges[edgeI]);
357 curPatchEdgeAddressing[edgeI] = edgesHash.find(curGlobalEdge).val();
360 forAll(curPatchEdgeAddressing, edgeI)
362 curMap.insert(curPatchEdgeAddressing[edgeI], edgeI);
365 procNInternalEdges_[procI] = procPatch.nInternalEdges();
369 Info <<
"\nDistributing edges to processors" <<
endl;
376 const edgeList& edges = this->edges();
378 const labelList& neighbour = edgeNeighbour();
382 List<SLList<label>> procEdgeList(nProcs());
384 forAll(procEdgeList, procI)
386 for(label i=0; i<procNInternalEdges_[procI]; i++)
388 procEdgeList[procI].append(procPatchEdgeAddressing_[procI][i]);
396 List<SLList<label>> interProcBoundaries(nProcs());
399 List<SLList<SLList<label>>> interProcBEdges(nProcs());
401 List<SLList<label>> procPatchIndex(nProcs());
405 if (faceToProc_[owner[edgeI]] != faceToProc_[neighbour[edgeI]])
411 bool interProcBouFound =
false;
413 const label ownProc = faceToProc_[owner[edgeI]];
414 const label neiProc = faceToProc_[neighbour[edgeI]];
416 auto curInterProcBdrsOwnIter =
417 interProcBoundaries[ownProc].cbegin();
419 auto curInterProcBEdgesOwnIter =
420 interProcBEdges[ownProc].begin();
427 curInterProcBdrsOwnIter.good()
428 && curInterProcBEdgesOwnIter.good();
429 ++curInterProcBdrsOwnIter,
430 ++curInterProcBEdgesOwnIter
433 if (curInterProcBdrsOwnIter() == neiProc)
436 interProcBouFound =
true;
438 bool neighbourFound =
false;
440 curInterProcBEdgesOwnIter().append(edgeI);
442 auto curInterProcBdrsNeiIter =
443 interProcBoundaries[neiProc].cbegin();
445 auto curInterProcBEdgesNeiIter =
446 interProcBEdges[neiProc].begin();
453 curInterProcBdrsNeiIter.good()
454 && curInterProcBEdgesNeiIter.good();
455 ++curInterProcBdrsNeiIter,
456 ++curInterProcBEdgesNeiIter
459 if (curInterProcBdrsNeiIter() == ownProc)
462 neighbourFound =
true;
464 curInterProcBEdgesNeiIter().append(edgeI);
467 if (neighbourFound)
break;
470 if (interProcBouFound && !neighbourFound)
473 (
"faDomainDecomposition::decomposeMesh()")
474 <<
"Inconsistency in inter - " 475 <<
"processor boundary lists for processors " 476 << ownProc <<
" and " << neiProc
481 if (interProcBouFound)
break;
484 if (!interProcBouFound)
492 interProcBoundaries[ownProc].append(neiProc);
493 interProcBEdges[ownProc].append(SLList<label>(edgeI));
496 interProcBoundaries[neiProc].append(ownProc);
497 interProcBEdges[neiProc]
513 forAll(procPatchSize_, procI)
516 procPatchStartIndex_[procI].setSize(
patches.
size());
522 forAll(procPatchSize_, procI)
524 procPatchSize_[procI][patchI] = 0;
525 procPatchStartIndex_[procI][patchI] =
526 procEdgeList[procI].size();
539 const label size =
patches[patchI].labelList::size();
543 for(
int eI=0; eI<size; eI++)
545 patchEdgeFaces[eI] = eF[
patches[patchI][eI]][0];
548 forAll(patchEdgeFaces, edgeI)
550 const label curProc = faceToProc_[patchEdgeFaces[edgeI]];
553 procEdgeList[curProc].append(patchStart + edgeI);
556 procPatchSize_[curProc][patchI]++;
563 const faPatch& cPatch =
patches[patchI];
565 const label cycOffset = cPatch.
size()/2;
581 forAll(firstEdgeFaces, edgeI)
585 faceToProc_[firstEdgeFaces[edgeI]]
586 != faceToProc_[secondEdgeFaces[edgeI]]
595 cyclicParallel_ =
true;
597 bool interProcBouFound =
false;
599 const label ownProc =
600 faceToProc_[firstEdgeFaces[edgeI]];
601 const label neiProc =
602 faceToProc_[secondEdgeFaces[edgeI]];
604 auto curInterProcBdrsOwnIter =
605 interProcBoundaries[ownProc].cbegin();
607 auto curInterProcBEdgesOwnIter =
608 interProcBEdges[ownProc].begin();
615 curInterProcBdrsOwnIter.good()
616 && curInterProcBEdgesOwnIter.good();
617 ++curInterProcBdrsOwnIter,
618 ++curInterProcBEdgesOwnIter
621 if (curInterProcBdrsOwnIter() == neiProc)
625 interProcBouFound =
true;
627 bool neighbourFound =
false;
629 curInterProcBEdgesOwnIter()
630 .append(patchStart + edgeI);
632 auto curInterProcBdrsNeiIter
633 = interProcBoundaries[neiProc].cbegin();
635 auto curInterProcBEdgesNeiIter =
636 interProcBEdges[neiProc].begin();
643 curInterProcBdrsNeiIter.good()
644 && curInterProcBEdgesNeiIter.good();
645 ++curInterProcBdrsNeiIter,
646 ++curInterProcBEdgesNeiIter
649 if (curInterProcBdrsNeiIter() == ownProc)
652 neighbourFound =
true;
654 curInterProcBEdgesNeiIter()
663 if (neighbourFound)
break;
666 if (interProcBouFound && !neighbourFound)
670 "faDomainDecomposition::decomposeMesh()" 671 ) <<
"Inconsistency in inter-processor " 672 <<
"boundary lists for processors " 673 << ownProc <<
" and " << neiProc
674 <<
" in cyclic boundary matching" 679 if (interProcBouFound)
break;
682 if (!interProcBouFound)
690 interProcBoundaries[ownProc].append(neiProc);
691 interProcBEdges[ownProc]
692 .append(SLList<label>(patchStart + edgeI));
695 interProcBoundaries[neiProc].append(ownProc);
696 interProcBEdges[neiProc]
711 label ownProc = faceToProc_[firstEdgeFaces[edgeI]];
714 procEdgeList[ownProc].append(patchStart + edgeI);
717 procPatchSize_[ownProc][patchI]++;
728 forAll(secondEdgeFaces, edgeI)
732 faceToProc_[firstEdgeFaces[edgeI]]
733 == faceToProc_[secondEdgeFaces[edgeI]]
737 label ownProc = faceToProc_[firstEdgeFaces[edgeI]];
740 procEdgeList[ownProc].append
741 (patchStart + cycOffset + edgeI);
744 procPatchSize_[ownProc][patchI]++;
752 forAll(procEdgeList, procI)
755 SLList<label>& curProcEdges = procEdgeList[procI];
758 labelList& curProcEdgeAddressing = procEdgeAddressing_[procI];
761 procNeighbourProcessors_[procI];
764 procProcessorPatchSize_[procI];
766 labelList& curProcProcessorPatchStartIndex =
767 procProcessorPatchStartIndex_[procI];
770 label nEdgesOnProcessor = curProcEdges.
size();
772 for (
const auto& bedges : interProcBEdges[procI])
774 nEdgesOnProcessor += bedges.size();
777 curProcEdgeAddressing.setSize(nEdgesOnProcessor);
790 for (
const label procEdgei : curProcEdges)
792 curProcEdgeAddressing[nEdges] = procEdgei;
800 curProcNeighbourProcessors.setSize
802 interProcBoundaries[procI].size()
805 curProcProcessorPatchSize.setSize
807 interProcBoundaries[procI].size()
810 curProcProcessorPatchStartIndex.setSize
812 interProcBoundaries[procI].size()
817 auto curInterProcBdrsIter =
818 interProcBoundaries[procI].cbegin();
820 auto curInterProcBEdgesIter =
821 interProcBEdges[procI].cbegin();
826 curInterProcBdrsIter.good()
827 && curInterProcBEdgesIter.good();
828 ++curInterProcBdrsIter,
829 ++curInterProcBEdgesIter
833 curInterProcBdrsIter();
845 for (
const label edgei : *curInterProcBEdgesIter)
851 if (faceToProc_[owner[edgei]] == procI)
853 curProcEdgeAddressing[nEdges] = edgei;
859 curProcEdgeAddressing[nEdges] = edgei;
874 Info <<
"\nCalculating processor boundary addressing" <<
endl;
880 forAll(procPatchSize_, procI)
883 const labelList oldPatchSizes = procPatchSize_[procI];
885 const labelList oldPatchStarts = procPatchStartIndex_[procI];
887 labelList& curPatchSizes = procPatchSize_[procI];
889 labelList& curPatchStarts = procPatchStartIndex_[procI];
891 const labelList& curProcessorPatchSizes =
892 procProcessorPatchSize_[procI];
894 labelList& curBoundaryAddressing = procBoundaryAddressing_[procI];
899 + curProcessorPatchSizes.size()
904 forAll(oldPatchSizes, patchI)
910 curBoundaryAddressing[
nPatches] = patchI;
912 curPatchSizes[
nPatches] = oldPatchSizes[patchI];
914 curPatchStarts[
nPatches] = oldPatchStarts[patchI];
924 forAll(curProcessorPatchSizes, procPatchI)
926 curBoundaryAddressing[
nPatches] = -1;
931 curBoundaryAddressing.setSize(
nPatches);
952 for (label procI = 0; procI < nProcs(); procI++)
955 const labelList& curEdgeLabels = procEdgeAddressing_[procI];
958 const labelList& curProcessorPatchStarts =
959 procProcessorPatchStartIndex_[procI];
961 const labelList& curProcessorPatchSizes =
962 procProcessorPatchSize_[procI];
967 forAll(curProcessorPatchStarts, patchI)
969 const label curStart = curProcessorPatchStarts[patchI];
970 const label curEnd = curStart + curProcessorPatchSizes[patchI];
974 label edgeI = curStart;
981 const label curE = curEdgeLabels[edgeI];
983 const edge&
e = edges[curE];
987 if (pointsUsage[
e[pointI]] == 0)
990 pointsUsage[
e[pointI]] = patchI + 1;
992 else if (pointsUsage[
e[pointI]] != patchI + 1)
995 gSharedPoints.insert(
e[pointI]);
1003 globallySharedPoints_ = gSharedPoints.sortedToc();
1009 for (label procI = 0; procI < nProcs(); procI++)
1016 time().caseName()/(
"processor" +
Foam::name(procI)),
1028 processorDb.timeName(),
1041 const labelList& curEdgeAddressing = procEdgeAddressing_[procI];
1043 const labelList& curPatchStartIndex = procPatchStartIndex_[procI];
1044 const labelList& curPatchSize = procPatchSize_[procI];
1046 const labelList& curProcessorPatchStartIndex =
1047 procProcessorPatchStartIndex_[procI];
1049 const labelList& curProcessorPatchSize =
1050 procProcessorPatchSize_[procI];
1052 labelListList& curPatchEdgeLabels = procPatchEdgeLabels_[procI];
1053 curPatchEdgeLabels.
resize 1056 + curProcessorPatchSize.size()
1059 forAll(curPatchSize, patchI)
1061 labelList& curEdgeLabels = curPatchEdgeLabels[patchI];
1062 curEdgeLabels.
setSize(curPatchSize[patchI], -1);
1068 int i=curPatchStartIndex[patchI];
1069 i<(curPatchStartIndex[patchI]+curPatchSize[patchI]);
1073 curEdgeLabels[edgeI] =
1074 procMeshEdgesMap_[procI][curEdgeAddressing[i]];
1079 forAll(curProcessorPatchSize, patchI)
1082 curPatchEdgeLabels[curPatchSize.size() + patchI];
1083 curEdgeLabels.
setSize(curProcessorPatchSize[patchI], -1);
1089 int i=curProcessorPatchStartIndex[patchI];
1090 i<(curProcessorPatchStartIndex[patchI]
1091 +curProcessorPatchSize[patchI]);
1095 curEdgeLabels[edgeI] =
1096 procMeshEdgesMap_[procI][curEdgeAddressing[i]];
1106 const word& polyMeshRegionName =
mesh().
name();
1108 Info<<
"\nConstructing processor FA meshes" <<
endl;
1111 Map<label> sharedPointLookup(
invertToMap(globallySharedPoints_));
1114 label maxProcFaces = 0;
1115 label totProcFaces = 0;
1116 label maxProcEdges = 0;
1117 label totProcEdges = 0;
1118 label maxProcPatches = 0;
1119 label totProcPatches = 0;
1122 for (label procI = 0; procI < nProcs(); procI++)
1131 time().caseName()/(
"processor" +
Foam::name(procI)),
1142 processorDb.timeName(),
1151 "boundaryProcAddressing",
1169 const labelList& curBoundaryAddressing =
1170 procBoundaryAddressing_[procI];
1172 const labelList& curPatchSizes = procPatchSize_[procI];
1174 const labelList& curNeighbourProcessors =
1175 procNeighbourProcessors_[procI];
1177 const labelList& curProcessorPatchSizes =
1178 procProcessorPatchSize_[procI];
1181 procPatchEdgeLabels_[procI];
1187 curPatchSizes.size() + curProcessorPatchSizes.size()
1192 forAll(curPatchSizes, patchi)
1196 const label neiPolyPatchId =
1197 fvBoundaryProcAddressing.
find 1199 meshPatches[curBoundaryAddressing[patchi]]
1200 .ngbPolyPatchIndex()
1206 meshPatches[curBoundaryAddressing[patchi]].clone
1208 procMesh.boundary(),
1217 forAll(curProcessorPatchSizes, procPatchI)
1224 new processorFaPatch
1228 procMesh.boundary(),
1231 curNeighbourProcessors[procPatchI]
1239 procMesh.addFaPatches(procPatches);
1247 Info<<
nl <<
"Processor " << procI;
1249 if (procMesh.nFaces())
1258 Info<<
"Number of faces = " << procMesh.nFaces() <<
nl;
1260 if (procMesh.nFaces())
1262 Info<<
" Number of points = " << procMesh.nPoints() <<
nl;
1265 totProcFaces += procMesh.nFaces();
1266 maxProcFaces =
max(maxProcFaces, procMesh.nFaces());
1268 label nBoundaryEdges = 0;
1270 label nProcEdges = 0;
1272 for (
const faPatch& fap : procMesh.boundary())
1274 const auto* ppp = isA<processorFaPatch>(fap);
1278 const auto& procPatch = *ppp;
1280 Info<<
" Number of edges shared with processor " 1281 << procPatch.neighbProcNo() <<
" = " 1282 << procPatch.size() <<
nl;
1284 nProcEdges += procPatch.size();
1289 nBoundaryEdges += fap.size();
1293 if (procMesh.nFaces() && (nBoundaryEdges || nProcEdges))
1296 <<
" Number of processor edges = " << nProcEdges <<
nl 1297 <<
" Number of boundary edges = " << nBoundaryEdges <<
nl;
1300 totProcEdges += nProcEdges;
1302 maxProcEdges =
max(maxProcEdges, nProcEdges);
1319 ioAddr.rename(
"pointProcAddressing");
1323 ioAddr.rename(
"edgeProcAddressing");
1327 ioAddr.rename(
"faceProcAddressing");
1331 ioAddr.rename(
"boundaryProcAddressing");
1338 <<
"Number of processor edges = " << (totProcEdges/2) <<
nl 1339 <<
"Max number of faces = " << maxProcFaces;
1341 if (maxProcFaces != totProcFaces)
1343 scalar avgValue = scalar(totProcFaces)/nProcs_;
1345 Info<<
" (" << 100.0*(maxProcFaces-avgValue)/avgValue
1346 <<
"% above average " << avgValue <<
')';
1350 Info<<
"Max number of processor patches = " << maxProcPatches;
1353 scalar avgValue = scalar(totProcPatches)/nProcs_;
1355 Info<<
" (" << 100.0*(maxProcPatches-avgValue)/avgValue
1356 <<
"% above average " << avgValue <<
')';
1360 Info<<
"Max number of edges between processors = " << maxProcEdges;
1363 scalar avgValue = scalar(totProcEdges)/nProcs_;
1365 Info<<
" (" << 100.0*(maxProcEdges-avgValue)/avgValue
1366 <<
"% above average " << avgValue <<
')';
PtrList< faPatch > faPatchList
Store lists of faPatch as a PtrList.
Finite area mesh (used for 2-D non-Euclidian finite area method) defined using a patch of faces on a ...
void size(const label n)
Older name for setAddressableSize.
void resize(const label len)
Adjust allocated size of list.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
A list of keyword definitions, which are a keyword followed by a number of values (eg...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
List< edge > edgeList
List of edge.
const Time & time() const
Return reference to time.
const word & name() const noexcept
Return the object name.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
constexpr char nl
The newline '\n' character (0x0a)
label start() const noexcept
The start label of boundary faces in the polyMesh face list.
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Ostream & endl(Ostream &os)
Add newline and flush stream.
SubList< label > subList
Declare type of subList.
Ignore writing from objectRegistry::writeObject()
static void writeContents(const IOobject &io, const UList< T > &content)
Write contents. The IOobject is never registered.
label nProcs() const noexcept
Number of processor in decomposition.
void updateParameters(const dictionary ¶ms)
Update flags based on the decomposition model settings.
labelList faceLabels(nFaceLabels)
List< labelList > labelListList
List of labelList.
Various functions to operate on Lists.
bool found(const word &keyword, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry (const access) with the given keyword.
#define forAll(list, i)
Loop across all elements in list.
const fileName & caseName() const noexcept
Return the Time::caseName()
HashSet< label, Hash< label > > labelHashSet
A HashSet of labels, uses label hasher.
Functions used by OpenFOAM that are specific to POSIX compliant operating systems and need to be repl...
const dimensionedScalar e
Elementary charge.
IOList< label > labelIOList
IO for a List of label.
void setSize(const label n)
Alias for resize()
const labelList & faceLabels() const noexcept
Return the underlying polyMesh face labels.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
bool writeDecomposition()
Write decomposition.
label size() const noexcept
The number of entries in the list.
static unsigned int minPrecision(unsigned int prec) noexcept
Set the minimum default precision.
static word controlDictName
The default control dictionary name (normally "controlDict")
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
errorManip< error > abort(error &err)
label find(const T &val) const
Find index of the first occurrence of the value.
bool readIfPresent(const word &keyword, T &val, enum keyType::option matchOpt=keyType::REGEX) const
Find an entry if present, and assign to T val. FatalIOError if it is found and the number of tokens i...
const polyMesh & mesh() const
Return access to polyMesh.
faMeshDecomposition(const polyMesh &mesh, const label nProcessors, const dictionary ¶ms=dictionary::null)
Construct from components. Values will come from the volume decomposition.
static word meshSubDir
The mesh sub-directory name (usually "faMesh")
PrimitivePatch< UIndirectList< face >, const pointField & > uindirectPrimitivePatch
A PrimitivePatch with UIndirectList for the faces, const reference for the point field.
void decomposeMesh()
Decompose mesh.
const fileName & rootPath() const noexcept
Return the Time::rootPath()
cpuTimePosix cpuTime
Selection of preferred clock mechanism for the elapsed cpu time.
const word & name() const
Return reference to name.
IOobject(const IOobject &)=default
Copy construct.
void reserve(label numEntries)
Reserve space for at least the specified number of elements (not the number of buckets) and regenerat...
const polyBoundaryMesh & patches
const std::string patch
OpenFOAM patch number as a std::string.
messageStream Info
Information stream (stdout output on master, null elsewhere)
std::enable_if_t< std::is_same_v< bool, TypeT >, bool > set(const label i, bool val=true)
A bitSet::set() method for a list of bool.
Mesh consisting of general polyhedral cells.
List< label > labelList
A List of labels.
Non-intrusive singly-linked list.
Map< label > invertToMap(const labelUList &values)
Create inverse mapping, which is a lookup table into the given list.
#define FatalErrorIn(functionName)
Report an error message using Foam::FatalError.
Do not request registration (bool: false)
static constexpr const zero Zero
Global zero (0)