35 const label fineLevelIndex,
41 const lduMatrix& fineMatrix = matrixLevel(fineLevelIndex);
43 if (UPstream::myProcNo(fineMatrix.
mesh().
comm()) != -1)
45 const label nCoarseFaces = agglomeration_.nFaces(fineLevelIndex);
46 const label nCoarseCells = agglomeration_.nCells(fineLevelIndex);
54 lduMatrix& coarseMatrix = matrixLevels_[fineLevelIndex];
63 agglomeration_.restrictField
73 interfaceLevel(fineLevelIndex);
76 primitiveInterfaceLevels_.set
83 primitiveInterfaceLevels_[fineLevelIndex];
92 interfaceLevels_[fineLevelIndex];
95 interfaceLevelsBouCoeffs_.
set
101 interfaceLevelsBouCoeffs_[fineLevelIndex];
104 interfaceLevelsIntCoeffs_.set
110 interfaceLevelsIntCoeffs_[fineLevelIndex];
113 agglomerateInterfaceCoefficients
116 coarseMeshInterfaces,
117 coarsePrimInterfaces,
119 coarseInterfaceBouCoeffs,
120 coarseInterfaceIntCoeffs
126 agglomeration_.faceRestrictAddressing(fineLevelIndex);
128 agglomeration_.faceFlipMap(fineLevelIndex);
142 forAll(faceRestrictAddr, fineFacei)
144 label cFace = faceRestrictAddr[fineFacei];
150 if (!faceFlipMap[fineFacei])
152 coarseUpper[cFace] += fineUpper[fineFacei];
153 coarseLower[cFace] += fineLower[fineFacei];
157 coarseUpper[cFace] += fineLower[fineFacei];
158 coarseLower[cFace] += fineUpper[fineFacei];
164 coarseDiag[-1 - cFace] +=
165 fineUpper[fineFacei] + fineLower[fineFacei];
177 forAll(faceRestrictAddr, fineFacei)
179 label cFace = faceRestrictAddr[fineFacei];
183 coarseUpper[cFace] += fineUpper[fineFacei];
188 coarseDiag[-1 - cFace] += 2*fineUpper[fineFacei];
199 const label fineLevelIndex,
209 interfaceLevel(fineLevelIndex);
213 interfaceBouCoeffsLevel(fineLevelIndex);
217 interfaceIntCoeffsLevel(fineLevelIndex);
220 agglomeration_.patchFaceRestrictAddressing(fineLevelIndex);
223 agglomeration_.nPatchFaces(fineLevelIndex);
227 forAll(fineInterfaces, inti)
229 if (fineInterfaces.
set(inti))
232 refCast<const GAMGInterface>
234 coarseMeshInterfaces[inti]
237 coarsePrimInterfaces.
set
249 &coarsePrimInterfaces[inti]
252 const labelList& faceRestrictAddressing = patchFineToCoarse[inti];
254 coarseInterfaceBouCoeffs.set
259 agglomeration_.restrictField
261 coarseInterfaceBouCoeffs[inti],
262 fineInterfaceBouCoeffs[inti],
263 faceRestrictAddressing
266 coarseInterfaceIntCoeffs.set
271 agglomeration_.restrictField
273 coarseInterfaceIntCoeffs[inti],
274 fineInterfaceIntCoeffs[inti],
275 faceRestrictAddressing
288 const label meshComm,
304 Pout<<
"GAMGSolver::gatherMatrices :"
305 <<
" collecting matrices from procs:" << procIDs
306 <<
" using comm:" << meshComm <<
endl;
309 if (Pstream::myProcNo(meshComm) == procIDs[0])
313 otherBouCoeffs.setSize(procIDs.
size()-1);
314 otherIntCoeffs.setSize(procIDs.
size()-1);
316 otherRanks.setSize(procIDs.
size()-1);
318 for (
label procI = 1; procI < procIDs.
size(); procI++)
320 label otherI = procI-1;
331 otherMats.
set(otherI,
new lduMatrix(dummyMesh, fromSlave));
334 boolList& procTransforms = otherTransforms[otherI];
337 fromSlave >> procTransforms;
338 fromSlave >> procRanks;
353 if (procRanks[intI] != -1)
355 otherBouCoeffs[otherI].set
360 otherIntCoeffs[otherI].set
374 boolList procTransforms(interfaceBouCoeffs.size(),
false);
375 List<label> procRanks(interfaceBouCoeffs.size(), -1);
378 if (interfaces.
set(intI))
386 procTransforms[intI] =
interface.doTransform();
400 toMaster << mat << procTransforms << procRanks;
403 if (procRanks[intI] != -1)
406 << interfaceBouCoeffs[intI]
407 << interfaceIntCoeffs[intI];
430 const lduMatrix& coarsestMatrix = matrixLevels_[levelI];
432 interfaceLevels_[levelI];
434 interfaceLevelsBouCoeffs_[levelI];
436 interfaceLevelsIntCoeffs_[levelI];
437 const lduMesh& coarsestMesh = coarsestMatrix.
mesh();
442 label oldWarn = UPstream::warnComm;
443 UPstream::warnComm = coarseComm;
474 if (Pstream::myProcNo(coarseComm) == agglomProcIDs[0])
490 const lduMesh& allMesh = agglomeration_.meshLevel(levelI+1);
491 const labelList& cellOffsets = agglomeration_.cellOffsets(levelI+1);
493 const labelListList& boundaryMap = agglomeration_.boundaryMap(levelI+1);
495 agglomeration_.boundaryFaceMap(levelI+1);
506 coarsestMatrix.
diag().size()
509 coarsestMatrix.
diag()
516 otherMats[i].
diag().size(),
531 ) = coarsestMatrix.
lower();
538 ) = otherMats[i].lower();
548 ) = coarsestMatrix.
upper();
555 ) = otherMats[i].upper();
565 allInterfaceBouCoeffs.setSize(allMeshInterfaces.
size());
566 allInterfaceIntCoeffs.setSize(allMeshInterfaces.
size());
567 allPrimitiveInterfaces.
setSize(allMeshInterfaces.
size());
570 forAll(allMeshInterfaces, intI)
575 allInterfaceBouCoeffs.set(intI,
new scalarField(size));
576 allInterfaceIntCoeffs.set(intI,
new scalarField(size));
580 forAll(boundaryMap, procI)
586 : otherBouCoeffs[procI-1]
592 : otherIntCoeffs[procI-1]
595 const labelList& bMap = boundaryMap[procI];
598 label allIntI = bMap[procIntI];
605 if (!allInterfaces.
set(allIntI))
609 bool doTransform =
false;
619 coarsestInterfaces[procIntI]
622 rank = procInt.
rank();
627 otherTransforms[procI-1][procIntI];
628 rank = otherRanks[procI-1][procIntI];
631 allPrimitiveInterfaces.
set
636 refCast<const GAMGInterface>
638 allMeshInterfaces[allIntI]
647 &allPrimitiveInterfaces[allIntI]
654 scalarField& allBou = allInterfaceBouCoeffs[allIntI];
655 scalarField& allInt = allInterfaceIntCoeffs[allIntI];
657 const labelList& map = boundaryFaceMap[procI][procIntI];
659 const scalarField& procBou = procBouCoeffs[procIntI];
660 const scalarField& procInt = procIntCoeffs[procIntI];
664 label allFaceI = map[i];
670 allBou[allFaceI] = procBou[i];
671 allInt[allFaceI] = procInt[i];
674 else if (procBouCoeffs.set(procIntI))
678 const labelList& map = boundaryFaceMap[procI][procIntI];
679 const scalarField& procBou = procBouCoeffs[procIntI];
680 const scalarField& procInt = procIntCoeffs[procIntI];
687 label allFaceI = map[i];
691 allMatrix.
upper()[allFaceI] = -procBou[i];
695 allMatrix.
lower()[allFaceI] = -procInt[i];
700 label allFaceI = -map[i]-1;
704 allMatrix.
upper()[allFaceI] = -procInt[i];
708 allMatrix.
lower()[allFaceI] = -procBou[i];
741 UPstream::warnComm = oldWarn;
771 procAgglomerateMatrix
781 allInterfaceBouCoeffs(),
782 allInterfaceIntCoeffs(),
783 allPrimitiveInterfaces(),
787 matrixLevels_.set(levelI, allMatrixPtr);
788 interfaceLevelsBouCoeffs_.set(levelI, allInterfaceBouCoeffs);
789 interfaceLevelsIntCoeffs_.set(levelI, allInterfaceIntCoeffs);
790 primitiveInterfaceLevels_.set(levelI, allPrimitiveInterfaces);
791 interfaceLevels_.set(levelI, allInterfaces);