move LinearSolver parameters to TypeTag-free parameter system

This commit is contained in:
Arne Morten Kvarving 2024-07-05 17:49:51 +02:00
parent 0a40ed2950
commit 62a180447c
11 changed files with 64 additions and 171 deletions

View File

@ -171,20 +171,6 @@ struct Initialpressure<TypeTag, Properties::TTag::CO2PTBaseProblem>
static constexpr type value = 75.e5;
};
template <class TypeTag>
struct LinearSolverAbsTolerance<TypeTag, Properties::TTag::CO2PTBaseProblem>
{
using type = GetPropType<TypeTag, Properties::Scalar>;
static constexpr type value = 0.;
};
template <class TypeTag>
struct LinearSolverTolerance<TypeTag, Properties::TTag::CO2PTBaseProblem>
{
using type = GetPropType<TypeTag, Properties::Scalar>;
static constexpr type value = 1e-3;
};
template <class TypeTag>
struct SimulationName<TypeTag, Properties::TTag::CO2PTBaseProblem>
{ static constexpr auto value = "co2_ptflash"; };
@ -339,6 +325,9 @@ public:
Parameters::SetDefault<Parameters::VtkWriteTotalMoleFractions>(true);
Parameters::SetDefault<Parameters::VtkWriteEquilibriumConstants>(true);
Parameters::SetDefault<Parameters::VtkWriteLiquidMoleFractions>(true);
Parameters::SetDefault<Parameters::LinearSolverAbsTolerance<Scalar>>(0.0);
Parameters::SetDefault<Parameters::LinearSolverTolerance<Scalar>>(1e-3);
}
/*!

View File

@ -45,6 +45,8 @@
#include <opm/material/thermal/ConstantSolidHeatCapLaw.hpp>
#include <opm/material/thermal/SomertonThermalConductionLaw.hpp>
#include <opm/models/common/multiphasebaseparameters.hh>
#include <opm/models/discretization/common/fvbasefdlocallinearizer.hh>
#include <opm/models/pvs/pvsproperties.hh>
@ -133,14 +135,6 @@ struct PreconditionerWrapper<TypeTag, TTag::WaterAirBaseProblem>
} // namespace Opm::Properties
namespace Opm::Parameters {
template<class TypeTag>
struct PreconditionerOrder<TypeTag, Properties::TTag::WaterAirBaseProblem>
{ static constexpr int value = 2; };
} // namespace Opm::Parameters
namespace Opm {
/*!
* \ingroup TestProblems
@ -298,6 +292,7 @@ public:
Parameters::SetDefault<Parameters::EndTime<Scalar>>(1.0 * 365 * 24 * 60 * 60);
Parameters::SetDefault<Parameters::InitialTimeStepSize<Scalar>>(250.0);
Parameters::SetDefault<Parameters::EnableGravity>(true);
Parameters::SetDefault<Parameters::PreconditionerOrder>(2);
}
/*!

View File

@ -282,29 +282,6 @@ struct DiscreteFunction<TypeTag, TTag::FvBaseDiscretization>
} // namespace Opm::Properties
namespace Opm::Parameters {
// use default initialization based on rule-of-thumb of Newton tolerance
template<class TypeTag>
struct LinearSolverAbsTolerance<TypeTag, Properties::TTag::FvBaseDiscretization>
{
using type = GetPropType<TypeTag, Properties::Scalar>;
static constexpr type value = -1.;
};
// if the deflection of the newton method is large, we do not need to solve the linear
// approximation accurately. Assuming that the value for the current solution is quite
// close to the final value, a reduction of 3 orders of magnitude in the defect should be
// sufficient...
template<class TypeTag>
struct LinearSolverTolerance<TypeTag, Properties::TTag::FvBaseDiscretization>
{
using type = GetPropType<TypeTag, Properties::Scalar>;
static constexpr type value = 1e-3;
};
} // namespace Opm::Parameters
namespace Opm {
/*!

View File

@ -75,16 +75,16 @@ namespace Linear {
\
static void registerParameters() \
{ \
Parameters::registerParam<TypeTag, Parameters::PreconditionerOrder> \
Parameters::Register<Parameters::PreconditionerOrder> \
("The order of the preconditioner"); \
Parameters::registerParam<TypeTag, Parameters::PreconditionerRelaxation> \
Parameters::Register<Parameters::PreconditionerRelaxation<Scalar>> \
("The relaxation factor of the preconditioner"); \
} \
\
void prepare(IstlMatrix& matrix) \
{ \
int order = Parameters::get<TypeTag, Parameters::PreconditionerOrder>(); \
Scalar relaxationFactor = Parameters::get<TypeTag, Parameters::PreconditionerRelaxation>(); \
int order = Parameters::Get<Parameters::PreconditionerOrder>(); \
Scalar relaxationFactor = Parameters::Get<Parameters::PreconditionerRelaxation<Scalar>>(); \
seqPreCond_ = new SequentialPreconditioner(matrix, order, \
relaxationFactor); \
} \
@ -118,14 +118,14 @@ namespace Linear {
\
static void registerParameters() \
{ \
Parameters::registerParam<TypeTag, Parameters::PreconditionerRelaxation> \
Parameters::Register<Parameters::PreconditionerRelaxation<Scalar>> \
("The relaxation factor of the preconditioner"); \
} \
\
void prepare(OverlappingMatrix& matrix) \
{ \
Scalar relaxationFactor = \
Parameters::get<TypeTag, Parameters::PreconditionerRelaxation>(); \
Parameters::Get<Parameters::PreconditionerRelaxation<Scalar>>();\
seqPreCond_ = new SequentialPreconditioner(matrix, \
relaxationFactor); \
} \
@ -155,7 +155,7 @@ class PreconditionerWrapperILU
using OverlappingMatrix = GetPropType<TypeTag, Properties::OverlappingMatrix>;
using OverlappingVector = GetPropType<TypeTag, Properties::OverlappingVector>;
static constexpr int order = getPropValue<TypeTag, Parameters::PreconditionerOrder>();
static constexpr int order = 0;
public:
using SequentialPreconditioner = Dune::SeqILU<OverlappingMatrix, OverlappingVector, OverlappingVector, order>;
@ -165,13 +165,15 @@ public:
static void registerParameters()
{
Parameters::registerParam<TypeTag, Parameters::PreconditionerRelaxation>
Parameters::Register<Parameters::PreconditionerRelaxation<Scalar>>
("The relaxation factor of the preconditioner");
Parameters::Register<Parameters::PreconditionerOrder>
("The order of the preconditioner");
}
void prepare(OverlappingMatrix& matrix)
{
Scalar relaxationFactor = Parameters::get<TypeTag, Parameters::PreconditionerRelaxation>();
Scalar relaxationFactor = Parameters::Get<Parameters::PreconditionerRelaxation<Scalar>>();
// create the sequential preconditioner.
seqPreCond_ = new SequentialPreconditioner(matrix, relaxationFactor);

View File

@ -79,12 +79,12 @@ namespace Opm::Linear {
ScalarProduct& parScalarProduct, \
Preconditioner& parPreCond) \
{ \
Scalar tolerance = Parameters::get<TypeTag, Parameters::LinearSolverTolerance>(); \
int maxIter = Parameters::get<TypeTag, Parameters::LinearSolverMaxIterations>(); \
Scalar tolerance = Parameters::Get<Parameters::LinearSolverTolerance<Scalar>>(); \
int maxIter = Parameters::Get<Parameters::LinearSolverMaxIterations>();\
\
int verbosity = 0; \
if (parOperator.overlap().myRank() == 0) \
verbosity = Parameters::get<TypeTag, Parameters::LinearSolverVerbosity>(); \
verbosity = Parameters::Get<Parameters::LinearSolverVerbosity>(); \
solver_ = std::make_shared<RawSolver>(parOperator, parScalarProduct, \
parPreCond, tolerance, maxIter, \
verbosity); \
@ -125,7 +125,7 @@ public:
static void registerParameters()
{
Parameters::registerParam<TypeTag, Parameters::GMResRestart>
Parameters::Register<Parameters::GMResRestart>
("Number of iterations after which the GMRES linear solver is restarted");
}
@ -134,13 +134,13 @@ public:
ScalarProduct& parScalarProduct,
Preconditioner& parPreCond)
{
Scalar tolerance = Parameters::get<TypeTag, Parameters::LinearSolverTolerance>();
int maxIter = Parameters::get<TypeTag, Parameters::LinearSolverMaxIterations>();
Scalar tolerance = Parameters::Get<Parameters::LinearSolverTolerance<Scalar>>();
int maxIter = Parameters::Get<Parameters::LinearSolverMaxIterations>();
int verbosity = 0;
if (parOperator.overlap().myRank() == 0)
verbosity = Parameters::get<TypeTag, Parameters::LinearSolverVerbosity>();
int restartAfter = Parameters::get<TypeTag, Parameters::GMResRestart>();
verbosity = Parameters::Get<Parameters::LinearSolverVerbosity>();
int restartAfter = Parameters::Get<Parameters::GMResRestart>();
solver_ = std::make_shared<RawSolver>(parOperator,
parScalarProduct,
parPreCond,

View File

@ -29,29 +29,22 @@
#ifndef EWOMS_LINALG_PARAMETERS_HH
#define EWOMS_LINALG_PARAMETERS_HH
#include <opm/models/utils/parametersystem.hh>
namespace Opm::Parameters {
template<class TypeTag, class MyTypeTag>
struct AmgCoarsenTarget { using type = Properties::UndefinedProperty; };
//! number of iterations between solver restarts for the GMRES solver
template<class TypeTag, class MyTypeTag>
struct GMResRestart { using type = Properties::UndefinedProperty; };
struct GMResRestart { static constexpr int value = 10; };
/*!
* \brief Maximum accepted error of the norm of the residual.
*/
template<class TypeTag, class MyTypeTag>
struct LinearSolverAbsTolerance { using type = Properties::UndefinedProperty; };
template<class Scalar>
struct LinearSolverAbsTolerance { static constexpr Scalar value = -1.0; };
template<class TypeTag, class MyTypeTag>
struct LinearSolverMaxError { using type = Properties::UndefinedProperty; };
template<class Scalar>
struct LinearSolverMaxError { static constexpr Scalar value = 1e7; };
//! Maximum number of iterations eyecuted by the linear solver
template<class TypeTag, class MyTypeTag>
struct LinearSolverMaxIterations { using type = Properties::UndefinedProperty; };
struct LinearSolverMaxIterations { static constexpr int value = 1000; };
/*!
* \brief The size of the algebraic overlap of the linear solver.
@ -60,14 +53,13 @@ struct LinearSolverMaxIterations { using type = Properties::UndefinedProperty; }
* of a grid, but it is only existant for the linear system of
* equations.
*/
template<class TypeTag, class MyTypeTag>
struct LinearSolverOverlapSize { using type = Properties::UndefinedProperty; };
struct LinearSolverOverlapSize { static constexpr unsigned value = 2; };
/*!
* \brief Maximum accepted error of the solution of the linear solver.
*/
template<class TypeTag, class MyTypeTag>
struct LinearSolverTolerance { using type = Properties::UndefinedProperty; };
template<class Scalar>
struct LinearSolverTolerance { static constexpr Scalar value = 1e-3; };
/*!
* \brief Specifies the verbosity of the linear solver
@ -76,16 +68,14 @@ struct LinearSolverTolerance { using type = Properties::UndefinedProperty; };
* property to 1 prints aggregated convergence rates, 2 prints the
* convergence rate of every iteration of the scheme.
*/
template<class TypeTag, class MyTypeTag>
struct LinearSolverVerbosity { using type = Properties::UndefinedProperty; };
struct LinearSolverVerbosity { static constexpr int value = 0; };
//! The order of the sequential preconditioner
template<class TypeTag, class MyTypeTag>
struct PreconditionerOrder { using type = Properties::UndefinedProperty; };
struct PreconditionerOrder { static constexpr int value = 0; };
//! The relaxation factor of the preconditioner
template<class TypeTag, class MyTypeTag>
struct PreconditionerRelaxation { using type = Properties::UndefinedProperty; };
template<class Scalar>
struct PreconditionerRelaxation { static constexpr Scalar value = 1.0; };
} // namespace Opm::Parameters

