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>
169 mesh.objectRegistry::lookupClass<GeoField>()
173 const GeoField&
fld = *iter.val();
191 forAll(tSubFld().boundaryField(), patchi)
193 if (addedPatches.
found(patchi))
195 tSubFld.ref().boundaryFieldRef()[patchi] ==
196 typename GeoField::value_type(
Zero);
201 GeoField* subFld = tSubFld.ptr();
202 subFld->rename(
fld.name());
209 template<
class GeoField>
210 void subsetSurfaceFields
223 mesh.objectRegistry::lookupClass<GeoField>()
227 const GeoField&
fld = *iter.val();
245 forAll(tSubFld().boundaryField(), patchi)
247 if (addedPatches.
found(patchi))
249 tSubFld.ref().boundaryFieldRef()[patchi] ==
250 typename GeoField::value_type(
Zero);
255 GeoField* subFld = tSubFld.ptr();
256 subFld->rename(
fld.name());
268 if (cellRegion[celli] != regionI)
270 nonRegionCells.append(celli);
273 return nonRegionCells.shrink();
281 const label ownRegion,
282 const label neiRegion,
288 min(ownRegion, neiRegion),
289 max(ownRegion, neiRegion)
297 auto zoneIter = iter().find(zoneID);
306 iter().insert(zoneID, 1);
313 zoneToSize.
insert(zoneID, 1);
321 void getInterfaceSizes
324 const bool useFaceZones,
347 if (ownRegion != neiRegion)
369 coupledRegion[i] = cellRegion[celli];
377 label neiRegion = coupledRegion[i];
379 if (ownRegion != neiRegion)
408 auto masterIter = regionsToSize.
find(slaveIter.key());
410 if (masterIter.good())
417 const label zoneID = iter.key();
418 const label slaveSize = iter.val();
420 auto zoneIter = masterInfo.
find(zoneID);
423 *zoneIter += slaveSize;
427 masterInfo.
insert(zoneID, slaveSize);
433 regionsToSize.
insert(slaveIter.key(), slaveInfo);
447 toMaster << regionsToSize;
459 label nInterfaces = 0;
463 nInterfaces += info.
size();
466 interfaces.
setSize(nInterfaces);
467 interfaceNames.
setSize(nInterfaces);
468 interfaceSizes.
setSize(nInterfaces);
474 const edge&
e = iter.key();
482 interfaces[nInterfaces] = iter.key();
483 label zoneID = infoIter.key();
488 name0 +
"_to_" + name1,
489 name1 +
"_to_" + name0
497 zoneName +
"_" + name0 +
"_to_" + name1,
498 zoneName +
"_" + name1 +
"_to_" + name0
501 interfaceSizes[nInterfaces] = infoIter();
503 if (regionsToInterface.found(
e))
505 regionsToInterface[
e].insert(zoneID, nInterfaces);
510 zoneAndInterface.
insert(zoneID, nInterfaces);
511 regionsToInterface.insert(
e, zoneAndInterface);
536 if (ownRegion != neiRegion)
546 min(ownRegion, neiRegion),
547 max(ownRegion, neiRegion)
550 faceToInterface[facei] = regionsToInterface[
interface][zoneID];
557 label neiRegion = coupledRegion[i];
559 if (ownRegion != neiRegion)
569 min(ownRegion, neiRegion),
570 max(ownRegion, neiRegion)
573 faceToInterface[facei] = regionsToInterface[
interface][zoneID];
603 coupledRegion[i] = cellRegion[celli];
615 labelList cellsToRemove(getNonRegionCells(cellRegion, regionI));
620 labelList exposedFaces = cellRemover.getExposedFaces(cellsToRemove);
625 label facei = exposedFaces[i];
626 label interfacei = faceToInterface[facei];
629 label neiRegion = -1;
644 label otherRegion = -1;
646 if (ownRegion == regionI && neiRegion != regionI)
648 otherRegion = neiRegion;
650 else if (ownRegion != regionI && neiRegion == regionI)
652 otherRegion = ownRegion;
657 <<
"Exposed face:" << facei
659 <<
" has owner region " << ownRegion
660 <<
" and neighbour region " << neiRegion
661 <<
" when handling region:" << regionI
666 if (regionI < otherRegion)
668 exposedPatchIDs[i] = interfacePatches[interfacei];
672 exposedPatchIDs[i] = interfacePatches[interfacei]+1;
677 cellRemover.setRefinement
703 void createAndWriteRegion
708 const bool prefixRegion,
712 const word& newMeshInstance
715 Info<<
"Creating mesh for region " << regionI
733 forAll(interfacePatches, interfacei)
735 addedPatches.
insert(interfacePatches[interfacei]);
736 addedPatches.
insert(interfacePatches[interfacei]+1);
743 newMesh().updateMesh(map());
746 subsetVolFields<volScalarField>
754 subsetVolFields<volVectorField>
762 subsetVolFields<volSphericalTensorField>
770 subsetVolFields<volSymmTensorField>
778 subsetVolFields<volTensorField>
787 subsetSurfaceFields<surfaceScalarField>
795 subsetSurfaceFields<surfaceVectorField>
803 subsetSurfaceFields<surfaceSphericalTensorField>
811 subsetSurfaceFields<surfaceSymmTensorField>
819 subsetSurfaceFields<surfaceTensorField>
830 newPatches.checkParallelSync(
true);
836 labelList oldToNew(newPatches.size(), -1);
840 Info<<
"Deleting empty patches" <<
endl;
843 forAll(newPatches, patchi)
847 if (!isA<processorPolyPatch>(
pp))
851 oldToNew[patchi] = newI;
852 if (!addedPatches.
found(patchi))
854 sharedPatches.append(newI);
862 forAll(newPatches, patchi)
866 if (isA<processorPolyPatch>(
pp) &&
pp.size())
868 oldToNew[patchi] = newI++;
872 const label nNewPatches = newI;
877 if (oldToNew[patchi] == -1)
879 oldToNew[patchi] = newI++;
889 Info<<
"Prefixing patches with region name" <<
endl;
891 renamePatches(newMesh(),
regionNames[regionI], sharedPatches);
897 newMesh().setInstance(newMeshInstance);
903 Info<<
"Writing addressing to base mesh" <<
endl;
909 "pointRegionAddressing",
910 newMesh().facesInstance(),
911 newMesh().meshSubDir,
919 Info<<
"Writing map " << pointProcAddressing.name()
920 <<
" from region" << regionI
921 <<
" points back to base mesh." <<
endl;
922 pointProcAddressing.
write();
928 "faceRegionAddressing",
929 newMesh().facesInstance(),
930 newMesh().meshSubDir,
938 forAll(faceProcAddressing, facei)
942 label oldFacei = map().faceMap()[facei];
946 map().cellMap()[newMesh().faceOwner()[facei]]
950 faceProcAddressing[facei] = oldFacei+1;
954 faceProcAddressing[facei] = -(oldFacei+1);
957 Info<<
"Writing map " << faceProcAddressing.name()
958 <<
" from region" << regionI
959 <<
" faces back to base mesh." <<
endl;
960 faceProcAddressing.
write();
966 "cellRegionAddressing",
967 newMesh().facesInstance(),
968 newMesh().meshSubDir,
976 Info<<
"Writing map " <<cellProcAddressing.name()
977 <<
" from region" << regionI
978 <<
" cells back to base mesh." <<
endl;
979 cellProcAddressing.
write();
985 "boundaryRegionAddressing",
986 newMesh().facesInstance(),
987 newMesh().meshSubDir,
997 if (!addedPatches.
found(i))
999 label newI = oldToNew[i];
1000 if (newI >= 0 && newI < nNewPatches)
1002 boundaryProcAddressing[oldToNew[i]] = i;
1006 Info<<
"Writing map " << boundaryProcAddressing.name()
1007 <<
" from region" << regionI
1008 <<
" boundary back to base mesh." <<
endl;
1009 boundaryProcAddressing.
write();
1029 forAll(interfaces, interI)
1031 const edge&
e = interfaces[interI];
1084 <<
" " << interfacePatches[interI]
1087 <<
" " << interfacePatches[interI]+1
1091 return interfacePatches;
1096 label findCorrespondingRegion
1100 const label nCellRegions,
1102 const label minOverlapSize
1108 forAll(cellRegion, celli)
1110 if (existingZoneID[celli] == zoneI)
1112 cellsInZone[cellRegion[celli]]++;
1119 label regionI =
findMax(cellsInZone);
1122 if (cellsInZone[regionI] < minOverlapSize)
1130 forAll(cellRegion, celli)
1132 if (cellRegion[celli] == regionI && existingZoneID[celli] != zoneI)
1162 forAll(clusterToZones, clusterI)
1164 for (
const label zoneI : clusterToZones[clusterI])
1166 const cellZone& cz = cellZones[zoneI];
1170 label celli = cz[i];
1171 if (clusterID[celli] == -1)
1173 clusterID[celli] = clusterI;
1178 <<
"Cell " << celli <<
" with cell centre " 1180 <<
" is multiple zones. This is not allowed." <<
endl 1181 <<
"It is in zone " << clusterNames[clusterID[celli]]
1182 <<
" and in zone " << clusterNames[clusterI]
1197 const label regioni,
1236 clusterNames.
clear();
1237 clusterToZones.
clear();
1241 if (zoneClusters.
size())
1243 forAll(zoneClusters, clusteri)
1249 zoneClusterNames[clusteri].size()
1250 ? zoneClusterNames[clusteri]
1262 forAll(zoneToCluster, zonei)
1264 if (zoneToCluster[zonei] == -1)
1266 clusterNames.
append(cellZones[zonei].
name());
1268 zoneToCluster[zonei] = clusterToZones.
size();
1274 for (
const auto&
cellZone : cellZones)
1276 const label nClusters = clusterToZones.
size();
1287 const bool sloppyCellZones,
1294 const label nCellRegions,
1304 regionToZones.
setSize(nCellRegions);
1313 forAll(clusterToZones, clusterI)
1315 for (
const label zoneI : clusterToZones[clusterI])
1317 clusterSizes[clusterI] += cellZones[zoneI].
size();
1322 if (sloppyCellZones)
1324 Info<<
"Trying to match regions to existing cell zones;" 1325 <<
" region can be subset of cell zone." <<
nl <<
endl;
1327 forAll(clusterToZones, clusterI)
1329 label regionI = findCorrespondingRegion
1335 label(0.5*clusterSizes[clusterI])
1340 Info<<
"Sloppily matched region " << regionI
1342 <<
" to cluster " << clusterI
1343 <<
" size " << clusterSizes[clusterI]
1348 clusterToZones[clusterI]
1350 regionToZones[regionI] = clusterToZones[clusterI];
1357 Info<<
"Trying to match regions to existing cell zones." <<
nl <<
endl;
1359 forAll(clusterToZones, clusterI)
1361 label regionI = findCorrespondingRegion
1367 clusterSizes[clusterI]
1375 clusterToZones[clusterI]
1377 regionToZones[regionI] = clusterToZones[clusterI];
1391 regionToZones[regionI]
1415 cellToRegion.write();
1417 Info<<
"Writing region per cell file (for manual decomposition) to " 1418 << cellToRegion.objectPath() <<
nl <<
endl;
1437 forAll(cellRegion, celli)
1439 cellToRegion[celli] = cellRegion[celli];
1441 cellToRegion.write();
1443 Info<<
"Writing region per cell as volScalarField to " 1444 << cellToRegion.objectPath() <<
nl <<
endl;
1451 int main(
int argc,
char *argv[])
1455 "Split mesh into multiple regions (detected by walking across faces)" 1462 "Additionally split cellZones off into separate regions" 1467 "Use cellZones only to split mesh into regions; do not use walking" 1471 "cellZonesFileOnly",
1473 "Like -cellZonesOnly, but use specified file" 1479 "Combine zones in follow-on analysis" 1485 "Combine zones in follow-on analysis" 1491 "Specify additional region boundaries that walking does not cross" 1496 "Place cells into cellZones instead of splitting mesh" 1501 "Only write largest region" 1507 "Only write region containing point" 1517 "Try to match heuristically regions to existing cell zones" 1522 "Use faceZones to patch inter-region faces instead of single patch" 1527 "Prefix region name to all patches, not just coupling patches" 1538 word blockedFacesName;
1541 Info<<
"Reading blocked internal faces from faceSet " 1542 << blockedFacesName <<
nl <<
endl;
1545 const bool makeCellZones =
args.
found(
"makeCellZones");
1546 const bool largestOnly =
args.
found(
"largestOnly");
1547 const bool insidePoint =
args.
found(
"insidePoint");
1548 const bool useCellZones =
args.
found(
"cellZones");
1549 const bool useCellZonesOnly =
args.
found(
"cellZonesOnly");
1550 const bool useCellZonesFile =
args.
found(
"cellZonesFileOnly");
1551 const bool combineZones =
args.
found(
"combineZones");
1552 const bool addZones =
args.
found(
"addZones");
1553 const bool overwrite =
args.
found(
"overwrite");
1554 const bool detectOnly =
args.
found(
"detectOnly");
1555 const bool sloppyCellZones =
args.
found(
"sloppyCellZones");
1556 const bool useFaceZones =
args.
found(
"useFaceZones");
1557 const bool prefixRegion =
args.
found(
"prefixRegion");
1562 (useCellZonesOnly || useCellZonesFile)
1563 && (useCellZones || blockedFacesName.size())
1567 <<
"You cannot specify both -cellZonesOnly or -cellZonesFileOnly" 1568 <<
" (which specify complete split)" 1569 <<
" in combination with -blockedFaces or -cellZones" 1570 <<
" (which imply a split based on topology)" 1577 Info<<
"Using current faceZones to divide inter-region interfaces" 1578 <<
" into multiple patches." 1583 Info<<
"Creating single patch per inter-region interface." 1589 if (insidePoint && largestOnly)
1592 <<
"You cannot specify both -largestOnly" 1593 <<
" (keep region with most cells)" 1594 <<
" and -insidePoint (keep region containing point)" 1609 <<
"Cannot specify both combineZones and addZones" 1619 forAll(zoneClusters, clusteri)
1623 wordRes& wrs = zoneClusters[clusteri];
1625 zoneClusterNames[clusteri] = wrs[0];
1627 for (label i = 1; i < wrs.
size(); i++)
1648 label nCellRegions = 0;
1649 if (useCellZonesOnly)
1651 Info<<
"Using current cellZones to split mesh into regions." 1652 <<
" This requires all" 1653 <<
" cells to be in one and only one cellZone." <<
nl <<
endl;
1684 label unzonedCelli = clusterID.
find(-1);
1685 if (unzonedCelli != -1)
1688 <<
"For the cellZonesOnly option all cells " 1689 <<
"have to be in a cellZone." <<
endl 1690 <<
"Cell " << unzonedCelli
1692 <<
" is not in a cellZone. There might be more unzoned cells." 1695 cellRegion = clusterID;
1696 nCellRegions =
gMax(cellRegion)+1;
1697 zoneToRegion = zoneToCluster;
1698 regionToZones = clusterToZones;
1701 else if (useCellZonesFile)
1703 const word zoneFile(
args[
"cellZonesFileOnly"]);
1704 Info<<
"Reading split from cellZones file " << zoneFile <<
endl 1705 <<
"This requires all" 1706 <<
" cells to be in one and only one cellZone." <<
nl <<
endl;
1752 label unzonedCelli = clusterID.find(-1);
1753 if (unzonedCelli != -1)
1756 <<
"For the cellZonesFileOnly option all cells " 1757 <<
"have to be in a cellZone." <<
endl 1758 <<
"Cell " << unzonedCelli
1760 <<
" is not in a cellZone. There might be more unzoned cells." 1763 cellRegion = clusterID;
1764 nCellRegions =
gMax(cellRegion)+1;
1765 zoneToRegion = zoneToCluster;
1766 regionToZones = clusterToZones;
1778 if (blockedFacesName.size())
1783 <<
" blocked faces from set " << blockedFacesName <<
nl <<
endl;
1787 for (
const label facei : blockedFaceSet)
1789 blockedFace[facei] =
true;
1833 if (ownCluster != neiCluster)
1835 blockedFace[facei] =
true;
1844 label neiCluster = neiClusterID[i];
1846 if (ownCluster != neiCluster)
1848 blockedFace[facei] =
true;
1855 nCellRegions = regions.nRegions();
1880 if (largestOnly || insidePoint)
1882 forAll(regionToZones, regionI)
1884 if (regionToZones[regionI].empty())
1890 else if (insidePoint)
1894 else if (largestOnly)
1903 Info<<
endl <<
"Number of regions:" << nCellRegions <<
nl <<
endl;
1907 writeCellToRegion(
mesh, cellRegion);
1916 forAll(cellRegion, celli)
1918 regionSizes[cellRegion[celli]]++;
1920 forAll(regionSizes, regionI)
1925 Info<<
"Region\tCells" <<
nl 1926 <<
"------\t-----" <<
endl;
1928 forAll(regionSizes, regionI)
1930 Info<< regionI <<
'\t' << regionSizes[regionI] <<
nl;
1937 Info<<
"Region\tZone\tName" <<
nl 1938 <<
"------\t----\t----" <<
endl;
1939 forAll(regionToZones, regionI)
1980 Info<<
"Sizes of interfaces between regions:" <<
nl <<
nl 1981 <<
"Interface\tRegion\tRegion\tFaces" <<
nl 1982 <<
"---------\t------\t------\t-----" <<
endl;
1984 forAll(interfaces, interI)
1986 const edge&
e = interfaces[interI];
1989 <<
"\t\t" <<
e[0] <<
"\t" <<
e[1]
1990 <<
"\t" << interfaceSizes[interI] <<
nl;
2049 if (nCellRegions == 1)
2051 Info<<
"Only one region. Doing nothing." <<
endl;
2053 else if (makeCellZones)
2055 Info<<
"Putting cells into cellZones instead of splitting mesh." 2060 for (label regionI = 0; regionI < nCellRegions; regionI++)
2062 const labelList& zones = regionToZones[regionI];
2064 if (zones.
size() == 1 && zones[0] != -1)
2067 const label zoneI = zones[0];
2068 Info<<
" Region " << regionI <<
" : corresponds to existing" 2091 std::move(regionCells),
2102 Info<<
" Region " << regionI <<
" : created new cellZone " 2127 Info<<
"Writing cellSets corresponding to cellZones." <<
nl <<
endl;
2173 Info<<
nl <<
"Found point " << insidePoint <<
" in cell " << celli
2178 regionI = cellRegion[celli];
2184 <<
"Subsetting region " << regionI
2185 <<
" containing point " << insidePoint <<
endl;
2190 <<
"Point " << insidePoint
2191 <<
" is not inside the mesh." <<
nl 2192 <<
"Bounding box of the mesh:" <<
mesh.
bounds()
2196 createAndWriteRegion
2208 else if (largestOnly)
2210 label regionI =
findMax(regionSizes);
2213 <<
"Subsetting region " << regionI
2214 <<
" of size " << regionSizes[regionI]
2217 createAndWriteRegion
2232 for (label regionI = 0; regionI < nCellRegions; regionI++)
2235 <<
"Region " << regionI <<
nl 2236 <<
"-------- " <<
endl;
2238 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 ...
void clearOut()
Clear all geometry and addressing.
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.
"blocking" : (MPI_Bsend, MPI_Recv)
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.
label find(const T &val, label pos=0) const
Find index of the first occurrence of the value.
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.
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 processes in communicator.
multivariateSurfaceInterpolationScheme< scalar >::fieldTable fields
#define forAll(list, i)
Loop across all elements in list.
Input inter-processor communications stream.
bool insert(const Key &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)
Foam::word regionName(Foam::polyMesh::defaultRegion)
writeOption writeOpt() const noexcept
Get the write option.
static void removeFiles(const polyMesh &)
Helper: remove all sets files from mesh instance.
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 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)
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.
A HashTable similar to std::unordered_map.
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...
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 time name of given scalar time 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.
Output inter-processor communications stream.
void setSize(const label newLen)
Same as resize()
static void broadcasts(const label comm, Type &arg1, Args &&... args)
Broadcast multiple items to all processes in communicator.
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.
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.
void reduce(const List< UPstream::commsStruct > &comms, T &value, const BinaryOp &bop, const int tag, const label comm)
Reduce inplace (cf. MPI Allreduce) using specified communication schedule.
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.
Defines the attributes of an object for which implicit objectRegistry management is supported...
Do not request registration (bool: false)
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)
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)