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; 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> template <class TypeTag>
struct SimulationName<TypeTag, Properties::TTag::CO2PTBaseProblem> struct SimulationName<TypeTag, Properties::TTag::CO2PTBaseProblem>
{ static constexpr auto value = "co2_ptflash"; }; { static constexpr auto value = "co2_ptflash"; };
@ -339,6 +325,9 @@ public:
Parameters::SetDefault<Parameters::VtkWriteTotalMoleFractions>(true); Parameters::SetDefault<Parameters::VtkWriteTotalMoleFractions>(true);
Parameters::SetDefault<Parameters::VtkWriteEquilibriumConstants>(true); Parameters::SetDefault<Parameters::VtkWriteEquilibriumConstants>(true);
Parameters::SetDefault<Parameters::VtkWriteLiquidMoleFractions>(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/ConstantSolidHeatCapLaw.hpp>
#include <opm/material/thermal/SomertonThermalConductionLaw.hpp> #include <opm/material/thermal/SomertonThermalConductionLaw.hpp>
#include <opm/models/common/multiphasebaseparameters.hh>
#include <opm/models/discretization/common/fvbasefdlocallinearizer.hh> #include <opm/models/discretization/common/fvbasefdlocallinearizer.hh>
#include <opm/models/pvs/pvsproperties.hh> #include <opm/models/pvs/pvsproperties.hh>
@ -133,14 +135,6 @@ struct PreconditionerWrapper<TypeTag, TTag::WaterAirBaseProblem>
} // namespace Opm::Properties } // 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 { namespace Opm {
/*! /*!
* \ingroup TestProblems * \ingroup TestProblems
@ -298,6 +292,7 @@ public:
Parameters::SetDefault<Parameters::EndTime<Scalar>>(1.0 * 365 * 24 * 60 * 60); Parameters::SetDefault<Parameters::EndTime<Scalar>>(1.0 * 365 * 24 * 60 * 60);
Parameters::SetDefault<Parameters::InitialTimeStepSize<Scalar>>(250.0); Parameters::SetDefault<Parameters::InitialTimeStepSize<Scalar>>(250.0);
Parameters::SetDefault<Parameters::EnableGravity>(true); 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::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 { namespace Opm {
/*! /*!

View File

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

View File

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

View File

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

View File

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

View File

@ -152,15 +152,15 @@ public:
*/ */
static void registerParameters() static void registerParameters()
{ {
Parameters::registerParam<TypeTag, Parameters::LinearSolverTolerance> Parameters::Register<Parameters::LinearSolverTolerance<Scalar>>
("The maximum allowed error between of the linear solver"); ("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"); ("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"); ("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"); ("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"); ("The verbosity level of the linear solver");
PreconditionerWrapper::registerParameters(); PreconditionerWrapper::registerParameters();
@ -195,7 +195,7 @@ public:
simulator_.model().dofMapper()); simulator_.model().dofMapper());
// create the overlapping Jacobian matrix // create the overlapping Jacobian matrix
unsigned overlapSize = Parameters::get<TypeTag, Parameters::LinearSolverOverlapSize>(); unsigned overlapSize = Parameters::Get<Parameters::LinearSolverOverlapSize>();
overlappingMatrix_ = new OverlappingMatrix(M.istlMatrix(), overlappingMatrix_ = new OverlappingMatrix(M.istlMatrix(),
borderListCreator.borderList(), borderListCreator.borderList(),
borderListCreator.blackList(), borderListCreator.blackList(),
@ -444,36 +444,4 @@ struct PreconditionerWrapper<TypeTag, TTag::ParallelBaseLinearSolver>
} // namespace Opm::Properties } // 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 #endif

View File

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

View File

@ -158,13 +158,4 @@ struct PreconditionerWrapper<TypeTag, TTag::ParallelIstlLinearSolver>
} // namespace Opm::Properties } // 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 #endif

View File

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