119 using namespace Foam;
133 forAll(patchesToRename, i)
135 label patchi = patchesToRename[i];
138 if (isA<coupledPolyPatch>(
pp))
141 <<
"Encountered coupled patch " <<
pp.name()
142 <<
". Will only rename the patch itself," 143 <<
" not any referred patches." 144 <<
" This might have to be done by hand." 148 pp.name() = prefix +
'_' +
pp.name();
155 template<
class GeoField>
167 for (
const GeoField&
fld :
mesh.objectRegistry::csorted<GeoField>())
185 forAll(tSubFld().boundaryField(), patchi)
187 if (addedPatches.
found(patchi))
189 tSubFld.ref().boundaryFieldRef()[patchi] ==
Zero;
194 GeoField* subFld = tSubFld.ptr();
195 subFld->rename(
fld.name());
202 template<
class GeoField>
203 void subsetSurfaceFields
214 for (
const GeoField&
fld :
mesh.objectRegistry::csorted<GeoField>())
232 forAll(tSubFld().boundaryField(), patchi)
234 if (addedPatches.
found(patchi))
236 tSubFld.ref().boundaryFieldRef()[patchi] ==
Zero;
241 GeoField* subFld = tSubFld.ptr();
242 subFld->rename(
fld.name());
254 if (cellRegion[celli] != regionI)
256 nonRegionCells.append(celli);
259 return nonRegionCells.shrink();
267 const label ownRegion,
268 const label neiRegion,
274 min(ownRegion, neiRegion),
275 max(ownRegion, neiRegion)
283 auto zoneIter = iter().find(zoneID);
292 iter().insert(zoneID, 1);
305 void getInterfaceSizes
308 const bool useFaceZones,
331 if (ownRegion != neiRegion)
353 coupledRegion[i] = cellRegion[celli];
361 label neiRegion = coupledRegion[i];
363 if (ownRegion != neiRegion)
391 auto masterIter = regionsToSize.
find(slaveIter.key());
393 if (masterIter.good())
400 const label zoneID = iter.key();
401 const label slaveSize = iter.val();
403 auto zoneIter = masterInfo.
find(zoneID);
406 *zoneIter += slaveSize;
410 masterInfo.
insert(zoneID, slaveSize);
416 regionsToSize.
insert(slaveIter.key(), slaveInfo);
435 label nInterfaces = 0;
439 nInterfaces += info.
size();
442 interfaces.
setSize(nInterfaces);
443 interfaceNames.
setSize(nInterfaces);
444 interfaceSizes.
setSize(nInterfaces);
450 const edge&
e = iter.key();
458 interfaces[nInterfaces] = iter.key();
459 label zoneID = infoIter.key();
464 name0 +
"_to_" + name1,
465 name1 +
"_to_" + name0
473 zoneName +
"_" + name0 +
"_to_" + name1,
474 zoneName +
"_" + name1 +
"_to_" + name0
478 interfaceSizes[nInterfaces] = infoIter();
479 regionsToInterface(
e).insert(zoneID, nInterfaces);
504 if (ownRegion != neiRegion)
514 min(ownRegion, neiRegion),
515 max(ownRegion, neiRegion)
518 faceToInterface[facei] = regionsToInterface[
interface][zoneID];
525 label neiRegion = coupledRegion[i];
527 if (ownRegion != neiRegion)
537 min(ownRegion, neiRegion),
538 max(ownRegion, neiRegion)
541 faceToInterface[facei] = regionsToInterface[
interface][zoneID];
571 coupledRegion[i] = cellRegion[celli];
583 labelList cellsToRemove(getNonRegionCells(cellRegion, regionI));
588 labelList exposedFaces = cellRemover.getExposedFaces(cellsToRemove);
593 label facei = exposedFaces[i];
594 label interfacei = faceToInterface[facei];
597 label neiRegion = -1;
612 label otherRegion = -1;
614 if (ownRegion == regionI && neiRegion != regionI)
616 otherRegion = neiRegion;
618 else if (ownRegion != regionI && neiRegion == regionI)
620 otherRegion = ownRegion;
625 <<
"Exposed face:" << facei
627 <<
" has owner region " << ownRegion
628 <<
" and neighbour region " << neiRegion
629 <<
" when handling region:" << regionI
634 if (regionI < otherRegion)
636 exposedPatchIDs[i] = interfacePatches[interfacei];
640 exposedPatchIDs[i] = interfacePatches[interfacei]+1;
645 cellRemover.setRefinement
671 void createAndWriteRegion
676 const bool prefixRegion,
680 const word& newMeshInstance
683 Info<<
"Creating mesh for region " << regionI
701 forAll(interfacePatches, interfacei)
703 addedPatches.
insert(interfacePatches[interfacei]);
704 addedPatches.
insert(interfacePatches[interfacei]+1);
711 newMesh().updateMesh(map());
714 subsetVolFields<volScalarField>
722 subsetVolFields<volVectorField>
730 subsetVolFields<volSphericalTensorField>
738 subsetVolFields<volSymmTensorField>
746 subsetVolFields<volTensorField>
755 subsetSurfaceFields<surfaceScalarField>
763 subsetSurfaceFields<surfaceVectorField>
771 subsetSurfaceFields<surfaceSphericalTensorField>
779 subsetSurfaceFields<surfaceSymmTensorField>
787 subsetSurfaceFields<surfaceTensorField>
798 newPatches.checkParallelSync(
true);
804 labelList oldToNew(newPatches.size(), -1);
808 Info<<
"Deleting empty patches" <<
endl;
811 forAll(newPatches, patchi)
815 if (!isA<processorPolyPatch>(
pp))
819 oldToNew[patchi] = newI;
820 if (!addedPatches.
found(patchi))
822 sharedPatches.append(newI);
830 forAll(newPatches, patchi)
834 if (isA<processorPolyPatch>(
pp) &&
pp.size())
836 oldToNew[patchi] = newI++;
840 const label nNewPatches = newI;
845 if (oldToNew[patchi] == -1)
847 oldToNew[patchi] = newI++;
857 Info<<
"Prefixing patches with region name" <<
endl;
859 renamePatches(newMesh(),
regionNames[regionI], sharedPatches);
865 newMesh().setInstance(newMeshInstance);
871 Info<<
"Writing addressing to base mesh" <<
endl;
877 "pointRegionAddressing",
878 newMesh().facesInstance(),
887 Info<<
"Writing map " << pointProcAddressing.name()
888 <<
" from region" << regionI
889 <<
" points back to base mesh." <<
endl;
890 pointProcAddressing.
write();
896 "faceRegionAddressing",
897 newMesh().facesInstance(),
906 forAll(faceProcAddressing, facei)
910 label oldFacei = map().faceMap()[facei];
914 map().cellMap()[newMesh().faceOwner()[facei]]
918 faceProcAddressing[facei] = oldFacei+1;
922 faceProcAddressing[facei] = -(oldFacei+1);
925 Info<<
"Writing map " << faceProcAddressing.name()
926 <<
" from region" << regionI
927 <<
" faces back to base mesh." <<
endl;
928 faceProcAddressing.
write();
934 "cellRegionAddressing",
935 newMesh().facesInstance(),
944 Info<<
"Writing map " <<cellProcAddressing.name()
945 <<
" from region" << regionI
946 <<
" cells back to base mesh." <<
endl;
947 cellProcAddressing.
write();
953 "boundaryRegionAddressing",
954 newMesh().facesInstance(),
965 if (!addedPatches.
found(i))
967 label newI = oldToNew[i];
968 if (newI >= 0 && newI < nNewPatches)
970 boundaryProcAddressing[oldToNew[i]] = i;
974 Info<<
"Writing map " << boundaryProcAddressing.name()
975 <<
" from region" << regionI
976 <<
" boundary back to base mesh." <<
endl;
977 boundaryProcAddressing.
write();
997 forAll(interfaces, interI)
999 const edge&
e = interfaces[interI];
1052 <<
" " << interfacePatches[interI]
1055 <<
" " << interfacePatches[interI]+1
1059 return interfacePatches;
1064 label findCorrespondingRegion
1068 const label nCellRegions,
1070 const label minOverlapSize
1076 forAll(cellRegion, celli)
1078 if (existingZoneID[celli] == zoneI)
1080 cellsInZone[cellRegion[celli]]++;
1087 label regionI =
findMax(cellsInZone);
1090 if (cellsInZone[regionI] < minOverlapSize)
1098 forAll(cellRegion, celli)
1100 if (cellRegion[celli] == regionI && existingZoneID[celli] != zoneI)
1130 forAll(clusterToZones, clusterI)
1132 for (
const label zoneI : clusterToZones[clusterI])
1134 const cellZone& cz = cellZones[zoneI];
1138 label celli = cz[i];
1139 if (clusterID[celli] == -1)
1141 clusterID[celli] = clusterI;
1146 <<
"Cell " << celli <<
" with cell centre " 1148 <<
" is multiple zones. This is not allowed." <<
endl 1149 <<
"It is in zone " << clusterNames[clusterID[celli]]
1150 <<
" and in zone " << clusterNames[clusterI]
1165 const label regioni,
1204 clusterNames.
clear();
1205 clusterToZones.
clear();
1209 if (zoneClusters.
size())
1211 forAll(zoneClusters, clusteri)
1217 zoneClusterNames[clusteri].size()
1218 ? zoneClusterNames[clusteri]
1230 forAll(zoneToCluster, zonei)
1232 if (zoneToCluster[zonei] == -1)
1234 clusterNames.
append(cellZones[zonei].
name());
1236 zoneToCluster[zonei] = clusterToZones.
size();
1242 for (
const auto&
cellZone : cellZones)
1244 const label nClusters = clusterToZones.
size();
1255 const bool sloppyCellZones,
1262 const label nCellRegions,
1272 regionToZones.
setSize(nCellRegions);
1281 forAll(clusterToZones, clusterI)
1283 for (
const label zoneI : clusterToZones[clusterI])
1285 clusterSizes[clusterI] += cellZones[zoneI].
size();
1290 if (sloppyCellZones)
1292 Info<<
"Trying to match regions to existing cell zones;" 1293 <<
" region can be subset of cell zone." <<
nl <<
endl;
1295 forAll(clusterToZones, clusterI)
1297 label regionI = findCorrespondingRegion
1303 label(0.5*clusterSizes[clusterI])
1308 Info<<
"Sloppily matched region " << regionI
1310 <<
" to cluster " << clusterI
1311 <<
" size " << clusterSizes[clusterI]
1316 clusterToZones[clusterI]
1318 regionToZones[regionI] = clusterToZones[clusterI];
1325 Info<<
"Trying to match regions to existing cell zones." <<
nl <<
endl;
1327 forAll(clusterToZones, clusterI)
1329 label regionI = findCorrespondingRegion
1335 clusterSizes[clusterI]
1343 clusterToZones[clusterI]
1345 regionToZones[regionI] = clusterToZones[clusterI];
1359 regionToZones[regionI]
1383 cellToRegion.write();
1385 Info<<
"Writing region per cell file (for manual decomposition) to " 1386 << cellToRegion.objectPath() <<
nl <<
endl;
1405 forAll(cellRegion, celli)
1407 cellToRegion[celli] = cellRegion[celli];
1409 cellToRegion.write();
1411 Info<<
"Writing region per cell as volScalarField to " 1412 << cellToRegion.objectPath() <<
nl <<
endl;
1419 int main(
int argc,
char *argv[])
1423 "Split mesh into multiple regions (detected by walking across faces)" 1430 "Additionally split cellZones off into separate regions" 1435 "Use cellZones only to split mesh into regions; do not use walking" 1439 "cellZonesFileOnly",
1441 "Like -cellZonesOnly, but use specified file" 1447 "Combine zones in follow-on analysis" 1453 "Combine zones in follow-on analysis" 1459 "Specify additional region boundaries that walking does not cross" 1464 "Place cells into cellZones instead of splitting mesh" 1469 "Only write largest region" 1475 "Only write region containing point" 1485 "Try to match heuristically regions to existing cell zones" 1490 "Use faceZones to patch inter-region faces instead of single patch" 1495 "Prefix region name to all patches, not just coupling patches" 1506 word blockedFacesName;
1509 Info<<
"Reading blocked internal faces from faceSet " 1510 << blockedFacesName <<
nl <<
endl;
1513 const bool makeCellZones =
args.
found(
"makeCellZones");
1514 const bool largestOnly =
args.
found(
"largestOnly");
1515 const bool insidePoint =
args.
found(
"insidePoint");
1516 const bool useCellZones =
args.
found(
"cellZones");
1517 const bool useCellZonesOnly =
args.
found(
"cellZonesOnly");
1518 const bool useCellZonesFile =
args.
found(
"cellZonesFileOnly");
1519 const bool combineZones =
args.
found(
"combineZones");
1520 const bool addZones =
args.
found(
"addZones");
1521 const bool overwrite =
args.
found(
"overwrite");
1522 const bool detectOnly =
args.
found(
"detectOnly");
1523 const bool sloppyCellZones =
args.
found(
"sloppyCellZones");
1524 const bool useFaceZones =
args.
found(
"useFaceZones");
1525 const bool prefixRegion =
args.
found(
"prefixRegion");
1530 (useCellZonesOnly || useCellZonesFile)
1531 && (useCellZones || blockedFacesName.size())
1535 <<
"You cannot specify both -cellZonesOnly or -cellZonesFileOnly" 1536 <<
" (which specify complete split)" 1537 <<
" in combination with -blockedFaces or -cellZones" 1538 <<
" (which imply a split based on topology)" 1545 Info<<
"Using current faceZones to divide inter-region interfaces" 1546 <<
" into multiple patches." 1551 Info<<
"Creating single patch per inter-region interface." 1557 if (insidePoint && largestOnly)
1560 <<
"You cannot specify both -largestOnly" 1561 <<
" (keep region with most cells)" 1562 <<
" and -insidePoint (keep region containing point)" 1577 <<
"Cannot specify both combineZones and addZones" 1587 forAll(zoneClusters, clusteri)
1591 wordRes& wrs = zoneClusters[clusteri];
1593 zoneClusterNames[clusteri] = wrs[0];
1595 for (label i = 1; i < wrs.
size(); i++)
1616 label nCellRegions = 0;
1617 if (useCellZonesOnly)
1619 Info<<
"Using current cellZones to split mesh into regions." 1620 <<
" This requires all" 1621 <<
" cells to be in one and only one cellZone." <<
nl <<
endl;
1652 label unzonedCelli = clusterID.
find(-1);
1653 if (unzonedCelli != -1)
1656 <<
"For the cellZonesOnly option all cells " 1657 <<
"have to be in a cellZone." <<
endl 1658 <<
"Cell " << unzonedCelli
1660 <<
" is not in a cellZone. There might be more unzoned cells." 1663 cellRegion = clusterID;
1664 nCellRegions =
gMax(cellRegion)+1;
1665 zoneToRegion = zoneToCluster;
1666 regionToZones = clusterToZones;
1669 else if (useCellZonesFile)
1671 const word zoneFile(
args[
"cellZonesFileOnly"]);
1672 Info<<
"Reading split from cellZones file " << zoneFile <<
endl 1673 <<
"This requires all" 1674 <<
" cells to be in one and only one cellZone." <<
nl <<
endl;
1720 label unzonedCelli = clusterID.find(-1);
1721 if (unzonedCelli != -1)
1724 <<
"For the cellZonesFileOnly option all cells " 1725 <<
"have to be in a cellZone." <<
endl 1726 <<
"Cell " << unzonedCelli
1728 <<
" is not in a cellZone. There might be more unzoned cells." 1731 cellRegion = clusterID;
1732 nCellRegions =
gMax(cellRegion)+1;
1733 zoneToRegion = zoneToCluster;
1734 regionToZones = clusterToZones;
1746 if (blockedFacesName.size())
1751 <<
" blocked faces from set " << blockedFacesName <<
nl <<
endl;
1755 for (
const label facei : blockedFaceSet)
1757 blockedFace[facei] =
true;
1801 if (ownCluster != neiCluster)
1803 blockedFace[facei] =
true;
1812 label neiCluster = neiClusterID[i];
1814 if (ownCluster != neiCluster)
1816 blockedFace[facei] =
true;
1823 nCellRegions = regions.nRegions();
1848 if (largestOnly || insidePoint)
1850 forAll(regionToZones, regionI)
1852 if (regionToZones[regionI].empty())
1858 else if (insidePoint)
1862 else if (largestOnly)
1871 Info<<
endl <<
"Number of regions:" << nCellRegions <<
nl <<
endl;
1875 writeCellToRegion(
mesh, cellRegion);
1884 forAll(cellRegion, celli)
1886 regionSizes[cellRegion[celli]]++;
1888 forAll(regionSizes, regionI)
1893 Info<<
"Region\tCells" <<
nl 1894 <<
"------\t-----" <<
endl;
1896 forAll(regionSizes, regionI)
1898 Info<< regionI <<
'\t' << regionSizes[regionI] <<
nl;
1905 Info<<
"Region\tZone\tName" <<
nl 1906 <<
"------\t----\t----" <<
endl;
1907 forAll(regionToZones, regionI)
1948 Info<<
"Sizes of interfaces between regions:" <<
nl <<
nl 1949 <<
"Interface\tRegion\tRegion\tFaces" <<
nl 1950 <<
"---------\t------\t------\t-----" <<
endl;
1952 forAll(interfaces, interI)
1954 const edge&
e = interfaces[interI];
1957 <<
"\t\t" <<
e[0] <<
"\t" <<
e[1]
1958 <<
"\t" << interfaceSizes[interI] <<
nl;
2017 if (nCellRegions == 1)
2019 Info<<
"Only one region. Doing nothing." <<
endl;
2021 else if (makeCellZones)
2023 Info<<
"Putting cells into cellZones instead of splitting mesh." 2028 for (label regionI = 0; regionI < nCellRegions; regionI++)
2030 const labelList& zones = regionToZones[regionI];
2032 if (zones.
size() == 1 && zones[0] != -1)
2035 const label zoneI = zones[0];
2036 Info<<
" Region " << regionI <<
" : corresponds to existing" 2059 std::move(regionCells),
2070 Info<<
" Region " << regionI <<
" : created new cellZone " 2095 Info<<
"Writing cellSets corresponding to cellZones." <<
nl <<
endl;
2141 Info<<
nl <<
"Found point " << insidePoint <<
" in cell " << celli
2146 regionI = cellRegion[celli];
2152 <<
"Subsetting region " << regionI
2153 <<
" containing point " << insidePoint <<
endl;
2158 <<
"Point " << insidePoint
2159 <<
" is not inside the mesh." <<
nl 2160 <<
"Bounding box of the mesh:" <<
mesh.
bounds()
2164 createAndWriteRegion
2176 else if (largestOnly)
2178 label regionI =
findMax(regionSizes);
2181 <<
"Subsetting region " << regionI
2182 <<
" of size " << regionSizes[regionI]
2185 createAndWriteRegion
2200 for (label regionI = 0; regionI < nCellRegions; regionI++)
2203 <<
"Region " << regionI <<
nl 2204 <<
"-------- " <<
endl;
2206 createAndWriteRegion
static const word & zeroGradientType() noexcept
The type name for zeroGradient patch fields.
bool checkParallelSync(const bool report=false) const
Check whether all procs have all zones and in same order.
This class separates the mesh into distinct unconnected regions, each of which is then given a label ...
label findMax(const ListType &input, label start=0)
Linear search for the index of the max element, similar to std::max_element but for lists and returns...
static tmp< DimensionedField< Type, volMesh > > interpolate(const DimensionedField< Type, volMesh > &, const fvMesh &sMesh, const labelUList &cellMap)
Map volume internal (dimensioned) field.
static void noFunctionObjects(bool addWithOption=false)
Remove '-noFunctionObjects' option and ignore any occurrences.
static void addNote(const string ¬e)
Add extra notes for the usage information.
void size(const label n)
Older name for setAddressableSize.
static void removeFiles(const polyMesh &mesh)
Helper: remove all procAddressing files from mesh instance.
const labelIOList & zoneIDs
void clearAddressing()
Clear addressing.
nearest face on selected patch
List< word > names(const UPtrList< T > &list, const UnaryMatchPredicate &matcher)
List of names generated by calling name() for each list item and filtered for matches.
wordList ReadFields(const typename GeoMesh::Mesh &mesh, const IOobjectList &objects, PtrList< GeometricField< Type, PatchField, GeoMesh >> &fields, const bool syncPar=true, const bool readOldTime=false)
Read Geometric fields of templated type.
List of IOobjects with searching and retrieving facilities. Implemented as a HashTable, so the various sorted methods should be used if traversing in parallel.
errorManipArg< error, int > exit(error &err, const int errNo=1)
const fileName & facesInstance() const
Return the current instance directory for faces.
void transfer(List< T > &list)
Transfer the contents of the argument List into this list and annul the argument 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.
void append(const T &val)
Append an element at the end of the list.
bool found(const Key &key) const
Same as contains()
virtual const labelList & faceNeighbour() const
Return face neighbour.
const labelIOList & tetBasePtIs() const
Return the tetBasePtIs.
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)
bool empty() const noexcept
True if List is empty (ie, size() is zero)
Given list of cells to remove, insert all the topology changes.
static word meshSubDir
Return the mesh sub-directory name (usually "polyMesh")
Ostream & endl(Ostream &os)
Add newline and flush stream.
static bool & parRun() noexcept
Test if this a parallel run.
void clearOut(const bool isMeshUpdate=false)
Clear all geometry and addressing.
static void addBoolOption(const word &optName, const string &usage="", bool advanced=false)
Add a bool option to validOptions with usage information.
labelList findIndices(const ListType &input, typename ListType::const_reference val, label start=0)
Linear search to find all occurrences of given element.
interfaceProperties interface(alpha1, U, thermo->transportPropertiesDict())
Field reading functions for post-processing utilities.
Ignore writing from objectRegistry::writeObject()
const dimensionSet dimless
Dimensionless.
const Time & time() const
Return the top-level database.
static label worldComm
Communicator for all ranks. May differ from commGlobal() if local worlds are in use.
label nFaces() const noexcept
Number of mesh faces.
bool insert(const Key &key)
Insert a new entry, not overwriting existing entries.
T returnReduce(const T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Perform reduction on a copy, using specified binary operation.
bool isInternalFace(const label faceIndex) const noexcept
Return true if given face label is internal to the mesh.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
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...
#define forAll(list, i)
Loop across all elements in list.
bool insert(const edge &key, const T &obj)
Copy insert a new entry, not overwriting existing entries.
label size() const noexcept
The number of elements in table.
void write(vtk::formatter &fmt, const Type &val, const label n=1)
Component-wise write of a value (N times)
writeOption writeOpt() const noexcept
Get the write option.
static void removeFiles(const polyMesh &)
Helper: remove all sets files from mesh instance.
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.
const dimensionedScalar e
Elementary charge.
const fileName & pointsInstance() const
Return the current instance directory for points.
void setSize(const label n)
Alias for resize()
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for expressions::valueTypeCode::INVALID.
labelList indices(const wordRe &matcher, const bool useGroups=true) const
Return (sorted) zone indices for all matches.
label findZoneID(const word &zoneName) const
Find zone index by name, return -1 if not found.
An edge is a list of two vertex labels. This can correspond to a directed graph edge or an edge on a ...
labelList identity(const label len, label start=0)
Return an identity map of the given length with (map[i] == i), works like std::iota() but returning a...
void clear()
Clear the list, i.e. set size to zero.
const polyBoundaryMesh & boundaryMesh() const noexcept
Return boundary mesh.
A class for handling words, derived from Foam::string.
iterator find(const edge &key)
Find and return an iterator set at the hashed entry.
Determines a mapping between patch face centres and mesh cell or face centres and processors they're ...
static word defaultRegion
Return the default region name.
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.
virtual const labelList & faceOwner() const
Return face owner.
Reading is optional [identical to LAZY_READ].
static const word null
An empty word.
A List of wordRe with additional matching capabilities.
static void addOption(const word &optName, const string ¶m="", const string &usage="", bool advanced=false)
Add an option to validOptions with usage information.
virtual bool write(const token &tok)=0
Write token to stream or otherwise handle it.
label nInternalFaces() const noexcept
Number of internal faces.
label min(const labelHashSet &set, label minValue=labelMax)
Find the min value in labelHashSet, optionally limited by second argument.
const vectorField & cellCentres() const
const T * set(const label i) const
Return const pointer to element (can be nullptr), or nullptr for out-of-range access (ie...
label find(const T &val) const
Find index of the first occurrence of the value.
virtual bool write(const bool writeOnProc=true) const
Write mesh using IO settings from time.
A polyBoundaryMesh is a polyPatch list with additional search methods and registered IO...
label index() const noexcept
The index of this zone in the zone list.
bool checkParallelSync(const bool report=false) const
Check whether all procs have all patches and in same order.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
static word timeName(const scalar t, const int precision=precision_)
Return a time name for the given scalar time value formatted with the given precision.
Map from edge (expressed as its endpoints) to value. Hashing (and ==) on an edge is symmetric...
void updateMesh()
Correct polyBoundaryMesh after topology update.
Type gMax(const FieldField< Field, Type > &f)
const faceZoneMesh & faceZones() const noexcept
Return face zone mesh.
void setSize(const label newLen)
Same as resize()
static void broadcasts(const label comm, Type &arg1, Args &&... args)
Broadcast multiple items to all communicator ranks. Does nothing in non-parallel. ...
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< ' ';}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< ' ';}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< ' ';}gmvFile<< nl;for(const word &name :lagrangianScalarNames){ IOField< scalar > fld(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
label whichZone(const label objectIndex) const
Given a global object index, return the zone it is in.
const vectorField & faceCentres() const
T get(const label index) const
Get a value from the argument at index.
void setInstance(const fileName &instance, const IOobjectOption::writeOption wOpt=IOobject::AUTO_WRITE)
Set the instance for mesh files.
#define WarningInFunction
Report a warning using Foam::Warning.
const word & name() const
Return reference to name.
Foam::word regionName(args.getOrDefault< word >("region", Foam::polyMesh::defaultRegion))
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
label nCells() const noexcept
Number of mesh cells.
A list of pointers to objects of type <T>, with allocation/deallocation management of the pointers...
A collection of cell labels.
Mesh data needed to do the Finite Volume discretisation.
A List with indirect addressing. Like IndirectList but does not store addressing. ...
Direct mesh changes based on v1.3 polyTopoChange syntax.
static bool master(const label communicator=worldComm)
True if process corresponds to the master rank in the communicator.
const word & name() const noexcept
The zone name.
static const word & calculatedType() noexcept
The type name for calculated patch fields.
Automatically write from objectRegistry::writeObject()
const cellZoneMesh & cellZones() const noexcept
Return cell zone mesh.
label findCell(const point &p, const cellDecomposition=CELL_TETS) const
Find cell enclosing this location and return index.
messageStream Info
Information stream (stdout output on master, null elsewhere)
const boundBox & bounds() const noexcept
Return mesh bounding box.
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
Mesh consisting of general polyhedral cells.
bool readIfPresent(const word &optName, T &val) const
Read a value from the named option if present.
List< label > labelList
A List of labels.
static rangeType subProcs(const label communicator=worldComm)
Range of process indices for sub-processes.
A class for managing temporary objects.
A patch is a list of labels that address the faces in the global face list.
label nBoundaryFaces() const noexcept
Number of boundary faces (== nFaces - nInternalFaces)
Foam::argList args(argc, argv)
bool returnReduceOr(const bool value, const label comm=UPstream::worldComm)
Perform logical (or) MPI Allreduce on a copy. Uses UPstream::reduceOr.
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...
Do not request registration (bool: false)
void reduce(T &value, const BinaryOp &bop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Reduce inplace (cf. MPI Allreduce) using linear/tree communication schedule.
bool found(const word &optName) const
Return true if the named option is found.
uindirectPrimitivePatch pp(UIndirectList< face >(mesh.faces(), faceLabels), mesh.points())
forAllConstIters(mixture.phases(), phase)
static void listCombineReduce(List< T > &values, const CombineOp &cop, const int tag=UPstream::msgType(), const label comm=UPstream::worldComm)
Combines List elements. After completion all processors have the same data.
FlatOutput::OutputAdaptor< Container, Delimiters > flatOutput(const Container &obj, Delimiters delim)
Global flatOutput() function with specified output delimiters.
static constexpr const zero Zero
Global zero (0)