49 void Foam::domainDecomposition::decomposePoints()
51 for (
label proci = 0; proci < nProcs(); proci++)
53 fvMesh& procMesh = procMeshes_[proci];
55 const label pointsCompare =
58 completeMesh().pointsInstance(),
59 procMeshes_[proci].pointsInstance()
62 if (pointsCompare == -1)
69 procPointAddressing_[proci]
77 void Foam::domainDecomposition::reconstructPoints()
79 const label pointsCompare =
82 completeMesh().pointsInstance(),
83 procMeshes_[0].pointsInstance()
86 if (pointsCompare == 1)
90 for (
label proci = 0; proci < nProcs(); proci++)
92 const fvMesh& procMesh = procMeshes_[proci];
94 completePoints.rmap(procMesh.points(), procPointAddressing_[proci]);
97 completeMesh_->setPoints(completePoints);
102 bool Foam::domainDecomposition::completeConformal()
const 104 return completeMesh().conformal();
108 bool Foam::domainDecomposition::procsConformal()
const 110 forAll(procMeshes_, proci)
112 if (!procMeshes_[proci].conformal())
122 void Foam::domainDecomposition::unconform()
125 auto checkNonConformalCoupledPatchOrdering = []
129 const fvPatch& nbrFvp,
134 if (fvp.size() != nbrFvp.size())
137 <<
"Coupled patches " << fvp.name() <<
" and " 138 << nbrFvp.name() <<
" are not the same size" 144 for (
label i = 1; i < fvp.size(); ++ i)
148 polyFacesPf[i - 1] > polyFacesPf[i]
150 : polyFacesPf[i - 1] == polyFacesPf[i]
151 ? nbrPolyFacesPf[i - 1] >= nbrPolyFacesPf[i]
156 <<
"Coupled patches " << fvp.name()
157 <<
" and " << nbrFvp.name()
158 <<
" are not in order";
160 if (procs[0] == procs[1])
163 <<
" on process #" << procs[0];
173 <<
"Coupled patches " << fvp.name()
174 <<
" and " << nbrFvp.name()
175 <<
" are in order" <<
endl;
179 auto checkNonConformalErrorPatchOrdering = []
188 for (
label i = 1; i < fvp.size(); ++ i)
190 if (polyFacesPf[i - 1] > polyFacesPf[i])
193 <<
"Error patch " << fvp.name()
194 <<
" is not in order";
199 <<
" on process #" << proci;
209 <<
"Error patch " << fvp.name()
210 <<
" is in order" <<
endl;
213 if (completeConformal() && procsConformal())
217 else if (!completeConformal() && procsConformal())
220 labelList faceProcFace(completeMesh().nFaces(), -labelMax);
221 forAll(procMeshes_, proci)
223 forAll(procFaceAddressing()[proci], procFacei)
226 mag(procFaceAddressing()[proci][procFacei]) - 1;
228 faceProcFace[facei] =
229 faceProcFace[facei] == -labelMax ? procFacei : -1;
236 forAll(procMeshes_, proci)
238 fvMesh& procMesh = procMeshes_[proci];
241 procFaceAddressingBf()[proci];
246 procMesh.polyFacesBf()
251 forAll(procMesh.boundary(), procNccPatchi)
253 const fvPatch& fvp = procMesh.boundary()[procNccPatchi];
255 if (isA<nonConformalFvPatch>(fvp))
257 const label completeNccPatchi =
258 isA<processorCyclicFvPatch>(fvp)
259 ? refCast<const processorCyclicFvPatch>(fvp)
263 polyFacesBf[procNccPatchi] =
269 completeMesh().polyFacesBf()[completeNccPatchi],
270 mag(faceAddressingBf[procNccPatchi]) - 1
274 const label size = polyFacesBf[procNccPatchi].size();
276 Sf.boundaryFieldRef()[procNccPatchi].resize(size,
Zero);
277 Cf.boundaryFieldRef()[procNccPatchi].resize(size,
Zero);
286 NullObjectRef<surfaceScalarField>(),
294 forAll(procMeshes_, proci)
299 procMeshes_[proci].boundary()[
patchi];
304 isA<nonConformalCoupledFvPatch>(fvp)
305 && refCast<const nonConformalCoupledFvPatch>(fvp).owner()
310 label nbrProci = -1, nbrNccPatchi = -1;
311 if (isA<cyclicFvPatch>(fvp))
315 refCast<const cyclicFvPatch>(fvp).nbrPatchID();
317 else if (isA<processorCyclicFvPatch>(fvp))
319 typedef processorCyclicFvPatch PcFvp;
321 const PcFvp& pcFvp = refCast<const PcFvp>(fvp);
323 nbrProci = pcFvp.neighbProcNo();
325 const fvBoundaryMesh& nbrFvPatches =
326 procMeshes_[nbrProci].boundary();
328 forAll(nbrFvPatches, nbrNccPatchj)
330 const fvPatch& nbrFvp =
331 nbrFvPatches[nbrNccPatchj];
333 if (isA<PcFvp>(nbrFvp))
335 const PcFvp& nbrPcFvp =
336 refCast<const PcFvp>(nbrFvp);
340 nbrPcFvp.neighbProcNo()
342 && nbrPcFvp.referPatchID()
343 == pcFvp.referPatch().nbrPatchID()
346 nbrNccPatchi = nbrNccPatchj;
352 if (nbrNccPatchi == -1)
355 <<
"Opposite processor patch not found for " 356 <<
"patch " << fvp.name() <<
" on proc #" 363 <<
"Non-conformal-coupled type not recognised " 364 <<
"for patch " << fvp.name() <<
" on proc #" 368 checkNonConformalCoupledPatchOrdering
371 procMeshes_[proci].boundary()[nccPatchi],
372 procMeshes_[nbrProci].boundary()[nbrNccPatchi],
373 procMeshes_[proci].polyFacesBf()[nccPatchi],
374 procMeshes_[nbrProci].polyFacesBf()[nbrNccPatchi]
379 if (isA<nonConformalErrorFvPatch>(fvp))
383 checkNonConformalErrorPatchOrdering
386 procMeshes_[proci].
boundary()[ncePatchi],
387 procMeshes_[proci].polyFacesBf()[ncePatchi]
394 else if (completeConformal() && !procsConformal())
402 completeMesh().polyFacesBf()
407 forAll(procMeshes_, proci)
409 const fvMesh& procMesh = procMeshes_[proci];
412 procFaceAddressingBf()[proci];
414 forAll(procMesh.boundary(), procNccPatchi)
416 const fvPatch& fvp = procMesh.boundary()[procNccPatchi];
418 if (isA<nonConformalFvPatch>(fvp))
420 const label completeNccPatchi =
421 isA<processorCyclicFvPatch>(fvp)
422 ? refCast<const processorCyclicFvPatch>(fvp)
429 max(
mag(faceAddressingBf[procNccPatchi])),
430 polyFacesBf[completeNccPatchi].size()
433 polyFacesBf[completeNccPatchi].resize(size, -1);
434 Sf.boundaryFieldRef()[completeNccPatchi].resize(size,
Zero);
435 Cf.boundaryFieldRef()[completeNccPatchi].resize(size,
Zero);
437 polyFacesBf[completeNccPatchi].labelField::rmap
443 procFaceAddressing_[proci],
444 procMesh.polyFacesBf()[procNccPatchi]
447 mag(faceAddressingBf[procNccPatchi]) - 1
453 completeMesh_->unconform
458 NullObjectRef<surfaceScalarField>(),
467 const fvPatch& fvp = completeMesh().boundary()[
patchi];
472 isA<nonConformalCyclicFvPatch>(fvp)
473 && refCast<const nonConformalCoupledFvPatch>(fvp).owner()
478 const label nbrNccPatchi =
479 refCast<const nonConformalCyclicFvPatch>(fvp)
482 checkNonConformalCoupledPatchOrdering
485 completeMesh().boundary()[nccPatchi],
486 completeMesh().boundary()[nbrNccPatchi],
487 completeMesh().polyFacesBf()[nccPatchi],
488 completeMesh().polyFacesBf()[nbrNccPatchi]
493 if (isA<nonConformalErrorFvPatch>(fvp))
497 checkNonConformalErrorPatchOrdering
500 completeMesh().
boundary()[ncePatchi],
501 completeMesh().polyFacesBf()[ncePatchi]
514 Foam::label Foam::domainDecomposition::compareInstances
520 const word& constant = runTimes_.completeTime().constant();
522 if (a == constant && b == constant)
return 0;
524 if (a == constant)
return +1;
526 if (b == constant)
return -1;
528 const scalar aValue = instant(a).value();
529 const scalar bValue = instant(b).value();
531 if (aValue < bValue)
return +1;
533 if (aValue > bValue)
return -1;
539 void Foam::domainDecomposition::validateComplete()
const 541 if (!completeMesh_.valid())
544 <<
"Complete data requested but complete mesh has not been " 550 void Foam::domainDecomposition::validateProcs()
const 552 if (!procMeshes_.set(0))
555 <<
"Decomposed data requested but decomposed mesh has not been " 566 const word& regionName
570 regionName_(regionName),
571 completeMesh_(
nullptr),
572 procMeshes_(nProcs()),
573 procPointAddressing_(nProcs()),
574 procFaceAddressing_(nProcs()),
575 procCellAddressing_(nProcs()),
576 procFaceAddressingBf_()
597 runTimes_.completeTime().timeName(),
598 runTimes_.completeTime(),
611 for (
label proci = 0; proci < nProcs(); proci++)
621 runTimes_.procTimes()[proci].timeName(),
622 runTimes_.procTimes()[proci],
636 for (
label proci = 0; proci < nProcs(); proci++)
638 const fvMesh& procMesh = procMeshes_[proci];
640 procPointAddressing_[proci] =
645 "pointProcAddressing",
655 procFaceAddressing_[proci] =
660 "faceProcAddressing",
670 procCellAddressing_[proci] =
675 "cellProcAddressing",
696 forAll(runTimes_.procTimes(), proci)
706 const label facesCompare =
709 completeMesh().facesInstance(),
710 procMeshes_[0].facesInstance()
713 const label pointsCompare =
716 completeMesh().pointsInstance(),
717 procMeshes_[0].pointsInstance()
721 if (facesCompare == -1)
727 if (facesCompare == +1)
735 procFaceAddressingBf_.clear();
743 (!completeConformal() || !procsConformal())
747 procFaceAddressingBf_.clear();
752 if (pointsCompare == -1)
754 if (!procsConformal())
756 forAll(procMeshes_, proci) procMeshes_[proci].conform();
768 if (pointsCompare == +1)
770 if (!completeConformal())
772 completeMesh_->conform();
788 labelList result(completeMesh().nCells());
790 forAll(procCellAddressing_, proci)
792 forAll(procCellAddressing_[proci], procCelli)
794 result[procCellAddressing_[proci][procCelli]] = proci;
808 if (procFaceAddressingBf_.empty())
812 const labelList cellToProc(this->cellToProc());
820 forAll(procMeshes_, proci)
822 const fvMesh& procMesh = procMeshes_[proci];
828 if (isA<cyclicFvPatch>(fvp))
830 refPatchProcPatchTable[procPatchi].insert
836 else if (isA<processorCyclicFvPatch>(fvp))
839 refCast<const processorCyclicFvPatch>(fvp);
852 nonConformalProcFaceAddressingBf(nProcs());
853 forAll(nonConformalProcFaceAddressingBf, proci)
855 nonConformalProcFaceAddressingBf[proci].
resize 857 procMeshes_[proci].
boundary().size()
860 if (completeMesh().conformal() && procMeshes_[0].conformal())
864 else if (!completeMesh().conformal())
868 completeMesh().polyFacesBf();
873 const fvPatch& fvp = completeMesh().boundary()[nccPatchi];
875 if (!isA<nonConformalCyclicFvPatch>(fvp))
continue;
878 refCast<const nonConformalCyclicFvPatch>(fvp);
880 if (!nccFvp.
owner())
continue;
884 forAll(polyFacesBf[nccPatchi], nccPatchFacei)
886 const label facei = polyFacesBf[nccPatchi][nccPatchFacei];
887 const label celli = completeMesh().faceOwner()[facei];
888 const label proci = cellToProc[celli];
890 const label nbrFacei =
891 polyFacesBf[nccNbrPatchi][nccPatchFacei];
892 const label nbrCelli =
893 completeMesh().faceOwner()[nbrFacei];
894 const label nbrProci = cellToProc[nbrCelli];
896 const label procNccPatchi =
897 refPatchProcPatchTable
899 const label nbrProcNccPatchi =
900 refPatchProcPatchTable
901 [nccNbrPatchi][
labelPair(nbrProci, proci)];
903 nonConformalProcFaceAddressingBf[proci][procNccPatchi]
904 .
append(nccPatchFacei + 1);
905 nonConformalProcFaceAddressingBf[nbrProci][nbrProcNccPatchi]
906 .
append(nccPatchFacei + 1);
913 const fvPatch& fvp = completeMesh().boundary()[ncePatchi];
915 if (!isA<nonConformalErrorFvPatch>(fvp))
continue;
917 forAll(polyFacesBf[ncePatchi], ncePatchFacei)
919 const label facei = polyFacesBf[ncePatchi][ncePatchFacei];
920 const label celli = completeMesh().faceOwner()[facei];
921 const label proci = cellToProc[celli];
923 nonConformalProcFaceAddressingBf[proci][ncePatchi]
924 .
append(ncePatchFacei + 1);
935 const fvPatch& fvp = completeMesh().boundary()[nccPatchi];
937 if (!isA<nonConformalCyclicFvPatch>(fvp))
continue;
940 refCast<const nonConformalCyclicFvPatch>(fvp);
942 if (!nccFvp.
owner())
continue;
947 labelPairTable procCounts;
951 refPatchProcPatchTable[nccPatchi],
955 procCounts.insert(iter.key(), 0);
960 labelPair procNbrProc(labelMax, labelMax);
961 labelPair faceNbrFace(labelMax, labelMax);
965 const label proci = iter.key().first();
966 const label nbrProci = iter.key().second();
968 const labelPair procNbrProcStar(proci, nbrProci);
969 const labelPair nbrProcProcStar(nbrProci, proci);
971 const label procNccPatchi =
972 refPatchProcPatchTable
973 [nccPatchi][procNbrProcStar];
974 const label nbrProcNccPatchi =
975 refPatchProcPatchTable
976 [nccNbrPatchi][nbrProcProcStar];
980 .polyFacesBf()[procNccPatchi]
983 if (iter() >= size)
continue;
985 const label procFacei =
986 procMeshes_[proci].polyFacesBf()
987 [procNccPatchi][iter()];
988 const label nbrProcFacei =
989 procMeshes_[nbrProci].polyFacesBf()
990 [nbrProcNccPatchi][iter()];
994 procFaceAddressing_[proci][procFacei] - 1,
995 procFaceAddressing_[nbrProci][nbrProcFacei] - 1
998 if (faceNbrFace > faceNbrFaceStar)
1000 procNbrProc = procNbrProcStar;
1001 faceNbrFace = faceNbrFaceStar;
1005 if (faceNbrFace ==
labelPair(labelMax, labelMax))
1014 const labelPair nbrProcProc(nbrProci, proci);
1016 const label procNccPatchi =
1017 refPatchProcPatchTable[nccPatchi][procNbrProc];
1018 const label nbrProcNccPatchi =
1019 refPatchProcPatchTable[nccNbrPatchi][nbrProcProc];
1021 nonConformalProcFaceAddressingBf
1022 [proci][procNccPatchi].
append(count + 1);
1023 nonConformalProcFaceAddressingBf
1024 [nbrProci][nbrProcNccPatchi].
append(count + 1);
1027 procCounts[procNbrProc] ++;
1035 const fvPatch& fvp = completeMesh().boundary()[ncePatchi];
1037 if (!isA<nonConformalErrorFvPatch>(fvp))
continue;
1046 forAll(procCounts, procStari)
1049 procMeshes_[procStari]
1050 .polyFacesBf()[ncePatchi]
1053 if (procCounts[procStari] >= size)
continue;
1055 const label procFacei =
1056 procMeshes_[procStari].polyFacesBf()
1057 [ncePatchi][procCounts[procStari]];
1059 const label faceStari =
1060 procFaceAddressing_[procStari][procFacei] - 1;
1062 if (facei > faceStari)
1069 if (facei == labelMax)
1075 nonConformalProcFaceAddressingBf
1076 [proci][ncePatchi].
append(count + 1);
1079 procCounts[proci] ++;
1086 procFaceAddressingBf_.
resize(nProcs());
1087 forAll(procMeshes_, proci)
1089 const fvMesh& procMesh = procMeshes_[proci];
1091 procFaceAddressingBf_.
set 1098 calculatedFvsPatchLabelField::typeName
1106 if (isA<nonConformalFvPatch>(fvp))
1108 procFaceAddressingBf_[proci][procPatchi] =
1109 nonConformalProcFaceAddressingBf[proci][procPatchi];
1111 else if (isA<processorCyclicFvPatch>(fvp))
1113 const label completePatchi =
1114 refCast<const processorCyclicFvPatch>(fvp)
1117 procFaceAddressingBf_[proci][procPatchi] =
1119 - completeMesh().boundaryMesh()[completePatchi].start();
1121 else if (isA<processorFvPatch>(fvp))
1123 procFaceAddressingBf_[proci][procPatchi] =
1128 procFaceAddressingBf_[proci][procPatchi] =
1130 - completeMesh().boundaryMesh()[procPatchi].start();
1136 return procFaceAddressingBf_;
1142 for (
label proci = 0; proci < nProcs(); proci++)
1144 const fvMesh& procMesh = procMeshes_[proci];
1150 "pointProcAddressing",
1157 procPointAddressing_[proci]
1159 pointProcAddressing.
write();
1165 "faceProcAddressing",
1172 procFaceAddressing_[proci]
1174 faceProcAddressing.
write();
1180 "cellProcAddressing",
1187 procCellAddressing_[proci]
1189 cellProcAddressing.
write();
1200 completeMesh().write();
1209 for (
label proci = 0; proci < nProcs(); proci++)
1211 const fvMesh& procMesh = procMeshes_[proci];
1216 runTimes_.procTimes()[proci].timeName(),
1223 cSetNames.
insert(iter.key(), cSetNames.
size());
1229 fSetNames.
insert(iter.key(), fSetNames.
size());
1234 pSetNames.
insert(iter.key(), pSetNames.
size());
1239 if (cSetNames.
size() || fSetNames.
size() || pSetNames.
size())
1245 Info<<
"Reconstructing sets:" <<
endl;
1246 if (cSetNames.
size())
1251 if (fSetNames.
size())
1256 if (pSetNames.
size())
1258 Info<<
" pointSets " 1263 for (
label proci = 0; proci < nProcs(); proci++)
1265 const fvMesh& procMesh = procMeshes_[proci];
1270 runTimes_.procTimes()[proci].timeName(),
1275 const labelList& cellMap = procCellAddressing()[proci];
1279 objects.lookupClass(cellSet::typeName)
1285 const cellSet procSet(*iter());
1286 label setI = cSetNames[iter.key()];
1301 cSet.
instance() = runTimes_.completeTime().timeName();
1305 cSet.
insert(cellMap[iter.key()]);
1314 objects.lookupClass(faceSet::typeName)
1320 const faceSet procSet(*iter());
1321 label setI = fSetNames[iter.key()];
1336 fSet.
instance() = runTimes_.completeTime().timeName();
1340 fSet.
insert(
mag(faceMap[iter.key()]) - 1);
1345 const labelList& pointMap = procPointAddressing()[proci];
1349 objects.lookupClass(pointSet::typeName)
1356 label setI = pSetNames[iter.key()];
1357 if (!pointSets.set(setI))
1371 pSet.
instance() = runTimes_.completeTime().timeName();
1375 pSet.
insert(pointMap[iter.key()]);
1391 pointSets[i].write();
1400 for (
label proci = 0; proci < nProcs(); proci++)
1402 const fvMesh& procMesh = procMeshes_[proci];
1404 cellMaps.
set(proci, &procCellAddressing_[proci]);
1405 pointMaps.
set(proci, &procPointAddressing_[proci]);
1414 completeMesh().facesInstance(),
1429 completeMesh().facesInstance(),
1457 completeMesh().facesInstance(),
1489 completeMesh().facesInstance(),
1499 for (
label proci = 0; proci < nProcs(); proci++)
1501 const fvMesh& procMesh = procMeshes_[proci];
1514 const cellSet& cs = cellSets[i];
1516 forAll(procCellAddressing_[proci], i)
1518 if (cs.
found(procCellAddressing_[proci][i]))
1527 const faceSet& cs = faceSets[i];
1529 forAll(procFaceAddressing_[proci], i)
1531 if (cs.
found(
mag(procFaceAddressing_[proci][i])-1))
1542 forAll(procPointAddressing_[proci], i)
1544 if (cs.
found(procPointAddressing_[proci][i]))
1559 completeMesh().facesInstance(),
1567 procCellAddressing_[proci],
1568 procPointAddressing_[proci]
void writeProcs(const bool doSets) const
Write the decomposed meshes and associated data.
void append(T *)
Append an element at the end of the list.
Field< label > labelField
Specialisation of Field<T> for label.
#define forAll(list, i)
Loop across all elements in list.
layerAndWeight max(const layerAndWeight &a, const layerAndWeight &b)
FvWallInfoData< WallInfo, label > label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
const word & name() const
Return name.
bool set(const label) const
Is element set.
List of IOobjects with searching and retrieving facilities.
errorManipArg< error, int > exit(error &err, const int errNo=1)
const fileName & facesInstance() const
Return the current instance directory for faces.
virtual label nbrPatchID() const
Return neighbour.
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
#define forAllConstIter(Container, container, iter)
Iterate across all elements in the container object of type.
labelList cellToProc() const
Return the distribution as an FV field for writing.
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
static unsigned int defaultPrecision()
Return the default precision.
GeometricField< vector, fvsPatchField, surfaceMesh > surfaceVectorField
Ostream & endl(Ostream &os)
Add newline and flush stream.
A finiteVolume patch using a polyPatch and a fvBoundaryMesh.
label count(const ListType &l, typename ListType::const_reference x)
Count the number of occurrences of a value in a list.
GeometricBoundaryField< Type, PatchField, GeoMesh > Boundary
Type of the boundary field.
virtual ~domainDecomposition()
Destructor.
void resize(const label)
Alias for setSize(const label)
virtual bool write(const bool write=true) const
Write mesh using IO settings from time.
bool insert(const Key &key)
Insert a new entry.
label size() const
Return number of elements in table.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
virtual int neighbProcNo() const
Return neighbour processor number.
bool insert(const Key &, const T &newElmt)
Insert a new hashedEntry.
vectorField pointField
pointField is a vectorField.
An ordered pair of two objects of type <T> with first() and second() elements.
bool found(const Key &) const
Return true if hashedEntry is found in table.
A class for handling words, derived from string.
void append(const T &)
Append an element at the end of the list.
fvMesh::readUpdateState readUpdate()
...
Pair< label > labelPair
Label pair.
static const label labelMax
List< label > labelList
A List of labels.
faceListList boundary(nPatches)
An STL-conforming hash table.
const PtrList< surfaceLabelField::Boundary > & procFaceAddressingBf() const
Access the labels of faces for each processor (see notes above)
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
domainDecomposition(const processorRunTimes &procRunTimes, const word ®ionName)
Construct from processor run times and region name.
void writeComplete(const bool doSets) const
Write the decomposed meshes and associated data.
bool set(const label) const
Is element set.
defineTypeNameAndDebug(combustionModel, 0)
const List< T >::subList patchSlice(const List< T > &l) const
Slice list to patch.
Generic GeometricBoundaryField class.
const Type & second() const
Return second.
static const GeometricField< Type, PatchField, GeoMesh > & null()
Return a null geometric field.
Transfers refinement levels such that slow transition between levels is maintained. Used in FaceCellWave.
void writeAddressing() const
Write the decomposition addressing.
IOobjectList lookupClass(const word &className) const
Return the list for all IOobjects of a given class.
bool set(const Key &, const T &newElmt)
Assign a new hashedEntry, overwriting existing entries.
tmp< GeometricField< typename outerProduct< vector, Type >::type, fvPatchField, volMesh >> reconstruct(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
virtual bool owner() const
Does this side own the patch ?
A templated 1D list of pointers to objects of type <T>, where the size of the array is known and used...
A collection of cell labels.
Mesh data needed to do the Finite Volume discretisation.
List< Key > sortedToc() const
Return the table of contents as a sorted list.
dimensioned< scalar > mag(const dimensioned< Type > &)
Various for reading/decomposing/reconstructing/distributing refinement data.
fileName & instance() const
Return the instance directory, constant, system, <time> etc.
readUpdateState
Enumeration defining the state of the mesh after a read update.
virtual bool write(const bool write=true) const
Write using setting from DB.
IOobject defines the attributes of an object for which implicit objectRegistry management is supporte...
const Type & first() const
Return first.
label referPatchID() const
Return the referring patch ID.
IOList< label > labelIOList
Label container classes.
const fvBoundaryMesh & boundary() const
Return reference to boundary mesh.
#define InfoInFunction
Report an information message using Foam::Info.