Robustness improvement on top block AMG level
This commit is contained in:
parent
f00636e865
commit
facf4bc864
1 changed files with 19 additions and 6 deletions
|
@ -212,13 +212,11 @@ void Foam::coarseBlockAMGLevel<Type>::solve
|
||||||
"topLevelCorr"
|
"topLevelCorr"
|
||||||
);
|
);
|
||||||
|
|
||||||
label maxIter = Foam::min(2*coarseningPtr_->minCoarseEqns(), 100);
|
|
||||||
|
|
||||||
// Create artificial dictionary for top-level solution
|
// Create artificial dictionary for top-level solution
|
||||||
dictionary topLevelDict;
|
dictionary topLevelDict;
|
||||||
topLevelDict.add("nDirections", "5");
|
topLevelDict.add("nDirections", "5");
|
||||||
topLevelDict.add("minIter", 1);
|
topLevelDict.add("minIter", 1);
|
||||||
topLevelDict.add("maxIter", maxIter);
|
topLevelDict.add("maxIter", 500);
|
||||||
topLevelDict.add("tolerance", tolerance);
|
topLevelDict.add("tolerance", tolerance);
|
||||||
topLevelDict.add("relTol", relTol);
|
topLevelDict.add("relTol", relTol);
|
||||||
|
|
||||||
|
@ -245,8 +243,8 @@ void Foam::coarseBlockAMGLevel<Type>::solve
|
||||||
|
|
||||||
if (matrixPtr_->symmetric())
|
if (matrixPtr_->symmetric())
|
||||||
{
|
{
|
||||||
// Note: top-level preconditioner is incorrect: FIX. HJ, 3/Oct/2017
|
// Note: must change preconditioner to C0. HJ. 10/Oct/2017
|
||||||
topLevelDict.add("preconditioner", "Cholesky");
|
topLevelDict.add("preconditioner", "ILUC0");
|
||||||
|
|
||||||
coarseSolverPerf = BlockCGSolver<Type>
|
coarseSolverPerf = BlockCGSolver<Type>
|
||||||
(
|
(
|
||||||
|
@ -268,10 +266,25 @@ void Foam::coarseBlockAMGLevel<Type>::solve
|
||||||
).solve(x, b);
|
).solve(x, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check for convergence
|
||||||
|
const scalar magInitialRes = mag(coarseSolverPerf.initialResidual());
|
||||||
|
const scalar magFinalRes = mag(coarseSolverPerf.finalResidual());
|
||||||
|
|
||||||
|
if (magFinalRes > magInitialRes && magInitialRes > SMALL)
|
||||||
|
{
|
||||||
|
if (blockLduMatrix::debug)
|
||||||
|
{
|
||||||
|
Info<< "Divergence in top AMG level" << endl;
|
||||||
|
coarseSolverPerf.print();
|
||||||
|
}
|
||||||
|
|
||||||
|
x = pTraits<Type>::zero;
|
||||||
|
}
|
||||||
|
|
||||||
// Restore debug
|
// Restore debug
|
||||||
blockLduMatrix::debug = oldDebug;
|
blockLduMatrix::debug = oldDebug;
|
||||||
|
|
||||||
if (blockLduMatrix::debug >= 3)
|
if (blockLduMatrix::debug >= 2)
|
||||||
{
|
{
|
||||||
coarseSolverPerf.print();
|
coarseSolverPerf.print();
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue