43 MGridGenGAMGAgglomeration,
51 void Foam::MGridGenGAMGAgglomeration::swap
55 PtrList<labelList>& nbrValues
61 if (interfaces.set(inti))
63 interfaces[inti].initInternalFieldTransfer
77 nbrValues.setSize(interfaces.size());
80 if (interfaces.set(inti))
87 interfaces[inti].internalFieldTransfer
99 void Foam::MGridGenGAMGAgglomeration::getNbrAgglom
101 const lduAddressing& addr,
103 const PtrList<labelList>& nbrGlobalAgglom,
107 cellToNbrAgglom.setSize(addr.size());
108 cellToNbrAgglom = -1;
112 if (interfaces.set(inti))
114 if (isA<processorLduInterface>(interfaces[inti]))
116 const processorLduInterface& pldui =
117 refCast<const processorLduInterface>(interfaces[inti]);
119 if (pldui.myProcNo() > pldui.neighbProcNo())
122 interfaces[inti].faceCells();
123 const labelList& nbrData = nbrGlobalAgglom[inti];
127 cellToNbrAgglom[faceCells[i]] = nbrData[i];
136 void Foam::MGridGenGAMGAgglomeration::detectSharedFaces
148 sharedFaces.resize(addr.lowerAddr().size()/100);
156 if (lowerData != -1 && lowerData == upperData)
158 sharedFaces.insert(facei);
166 Foam::MGridGenGAMGAgglomeration::MGridGenGAMGAgglomeration
173 fvMesh_(refCast<const fvMesh>(
mesh))
181 label nProcConsistencyIter
203 const labelList& own = fvMesh_.faceOwner();
208 if (!fvMesh_.isInternalFace(facei))
210 magSb[own[facei]] +=
mag(Sf[facei]);
218 label nCreatedLevels = 0;
220 while (nCreatedLevels < maxLevels_ - 1)
222 label nCoarseCells = -1;
229 meshLevel(nCreatedLevels).lduAddr(),
236 for (
int i=0; i<nProcConsistencyIter; i++)
250 globalAgglom[celli] = globalNumbering.
toGlobal(agglom[celli]);
255 swap(interfaces, globalAgglom, nbrGlobalAgglom);
261 getNbrAgglom(addr, interfaces, nbrGlobalAgglom, cellToNbrAgglom);
266 detectSharedFaces(
mesh, cellToNbrAgglom, sharedFaces);
273 for (
const label facei : sharedFaces)
275 weights[facei] *= 2.0;
279 finalAgglomPtr = agglomerate
284 meshLevel(nCreatedLevels).lduAddr(),
291 if (continueAgglomerating(finalAgglomPtr().size(), nCoarseCells))
293 nCells_[nCreatedLevels] = nCoarseCells;
294 restrictAddressing_.set(nCreatedLevels, finalAgglomPtr);
301 agglomerateLduAddressing(nCreatedLevels);
307 new scalarField(meshLevels_[nCreatedLevels].size())
311 restrictField(*aggVPtr, *VPtr, nCreatedLevels,
false);
327 meshLevels_[nCreatedLevels].upperAddr().size(),
332 restrictFaceField(*aggMagSfPtr, *magSfPtr, nCreatedLevels);
339 magSfPtr = aggMagSfPtr;
346 new scalarField(meshLevels_[nCreatedLevels].size())
350 restrictField(*aggMagSbPtr, *magSbPtr, nCreatedLevels,
false);
353 magSbPtr = aggMagSbPtr;
360 compactLevels(nCreatedLevels);