Commit a762a311 authored by Kutalmis Bercin's avatar Kutalmis Bercin
Browse files

ENH: linear solvers: add variable-specific debug flags

Introduces a new optional keyword of label type 'log'
to linear-solver dictionaries to enable variable-specific
debug statements. For example, in fvOptions file:

    solvers
    {
        p
        {
            solver GAMG;
            ...
            log    2;
        }

        U
        {
            ...
            log    0;
        }
    }

The meanings of values of 'log' are:

    log    0;    <!--  no output
    log    1;    <!--  standard output
    log    2;    <!--  debug output
    // values higher than 2 are expected to have no effect

This keyword does not directly affect the operations of various
DebugSwitches and backward compatibility has been ensured in exchange
of code cleanness. The related DebugSwitches are:

    DebugSwitches
    {
        SolverPerformance    0;
        GAMG                 0;
        PCG                  0;
        PBiCG                0;
        smoothSolver         0;
    }
parent 390e7b0a
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd.
Copyright (C) 2019-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -134,6 +134,9 @@ public:
//- Minimum number of iterations in the solver
label minIter_;
//- Level of verbosity in the solver output statements
label log_;
//- Final convergence tolerance
Type tolerance_;
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd.
Copyright (C) 2019-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -131,6 +131,7 @@ Foam::LduMatrix<Type, DType, LUType>::solver::solver
maxIter_(defaultMaxIter_),
minIter_(0),
log_(1),
tolerance_(1e-6*pTraits<Type>::one),
relTol_(Zero)
{
......@@ -145,6 +146,7 @@ void Foam::LduMatrix<Type, DType, LUType>::solver::readControls()
{
readControl(controlDict_, maxIter_, "maxIter");
readControl(controlDict_, minIter_, "minIter");
readControl(controlDict_, log_, "log");
readControl(controlDict_, tolerance_, "tolerance");
readControl(controlDict_, relTol_, "relTol");
}
......
......@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -62,10 +63,11 @@ template<class Type>
bool Foam::SolverPerformance<Type>::checkConvergence
(
const Type& Tolerance,
const Type& RelTolerance
const Type& RelTolerance,
const label log
)
{
if (debug >= 2)
if ((log >= 2) || (debug >= 2))
{
Info<< solverName_
<< ": Iteration " << nIterations_
......
......@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2012-2016 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -218,7 +219,8 @@ public:
bool checkConvergence
(
const Type& tolerance,
const Type& relTolerance
const Type& relTolerance,
const label log
);
//- Singularity test
......
......@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -98,7 +99,7 @@ Foam::PBiCCCG<Type, DType, LUType>::solve
// --- Calculate normalisation factor
Type normFactor = this->normFactor(psi, wA, pA);
if (LduMatrix<Type, DType, LUType>::debug >= 2)
if ((this->log_ >= 2) || (LduMatrix<Type, DType, LUType>::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -111,7 +112,12 @@ Foam::PBiCCCG<Type, DType, LUType>::solve
if
(
this->minIter_ > 0
|| !solverPerf.checkConvergence(this->tolerance_, this->relTol_)
|| !solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
)
{
// --- Select and construct the preconditioner
......@@ -192,7 +198,12 @@ Foam::PBiCCCG<Type, DType, LUType>::solve
(
(
nIter++ < this->maxIter_
&& !solverPerf.checkConvergence(this->tolerance_, this->relTol_)
&& !solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
)
|| nIter < this->minIter_
);
......
......@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -95,7 +96,7 @@ Foam::PBiCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
// --- Calculate normalisation factor
Type normFactor = this->normFactor(psi, wA, pA);
if (LduMatrix<Type, DType, LUType>::debug >= 2)
if ((this->log_ >= 2) || (LduMatrix<Type, DType, LUType>::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -105,7 +106,15 @@ Foam::PBiCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
solverPerf.finalResidual() = solverPerf.initialResidual();
// --- Check convergence, solve if not converged
if (!solverPerf.checkConvergence(this->tolerance_, this->relTol_))
if
(
!solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
)
{
// --- Select and construct the preconditioner
autoPtr<typename LduMatrix<Type, DType, LUType>::preconditioner>
......@@ -192,7 +201,12 @@ Foam::PBiCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
} while
(
nIter++ < this->maxIter_
&& !(solverPerf.checkConvergence(this->tolerance_, this->relTol_))
&& !solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
);
}
......
......@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -86,7 +87,7 @@ Foam::PCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
// --- Calculate normalisation factor
Type normFactor = this->normFactor(psi, wA, pA);
if (LduMatrix<Type, DType, LUType>::debug >= 2)
if ((this->log_ >= 2) || (LduMatrix<Type, DType, LUType>::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -99,7 +100,12 @@ Foam::PCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
if
(
this->minIter_ > 0
|| !solverPerf.checkConvergence(this->tolerance_, this->relTol_)
|| !solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
)
{
// --- Select and construct the preconditioner
......@@ -184,7 +190,12 @@ Foam::PCICG<Type, DType, LUType>::solve(Field<Type>& psi) const
(
(
nIter++ < this->maxIter_
&& !solverPerf.checkConvergence(this->tolerance_, this->relTol_)
&& !solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
)
|| nIter < this->minIter_
);
......
......@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -110,7 +111,7 @@ Foam::SmoothSolver<Type, DType, LUType>::solve(Field<Type>& psi) const
solverPerf.finalResidual() = solverPerf.initialResidual();
}
if (LduMatrix<Type, DType, LUType>::debug >= 2)
if ((this->log_ >= 2) || (LduMatrix<Type, DType, LUType>::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -120,7 +121,12 @@ Foam::SmoothSolver<Type, DType, LUType>::solve(Field<Type>& psi) const
if
(
this->minIter_ > 0
|| !solverPerf.checkConvergence(this->tolerance_, this->relTol_)
|| !solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
)
{
autoPtr<typename LduMatrix<Type, DType, LUType>::smoother>
......@@ -150,7 +156,12 @@ Foam::SmoothSolver<Type, DType, LUType>::solve(Field<Type>& psi) const
(
(
(nIter += nSweeps_) < this->maxIter_
&& !solverPerf.checkConvergence(this->tolerance_, this->relTol_)
&& !solverPerf.checkConvergence
(
this->tolerance_,
this->relTol_,
this->log_
)
)
|| nIter < this->minIter_
);
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2016-2019 OpenCFD Ltd.
Copyright (C) 2016-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -119,6 +119,9 @@ public:
//- Minimum number of iterations in the solver
label minIter_;
//- Level of verbosity in the solver output statements
label log_;
//- Final convergence tolerance
scalar tolerance_;
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2016-2020 OpenCFD Ltd.
Copyright (C) 2016-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -164,6 +164,7 @@ void Foam::lduMatrix::solver::readControls()
{
maxIter_ = controlDict_.getOrDefault<label>("maxIter", defaultMaxIter_);
minIter_ = controlDict_.getOrDefault<label>("minIter", 0);
log_ = controlDict_.getOrDefault<label>("log", 1);
tolerance_ = controlDict_.getOrDefault<scalar>("tolerance", 1e-6);
relTol_ = controlDict_.getOrDefault<scalar>("relTol", 0);
}
......
......@@ -6,6 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -208,8 +209,7 @@ Foam::GAMGSolver::GAMGSolver
}
}
if (debug & 2)
if ((log_ >= 2) || (debug & 2))
{
for
(
......@@ -368,7 +368,7 @@ void Foam::GAMGSolver::readControls()
controlDict_.readIfPresent("scaleCorrection", scaleCorrection_);
controlDict_.readIfPresent("directSolveCoarsest", directSolveCoarsest_);
if (debug)
if ((log_ >= 2) || debug)
{
Info<< "GAMGSolver settings :"
<< " cacheAgglomeration:" << cacheAgglomeration_
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2016-2019 OpenCFD Ltd.
Copyright (C) 2016-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -59,7 +59,7 @@ Foam::solverPerformance Foam::GAMGSolver::solve
solveScalar normFactor =
this->normFactor(psi, tsource(), Apsi, finestCorrection);
if (debug >= 2)
if ((log_ >= 2) || (debug >= 2))
{
Pout<< " Normalisation factor = " << normFactor << endl;
}
......@@ -87,7 +87,7 @@ Foam::solverPerformance Foam::GAMGSolver::solve
if
(
minIter_ > 0
|| !solverPerf.checkConvergence(tolerance_, relTol_)
|| !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
{
// Create coarse grid correction fields
......@@ -144,7 +144,7 @@ Foam::solverPerformance Foam::GAMGSolver::solve
matrix().mesh().comm()
)/normFactor;
if (debug >= 2)
if ((log_ >= 2) || (debug >= 2))
{
solverPerf.print(Info.masterStream(matrix().mesh().comm()));
}
......@@ -152,7 +152,7 @@ Foam::solverPerformance Foam::GAMGSolver::solve
(
(
++solverPerf.nIterations() < maxIter_
&& !solverPerf.checkConvergence(tolerance_, relTol_)
&& !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
|| solverPerf.nIterations() < minIter_
);
......@@ -193,7 +193,7 @@ void Foam::GAMGSolver::Vcycle
// Restrict finest grid residual for the next level up.
agglomeration_.restrictField(coarseSources[0], finestResidual, 0, true);
if (debug >= 2 && nPreSweeps_)
if (nPreSweeps_ && ((log_ >= 2) || (debug >= 2)))
{
Pout<< "Pre-smoothing scaling factors: ";
}
......@@ -274,7 +274,7 @@ void Foam::GAMGSolver::Vcycle
}
}
if (debug >= 2 && nPreSweeps_)
if (nPreSweeps_ && ((log_ >= 2) || (debug >= 2)))
{
Pout<< endl;
}
......@@ -290,7 +290,7 @@ void Foam::GAMGSolver::Vcycle
);
}
if (debug >= 2)
if ((log_ >= 2) || (debug >= 2))
{
Pout<< "Post-smoothing scaling factors: ";
}
......@@ -703,7 +703,7 @@ void Foam::GAMGSolver::solveCoarsestLevel
)
);
if (debug)
if ((log_ >= 2) || debug)
{
coarseSolverPerf.print(Info.masterStream(coarseComm));
}
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd.
Copyright (C) 2019-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -111,7 +111,7 @@ Foam::solverPerformance Foam::PBiCG::solve
// --- Calculate normalisation factor
const solveScalar normFactor = this->normFactor(psi, tsource(), wA, pA);
if (lduMatrix::debug >= 2)
if ((log_ >= 2) || (lduMatrix::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -126,7 +126,7 @@ Foam::solverPerformance Foam::PBiCG::solve
if
(
minIter_ > 0
|| !solverPerf.checkConvergence(tolerance_, relTol_)
|| !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
{
solveScalarField pT(nCells, 0);
......@@ -217,7 +217,7 @@ Foam::solverPerformance Foam::PBiCG::solve
(
(
++solverPerf.nIterations() < maxIter_
&& !solverPerf.checkConvergence(tolerance_, relTol_)
&& !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
|| solverPerf.nIterations() < minIter_
);
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2016-2017 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd.
Copyright (C) 2019-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -110,7 +110,7 @@ Foam::solverPerformance Foam::PBiCGStab::scalarSolve
// --- Calculate normalisation factor
const solveScalar normFactor = this->normFactor(psi, source, yA, pA);
if (lduMatrix::debug >= 2)
if ((log_ >= 2) || (lduMatrix::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -125,7 +125,7 @@ Foam::solverPerformance Foam::PBiCGStab::scalarSolve
if
(
minIter_ > 0
|| !solverPerf.checkConvergence(tolerance_, relTol_)
|| !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
{
solveScalarField AyA(nCells);
......@@ -219,7 +219,7 @@ Foam::solverPerformance Foam::PBiCGStab::scalarSolve
if
(
solverPerf.nIterations() >= minIter_
&& solverPerf.checkConvergence(tolerance_, relTol_)
&& solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
{
for (label cell=0; cell<nCells; cell++)
......@@ -258,7 +258,7 @@ Foam::solverPerformance Foam::PBiCGStab::scalarSolve
(
(
++solverPerf.nIterations() < maxIter_
&& !solverPerf.checkConvergence(tolerance_, relTol_)
&& !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
|| solverPerf.nIterations() < minIter_
);
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2019 OpenCFD Ltd.
Copyright (C) 2019-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -110,7 +110,7 @@ Foam::solverPerformance Foam::PCG::scalarSolve
// --- Calculate normalisation factor
solveScalar normFactor = this->normFactor(psi, source, wA, pA);
if (lduMatrix::debug >= 2)
if ((log_ >= 2) || (lduMatrix::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -125,7 +125,7 @@ Foam::solverPerformance Foam::PCG::scalarSolve
if
(
minIter_ > 0
|| !solverPerf.checkConvergence(tolerance_, relTol_)
|| !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
{
// --- Select and construct the preconditioner
......@@ -193,7 +193,7 @@ Foam::solverPerformance Foam::PCG::scalarSolve
(
(
++solverPerf.nIterations() < maxIter_
&& !solverPerf.checkConvergence(tolerance_, relTol_)
&& !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
|| solverPerf.nIterations() < minIter_
);
......
......@@ -107,7 +107,7 @@ Foam::solverPerformance Foam::PPCG::scalarSolveCG
solveScalarField p(nCells);
const solveScalar normFactor = this->normFactor(psi, source, w, p);
if (lduMatrix::debug >= 2)
if ((log_ >= 2) || (lduMatrix::debug >= 2))
{
Info<< " Normalisation factor = " << normFactor << endl;
}
......@@ -190,7 +190,7 @@ Foam::solverPerformance Foam::PPCG::scalarSolveCG
if
(
(minIter_ <= 0 || solverPerf.nIterations() >= minIter_)
&& solverPerf.checkConvergence(tolerance_, relTol_)
&& solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
{
break;
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2014 OpenFOAM Foundation
Copyright (C) 2016-2020 OpenCFD Ltd.
Copyright (C) 2016-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -149,7 +149,7 @@ Foam::solverPerformance Foam::smoothSolver::solve
solverPerf.finalResidual() = solverPerf.initialResidual();
}
if (lduMatrix::debug >= 2)
if ((log_ >= 2) || (lduMatrix::debug >= 2))
{
Info.masterStream(matrix().mesh().comm())
<< " Normalisation factor = " << normFactor << endl;
......@@ -160,7 +160,7 @@ Foam::solverPerformance Foam::smoothSolver::solve
if
(
minIter_ > 0
|| !solverPerf.checkConvergence(tolerance_, relTol_)
|| !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
{
addProfiling(solve, "lduMatrix::smoother." + fieldName_);
......@@ -203,7 +203,7 @@ Foam::solverPerformance Foam::smoothSolver::solve
(
(
(solverPerf.nIterations() += nSweeps_) < maxIter_
&& !solverPerf.checkConvergence(tolerance_, relTol_)
&& !solverPerf.checkConvergence(tolerance_, relTol_, log_)
)
|| solverPerf.nIterations() < minIter_
);
......
......@@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2016-2020 OpenCFD Ltd.
Copyright (C) 2016-2021 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -216,7 +216,14 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveSegregated
solverControls
)->solve(psiCmpt, sourceCmpt, cmpt);
if (SolverPerformance<Type>::debug)
const label log =
solverControls.getOrDefault<label>
(
"log",
SolverPerformance<Type>::debug
);
if (log)
{
solverPerf.print(Info.masterStream(this->mesh().comm()));
}
......@@ -283,7 +290,14 @@ Foam::SolverPerformance<Type> Foam::fvMatrix<Type>::solveCoupled
coupledMatrixSolver->solve(psi)
);
if (SolverPerformance<Type>::debug)
const label log =