View File

@ -69,16 +69,7 @@ namespace Opm::Parameters {
//! The target number of DOFs per processor for the parallel algebraic
//! multi-grid solver
template<class TypeTag>
struct AmgCoarsenTarget<TypeTag, Properties::TTag::ParallelAmgLinearSolver>
{ static constexpr int value = 5000; };
template<class TypeTag>
struct LinearSolverMaxError<TypeTag, Properties::TTag::ParallelAmgLinearSolver>
{
using type = GetPropType<TypeTag, Properties::Scalar>;
static constexpr type value = 1e7;
};
struct AmgCoarsenTarget { static constexpr int value = 5000; };
}
@ -160,10 +151,10 @@ public:
{
ParentType::registerParameters();
Parameters::registerParam<TypeTag, Parameters::LinearSolverMaxError>
Parameters::Register<Parameters::LinearSolverMaxError<Scalar>>
("The maximum residual error which the linear solver tolerates "
"without giving up");
Parameters::registerParam<TypeTag, Parameters::AmgCoarsenTarget>
Parameters::Register<Parameters::AmgCoarsenTarget>
("The coarsening target for the agglomerations of "
"the AMG preconditioner");
}
@ -203,24 +194,25 @@ protected:
const auto& gridView = this->simulator_.gridView();
using CCC = CombinedCriterion<OverlappingVector, decltype(gridView.comm())>;
Scalar linearSolverTolerance = Parameters::get<TypeTag, Parameters::LinearSolverTolerance>();
Scalar linearSolverAbsTolerance = Parameters::get<TypeTag, Parameters::LinearSolverAbsTolerance>();
if(linearSolverAbsTolerance < 0.0)
Scalar linearSolverTolerance = Parameters::Get<Parameters::LinearSolverTolerance<Scalar>>();
Scalar linearSolverAbsTolerance = Parameters::Get<Parameters::LinearSolverAbsTolerance<Scalar>>();
if (linearSolverAbsTolerance < 0.0) {
linearSolverAbsTolerance = this->simulator_.model().newtonMethod().tolerance()/100.0;
}
convCrit_.reset(new CCC(gridView.comm(),
/*residualReductionTolerance=*/linearSolverTolerance,
/*absoluteResidualTolerance=*/linearSolverAbsTolerance,
Parameters::get<TypeTag, Parameters::LinearSolverMaxError>()));
Parameters::Get<Parameters::LinearSolverMaxError<Scalar>>()));
auto bicgstabSolver =
std::make_shared<RawLinearSolver>(parPreCond, *convCrit_, parScalarProduct);
int verbosity = 0;
if (parOperator.overlap().myRank() == 0)
verbosity = Parameters::get<TypeTag, Parameters::LinearSolverVerbosity>();
verbosity = Parameters::Get<Parameters::LinearSolverVerbosity>();
bicgstabSolver->setVerbosity(verbosity);
bicgstabSolver->setMaxIterations(Parameters::get<TypeTag, Parameters::LinearSolverMaxIterations>());
bicgstabSolver->setMaxIterations(Parameters::Get<Parameters::LinearSolverMaxIterations>());
bicgstabSolver->setLinearOperator(&parOperator);
bicgstabSolver->setRhs(this->overlappingb_);
@ -284,7 +276,7 @@ protected:
int verbosity = 0;
if (this->simulator_.vanguard().gridView().comm().rank() == 0)
verbosity = Parameters::get<TypeTag, Parameters::LinearSolverVerbosity>();
verbosity = Parameters::Get<Parameters::LinearSolverVerbosity>();
using SmootherArgs = typename Dune::Amg::SmootherTraits<ParallelSmoother>::Arguments;
@ -299,7 +291,7 @@ protected:
// Dune::Amg::FirstDiagonal>>
using CoarsenCriterion = Dune::Amg::
CoarsenCriterion<Dune::Amg::SymmetricCriterion<IstlMatrix, Dune::Amg::FrobeniusNorm> >;
int coarsenTarget = Parameters::get<TypeTag, Parameters::AmgCoarsenTarget>();
int coarsenTarget = Parameters::Get<Parameters::AmgCoarsenTarget>();
CoarsenCriterion coarsenCriterion(/*maxLevel=*/15, coarsenTarget);
coarsenCriterion.setDefaultValuesAnisotropic(GridView::dimension,
/*aggregateSizePerDim=*/3);

