mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
move LinearSolver parameters to TypeTag-free parameter system
This commit is contained in:
parent
0a40ed2950
commit
62a180447c
@ -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);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -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 {
|
||||
|
||||
/*!
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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_);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user