46 bool Foam::refinementHistory::readContents()
59 void Foam::refinementHistory::writeEntry
61 const List<splitCell8>& splitCells,
62 const splitCell8&
split 66 if (
split.addedCellsPtr_)
69 <<
" subCells:" <<
split.addedCellsPtr_()
79 if (
split.parent_ >= 0)
85 writeEntry(splitCells, splitCells[
split.parent_]);
94 const List<splitCell8>& splitCells
100 forAll(visibleCells, celli)
102 label index = visibleCells[celli];
106 Pout<<
"Cell from refinement:" << celli <<
" index:" << index
111 writeEntry(splitCells, splitCells[index]);
116 Pout<<
"Unrefined cell:" << celli <<
" index:" << index <<
endl;
128 addedCellsPtr_(nullptr)
135 addedCellsPtr_(nullptr)
149 parent_(rhs.parent_),
150 addedCellsPtr_(rhs.addedCellsPtr_.
clone())
170 bool Foam::refinementHistory::splitCell8::operator==
184 else if (addedCellsPtr_)
193 bool Foam::refinementHistory::splitCell8::operator!=
195 const splitCell8& rhs
208 is >> sc.parent_ >> addedCells;
210 if (addedCells.size())
212 sc.addedCellsPtr_.reset(
new FixedList<label, 8>(addedCells));
216 sc.addedCellsPtr_.reset(
nullptr);
226 const refinementHistory::splitCell8& sc
235 if (sc.addedCellsPtr_)
237 labels = sc.addedCellsPtr_();
246 void Foam::refinementHistory::checkIndices()
const 251 if (visibleCells_[i] < 0 && visibleCells_[i] >= splitCells_.size())
254 <<
"Illegal entry " << visibleCells_[i]
255 <<
" in visibleCells at location" << i <<
nl 256 <<
"It points outside the range of splitCells : 0.." 257 << splitCells_.size()-1
264 Foam::label Foam::refinementHistory::allocateSplitCell
272 if (freeSplitCells_.
size())
274 index = freeSplitCells_.
remove();
276 splitCells_[index] = splitCell8(parent);
280 index = splitCells_.size();
282 splitCells_.append(splitCell8(parent));
289 splitCell8& parentSplit = splitCells_[parent];
291 if (!parentSplit.addedCellsPtr_)
294 parentSplit.addedCellsPtr_.reset(
new FixedList<label, 8>(-1));
299 FixedList<label, 8>& parentSplits = parentSplit.addedCellsPtr_();
301 parentSplits[i] = index;
308 void Foam::refinementHistory::freeSplitCell(
const label index)
310 splitCell8&
split = splitCells_[index];
313 if (
split.parent_ >= 0)
315 autoPtr<FixedList<label, 8>>& subCellsPtr =
316 splitCells_[
split.parent_].addedCellsPtr_;
320 FixedList<label, 8>& subCells = subCellsPtr();
322 label myPos = subCells.find(index);
327 <<
"Problem: cannot find myself in" 332 subCells[myPos] = -1;
341 freeSplitCells_.
append(index);
345 void Foam::refinementHistory::markSplit
349 DynamicList<splitCell8>& newSplitCells
352 if (oldToNew[index] == -1)
356 const splitCell8&
split = splitCells_[index];
358 oldToNew[index] = newSplitCells.size();
359 newSplitCells.append(
split);
361 if (
split.parent_ >= 0)
363 markSplit(
split.parent_, oldToNew, newSplitCells);
365 if (
split.addedCellsPtr_)
367 const FixedList<label, 8>& splits =
split.addedCellsPtr_();
373 markSplit(splits[i], oldToNew, newSplitCells);
381 void Foam::refinementHistory::mark
388 splitToVal[index] = val;
390 const splitCell8&
split = splitCells_[index];
392 if (
split.addedCellsPtr_)
394 const FixedList<label, 8>& splits =
split.addedCellsPtr_();
400 mark(val, splits[i], splitToVal);
407 Foam::label Foam::refinementHistory::markCommonCells
414 labelList splitToCluster(splitCells_.size(), -1);
417 forAll(visibleCells_, cellI)
419 label index = visibleCells_[cellI];
424 while (splitCells_[index].parent_ != -1)
426 index = splitCells_[index].parent_;
430 if (splitToCluster[index] == -1)
432 mark(clusterI, index, splitToCluster);
439 cellToCluster.setSize(visibleCells_.
size(), -1);
441 forAll(visibleCells_, cellI)
443 label index = visibleCells_[cellI];
447 cellToCluster[cellI] = splitToCluster[index];
458 PtrList<labelList>& specifiedProcessorFaces,
460 List<labelPair>& explicitConnections
463 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(
db());
465 blockedFace.setSize(
mesh.nFaces(),
true);
469 markCommonCells(cellToCluster);
474 label nUnblocked = 0;
478 label ownCluster = cellToCluster[
mesh.faceOwner()[faceI]];
479 label neiCluster = cellToCluster[
mesh.faceNeighbour()[faceI]];
481 if (ownCluster != -1 && ownCluster == neiCluster)
483 if (blockedFace[faceI])
485 blockedFace[faceI] =
false;
504 const PtrList<labelList>& specifiedProcessorFaces,
506 const List<labelPair>& explicitConnections,
510 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(
db());
514 label nClusters = markCommonCells(cellToCluster);
525 label own =
mesh.faceOwner()[faceI];
526 label nei =
mesh.faceNeighbour()[faceI];
528 label ownCluster = cellToCluster[own];
529 label neiCluster = cellToCluster[nei];
531 if (ownCluster != -1 && ownCluster == neiCluster)
533 if (clusterToProc[ownCluster] == -1)
535 clusterToProc[ownCluster] = decomposition[own];
538 if (decomposition[own] != clusterToProc[ownCluster])
540 decomposition[own] = clusterToProc[ownCluster];
543 if (decomposition[nei] != clusterToProc[ownCluster])
545 decomposition[nei] = clusterToProc[ownCluster];
553 Info<<
type() <<
" : changed decomposition on " 567 warnNoRereading<refinementHistory>();
578 Pout<<
"refinementHistory::refinementHistory :" 579 <<
" constructed history from IOobject :" 580 <<
" splitCells:" << splitCells_.size()
581 <<
" visibleCells:" << visibleCells_.
size()
582 <<
" active:" << active_
591 const List<splitCell8>& splitCells,
598 splitCells_(splitCells),
600 visibleCells_(visibleCells)
603 warnNoRereading<refinementHistory>();
612 Pout<<
"refinementHistory::refinementHistory :" 613 <<
" constructed history from IOobject or components :" 614 <<
" splitCells:" << splitCells_.size()
615 <<
" visibleCells:" << visibleCells_.
size()
616 <<
" active:" << active_
633 warnNoRereading<refinementHistory>();
638 splitCells_.setCapacity(nCells);
640 for (label cellI = 0; cellI < nCells; cellI++)
642 visibleCells_[cellI] = cellI;
643 splitCells_.append(splitCell8());
655 Pout<<
"refinementHistory::refinementHistory :" 656 <<
" constructed history from IOobject or initial size :" 657 <<
" splitCells:" << splitCells_.size()
658 <<
" visibleCells:" << visibleCells_.
size()
659 <<
" active:" << active_
678 warnNoRereading<refinementHistory>();
683 splitCells_.setCapacity(nCells);
685 for (label celli = 0; celli < nCells; celli++)
687 visibleCells_[celli] = celli;
688 splitCells_.append(splitCell8());
697 Pout<<
"refinementHistory::refinementHistory :" 698 <<
" constructed history from IOobject or initial size :" 699 <<
" splitCells:" << splitCells_.size()
700 <<
" visibleCells:" << visibleCells_.
size()
701 <<
" active:" << active_
710 const refinementHistory& rh
715 splitCells_(rh.splitCells()),
716 freeSplitCells_(rh.freeSplitCells()),
717 visibleCells_(rh.visibleCells())
721 Pout<<
"refinementHistory::refinementHistory : constructed initial" 722 <<
" history." <<
endl;
730 const UPtrList<const labelList>& cellMaps,
731 const UPtrList<const refinementHistory>& refs
740 <<
"read option IOobject::MUST_READ or READ_IF_PRESENT " 741 <<
"or MUST_READ_IF_MODIFIED" 742 <<
" suggests that a read constructor would be more appropriate." 746 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(
db());
754 const DynamicList<splitCell8>& subSplits = refs[refI].splitCells();
755 offsets[refI+1] = offsets[refI]+subSplits.size();
759 splitCells_.setSize(offsets.last());
762 const DynamicList<splitCell8>& subSplits = refs[refI].splitCells();
765 splitCell8& newSplit = splitCells_[offsets[refI]+i];
768 newSplit = subSplits[i];
771 if (newSplit.parent_ >= 0)
773 newSplit.parent_ += offsets[refI];
776 if (newSplit.addedCellsPtr_)
778 FixedList<label, 8>& splits = newSplit.addedCellsPtr_();
784 splits[i] += offsets[refI];
796 const labelList& cellMap = cellMaps[refI];
797 const labelList& subVis = refs[refI].visibleCells();
801 label& newVis = visibleCells_[cellMap[i]];
806 newVis += offsets[refI];
829 Pout<<
"refinementHistory::refinementHistory :" 830 <<
" constructed history from multiple refinementHistories :" 831 <<
" splitCells:" << splitCells_.size()
832 <<
" visibleCells:" << visibleCells_.
size()
852 Pout<<
"refinementHistory::refinementHistory :" 853 <<
" constructed history from Istream" 854 <<
" splitCells:" << splitCells_.size()
855 <<
" visibleCells:" << visibleCells_.
size()
879 oldToNewSplit.setSize(splitCells_.size());
883 DynamicList<splitCell8> newSplitCells(splitCells_.size());
888 forAll(splitCells_, index)
890 if (splitCellProc[index] == procI && splitCellNum[index] == 8)
893 oldToNewSplit[index] = newSplitCells.size();
894 newSplitCells.append(splitCells_[index]);
899 forAll(visibleCells_, cellI)
901 label index = visibleCells_[cellI];
903 if (index >= 0 && decomposition[cellI] == procI)
905 label parent = splitCells_[index].parent_;
908 oldToNewSplit[index] = newSplitCells.size();
909 newSplitCells.append(splitCell8(parent));
919 newSplitCells.shrink();
922 forAll(newSplitCells, index)
924 splitCell8&
split = newSplitCells[index];
926 if (
split.parent_ >= 0)
930 if (
split.addedCellsPtr_)
932 FixedList<label, 8>& splits =
split.addedCellsPtr_();
938 splits[i] = oldToNewSplit[splits[i]];
947 forAll(decomposition, cellI)
949 if (decomposition[cellI] == procI)
958 forAll(visibleCells_, cellI)
960 if (decomposition[cellI] == procI)
962 label index = visibleCells_[cellI];
965 index = oldToNewSplit[index];
967 newVisibleCells[nSub++] = index;
971 return autoPtr<refinementHistory>
973 new refinementHistory
996 decomposition[cellMap[i]] = 1;
1001 labelList splitCellProc(splitCells_.size(), -1);
1006 forAll(visibleCells_, cellI)
1008 label index = visibleCells_[cellI];
1014 splitCells_[index].parent_,
1015 decomposition[cellI],
1035 return autoPtr<refinementHistory>
1037 new refinementHistory
1051 label oldSize = visibleCells_.size();
1055 Pout<<
"refinementHistory::resize from " << oldSize <<
" to " << size
1056 <<
" cells" <<
endl;
1059 visibleCells_.setSize(size);
1062 for (label i = oldSize; i < visibleCells_.size(); i++)
1064 visibleCells_[i] = -1;
1073 const labelList& reverseCellMap = map.reverseCellMap();
1077 labelList newVisibleCells(map.cellMap().size(), -1);
1079 forAll(visibleCells_, celli)
1081 if (visibleCells_[celli] != -1)
1083 label index = visibleCells_[celli];
1086 if (splitCells_[index].addedCellsPtr_)
1092 label newCelli = reverseCellMap[celli];
1096 newVisibleCells[newCelli] = index;
1103 Pout<<
"refinementHistory::updateMesh : from " 1104 << visibleCells_.size()
1105 <<
" to " << newVisibleCells.size()
1106 <<
" cells" <<
endl;
1109 visibleCells_.transfer(newVisibleCells);
1123 labelList newVisibleCells(cellMap.size(), -1);
1125 forAll(newVisibleCells, celli)
1127 label oldCelli = cellMap[celli];
1129 label index = visibleCells_[oldCelli];
1132 if (index >= 0 && splitCells_[index].addedCellsPtr_)
1138 newVisibleCells[celli] = index;
1143 Pout<<
"refinementHistory::updateMesh : from " 1144 << visibleCells_.size()
1145 <<
" to " << newVisibleCells.size()
1146 <<
" cells" <<
endl;
1149 visibleCells_.transfer(newVisibleCells);
1154 void Foam::refinementHistory::countProc
1157 const label newProcNo,
1162 if (splitCellProc[index] != newProcNo)
1166 splitCellProc[index] = newProcNo;
1167 splitCellNum[index] = 1;
1171 splitCellNum[index]++;
1174 if (splitCellNum[index] == 8)
1178 Pout<<
"Moving " << splitCellNum[index]
1179 <<
" cells originating from cell " << index
1181 <<
" to processor " << splitCellProc[index]
1185 label parent = splitCells_[index].parent_;
1189 countProc(parent, newProcNo, splitCellProc, splitCellNum);
1229 labelList destination(visibleCells_.size());
1233 forAll(subCellMap, proci)
1235 const labelList& newToOld = subCellMap[proci];
1239 label oldCelli = newToOld[i];
1241 destination[oldCelli] = proci;
1246 labelList splitCellProc(splitCells_.size(), -1);
1250 forAll(visibleCells_, celli)
1252 label index = visibleCells_[celli];
1258 splitCells_[index].parent_,
1280 labelList oldToNew(splitCells_.size(), -1);
1283 DynamicList<splitCell8> newSplitCells(splitCells_.size());
1288 forAll(splitCells_, index)
1290 if (splitCellProc[index] == proci && splitCellNum[index] == 8)
1293 oldToNew[index] = newSplitCells.size();
1294 newSplitCells.append(splitCells_[index]);
1299 forAll(visibleCells_, celli)
1301 label index = visibleCells_[celli];
1303 if (index >= 0 && destination[celli] == proci)
1305 label parent = splitCells_[index].parent_;
1308 oldToNew[index] = newSplitCells.size();
1309 newSplitCells.append(splitCell8(parent));
1319 newSplitCells.shrink();
1322 forAll(newSplitCells, index)
1324 splitCell8&
split = newSplitCells[index];
1326 if (
split.parent_ >= 0)
1330 if (
split.addedCellsPtr_)
1332 FixedList<label, 8>& splits =
split.addedCellsPtr_();
1338 splits[i] = oldToNew[splits[i]];
1345 const labelList& subMap = subCellMap[proci];
1348 labelList newVisibleCells(subMap.size(), -1);
1352 label oldCelli = subMap[newCelli];
1354 label oldIndex = visibleCells_[oldCelli];
1358 newVisibleCells[newCelli] = oldToNew[oldIndex];
1369 toNbr << newSplitCells << newVisibleCells;
1377 splitCells_.clear();
1379 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(db());
1387 List<splitCell8> newSplitCells(fromNbr);
1397 label offset = splitCells_.size();
1402 forAll(newSplitCells, index)
1404 splitCell8&
split = newSplitCells[index];
1406 if (
split.parent_ >= 0)
1408 split.parent_ += offset;
1410 if (
split.addedCellsPtr_)
1412 FixedList<label, 8>& splits =
split.addedCellsPtr_();
1418 splits[i] += offset;
1423 splitCells_.append(
split);
1428 const labelList& constructMap = map.cellMap().constructMap()[proci];
1430 forAll(newVisibleCells, i)
1432 if (newVisibleCells[i] >= 0)
1434 visibleCells_[constructMap[i]] = newVisibleCells[i] + offset;
1438 splitCells_.shrink();
1450 Pout<<
"refinementHistory::compact() Entering with:" 1451 <<
" freeSplitCells_:" << freeSplitCells_.size()
1452 <<
" splitCells_:" << splitCells_.size()
1453 <<
" visibleCells_:" << visibleCells_.size()
1457 forAll(freeSplitCells_, i)
1459 label index = freeSplitCells_[i];
1461 if (splitCells_[index].parent_ != -2)
1464 <<
"Problem index:" << index
1470 forAll(visibleCells_, celli)
1474 visibleCells_[celli] >= 0
1475 && splitCells_[visibleCells_[celli]].parent_ == -2
1479 <<
"Problem : visible cell:" << celli
1485 DynamicList<splitCell8> newSplitCells(splitCells_.size());
1488 labelList oldToNew(splitCells_.size(), -1);
1494 forAll(visibleCells_, celli)
1496 label index = visibleCells_[celli];
1504 splitCells_[index].parent_ != -1
1505 || splitCells_[index].addedCellsPtr_
1508 markSplit(index, oldToNew, newSplitCells);
1514 forAll(splitCells_, index)
1516 if (splitCells_[index].parent_ == -2)
1522 splitCells_[index].parent_ == -1
1523 && !splitCells_[index].addedCellsPtr_
1532 markSplit(index, oldToNew, newSplitCells);
1540 forAll(newSplitCells, index)
1542 splitCell8&
split = newSplitCells[index];
1544 if (
split.parent_ >= 0)
1548 if (
split.addedCellsPtr_)
1550 FixedList<label, 8>& splits =
split.addedCellsPtr_();
1556 splits[i] = oldToNew[splits[i]];
1565 Pout<<
"refinementHistory::compact : compacted splitCells from " 1566 << splitCells_.size() <<
" to " << newSplitCells.size() <<
endl;
1569 splitCells_.transfer(newSplitCells);
1570 freeSplitCells_.clearStorage();
1575 Pout<<
"refinementHistory::compact() NOW:" 1576 <<
" freeSplitCells_:" << freeSplitCells_.size()
1577 <<
" splitCells_:" << splitCells_.size()
1578 <<
" newSplitCells:" << newSplitCells.size()
1579 <<
" visibleCells_:" << visibleCells_.size()
1585 forAll(visibleCells_, celli)
1587 label index = visibleCells_[celli];
1592 visibleCells_[celli] = oldToNew[index];
1604 writeDebug(visibleCells_, splitCells_);
1614 label parentIndex = -1;
1616 if (visibleCells_[celli] != -1)
1621 parentIndex = visibleCells_[celli];
1625 visibleCells_[celli] = -1;
1630 parentIndex = allocateSplitCell(-1, -1);
1637 label addedCelli = addedCells[i];
1641 visibleCells_[addedCelli] = allocateSplitCell(parentIndex, i);
1648 const label masterCelli,
1653 label parentIndex = splitCells_[visibleCells_[masterCelli]].parent_;
1658 label celli = combinedCells[i];
1660 freeSplitCell(visibleCells_[celli]);
1661 visibleCells_[celli] = -1;
1664 splitCell8& parentSplit = splitCells_[parentIndex];
1666 visibleCells_[masterCelli] = parentIndex;
1672 bool ok = readData(readStream(typeName));
1709 if (
exists(setsDir/typeName))
1720 rh.freeSplitCells_.clearStorage();
1722 is >> rh.splitCells_ >> rh.visibleCells_;
1733 const_cast<refinementHistory&
>(rh).compact();
1735 return os <<
"// splitCells" <<
nl 1736 << rh.splitCells_ <<
nl 1737 <<
"// visibleCells" <<
nl 1738 << rh.visibleCells_;
List< labelList > labelListList
A List of labelList.
void operator=(const splitCell8 &rhs)
Copy assignment (no autoPtr stealing)
void size(const label n)
Older name for setAddressableSize.
autoPtr< IOobject > clone() const
Clone.
"blocking" : (MPI_Bsend, MPI_Recv)
A class for handling file names.
bool bad() const noexcept
True if stream is corrupted.
const fileName & facesInstance() const
Return the current instance directory for faces.
error FatalError
Error stream (stdout output on all processes), with additional 'FOAM FATAL ERROR' header text and sta...
#define FatalErrorInFunction
Report an error message using Foam::FatalError.
bool active() const
Is there unrefinement history?
static rangeType allProcs(const label communicator=worldComm)
Range of process indices for all processes.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
constexpr char nl
The newline '\n' character (0x0a)
regIOobject(const IOobject &io, const bool isTimeObject=false)
Construct from IOobject. The optional flag adds special handling if the object is the top-level regIO...
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.
bool headerOk()
Read and check header info. Does not check the headerClassName.
autoPtr< FixedList< label, 8 > > addedCellsPtr_
Cells this cell was refined into.
splitCell8()
Default construct (parent = -1)
refinementHistory(const IOobject &)
Construct (read) given an IOobject.
static int myProcNo(const label communicator=worldComm)
Number of this process (starting from masterNo() = 0)
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.
virtual bool writeData(Ostream &) const
WriteData function required for regIOobject write operation.
bool isReadOptional() const noexcept
True if (READ_IF_PRESENT) bits are set.
Pair< int > faceMap(const label facePi, const face &faceP, const label faceNi, const face &faceN)
fileName path() const
The complete path.
#define forAll(list, i)
Loop across all elements in list.
Istream & readStream(const word &, const bool valid=true)
Return Istream and check object type against that given.
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
void setSize(const label n)
Alias for resize()
IOobject io("surfaceFilmProperties", mesh.time().constant(), mesh, IOobject::READ_IF_PRESENT, IOobject::NO_WRITE, false)
void combineCells(const label masterCelli, const labelList &combinedCells)
Store combining 8 cells into master.
void close()
Close Istream.
Istream & operator>>(Istream &, directionInfo &)
void subset(const labelList &pointMap, const labelList &faceMap, const labelList &cellMap)
Update numbering for subsetting.
const string & prefix() const noexcept
Return the stream prefix.
const objectRegistry & db() const noexcept
Return the local objectRegistry.
bool exists(const fileName &name, const bool checkGzip=true, const bool followLink=true)
Does the name exist (as DIRECTORY or FILE) in the file system?
void append(const T &val)
Copy append an element to the end of this list.
errorManip< error > abort(error &err)
An Ostream is an abstract base class for all output systems (streams, files, token lists...
virtual bool read()
Read object. If global number of visible cells > 0 becomes active.
virtual bool readData(Istream &)
ReadData function required for regIOobject read operation. Note:
int debug
Static debugging option.
OBJstream os(runTime.globalPath()/outputName)
defineTypeNameAndDebug(combustionModel, 0)
void compact()
Compact splitCells_. Removes all freeSplitCells_ elements.
void storeSplit(const label celli, const labelList &addedCells)
Store splitting of cell into 8.
bool isReadRequired() const noexcept
True if (MUST_READ | MUST_READ_IF_MODIFIED) bits are set.
void updateMesh(const mapPolyMesh &)
Update numbering for mesh changes.
void distribute(const mapDistributePolyMesh &)
Update local numbering for mesh redistribution.
static bool split(const std::string &line, std::string &key, std::string &val)
T remove()
Remove and return the last element. Fatal on an empty list.
Ostream & operator<<(Ostream &, const boundaryPatch &p)
Write boundaryPatch as dictionary entries (without surrounding braces)
static void removeFiles(const polyMesh &)
Helper: remove all sets files from mesh instance.
void apply(const boolList &blockedFace, const PtrList< labelList > &specifiedProcessorFaces, const labelList &specifiedProcessor, const List< labelPair > &explicitConnections, labelList &decomposition) const
Apply any additional post-decomposition constraints.
#define WarningInFunction
Report a warning using Foam::Warning.
label nCells() const noexcept
Number of mesh cells.
bool good() const noexcept
True if next operation might succeed.
IOobject(const IOobject &)=default
Copy construct.
messageStream Info
Information stream (stdout output on master, null elsewhere)
#define DebugVar(var)
Report a variable name and value.
Mesh consisting of general polyhedral cells.
List< label > labelList
A List of labels.
tmp< faMatrix< Type > > operator==(const faMatrix< Type > &, const faMatrix< Type > &)
void add(boolList &blockedFace, PtrList< labelList > &specifiedProcessorFaces, labelList &specifiedProcessor, List< labelPair > &explicitConnections) const
Add my decomposition constraints.
void writeDebug() const
Debug write.
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...
List< bool > boolList
A List of bools.
void resize(const label nCells)
Extend/shrink storage. additional visibleCells_ elements get.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
bool rm(const fileName &file)
Remove a file (or its gz equivalent), returning true if successful.
static constexpr const zero Zero
Global zero (0)