37 const label fineLevelIndex
40 const lduMesh& fineMesh = meshLevel(fineLevelIndex);
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];
283 forAll(fineInterfaces, inti)
285 if (fineInterfaces.
set(inti))
287 fineInterfaces[inti].initInternalFieldTransfer
289 Pstream::commsTypes::nonBlocking,
295 if (Pstream::parRun())
297 Pstream::waitRequests();
317 forAll(fineInterfaces, inti)
319 if (fineInterfaces.
set(inti))
327 meshLevels_[fineLevelIndex].rawInterfaces(),
328 fineInterfaces[inti],
329 fineInterfaces[inti].interfaceInternalField(restrictMap),
330 fineInterfaces[inti].internalFieldTransfer
332 Pstream::commsTypes::nonBlocking,
340 nPatchFaces[inti] = coarseInterfaces[inti].faceCells().size();
341 patchFineToCoarse[inti] = refCast<const GAMGInterface>
343 coarseInterfaces[inti]
344 ).faceRestrictAddressing();
348 meshLevels_[fineLevelIndex].addInterfaces
351 lduPrimitiveMesh::nonBlockingSchedule<processorGAMGInterface>
360 Pout<<
"GAMGAgglomeration :"
361 <<
" agglomerated level " << fineLevelIndex
362 <<
" from nCells:" << fineMeshAddr.
size()
363 <<
" nFaces:" << upperAddr.
size()
364 <<
" to nCells:" << nCoarseCells
365 <<
" nFaces:" << nCoarseFaces
373 const label meshComm,
376 const label allMeshComm,
378 const label levelIndex
381 const lduMesh& myMesh = meshLevels_[levelIndex-1];
384 procAgglomMap_.set(levelIndex,
new labelList(procAgglomMap));
385 agglomProcIDs_.set(levelIndex,
new labelList(procIDs));
386 procCommunicator_[levelIndex] = allMeshComm;
390 procCellOffsets_.set(levelIndex,
new labelList(0));
398 lduPrimitiveMesh::gather(meshComm, myMesh, procIDs, otherMeshes);
400 if (Pstream::myProcNo(meshComm) == procIDs[0])
417 procCellOffsets_[levelIndex],
419 procFaceMap_[levelIndex],
420 procBoundaryMap_[levelIndex],
421 procBoundaryFaceMap_[levelIndex]
430 procAgglomerateRestrictAddressing
437 if (Pstream::myProcNo(meshComm) != procIDs[0])
439 clearLevel(levelIndex);
448 const label levelIndex
457 restrictAddressing_[levelIndex].size(),
466 offsets[i+1] = offsets[i] + nFineCells[i];
488 restrictAddressing_[levelIndex],
489 procRestrictAddressing,
492 Pstream::commsTypes::nonBlocking
496 if (Pstream::myProcNo(comm) == procIDs[0])
498 labelList coarseCellOffsets(procIDs.size()+1);
500 coarseCellOffsets[0] = 0;
503 coarseCellOffsets[i+1] = coarseCellOffsets[i]+nCoarseCells[i];
507 nCells_[levelIndex] = coarseCellOffsets.last();
510 for (
label proci = 1; proci < procIDs.size(); proci++)
514 procRestrictAddressing,
515 offsets[proci+1]-offsets[proci],
520 procSlot[i] += coarseCellOffsets[proci];
524 restrictAddressing_[levelIndex].transfer(procRestrictAddressing);
531 label prevLevel = curLevel - 1;
548 forAll(prevFaceResAddr, i)
550 if (prevFaceResAddr[i] >= 0)
552 label fineFacei = prevFaceResAddr[i];
553 prevFaceResAddr[i] = curFaceResAddr[fineFacei];
554 prevFaceFlipMap[i] = curFaceFlipMap[fineFacei];
558 label fineFacei = -prevFaceResAddr[i] - 1;
559 prevFaceResAddr[i] = -curResAddr[fineFacei] - 1;
560 prevFaceFlipMap[i] = curFaceFlipMap[fineFacei];
570 prevResAddr[i] = curResAddr[prevResAddr[i]];
578 forAll(prevPatchFaceResAddr, inti)
580 const labelList& curResAddr = curPatchFaceResAddr[inti];
581 labelList& prevResAddr = prevPatchFaceResAddr[inti];
584 label fineFacei = prevResAddr[i];
585 prevResAddr[i] = curResAddr[fineFacei];
603 forAll(prevInterLevel, inti)
605 if (prevInterLevel.
set(inti))
682 Map<label> agglomToMaster(procAgglomMap.size());
684 forAll(procAgglomMap, proci)
686 const label coarsei = procAgglomMap[proci];
688 auto iter = agglomToMaster.find(coarsei);
691 iter.val() =
min(iter.val(), proci);
695 agglomToMaster.insert(coarsei, proci);
699 masterProcs.
setSize(agglomToMaster.size());
702 masterProcs[iter.key()] = iter.val();
708 label myAgglom = procAgglomMap[myProcID];
712 agglomProcIDs = findIndices(procAgglomMap, myAgglom);
716 agglomProcIDs.find(agglomToMaster[myAgglom]);
718 Swap(agglomProcIDs[0], agglomProcIDs[index]);