From e22205d3d4b86b4108f26b33e617303ea54fcb6b Mon Sep 17 00:00:00 2001
From: Henry <Henry>
Date: Wed, 26 Dec 2012 15:54:00 +0000
Subject: [PATCH] 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
---
 .../matrices/lduMatrix/solvers/GAMG/GAMGSolver.C | 16 ++++++++++++++++
 .../matrices/lduMatrix/solvers/GAMG/GAMGSolver.H | 12 ++++++++++++
 .../lduMatrix/solvers/GAMG/GAMGSolverSolve.C     | 12 ++++++++++--
 3 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C
index 4d2ec30de2f..a8b348e6459 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C
@@ -65,7 +65,11 @@ Foam::GAMGSolver::GAMGSolver
     // which may be overridden by those in controlDict
     cacheAgglomeration_(false),
     nPreSweeps_(0),
+    preSweepsLevelMultiplier_(1),
+    maxPreSweeps_(10),
     nPostSweeps_(2),
+    postSweepsLevelMultiplier_(1),
+    maxPostSweeps_(10),
     nFinestSweeps_(2),
     scaleCorrection_(matrix.symmetric()),
     directSolveCoarsest_(false),
@@ -156,7 +160,19 @@ void Foam::GAMGSolver::readControls()
     // we could also consider supplying defaults here too
     controlDict_.readIfPresent("cacheAgglomeration", cacheAgglomeration_);
     controlDict_.readIfPresent("nPreSweeps", nPreSweeps_);
+    controlDict_.readIfPresent
+    (
+        "preSweepsLevelMultiplier",
+        preSweepsLevelMultiplier_
+    );
+    controlDict_.readIfPresent("maxPreSweeps", maxPreSweeps_);
     controlDict_.readIfPresent("nPostSweeps", nPostSweeps_);
+    controlDict_.readIfPresent
+    (
+        "postSweepsLevelMultiplier",
+        postSweepsLevelMultiplier_
+    );
+    controlDict_.readIfPresent("maxPostSweeps", maxPostSweeps_);
     controlDict_.readIfPresent("nFinestSweeps", nFinestSweeps_);
     controlDict_.readIfPresent("scaleCorrection", scaleCorrection_);
     controlDict_.readIfPresent("directSolveCoarsest", directSolveCoarsest_);
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H
index 273d2c75b21..c2aefbea16a 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H
@@ -79,9 +79,21 @@ class GAMGSolver
         //- Number of pre-smoothing sweeps
         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
         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
         label nFinestSweeps_;
 
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C
index 248c421f2e3..25c8e6dbe56 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C
@@ -156,7 +156,11 @@ void Foam::GAMGSolver::Vcycle
                 coarseCorrFields[leveli],
                 coarseSources[leveli],
                 cmpt,
-                nPreSweeps_ + leveli
+                min
+                (
+                    nPreSweeps_ +  preSweepsLevelMultiplier_*leveli,
+                    maxPreSweeps_
+                )
             );
 
             scalarField::subField ACf
@@ -297,7 +301,11 @@ void Foam::GAMGSolver::Vcycle
             coarseCorrFields[leveli],
             coarseSources[leveli],
             cmpt,
-            nPostSweeps_ + leveli
+            min
+            (
+                nPostSweeps_ + postSweepsLevelMultiplier_*leveli,
+                maxPostSweeps_
+            )
         );
     }
 
-- 
GitLab