40 lduMatrix::solver::addsymMatrixConstructorToTable<GAMGSolver>
43 lduMatrix::solver::addasymMatrixConstructorToTable<GAMGSolver>
52 const word& fieldName,
72 cacheAgglomeration_(
true),
74 preSweepsLevelMultiplier_(1),
77 postSweepsLevelMultiplier_(1),
80 interpolateCorrection_(
false),
82 directSolveCoarsest_(
false),
85 matrixLevels_(agglomeration_.size()),
86 primitiveInterfaceLevels_(agglomeration_.size()),
87 interfaceLevels_(agglomeration_.size()),
88 interfaceLevelsBouCoeffs_(agglomeration_.size()),
89 interfaceLevelsIntCoeffs_(agglomeration_.size())
93 if (agglomeration_.processorAgglomerate())
95 forAll(agglomeration_, fineLevelIndex)
97 if (agglomeration_.hasMeshLevel(fineLevelIndex))
101 (fineLevelIndex+1) < agglomeration_.size()
102 && agglomeration_.hasProcMesh(fineLevelIndex+1)
112 agglomeration_.interfaceLevel(fineLevelIndex);
116 fineMeshInterfaces.
size()
120 dummyPrimMeshInterfaces.size()
122 forAll(fineMeshInterfaces, intI)
124 if (fineMeshInterfaces.
set(intI))
127 refCast<const GAMGInterface>
129 fineMeshInterfaces[intI]
133 dummyPrimMeshInterfaces.set
138 fineMeshInterfaces[intI].
type(),
147 forAll(dummyPrimMeshInterfaces, intI)
149 if (dummyPrimMeshInterfaces.set(intI))
151 dummyMeshInterfaces.set
154 &dummyPrimMeshInterfaces[intI]
165 agglomeration_.meshLevel(fineLevelIndex),
171 agglomeration_.procAgglomMap(fineLevelIndex+1);
173 agglomeration_.agglomProcIDs(fineLevelIndex+1);
175 procAgglomerateMatrix
187 agglomeration_.meshLevel(fineLevelIndex + 1),
188 agglomeration_.interfaceLevel(fineLevelIndex + 1)
200 forAll(agglomeration_, fineLevelIndex)
206 agglomeration_.meshLevel(fineLevelIndex + 1),
207 agglomeration_.interfaceLevel(fineLevelIndex + 1)
212 if ((log_ >= 2) || (
debug & 2))
216 label fineLevelIndex = 0;
217 fineLevelIndex <= matrixLevels_.size();
221 if (fineLevelIndex == 0 || matrixLevels_.set(fineLevelIndex-1))
223 const lduMatrix& matrix = matrixLevel(fineLevelIndex);
225 interfaceLevel(fineLevelIndex);
227 Pout<<
"level:" << fineLevelIndex <<
nl
228 <<
" nCells:" << matrix.
diag().size() <<
nl
229 <<
" nFaces:" << matrix.
lower().size() <<
nl
230 <<
" nInterfaces:" << interfaces.
size()
235 if (interfaces.
set(i))
238 <<
"\ttype:" << interfaces[i].type()
245 Pout<<
"level:" << fineLevelIndex <<
" : no matrix" <<
endl;
252 if (matrixLevels_.size())
254 const label coarsestLevel = matrixLevels_.size() - 1;
256 if (matrixLevels_.set(coarsestLevel))
258 if (directSolveCoarsest_)
260 coarsestLUMatrixPtr_.reset
264 matrixLevels_[coarsestLevel],
265 interfaceLevelsBouCoeffs_[coarsestLevel],
266 interfaceLevels_[coarsestLevel]
272 entry* coarseEntry = controlDict_.findEntry
275 keyType::LITERAL_RECURSIVE
277 if (coarseEntry && coarseEntry->
isDict())
282 matrixLevels_[coarsestLevel],
283 interfaceLevelsBouCoeffs_[coarsestLevel],
284 interfaceLevelsIntCoeffs_[coarsestLevel],
285 interfaceLevels_[coarsestLevel],
289 else if (matrixLevels_[coarsestLevel].asymmetric())
291 coarsestSolverPtr_.reset
296 matrixLevels_[coarsestLevel],
297 interfaceLevelsBouCoeffs_[coarsestLevel],
298 interfaceLevelsIntCoeffs_[coarsestLevel],
299 interfaceLevels_[coarsestLevel],
300 PBiCGStabSolverDict(tolerance_, relTol_)
306 coarsestSolverPtr_.reset
311 matrixLevels_[coarsestLevel],
312 interfaceLevelsBouCoeffs_[coarsestLevel],
313 interfaceLevelsIntCoeffs_[coarsestLevel],
314 interfaceLevels_[coarsestLevel],
315 PCGsolverDict(tolerance_, relTol_)
325 <<
"No coarse levels created, either matrix too small for GAMG"
326 " or nCellsInCoarsestLevel too large.\n"
327 " Either choose another solver of reduce "
328 "nCellsInCoarsestLevel."
338 if (!cacheAgglomeration_)
340 delete &agglomeration_;
347 void Foam::GAMGSolver::readControls()
351 controlDict_.readIfPresent(
"cacheAgglomeration", cacheAgglomeration_);
352 controlDict_.readIfPresent(
"nPreSweeps", nPreSweeps_);
353 controlDict_.readIfPresent
355 "preSweepsLevelMultiplier",
356 preSweepsLevelMultiplier_
358 controlDict_.readIfPresent(
"maxPreSweeps", maxPreSweeps_);
359 controlDict_.readIfPresent(
"nPostSweeps", nPostSweeps_);
360 controlDict_.readIfPresent
362 "postSweepsLevelMultiplier",
363 postSweepsLevelMultiplier_
365 controlDict_.readIfPresent(
"maxPostSweeps", maxPostSweeps_);
366 controlDict_.readIfPresent(
"nFinestSweeps", nFinestSweeps_);
367 controlDict_.readIfPresent(
"interpolateCorrection", interpolateCorrection_);
368 controlDict_.readIfPresent(
"scaleCorrection", scaleCorrection_);
369 controlDict_.readIfPresent(
"directSolveCoarsest", directSolveCoarsest_);
371 if ((log_ >= 2) ||
debug)
373 Info<<
"GAMGSolver settings :"
374 <<
" cacheAgglomeration:" << cacheAgglomeration_
375 <<
" nPreSweeps:" << nPreSweeps_
376 <<
" preSweepsLevelMultiplier:" << preSweepsLevelMultiplier_
377 <<
" maxPreSweeps:" << maxPreSweeps_
378 <<
" nPostSweeps:" << nPostSweeps_
379 <<
" postSweepsLevelMultiplier:" << postSweepsLevelMultiplier_
380 <<
" maxPostSweeps:" << maxPostSweeps_
381 <<
" nFinestSweeps:" << nFinestSweeps_
382 <<
" interpolateCorrection:" << interpolateCorrection_
383 <<
" scaleCorrection:" << scaleCorrection_
384 <<
" directSolveCoarsest:" << directSolveCoarsest_
390 const Foam::lduMatrix& Foam::GAMGSolver::matrixLevel(
const label i)
const
398 return matrixLevels_[i - 1];
414 return interfaceLevels_[i - 1];
420 Foam::GAMGSolver::interfaceBouCoeffsLevel
427 return interfaceBouCoeffs_;
431 return interfaceLevelsBouCoeffs_[i - 1];
437 Foam::GAMGSolver::interfaceIntCoeffsLevel
444 return interfaceIntCoeffs_;
448 return interfaceLevelsIntCoeffs_[i - 1];