38 const label fineLevelIndex
41 const lduMesh& fineMesh = meshLevel(fineLevelIndex);
47 const label nFineFaces = upperAddr.
size();
50 const labelField& restrictMap = restrictAddressing(fineLevelIndex);
52 if (
min(restrictMap) == -1)
58 if (restrictMap.size() != fineMeshAddr.
size())
61 <<
"restrict map does not correspond to fine level. " <<
endl
62 <<
" Sizes: restrictMap: " << restrictMap.size()
63 <<
" nEqns: " << fineMeshAddr.
size()
69 const label nCoarseCells = nCells_[fineLevelIndex];
80 labelList cCellFaces(maxNnbrs*nCoarseCells);
83 faceRestrictAddressing_.set(fineLevelIndex,
new labelList(nFineFaces));
84 labelList& faceRestrictAddr = faceRestrictAddressing_[fineLevelIndex];
90 label& nCoarseFaces = nFaces_[fineLevelIndex];
94 forAll(upperAddr, fineFacei)
96 label rmUpperAddr = restrictMap[upperAddr[fineFacei]];
97 label rmLowerAddr = restrictMap[lowerAddr[fineFacei]];
99 if (rmUpperAddr == rmLowerAddr)
104 faceRestrictAddr[fineFacei] = -(rmUpperAddr + 1);
110 label cOwn = rmUpperAddr;
111 label cNei = rmLowerAddr;
114 if (rmUpperAddr > rmLowerAddr)
121 label* ccFaces = &cCellFaces[maxNnbrs*cOwn];
123 bool nbrFound =
false;
124 label& ccnFaces = cCellnFaces[cOwn];
126 for (
int i=0; i<ccnFaces; i++)
128 if (initCoarseNeighb[ccFaces[i]] == cNei)
131 faceRestrictAddr[fineFacei] = ccFaces[i];
138 if (ccnFaces >= maxNnbrs)
140 label oldMaxNnbrs = maxNnbrs;
143 cCellFaces.
setSize(maxNnbrs*nCoarseCells);
147 label* oldCcNbrs = &cCellFaces[oldMaxNnbrs*i];
148 label* newCcNbrs = &cCellFaces[maxNnbrs*i];
150 for (
int j=0; j<cCellnFaces[i]; j++)
152 newCcNbrs[j] = oldCcNbrs[j];
156 ccFaces = &cCellFaces[maxNnbrs*cOwn];
159 ccFaces[ccnFaces] = nCoarseFaces;
160 initCoarseNeighb[nCoarseFaces] = cNei;
161 faceRestrictAddr[fineFacei] = nCoarseFaces;
178 label coarseFacei = 0;
182 label* cFaces = &cCellFaces[maxNnbrs*cci];
183 label ccnFaces = cCellnFaces[cci];
185 for (
int i=0; i<ccnFaces; i++)
187 coarseOwner[coarseFacei] = cci;
188 coarseNeighbour[coarseFacei] = initCoarseNeighb[cFaces[i]];
189 coarseFaceMap[cFaces[i]] = coarseFacei;
194 forAll(faceRestrictAddr, fineFacei)
196 if (faceRestrictAddr[fineFacei] >= 0)
198 faceRestrictAddr[fineFacei] =
199 coarseFaceMap[faceRestrictAddr[fineFacei]];
205 faceFlipMap_.
set(fineLevelIndex,
new boolList(nFineFaces,
false));
206 boolList& faceFlipMap = faceFlipMap_[fineLevelIndex];
210 label nDissapear = 0;
212 forAll(faceRestrictAddr, fineFacei)
214 label coarseFacei = faceRestrictAddr[fineFacei];
216 if (coarseFacei >= 0)
219 label cOwn = coarseOwner[coarseFacei];
220 label cNei = coarseNeighbour[coarseFacei];
222 label rmUpperAddr = restrictMap[upperAddr[fineFacei]];
223 label rmLowerAddr = restrictMap[lowerAddr[fineFacei]];
225 if (cOwn == rmUpperAddr && cNei == rmLowerAddr)
227 faceFlipMap[fineFacei] =
true;
230 else if (cOwn == rmLowerAddr && cNei == rmUpperAddr)
238 <<
" fineFacei:" << fineFacei
239 <<
" rmUpperAddr:" << rmUpperAddr
240 <<
" rmLowerAddr:" << rmLowerAddr
241 <<
" coarseFacei:" << coarseFacei
272 labelList& nPatchFaces = nPatchFaces_[fineLevelIndex];
274 patchFaceRestrictAddressing_.
set
280 patchFaceRestrictAddressing_[fineLevelIndex];
283 const label nReq = Pstream::nRequests();
288 forAll(fineInterfaces, inti)
290 if (fineInterfaces.
set(inti))
292 if (fineLevelIndex == 0)
294 fineInterfaces[inti].initInternalFieldTransfer
296 Pstream::commsTypes::nonBlocking,
303 fineInterfaces[inti].initInternalFieldTransfer
305 Pstream::commsTypes::nonBlocking,
312 if (Pstream::parRun())
314 Pstream::waitRequests(nReq);
334 forAll(fineInterfaces, inti)
336 if (fineInterfaces.
set(inti))
342 if (fineLevelIndex == 0)
344 restrictMapInternalField =
345 fineInterfaces[inti].interfaceInternalField
353 restrictMapInternalField =
354 fineInterfaces[inti].interfaceInternalField
361 fineInterfaces[inti].internalFieldTransfer
363 Pstream::commsTypes::nonBlocking,
373 meshLevels_[fineLevelIndex].rawInterfaces(),
374 fineInterfaces[inti],
375 restrictMapInternalField(),
376 nbrRestrictMapInternalField(),
403 nPatchFaces[inti] = coarseInterfaces[inti].faceCells().size();
404 patchFineToCoarse[inti] = refCast<const GAMGInterface>
406 coarseInterfaces[inti]
407 ).faceRestrictAddressing();
411 meshLevels_[fineLevelIndex].addInterfaces
414 lduPrimitiveMesh::nonBlockingSchedule<processorGAMGInterface>
423 Pout<<
"GAMGAgglomeration :"
424 <<
" agglomerated level " << fineLevelIndex
425 <<
" from nCells:" << fineMeshAddr.
size()
426 <<
" nFaces:" << upperAddr.
size()
427 <<
" to nCells:" << nCoarseCells
428 <<
" nFaces:" << nCoarseFaces
436 const label meshComm,
439 const label allMeshComm,
441 const label levelIndex
444 const lduMesh& myMesh = meshLevels_[levelIndex-1];
447 procAgglomMap_.set(levelIndex,
new labelList(procAgglomMap));
448 agglomProcIDs_.set(levelIndex,
new labelList(procIDs));
449 procCommunicator_[levelIndex] = allMeshComm;
453 procCellOffsets_.set(levelIndex,
new labelList(0));
461 lduPrimitiveMesh::gather(meshComm, myMesh, procIDs, otherMeshes);
463 if (Pstream::myProcNo(meshComm) == procIDs[0])
480 procCellOffsets_[levelIndex],
482 procFaceMap_[levelIndex],
483 procBoundaryMap_[levelIndex],
484 procBoundaryFaceMap_[levelIndex]
493 procAgglomerateRestrictAddressing
500 if (Pstream::myProcNo(meshComm) != procIDs[0])
502 clearLevel(levelIndex);
511 const label levelIndex
520 restrictAddressing_[levelIndex].size(),
529 offsets[i+1] = offsets[i] + nFineCells[i];
551 restrictAddressing_[levelIndex],
552 procRestrictAddressing,
555 Pstream::commsTypes::nonBlocking
559 if (Pstream::myProcNo(comm) == procIDs[0])
561 labelList coarseCellOffsets(procIDs.size()+1);
563 coarseCellOffsets[0] = 0;
566 coarseCellOffsets[i+1] = coarseCellOffsets[i]+nCoarseCells[i];
570 nCells_[levelIndex] = coarseCellOffsets.last();
573 for (label proci = 1; proci < procIDs.size(); proci++)
577 procRestrictAddressing,
578 offsets[proci+1]-offsets[proci],
583 procSlot[i] += coarseCellOffsets[proci];
587 restrictAddressing_[levelIndex].transfer(procRestrictAddressing);
594 label prevLevel = curLevel - 1;
611 forAll(prevFaceResAddr, i)
613 if (prevFaceResAddr[i] >= 0)
615 label fineFacei = prevFaceResAddr[i];
616 prevFaceResAddr[i] = curFaceResAddr[fineFacei];
617 prevFaceFlipMap[i] = curFaceFlipMap[fineFacei];
621 label fineFacei = -prevFaceResAddr[i] - 1;
622 prevFaceResAddr[i] = -curResAddr[fineFacei] - 1;
623 prevFaceFlipMap[i] = curFaceFlipMap[fineFacei];
633 prevResAddr[i] = curResAddr[prevResAddr[i]];
641 forAll(prevPatchFaceResAddr, inti)
643 const labelList& curResAddr = curPatchFaceResAddr[inti];
644 labelList& prevResAddr = prevPatchFaceResAddr[inti];
647 label fineFacei = prevResAddr[i];
648 prevResAddr[i] = curResAddr[fineFacei];
666 forAll(prevInterLevel, inti)
668 if (prevInterLevel.
set(inti))
745 Map<label> agglomToMaster(procAgglomMap.size());
747 forAll(procAgglomMap, proci)
749 const label coarsei = procAgglomMap[proci];
751 auto iter = agglomToMaster.find(coarsei);
754 iter.val() =
min(iter.val(), proci);
758 agglomToMaster.insert(coarsei, proci);
762 masterProcs.
setSize(agglomToMaster.size());
765 masterProcs[iter.key()] = iter.val();
771 label myAgglom = procAgglomMap[myProcID];
775 agglomProcIDs =
findIndices(procAgglomMap, myAgglom);
779 agglomProcIDs.find(agglomToMaster[myAgglom]);
781 std::swap(agglomProcIDs[0], agglomProcIDs[index]);