diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C index 08414687e0127bc23e57e45312be9e292e48a871..5a1edb952f204fa1ca4a20c5f7ec87d25629cc10 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.C @@ -27,6 +27,8 @@ License #include "GAMGSolver.H" #include "GAMGInterface.H" +#include "PCG.H" +#include "PBiCGStab.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -249,11 +251,11 @@ Foam::GAMGSolver::GAMGSolver if (matrixLevels_.size()) { - if (directSolveCoarsest_) - { - const label coarsestLevel = matrixLevels_.size() - 1; + const label coarsestLevel = matrixLevels_.size() - 1; - if (matrixLevels_.set(coarsestLevel)) + if (matrixLevels_.set(coarsestLevel)) + { + if (directSolveCoarsest_) { coarsestLUMatrixPtr_.reset ( @@ -265,6 +267,56 @@ Foam::GAMGSolver::GAMGSolver ) ); } + else + { + entry* coarseEntry = controlDict_.findEntry + ( + "coarsestLevelCorr", + keyType::LITERAL_RECURSIVE + ); + if (coarseEntry && coarseEntry->isDict()) + { + coarsestSolverPtr_ = lduMatrix::solver::New + ( + "coarsestLevelCorr", + matrixLevels_[coarsestLevel], + interfaceLevelsBouCoeffs_[coarsestLevel], + interfaceLevelsIntCoeffs_[coarsestLevel], + interfaceLevels_[coarsestLevel], + coarseEntry->dict() + ); + } + else if (matrixLevels_[coarsestLevel].asymmetric()) + { + coarsestSolverPtr_.set + ( + new PBiCGStab + ( + "coarsestLevelCorr", + matrixLevels_[coarsestLevel], + interfaceLevelsBouCoeffs_[coarsestLevel], + interfaceLevelsIntCoeffs_[coarsestLevel], + interfaceLevels_[coarsestLevel], + PBiCGStabSolverDict(tolerance_, relTol_) + ) + ); + } + else + { + coarsestSolverPtr_.set + ( + new PCG + ( + "coarsestLevelCorr", + matrixLevels_[coarsestLevel], + interfaceLevelsBouCoeffs_[coarsestLevel], + interfaceLevelsIntCoeffs_[coarsestLevel], + interfaceLevels_[coarsestLevel], + PCGsolverDict(tolerance_, relTol_) + ) + ); + } + } } } else diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H index 3736926650aa077a59494f1a9334848ff15a29cc..19ca1d0f4d8c61947845764caef82c97e8c5333f 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolver.H @@ -135,6 +135,9 @@ class GAMGSolver //- LU decomposed coarsest matrix autoPtr<LUscalarMatrix> coarsestLUMatrixPtr_; + //- Sparse coarsest matrix solver + autoPtr<lduMatrix::solver> coarsestSolverPtr_; + // Private Member Functions diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C index 25fc7a8481497e81c3a05630034bff17596b427d..644de4eef9a94fad2f978991fb83af796d83e03b 100644 --- a/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C +++ b/src/OpenFOAM/matrices/lduMatrix/solvers/GAMG/GAMGSolverSolve.C @@ -26,8 +26,6 @@ License \*---------------------------------------------------------------------------*/ #include "GAMGSolver.H" -#include "PCG.H" -#include "PBiCGStab.H" #include "SubField.H" #include "PrecisionAdaptor.H" @@ -695,42 +693,16 @@ void Foam::GAMGSolver::solveCoarsestLevel else { coarsestCorrField = 0; - solverPerformance coarseSolverPerf; - - if (matrixLevels_[coarsestLevel].asymmetric()) - { - coarseSolverPerf = PBiCGStab - ( - "coarsestLevelCorr", - matrixLevels_[coarsestLevel], - interfaceLevelsBouCoeffs_[coarsestLevel], - interfaceLevelsIntCoeffs_[coarsestLevel], - interfaceLevels_[coarsestLevel], - PBiCGStabSolverDict(tolerance_, relTol_) - ).scalarSolve - ( - coarsestCorrField, - coarsestSource - ); - } - else - { - coarseSolverPerf = PCG - ( - "coarsestLevelCorr", - matrixLevels_[coarsestLevel], - interfaceLevelsBouCoeffs_[coarsestLevel], - interfaceLevelsIntCoeffs_[coarsestLevel], - interfaceLevels_[coarsestLevel], - PCGsolverDict(tolerance_, relTol_) - ).scalarSolve + const solverPerformance coarseSolverPerf + ( + coarsestSolverPtr_->solve ( coarsestCorrField, coarsestSource - ); - } + ) + ); - if (debug >= 2) + if (debug) { coarseSolverPerf.print(Info.masterStream(coarseComm)); } diff --git a/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/fvSolution b/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/fvSolution index c94598b2732c0ecf9b21355402caa66bb96a19a4..a3f28e6951b7f1c5cc10abe1c68687565c121d28 100644 --- a/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/fvSolution +++ b/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/fvSolution @@ -33,6 +33,15 @@ solvers { $p; relTol 0; + + // Explicit specify solver for coarse-level correction to override + // solution tolerance + coarsestLevelCorr + { + solver PCG; + preconditioner DIC; + relTol 0.05; + } } "(U|k|B|nuTilda)"