View File

@ -152,15 +152,15 @@ public:
*/
static void registerParameters()
{
Parameters::registerParam<TypeTag, Parameters::LinearSolverTolerance>
Parameters::Register<Parameters::LinearSolverTolerance<Scalar>>
("The maximum allowed error between of the linear solver");
Parameters::registerParam<TypeTag, Parameters::LinearSolverAbsTolerance>
Parameters::Register<Parameters::LinearSolverAbsTolerance<Scalar>>
("The maximum accepted error of the norm of the residual");
Parameters::registerParam<TypeTag, Parameters::LinearSolverOverlapSize>
Parameters::Register<Parameters::LinearSolverOverlapSize>
("The size of the algebraic overlap for the linear solver");
Parameters::registerParam<TypeTag, Parameters::LinearSolverMaxIterations>
Parameters::Register<Parameters::LinearSolverMaxIterations>
("The maximum number of iterations of the linear solver");
Parameters::registerParam<TypeTag, Parameters::LinearSolverVerbosity>
Parameters::Register<Parameters::LinearSolverVerbosity>
("The verbosity level of the linear solver");
PreconditionerWrapper::registerParameters();
@ -195,7 +195,7 @@ public:
simulator_.model().dofMapper());
// create the overlapping Jacobian matrix
unsigned overlapSize = Parameters::get<TypeTag, Parameters::LinearSolverOverlapSize>();
unsigned overlapSize = Parameters::Get<Parameters::LinearSolverOverlapSize>();
overlappingMatrix_ = new OverlappingMatrix(M.istlMatrix(),
borderListCreator.borderList(),
borderListCreator.blackList(),
@ -444,36 +444,4 @@ struct PreconditionerWrapper<TypeTag, TTag::ParallelBaseLinearSolver>
} // namespace Opm::Properties
namespace Opm::Parameters {
//! set the default number of maximum iterations for the linear solver
template<class TypeTag>
struct LinearSolverMaxIterations<TypeTag, Properties::TTag::ParallelBaseLinearSolver>
{ static constexpr int value = 1000; };
//! set the default overlap size to 2
template<class TypeTag>
struct LinearSolverOverlapSize<TypeTag, Properties::TTag::ParallelBaseLinearSolver>
{ static constexpr unsigned value = 2; };
//! make the linear solver shut up by default
template<class TypeTag>
struct LinearSolverVerbosity<TypeTag, Properties::TTag::ParallelBaseLinearSolver>
{ static constexpr int value = 0; };
//! set the preconditioner order to 0 by default
template<class TypeTag>
struct PreconditionerOrder<TypeTag, Properties::TTag::ParallelBaseLinearSolver>
{ static constexpr int value = 0; };
//! set the preconditioner relaxation parameter to 1.0 by default
template<class TypeTag>
struct PreconditionerRelaxation<TypeTag, Properties::TTag::ParallelBaseLinearSolver>
{
using type = GetPropType<TypeTag, Properties::Scalar>;
static constexpr type value = 1.0;
};
} // namespace Opm::Parameters
#endif

