37 const label fineLevelIndex
40 const lduMesh& fineMesh = meshLevel(fineLevelIndex);
46 label nFineFaces = upperAddr.
size();
49 const labelField& restrictMap = restrictAddressing(fineLevelIndex);
51 if (
min(restrictMap) == -1)
57 if (restrictMap.size() != fineMeshAddr.
size())
60 <<
"restrict map does not correspond to fine level. " <<
endl
61 <<
" Sizes: restrictMap: " << restrictMap.size()
62 <<
" nEqns: " << fineMeshAddr.
size()
68 const label nCoarseCells = nCells_[fineLevelIndex];
79 labelList cCellFaces(maxNnbrs*nCoarseCells);
82 faceRestrictAddressing_.set(fineLevelIndex,
new labelList(nFineFaces));
83 labelList& faceRestrictAddr = faceRestrictAddressing_[fineLevelIndex];
89 label& nCoarseFaces = nFaces_[fineLevelIndex];
93 forAll(upperAddr, fineFacei)
95 label rmUpperAddr = restrictMap[upperAddr[fineFacei]];
96 label rmLowerAddr = restrictMap[lowerAddr[fineFacei]];
98 if (rmUpperAddr == rmLowerAddr)
103 faceRestrictAddr[fineFacei] = -(rmUpperAddr + 1);
109 label cOwn = rmUpperAddr;
110 label cNei = rmLowerAddr;
113 if (rmUpperAddr > rmLowerAddr)
120 label* ccFaces = &cCellFaces[maxNnbrs*cOwn];
122 bool nbrFound =
false;
123 label& ccnFaces = cCellnFaces[cOwn];
125 for (
int i=0; i<ccnFaces; i++)
127 if (initCoarseNeighb[ccFaces[i]] == cNei)
130 faceRestrictAddr[fineFacei] = ccFaces[i];
137 if (ccnFaces >= maxNnbrs)
139 label oldMaxNnbrs = maxNnbrs;
142 cCellFaces.
setSize(maxNnbrs*nCoarseCells);
146 label* oldCcNbrs = &cCellFaces[oldMaxNnbrs*i];
147 label* newCcNbrs = &cCellFaces[maxNnbrs*i];
149 for (
int j=0; j<cCellnFaces[i]; j++)
151 newCcNbrs[j] = oldCcNbrs[j];
155 ccFaces = &cCellFaces[maxNnbrs*cOwn];
158 ccFaces[ccnFaces] = nCoarseFaces;
159 initCoarseNeighb[nCoarseFaces] = cNei;
160 faceRestrictAddr[fineFacei] = nCoarseFaces;
177 label coarseFacei = 0;
181 label* cFaces = &cCellFaces[maxNnbrs*cci];
182 label ccnFaces = cCellnFaces[cci];
184 for (
int i=0; i<ccnFaces; i++)
186 coarseOwner[coarseFacei] = cci;
187 coarseNeighbour[coarseFacei] = initCoarseNeighb[cFaces[i]];
188 coarseFaceMap[cFaces[i]] = coarseFacei;
193 forAll(faceRestrictAddr, fineFacei)
195 if (faceRestrictAddr[fineFacei] >= 0)
197 faceRestrictAddr[fineFacei] =
198 coarseFaceMap[faceRestrictAddr[fineFacei]];
204 faceFlipMap_.
set(fineLevelIndex,
new boolList(nFineFaces,
false));
205 boolList& faceFlipMap = faceFlipMap_[fineLevelIndex];
209 label nDissapear = 0;
211 forAll(faceRestrictAddr, fineFacei)
213 label coarseFacei = faceRestrictAddr[fineFacei];
215 if (coarseFacei >= 0)
218 label cOwn = coarseOwner[coarseFacei];
219 label cNei = coarseNeighbour[coarseFacei];
221 label rmUpperAddr = restrictMap[upperAddr[fineFacei]];
222 label rmLowerAddr = restrictMap[lowerAddr[fineFacei]];
224 if (cOwn == rmUpperAddr && cNei == rmLowerAddr)
226 faceFlipMap[fineFacei] =
true;
229 else if (cOwn == rmLowerAddr && cNei == rmUpperAddr)
237 <<
" fineFacei:" << fineFacei
238 <<
" rmUpperAddr:" << rmUpperAddr
239 <<
" rmLowerAddr:" << rmLowerAddr
240 <<
" coarseFacei:" << coarseFacei
271 labelList& nPatchFaces = nPatchFaces_[fineLevelIndex];
273 patchFaceRestrictAddressing_.
set
279 patchFaceRestrictAddressing_[fineLevelIndex];
282 const label nReq = Pstream::nRequests();
285 forAll(fineInterfaces, inti)
287 if (fineInterfaces.
set(inti))
289 fineInterfaces[inti].initInternalFieldTransfer
291 Pstream::commsTypes::nonBlocking,
297 if (Pstream::parRun())
299 Pstream::waitRequests(nReq);
319 forAll(fineInterfaces, inti)
321 if (fineInterfaces.
set(inti))
329 meshLevels_[fineLevelIndex].rawInterfaces(),
330 fineInterfaces[inti],
331 fineInterfaces[inti].interfaceInternalField(restrictMap),
332 fineInterfaces[inti].internalFieldTransfer
334 Pstream::commsTypes::nonBlocking,
342 nPatchFaces[inti] = coarseInterfaces[inti].faceCells().size();
343 patchFineToCoarse[inti] = refCast<const GAMGInterface>
345 coarseInterfaces[inti]
346 ).faceRestrictAddressing();
350 meshLevels_[fineLevelIndex].addInterfaces
353 lduPrimitiveMesh::nonBlockingSchedule<processorGAMGInterface>
362 Pout<<
"GAMGAgglomeration :"
363 <<
" agglomerated level " << fineLevelIndex
364 <<
" from nCells:" << fineMeshAddr.
size()
365 <<
" nFaces:" << upperAddr.
size()
366 <<
" to nCells:" << nCoarseCells
367 <<
" nFaces:" << nCoarseFaces
375 const label meshComm,
378 const label allMeshComm,
380 const label levelIndex
383 const lduMesh& myMesh = meshLevels_[levelIndex-1];
386 procAgglomMap_.set(levelIndex,
new labelList(procAgglomMap));
387 agglomProcIDs_.set(levelIndex,
new labelList(procIDs));
388 procCommunicator_[levelIndex] = allMeshComm;
392 procCellOffsets_.set(levelIndex,
new labelList(0));
400 lduPrimitiveMesh::gather(meshComm, myMesh, procIDs, otherMeshes);
402 if (Pstream::myProcNo(meshComm) == procIDs[0])
419 procCellOffsets_[levelIndex],
421 procFaceMap_[levelIndex],
422 procBoundaryMap_[levelIndex],
423 procBoundaryFaceMap_[levelIndex]
432 procAgglomerateRestrictAddressing
439 if (Pstream::myProcNo(meshComm) != procIDs[0])
441 clearLevel(levelIndex);
450 const label levelIndex
459 restrictAddressing_[levelIndex].size(),
468 offsets[i+1] = offsets[i] + nFineCells[i];
490 restrictAddressing_[levelIndex],
491 procRestrictAddressing,
494 Pstream::commsTypes::nonBlocking
498 if (Pstream::myProcNo(comm) == procIDs[0])
500 labelList coarseCellOffsets(procIDs.size()+1);
502 coarseCellOffsets[0] = 0;
505 coarseCellOffsets[i+1] = coarseCellOffsets[i]+nCoarseCells[i];
509 nCells_[levelIndex] = coarseCellOffsets.last();
512 for (label proci = 1; proci < procIDs.size(); proci++)
516 procRestrictAddressing,
517 offsets[proci+1]-offsets[proci],
522 procSlot[i] += coarseCellOffsets[proci];
526 restrictAddressing_[levelIndex].transfer(procRestrictAddressing);
533 label prevLevel = curLevel - 1;
550 forAll(prevFaceResAddr, i)
552 if (prevFaceResAddr[i] >= 0)
554 label fineFacei = prevFaceResAddr[i];
555 prevFaceResAddr[i] = curFaceResAddr[fineFacei];
556 prevFaceFlipMap[i] = curFaceFlipMap[fineFacei];
560 label fineFacei = -prevFaceResAddr[i] - 1;
561 prevFaceResAddr[i] = -curResAddr[fineFacei] - 1;
562 prevFaceFlipMap[i] = curFaceFlipMap[fineFacei];
572 prevResAddr[i] = curResAddr[prevResAddr[i]];
580 forAll(prevPatchFaceResAddr, inti)
582 const labelList& curResAddr = curPatchFaceResAddr[inti];
583 labelList& prevResAddr = prevPatchFaceResAddr[inti];
586 label fineFacei = prevResAddr[i];
587 prevResAddr[i] = curResAddr[fineFacei];
605 forAll(prevInterLevel, inti)
607 if (prevInterLevel.
set(inti))
684 Map<label> agglomToMaster(procAgglomMap.size());
686 forAll(procAgglomMap, proci)
688 const label coarsei = procAgglomMap[proci];
690 auto iter = agglomToMaster.find(coarsei);
693 iter.val() =
min(iter.val(), proci);
697 agglomToMaster.insert(coarsei, proci);
701 masterProcs.
setSize(agglomToMaster.size());
704 masterProcs[iter.key()] = iter.val();
710 label myAgglom = procAgglomMap[myProcID];
714 agglomProcIDs =
findIndices(procAgglomMap, myAgglom);
718 agglomProcIDs.find(agglomToMaster[myAgglom]);
720 Swap(agglomProcIDs[0], agglomProcIDs[index]);