GAMG solver: Add additional controls for pre- and post-sweeps:

preSweepsLevelMultiplier
    maxPreSweeps

    postSweepsLevelMultiplier
    maxPostSweeps

which control the way in which the number of sweeps increases with level
This commit is contained in:
Henry
2012-12-26 15:54:00 +00:00
parent c130b38e22
commit e22205d3d4
3 changed files with 38 additions and 2 deletions

View File

@ -65,7 +65,11 @@ Foam::GAMGSolver::GAMGSolver
// which may be overridden by those in controlDict // which may be overridden by those in controlDict
cacheAgglomeration_(false), cacheAgglomeration_(false),
nPreSweeps_(0), nPreSweeps_(0),
preSweepsLevelMultiplier_(1),
maxPreSweeps_(10),
nPostSweeps_(2), nPostSweeps_(2),
postSweepsLevelMultiplier_(1),
maxPostSweeps_(10),
nFinestSweeps_(2), nFinestSweeps_(2),
scaleCorrection_(matrix.symmetric()), scaleCorrection_(matrix.symmetric()),
directSolveCoarsest_(false), directSolveCoarsest_(false),
@ -156,7 +160,19 @@ void Foam::GAMGSolver::readControls()
// we could also consider supplying defaults here too // we could also consider supplying defaults here too
controlDict_.readIfPresent("cacheAgglomeration", cacheAgglomeration_); controlDict_.readIfPresent("cacheAgglomeration", cacheAgglomeration_);
controlDict_.readIfPresent("nPreSweeps", nPreSweeps_); controlDict_.readIfPresent("nPreSweeps", nPreSweeps_);
controlDict_.readIfPresent
(
"preSweepsLevelMultiplier",
preSweepsLevelMultiplier_
);
controlDict_.readIfPresent("maxPreSweeps", maxPreSweeps_);
controlDict_.readIfPresent("nPostSweeps", nPostSweeps_); controlDict_.readIfPresent("nPostSweeps", nPostSweeps_);
controlDict_.readIfPresent
(
"postSweepsLevelMultiplier",
postSweepsLevelMultiplier_
);
controlDict_.readIfPresent("maxPostSweeps", maxPostSweeps_);
controlDict_.readIfPresent("nFinestSweeps", nFinestSweeps_); controlDict_.readIfPresent("nFinestSweeps", nFinestSweeps_);
controlDict_.readIfPresent("scaleCorrection", scaleCorrection_); controlDict_.readIfPresent("scaleCorrection", scaleCorrection_);
controlDict_.readIfPresent("directSolveCoarsest", directSolveCoarsest_); controlDict_.readIfPresent("directSolveCoarsest", directSolveCoarsest_);

View File

@ -79,9 +79,21 @@ class GAMGSolver
//- Number of pre-smoothing sweeps //- Number of pre-smoothing sweeps
label nPreSweeps_; label nPreSweeps_;
//- Lever multiplier for the number of pre-smoothing sweeps
label preSweepsLevelMultiplier_;
//- Maximum number of pre-smoothing sweeps
label maxPreSweeps_;
//- Number of post-smoothing sweeps //- Number of post-smoothing sweeps
label nPostSweeps_; label nPostSweeps_;
//- Lever multiplier for the number of post-smoothing sweeps
label postSweepsLevelMultiplier_;
//- Maximum number of post-smoothing sweeps
label maxPostSweeps_;
//- Number of smoothing sweeps on finest mesh //- Number of smoothing sweeps on finest mesh
label nFinestSweeps_; label nFinestSweeps_;

View File

@ -156,7 +156,11 @@ void Foam::GAMGSolver::Vcycle
coarseCorrFields[leveli], coarseCorrFields[leveli],
coarseSources[leveli], coarseSources[leveli],
cmpt, cmpt,
nPreSweeps_ + leveli min
(
nPreSweeps_ + preSweepsLevelMultiplier_*leveli,
maxPreSweeps_
)
); );
scalarField::subField ACf scalarField::subField ACf
@ -297,7 +301,11 @@ void Foam::GAMGSolver::Vcycle
coarseCorrFields[leveli], coarseCorrFields[leveli],
coarseSources[leveli], coarseSources[leveli],
cmpt, cmpt,
nPostSweeps_ + leveli min
(
nPostSweeps_ + postSweepsLevelMultiplier_*leveli,
maxPostSweeps_
)
); );
} }