View File

@ -59,17 +59,6 @@ struct LinearSolverBackend<TypeTag, TTag::ParallelBiCGStabLinearSolver>
} // namespace Opm::Properties
namespace Opm::Parameters {
template<class TypeTag>
struct LinearSolverMaxError<TypeTag, Properties::TTag::ParallelBiCGStabLinearSolver>
{
using type = GetPropType<TypeTag, Properties::Scalar>;
static constexpr type value = 1e7;
};
}
namespace Opm::Linear {
/*!
@ -131,7 +120,7 @@ public:
{
ParentType::registerParameters();
Parameters::registerParam<TypeTag, Parameters::LinearSolverMaxError>
Parameters::Register<Parameters::LinearSolverMaxError<Scalar>>
("The maximum residual error which the linear solver tolerates"
" without giving up");
}
@ -146,24 +135,24 @@ protected:
const auto& gridView = this->simulator_.gridView();
using CCC = CombinedCriterion<OverlappingVector, decltype(gridView.comm())>;
Scalar linearSolverTolerance = Parameters::get<TypeTag, Parameters::LinearSolverTolerance>();
Scalar linearSolverAbsTolerance = Parameters::get<TypeTag, Parameters::LinearSolverAbsTolerance>();
Scalar linearSolverTolerance = Parameters::Get<Parameters::LinearSolverTolerance<Scalar>>();
Scalar linearSolverAbsTolerance = Parameters::Get<Parameters::LinearSolverAbsTolerance<Scalar>>();
if(linearSolverAbsTolerance < 0.0)
linearSolverAbsTolerance = this->simulator_.model().newtonMethod().tolerance() / 100.0;
convCrit_.reset(new CCC(gridView.comm(),
/*residualReductionTolerance=*/linearSolverTolerance,
/*absoluteResidualTolerance=*/linearSolverAbsTolerance,
Parameters::get<TypeTag, Parameters::LinearSolverMaxError>()));
Parameters::Get<Parameters::LinearSolverMaxError<Scalar>>()));
auto bicgstabSolver =
std::make_shared<RawLinearSolver>(parPreCond, *convCrit_, parScalarProduct);
int verbosity = 0;
if (parOperator.overlap().myRank() == 0)
verbosity = Parameters::get<TypeTag, Parameters::LinearSolverVerbosity>();
verbosity = Parameters::Get<Parameters::LinearSolverVerbosity>();
bicgstabSolver->setVerbosity(verbosity);
bicgstabSolver->setMaxIterations(Parameters::get<TypeTag, Parameters::LinearSolverMaxIterations>());
bicgstabSolver->setMaxIterations(Parameters::Get<Parameters::LinearSolverMaxIterations>());
bicgstabSolver->setLinearOperator(&parOperator);
bicgstabSolver->setRhs(this->overlappingb_);

View File

@ -158,13 +158,4 @@ struct PreconditionerWrapper<TypeTag, TTag::ParallelIstlLinearSolver>
} // namespace Opm::Properties
namespace Opm::Parameters {
//! set the GMRes restart parameter to 10 by default
template<class TypeTag>
struct GMResRestart<TypeTag, Properties::TTag::ParallelIstlLinearSolver>
{ static constexpr int value = 10; };
}
#endif

View File

@ -73,7 +73,7 @@ public:
static void registerParameters()
{
Parameters::registerParam<TypeTag, Parameters::LinearSolverVerbosity>
Parameters::Register<Parameters::LinearSolverVerbosity>
("The verbosity level of the linear solver");
}
@ -114,7 +114,7 @@ public:
{
Vector bTmp(b);
int verbosity = Parameters::get<TypeTag, Parameters::LinearSolverVerbosity>();
int verbosity = Parameters::Get<Parameters::LinearSolverVerbosity>();
Dune::InverseOperatorResult result;
Dune::SuperLU<Matrix> solver(A, verbosity > 0);
solver.apply(x, bTmp, result);