46 void Foam::refinementHistory::writeEntry
48 const List<splitCell8>& splitCells,
49 const splitCell8&
split
53 if (
split.addedCellsPtr_)
56 <<
" subCells:" <<
split.addedCellsPtr_()
66 if (
split.parent_ >= 0)
81 const List<splitCell8>& splitCells
87 forAll(visibleCells, celli)
89 label index = visibleCells[celli];
93 Pout<<
"Cell from refinement:" << celli <<
" index:" << index
98 writeEntry(splitCells, splitCells[index]);
103 Pout<<
"Unrefined cell:" << celli <<
" index:" << index <<
endl;
115 addedCellsPtr_(nullptr)
122 addedCellsPtr_(nullptr)
136 parent_(rhs.parent_),
137 addedCellsPtr_(rhs.addedCellsPtr_.
clone())
157 bool Foam::refinementHistory::splitCell8::operator==
171 else if (addedCellsPtr_)
180 bool Foam::refinementHistory::splitCell8::operator!=
182 const splitCell8& rhs
195 is >> sc.parent_ >> addedCells;
197 if (addedCells.size())
199 sc.addedCellsPtr_.reset(
new FixedList<label, 8>(addedCells));
203 sc.addedCellsPtr_.reset(
nullptr);
213 const refinementHistory::splitCell8& sc
222 if (sc.addedCellsPtr_)
224 labels = sc.addedCellsPtr_();
233 void Foam::refinementHistory::checkIndices()
const
238 if (visibleCells_[i] < 0 && visibleCells_[i] >= splitCells_.size())
241 <<
"Illegal entry " << visibleCells_[i]
242 <<
" in visibleCells at location" << i <<
nl
243 <<
"It points outside the range of splitCells : 0.."
244 << splitCells_.size()-1
251 Foam::label Foam::refinementHistory::allocateSplitCell
259 if (freeSplitCells_.size())
261 index = freeSplitCells_.
remove();
263 splitCells_[index] = splitCell8(parent);
267 index = splitCells_.size();
269 splitCells_.append(splitCell8(parent));
276 splitCell8& parentSplit = splitCells_[parent];
278 if (!parentSplit.addedCellsPtr_)
281 parentSplit.addedCellsPtr_.reset(
new FixedList<label, 8>(-1));
286 FixedList<label, 8>& parentSplits = parentSplit.addedCellsPtr_();
288 parentSplits[i] = index;
295 void Foam::refinementHistory::freeSplitCell(
const label index)
297 splitCell8&
split = splitCells_[index];
300 if (
split.parent_ >= 0)
302 autoPtr<FixedList<label, 8>>& subCellsPtr =
303 splitCells_[
split.parent_].addedCellsPtr_;
307 FixedList<label, 8>& subCells = subCellsPtr();
309 label myPos = subCells.find(index);
314 <<
"Problem: cannot find myself in"
319 subCells[myPos] = -1;
328 freeSplitCells_.
append(index);
332 void Foam::refinementHistory::markSplit
336 DynamicList<splitCell8>& newSplitCells
339 if (oldToNew[index] == -1)
343 const splitCell8&
split = splitCells_[index];
345 oldToNew[index] = newSplitCells.size();
346 newSplitCells.append(
split);
348 if (
split.parent_ >= 0)
350 markSplit(
split.parent_, oldToNew, newSplitCells);
352 if (
split.addedCellsPtr_)
354 const FixedList<label, 8>& splits =
split.addedCellsPtr_();
360 markSplit(splits[i], oldToNew, newSplitCells);
368 void Foam::refinementHistory::mark
375 splitToVal[index] = val;
377 const splitCell8&
split = splitCells_[index];
379 if (
split.addedCellsPtr_)
381 const FixedList<label, 8>& splits =
split.addedCellsPtr_();
387 mark(val, splits[i], splitToVal);
394 Foam::label Foam::refinementHistory::markCommonCells
401 labelList splitToCluster(splitCells_.size(), -1);
404 forAll(visibleCells_, cellI)
406 label index = visibleCells_[cellI];
411 while (splitCells_[index].parent_ != -1)
413 index = splitCells_[index].parent_;
417 if (splitToCluster[index] == -1)
419 mark(clusterI, index, splitToCluster);
426 cellToCluster.setSize(visibleCells_.size(), -1);
428 forAll(visibleCells_, cellI)
430 label index = visibleCells_[cellI];
434 cellToCluster[cellI] = splitToCluster[index];
445 PtrList<labelList>& specifiedProcessorFaces,
447 List<labelPair>& explicitConnections
450 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(
db());
452 blockedFace.setSize(
mesh.nFaces(),
true);
456 markCommonCells(cellToCluster);
461 label nUnblocked = 0;
465 label ownCluster = cellToCluster[
mesh.faceOwner()[faceI]];
466 label neiCluster = cellToCluster[
mesh.faceNeighbour()[faceI]];
468 if (ownCluster != -1 && ownCluster == neiCluster)
470 if (blockedFace[faceI])
472 blockedFace[faceI] =
false;
480 reduce(nUnblocked, sumOp<label>());
481 Info<<
type() <<
" : unblocked " << nUnblocked <<
" faces" <<
endl;
491 const PtrList<labelList>& specifiedProcessorFaces,
493 const List<labelPair>& explicitConnections,
497 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(
db());
501 label nClusters = markCommonCells(cellToCluster);
512 label own =
mesh.faceOwner()[faceI];
513 label nei =
mesh.faceNeighbour()[faceI];
515 label ownCluster = cellToCluster[own];
516 label neiCluster = cellToCluster[nei];
518 if (ownCluster != -1 && ownCluster == neiCluster)
520 if (clusterToProc[ownCluster] == -1)
522 clusterToProc[ownCluster] = decomposition[own];
525 if (decomposition[own] != clusterToProc[ownCluster])
527 decomposition[own] = clusterToProc[ownCluster];
530 if (decomposition[nei] != clusterToProc[ownCluster])
532 decomposition[nei] = clusterToProc[ownCluster];
540 reduce(nChanged, sumOp<label>());
541 Info<<
type() <<
" : changed decomposition on " << nChanged
555 warnNoRereading<refinementHistory>();
564 readStream(typeName) >> *
this;
571 active_ = (
returnReduce(visibleCells_.size(), sumOp<label>()) > 0);
575 Pout<<
"refinementHistory::refinementHistory :"
576 <<
" constructed history from IOobject :"
577 <<
" splitCells:" << splitCells_.size()
578 <<
" visibleCells:" << visibleCells_.size()
579 <<
" active:" << active_
588 const List<splitCell8>& splitCells,
595 splitCells_(splitCells),
597 visibleCells_(visibleCells)
600 warnNoRereading<refinementHistory>();
609 readStream(typeName) >> *
this;
618 Pout<<
"refinementHistory::refinementHistory :"
619 <<
" constructed history from IOobject or components :"
620 <<
" splitCells:" << splitCells_.size()
621 <<
" visibleCells:" << visibleCells_.size()
622 <<
" active:" << active_
639 warnNoRereading<refinementHistory>();
648 readStream(typeName) >> *
this;
654 splitCells_.setCapacity(nCells);
656 for (label cellI = 0; cellI < nCells; cellI++)
658 visibleCells_[cellI] = cellI;
659 splitCells_.append(splitCell8());
663 active_ = (
returnReduce(visibleCells_.size(), sumOp<label>()) > 0);
671 Pout<<
"refinementHistory::refinementHistory :"
672 <<
" constructed history from IOobject or initial size :"
673 <<
" splitCells:" << splitCells_.size()
674 <<
" visibleCells:" << visibleCells_.size()
675 <<
" active:" << active_
694 warnNoRereading<refinementHistory>();
703 readStream(typeName) >> *
this;
709 splitCells_.setCapacity(nCells);
711 for (label celli = 0; celli < nCells; celli++)
713 visibleCells_[celli] = celli;
714 splitCells_.append(splitCell8());
723 Pout<<
"refinementHistory::refinementHistory :"
724 <<
" constructed history from IOobject or initial size :"
725 <<
" splitCells:" << splitCells_.size()
726 <<
" visibleCells:" << visibleCells_.size()
727 <<
" active:" << active_
736 const refinementHistory& rh
741 splitCells_(rh.splitCells()),
742 freeSplitCells_(rh.freeSplitCells()),
743 visibleCells_(rh.visibleCells())
747 Pout<<
"refinementHistory::refinementHistory : constructed initial"
748 <<
" history." <<
endl;
756 const UPtrList<const labelList>& cellMaps,
757 const UPtrList<const refinementHistory>& refs
771 <<
"read option IOobject::MUST_READ, READ_IF_PRESENT or "
772 <<
"MUST_READ_IF_MODIFIED"
773 <<
" suggests that a read constructor would be more appropriate."
777 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(
db());
785 const DynamicList<splitCell8>& subSplits = refs[refI].splitCells();
786 offsets[refI+1] = offsets[refI]+subSplits.size();
790 splitCells_.setSize(offsets.last());
793 const DynamicList<splitCell8>& subSplits = refs[refI].splitCells();
796 splitCell8& newSplit = splitCells_[offsets[refI]+i];
799 newSplit = subSplits[i];
802 if (newSplit.parent_ >= 0)
804 newSplit.parent_ += offsets[refI];
807 if (newSplit.addedCellsPtr_)
809 FixedList<label, 8>& splits = newSplit.addedCellsPtr_();
815 splits[i] += offsets[refI];
827 const labelList& cellMap = cellMaps[refI];
828 const labelList& subVis = refs[refI].visibleCells();
832 label& newVis = visibleCells_[cellMap[i]];
837 newVis += offsets[refI];
860 Pout<<
"refinementHistory::refinementHistory :"
861 <<
" constructed history from multiple refinementHistories :"
862 <<
" splitCells:" << splitCells_.size()
863 <<
" visibleCells:" << visibleCells_.size()
876 active_ = (
returnReduce(visibleCells_.size(), sumOp<label>()) > 0);
883 Pout<<
"refinementHistory::refinementHistory :"
884 <<
" constructed history from Istream"
885 <<
" splitCells:" << splitCells_.size()
886 <<
" visibleCells:" << visibleCells_.size()
910 oldToNewSplit.setSize(splitCells_.size());
914 DynamicList<splitCell8> newSplitCells(splitCells_.size());
919 forAll(splitCells_, index)
921 if (splitCellProc[index] == procI && splitCellNum[index] == 8)
924 oldToNewSplit[index] = newSplitCells.size();
925 newSplitCells.append(splitCells_[index]);
930 forAll(visibleCells_, cellI)
932 label index = visibleCells_[cellI];
934 if (index >= 0 && decomposition[cellI] == procI)
936 label parent = splitCells_[index].parent_;
939 oldToNewSplit[index] = newSplitCells.size();
940 newSplitCells.append(splitCell8(parent));
950 newSplitCells.shrink();
953 forAll(newSplitCells, index)
955 splitCell8&
split = newSplitCells[index];
957 if (
split.parent_ >= 0)
961 if (
split.addedCellsPtr_)
963 FixedList<label, 8>& splits =
split.addedCellsPtr_();
969 splits[i] = oldToNewSplit[splits[i]];
978 forAll(decomposition, cellI)
980 if (decomposition[cellI] == procI)
989 forAll(visibleCells_, cellI)
991 if (decomposition[cellI] == procI)
993 label index = visibleCells_[cellI];
996 index = oldToNewSplit[index];
998 newVisibleCells[nSub++] = index;
1002 return autoPtr<refinementHistory>
1004 new refinementHistory
1027 decomposition[cellMap[i]] = 1;
1032 labelList splitCellProc(splitCells_.size(), -1);
1037 forAll(visibleCells_, cellI)
1039 label index = visibleCells_[cellI];
1045 splitCells_[index].parent_,
1046 decomposition[cellI],
1066 return autoPtr<refinementHistory>
1068 new refinementHistory
1071 DynamicList<splitCell8>(0),
1082 label oldSize = visibleCells_.size();
1086 Pout<<
"refinementHistory::resize from " << oldSize <<
" to " << size
1087 <<
" cells" <<
endl;
1090 visibleCells_.setSize(size);
1093 for (label i = oldSize; i < visibleCells_.size(); i++)
1095 visibleCells_[i] = -1;
1104 const labelList& reverseCellMap = map.reverseCellMap();
1108 labelList newVisibleCells(map.cellMap().size(), -1);
1110 forAll(visibleCells_, celli)
1112 if (visibleCells_[celli] != -1)
1114 label index = visibleCells_[celli];
1117 if (splitCells_[index].addedCellsPtr_)
1123 label newCelli = reverseCellMap[celli];
1127 newVisibleCells[newCelli] = index;
1134 Pout<<
"refinementHistory::updateMesh : from "
1135 << visibleCells_.size()
1136 <<
" to " << newVisibleCells.size()
1137 <<
" cells" <<
endl;
1140 visibleCells_.transfer(newVisibleCells);
1154 labelList newVisibleCells(cellMap.size(), -1);
1156 forAll(newVisibleCells, celli)
1158 label oldCelli = cellMap[celli];
1160 label index = visibleCells_[oldCelli];
1163 if (index >= 0 && splitCells_[index].addedCellsPtr_)
1169 newVisibleCells[celli] = index;
1174 Pout<<
"refinementHistory::updateMesh : from "
1175 << visibleCells_.size()
1176 <<
" to " << newVisibleCells.size()
1177 <<
" cells" <<
endl;
1180 visibleCells_.transfer(newVisibleCells);
1185 void Foam::refinementHistory::countProc
1188 const label newProcNo,
1193 if (splitCellProc[index] != newProcNo)
1197 splitCellProc[index] = newProcNo;
1198 splitCellNum[index] = 1;
1202 splitCellNum[index]++;
1205 if (splitCellNum[index] == 8)
1209 Pout<<
"Moving " << splitCellNum[index]
1210 <<
" cells originating from cell " << index
1212 <<
" to processor " << splitCellProc[index]
1216 label parent = splitCells_[index].parent_;
1220 countProc(parent, newProcNo, splitCellProc, splitCellNum);
1260 labelList destination(visibleCells_.size());
1264 forAll(subCellMap, proci)
1266 const labelList& newToOld = subCellMap[proci];
1270 label oldCelli = newToOld[i];
1272 destination[oldCelli] = proci;
1277 labelList splitCellProc(splitCells_.size(), -1);
1281 forAll(visibleCells_, celli)
1283 label index = visibleCells_[celli];
1289 splitCells_[index].parent_,
1311 labelList oldToNew(splitCells_.size(), -1);
1314 DynamicList<splitCell8> newSplitCells(splitCells_.size());
1319 forAll(splitCells_, index)
1321 if (splitCellProc[index] == proci && splitCellNum[index] == 8)
1324 oldToNew[index] = newSplitCells.size();
1325 newSplitCells.append(splitCells_[index]);
1330 forAll(visibleCells_, celli)
1332 label index = visibleCells_[celli];
1334 if (index >= 0 && destination[celli] == proci)
1336 label parent = splitCells_[index].parent_;
1339 oldToNew[index] = newSplitCells.size();
1340 newSplitCells.append(splitCell8(parent));
1350 newSplitCells.shrink();
1353 forAll(newSplitCells, index)
1355 splitCell8&
split = newSplitCells[index];
1357 if (
split.parent_ >= 0)
1361 if (
split.addedCellsPtr_)
1363 FixedList<label, 8>& splits =
split.addedCellsPtr_();
1369 splits[i] = oldToNew[splits[i]];
1376 const labelList& subMap = subCellMap[proci];
1379 labelList newVisibleCells(subMap.size(), -1);
1383 label oldCelli = subMap[newCelli];
1385 label oldIndex = visibleCells_[oldCelli];
1389 newVisibleCells[newCelli] = oldToNew[oldIndex];
1400 toNbr << newSplitCells << newVisibleCells;
1408 splitCells_.clear();
1410 const polyMesh&
mesh =
dynamic_cast<const polyMesh&
>(db());
1418 List<splitCell8> newSplitCells(fromNbr);
1428 label offset = splitCells_.size();
1433 forAll(newSplitCells, index)
1435 splitCell8&
split = newSplitCells[index];
1437 if (
split.parent_ >= 0)
1439 split.parent_ += offset;
1441 if (
split.addedCellsPtr_)
1443 FixedList<label, 8>& splits =
split.addedCellsPtr_();
1449 splits[i] += offset;
1454 splitCells_.append(
split);
1459 const labelList& constructMap = map.cellMap().constructMap()[proci];
1461 forAll(newVisibleCells, i)
1463 if (newVisibleCells[i] >= 0)
1465 visibleCells_[constructMap[i]] = newVisibleCells[i] + offset;
1469 splitCells_.shrink();
1481 Pout<<
"refinementHistory::compact() Entering with:"
1482 <<
" freeSplitCells_:" << freeSplitCells_.size()
1483 <<
" splitCells_:" << splitCells_.size()
1484 <<
" visibleCells_:" << visibleCells_.size()
1488 forAll(freeSplitCells_, i)
1490 label index = freeSplitCells_[i];
1492 if (splitCells_[index].parent_ != -2)
1495 <<
"Problem index:" << index
1501 forAll(visibleCells_, celli)
1505 visibleCells_[celli] >= 0
1506 && splitCells_[visibleCells_[celli]].parent_ == -2
1510 <<
"Problem : visible cell:" << celli
1516 DynamicList<splitCell8> newSplitCells(splitCells_.size());
1519 labelList oldToNew(splitCells_.size(), -1);
1525 forAll(visibleCells_, celli)
1527 label index = visibleCells_[celli];
1535 splitCells_[index].parent_ != -1
1536 || splitCells_[index].addedCellsPtr_
1539 markSplit(index, oldToNew, newSplitCells);
1545 forAll(splitCells_, index)
1547 if (splitCells_[index].parent_ == -2)
1553 splitCells_[index].parent_ == -1
1554 && !splitCells_[index].addedCellsPtr_
1563 markSplit(index, oldToNew, newSplitCells);
1571 forAll(newSplitCells, index)
1573 splitCell8&
split = newSplitCells[index];
1575 if (
split.parent_ >= 0)
1579 if (
split.addedCellsPtr_)
1581 FixedList<label, 8>& splits =
split.addedCellsPtr_();
1587 splits[i] = oldToNew[splits[i]];
1596 Pout<<
"refinementHistory::compact : compacted splitCells from "
1597 << splitCells_.size() <<
" to " << newSplitCells.size() <<
endl;
1600 splitCells_.transfer(newSplitCells);
1601 freeSplitCells_.clearStorage();
1606 Pout<<
"refinementHistory::compact() NOW:"
1607 <<
" freeSplitCells_:" << freeSplitCells_.size()
1608 <<
" splitCells_:" << splitCells_.size()
1609 <<
" newSplitCells:" << newSplitCells.size()
1610 <<
" visibleCells_:" << visibleCells_.size()
1616 forAll(visibleCells_, celli)
1618 label index = visibleCells_[celli];
1623 visibleCells_[celli] = oldToNew[index];
1635 writeDebug(visibleCells_, splitCells_);
1645 label parentIndex = -1;
1647 if (visibleCells_[celli] != -1)
1652 parentIndex = visibleCells_[celli];
1656 visibleCells_[celli] = -1;
1661 parentIndex = allocateSplitCell(-1, -1);
1668 label addedCelli = addedCells[i];
1672 visibleCells_[addedCelli] = allocateSplitCell(parentIndex, i);
1679 const label masterCelli,
1684 label parentIndex = splitCells_[visibleCells_[masterCelli]].parent_;
1689 label celli = combinedCells[i];
1691 freeSplitCell(visibleCells_[celli]);
1692 visibleCells_[celli] = -1;
1695 splitCell8& parentSplit = splitCells_[parentIndex];
1697 visibleCells_[masterCelli] = parentIndex;
1703 bool ok = readData(readStream(typeName));
1740 if (
exists(setsDir/typeName))
1751 rh.freeSplitCells_.clearStorage();
1753 is >> rh.splitCells_ >> rh.visibleCells_;
1764 const_cast<refinementHistory&
>(rh).compact();
1766 return os <<
"// splitCells" <<
nl
1767 << rh.splitCells_ <<
nl
1768 <<
"// visibleCells" <<
nl
1769 << rh.visibleCells_;