45 void Foam::regionSplit::calcNonCompactRegionSplit
47 const globalIndex& globalFaces,
49 const List<labelPair>& explicitConnections,
55 List<minData> cellData(
mesh().nCells());
56 List<minData> faceData(
mesh().nFaces());
63 if (blockedFace.size() && blockedFace[facei])
65 faceData[facei] = minData(-2);
75 List<minData> seedData(nUnblocked);
81 if (blockedFace.empty() || !blockedFace[facei])
83 seedFaces[nUnblocked] = facei;
85 seedData[nUnblocked] = minData(globalFaces.toGlobal(facei));
92 FaceCellWave<minData> deltaCalc
101 mesh().globalData().nTotalCells()+1
106 cellRegion.setSize(
mesh().nCells());
109 if (cellData[celli].valid(deltaCalc.data()))
111 cellRegion[celli] = cellData[celli].data();
117 const cell& cFaces =
mesh().
cells()[celli];
118 label facei = cFaces[0];
120 if (blockedFace.size() && !blockedFace[facei])
122 FatalErrorIn(
"regionSplit::calcNonCompactRegionSplit(..)")
123 <<
"Problem: unblocked face " << facei
125 <<
" on unassigned cell " << celli
129 cellRegion[celli] = globalFaces.toGlobal(facei);
137 const bool doGlobalRegions,
139 const List<labelPair>& explicitConnections,
147 if (!doGlobalRegions)
150 boolList coupledOrBlockedFace(blockedFace);
153 if (coupledOrBlockedFace.size())
157 const polyPatch& pp = pbm[
patchi];
158 if (isA<processorPolyPatch>(pp))
160 label facei = pp.start();
163 coupledOrBlockedFace[facei++] =
true;
175 const globalIndex globalRegions(move(offsets));
181 calcNonCompactRegionSplit
184 coupledOrBlockedFace,
190 Map<label> globalToCompact(
mesh().nCells()/8);
193 label region = cellRegion[celli];
198 if (fnd == globalToCompact.end())
200 globalRegion = globalRegions.toGlobal(globalToCompact.size());
201 globalToCompact.insert(region, globalRegion);
205 globalRegion = fnd();
207 cellRegion[celli] = globalRegion;
215 compactOffsets[i] = globalToCompact.size();
218 return autoPtr<globalIndex>(
new globalIndex(move(compactOffsets)));
224 const globalIndex globalRegions(
mesh().nFaces());
227 calcNonCompactRegionSplit
248 label region = cellRegion[celli];
252 if (globalRegions.isLocal(region))
254 if (haveRegion.insert(region))
261 label proci = globalRegions.whichProcID(region);
262 if (haveRegion.insert(region))
264 nOriginating[proci]++;
273 <<
" local regions." <<
endl;
278 autoPtr<globalIndex> globalCompactPtr
282 const globalIndex& globalCompact = globalCompactPtr();
299 nonLocal[proci].resize(2*nOriginating[proci]);
305 label region = cellRegion[celli];
306 if (globalRegions.isLocal(region))
309 globalToCompact.insert
312 globalCompact.toGlobal(globalToCompact.size())
317 nonLocal[globalRegions.whichProcID(region)].insert(region);
327 forAll(sendNonLocal, proci)
329 sendNonLocal[proci] = nonLocal[proci].toc();
334 forAll(sendNonLocal, proci)
336 Pout<<
" from processor " << proci
337 <<
" want " << sendNonLocal[proci].size()
338 <<
" region numbers." 347 Pstream::exchange<labelList, label>(sendNonLocal, recvNonLocal);
354 forAll(recvNonLocal, proci)
356 const labelList& nonLocal = recvNonLocal[proci];
357 sendWantedLocal[proci].
setSize(nonLocal.size());
361 sendWantedLocal[proci][i] = globalToCompact[nonLocal[i]];
367 recvNonLocal.clear();
368 Pstream::exchange<labelList, label>(sendWantedLocal, recvNonLocal);
369 sendWantedLocal.clear();
375 forAll(recvNonLocal, proci)
377 const labelList& wantedRegions = sendNonLocal[proci];
378 const labelList& compactRegions = recvNonLocal[proci];
382 globalToCompact.insert(wantedRegions[i], compactRegions[i]);
389 cellRegion[celli] = globalToCompact[cellRegion[celli]];
392 return globalCompactPtr;
403 globalNumberingPtr_ = calcRegionSplit
417 const bool doGlobalRegions
423 globalNumberingPtr_ = calcRegionSplit
438 const bool doGlobalRegions
444 globalNumberingPtr_ = calcRegionSplit
const polyBoundaryMesh & boundaryMesh() const
Return boundary mesh.
This class separates the mesh into distinct unconnected regions, each of which is then given a label ...
List< labelList > labelListList
A List of labelList.
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
errorManipArg< error, int > exit(error &err, const int errNo=1)
static int myProcNo(const label communicator=0)
Number of this process (starting from masterNo() = 0)
Ostream & endl(Ostream &os)
Add newline and flush stream.
HashTable< label, label, Hash< label > >::const_iterator const_iterator
const cellList & cells() const
List< bool > boolList
Bool container classes.
HashSet< label, Hash< label > > labelHashSet
A HashSet with label keys.
Templated abstract base-class for optional mesh objects used to automate their allocation to the mesh...
List< label > labelList
A List of labels.
const vectorField & cellCentres() const
defineTypeNameAndDebug(combustionModel, 0)
regionSplit(const polyMesh &, const bool doGlobalRegions=Pstream::parRun())
Construct from mesh.
const vectorField & faceCentres() const
void setSize(const label)
Reset size of List.
const polyMesh & mesh() const
static label nProcs(const label communicator=0)
Number of processes in parallel run.
prefixOSstream Pout(cout, "Pout")
Mesh consisting of general polyhedral cells.
#define FatalErrorIn(functionName)
Report an error message using Foam::FatalError.