43 MGridGenGAMGAgglomeration,
51 void Foam::MGridGenGAMGAgglomeration::swap
55 PtrList<labelList>& nbrValues
63 if (interfaces.set(inti))
65 interfaces[inti].initInternalFieldTransfer
79 nbrValues.setSize(interfaces.size());
82 if (interfaces.set(inti))
89 interfaces[inti].internalFieldTransfer
101 void Foam::MGridGenGAMGAgglomeration::getNbrAgglom
103 const lduAddressing& addr,
105 const PtrList<labelList>& nbrGlobalAgglom,
109 cellToNbrAgglom.setSize(addr.size());
110 cellToNbrAgglom = -1;
114 if (interfaces.set(inti))
116 if (isA<processorLduInterface>(interfaces[inti]))
118 const processorLduInterface& pldui =
119 refCast<const processorLduInterface>(interfaces[inti]);
121 if (pldui.myProcNo() > pldui.neighbProcNo())
124 interfaces[inti].faceCells();
125 const labelList& nbrData = nbrGlobalAgglom[inti];
129 cellToNbrAgglom[faceCells[i]] = nbrData[i];
138 void Foam::MGridGenGAMGAgglomeration::detectSharedFaces
150 sharedFaces.resize(addr.lowerAddr().size()/100);
155 label lowerData = value[
lower[facei]];
156 label upperData = value[
upper[facei]];
158 if (lowerData != -1 && lowerData == upperData)
160 sharedFaces.insert(facei);
168 Foam::MGridGenGAMGAgglomeration::MGridGenGAMGAgglomeration
175 fvMesh_(refCast<const fvMesh>(
mesh))
183 label nProcConsistencyIter
205 const labelList& own = fvMesh_.faceOwner();
210 if (!fvMesh_.isInternalFace(facei))
212 magSb[own[facei]] +=
mag(Sf[facei]);
220 label nCreatedLevels = 0;
222 while (nCreatedLevels < maxLevels_ - 1)
224 label nCoarseCells = -1;
231 meshLevel(nCreatedLevels).lduAddr(),
238 for (
int i=0; i<nProcConsistencyIter; i++)
252 globalAgglom[celli] = globalNumbering.
toGlobal(agglom[celli]);
257 swap(interfaces, globalAgglom, nbrGlobalAgglom);
263 getNbrAgglom(addr, interfaces, nbrGlobalAgglom, cellToNbrAgglom);
268 detectSharedFaces(
mesh, cellToNbrAgglom, sharedFaces);
275 for (
const label facei : sharedFaces)
277 weights[facei] *= 2.0;
281 finalAgglomPtr = agglomerate
286 meshLevel(nCreatedLevels).lduAddr(),
293 if (continueAgglomerating(finalAgglomPtr().size(), nCoarseCells))
295 nCells_[nCreatedLevels] = nCoarseCells;
296 restrictAddressing_.set(nCreatedLevels, finalAgglomPtr);
303 agglomerateLduAddressing(nCreatedLevels);
309 new scalarField(meshLevels_[nCreatedLevels].size())
313 restrictField(*aggVPtr, *VPtr, nCreatedLevels,
false);
329 meshLevels_[nCreatedLevels].upperAddr().size(),
334 restrictFaceField(*aggMagSfPtr, *magSfPtr, nCreatedLevels);
341 magSfPtr = aggMagSfPtr;
348 new scalarField(meshLevels_[nCreatedLevels].size())
352 restrictField(*aggMagSbPtr, *magSbPtr, nCreatedLevels,
false);
355 magSbPtr = aggMagSbPtr;
362 compactLevels(nCreatedLevels);