27 #ifndef EWOMS_PARALLEL_BICGSTAB_BACKEND_HH 28 #define EWOMS_PARALLEL_BICGSTAB_BACKEND_HH 41 template <
class TypeTag>
52 {
using InheritsFrom = std::tuple<ParallelBaseLinearSolver>; };
56 template<
class TypeTag>
91 template <
class TypeTag>
92 class ParallelBiCGStabSolverBackend :
public ParallelBaseBackend<TypeTag>
94 using ParentType = ParallelBaseBackend<TypeTag>;
100 using ParallelOperator =
typename ParentType::ParallelOperator;
101 using OverlappingVector =
typename ParentType::OverlappingVector;
102 using ParallelPreconditioner =
typename ParentType::ParallelPreconditioner;
103 using ParallelScalarProduct =
typename ParentType::ParallelScalarProduct;
105 using MatrixBlock =
typename SparseMatrixAdapter::MatrixBlock;
107 using RawLinearSolver = BiCGStabSolver<ParallelOperator,
109 ParallelPreconditioner>;
111 static_assert(std::is_same<SparseMatrixAdapter, IstlSparseMatrixAdapter<MatrixBlock> >::value,
112 "The ParallelIstlSolverBackend linear solver backend requires the IstlSparseMatrixAdapter");
115 explicit ParallelBiCGStabSolverBackend(
const Simulator& simulator)
116 : ParentType(simulator)
119 static void registerParameters()
123 Parameters::Register<Parameters::LinearSolverMaxError<Scalar>>
124 (
"The maximum residual error which the linear solver tolerates" 125 " without giving up");
131 std::shared_ptr<RawLinearSolver> prepareSolver_(ParallelOperator& parOperator,
132 ParallelScalarProduct& parScalarProduct,
133 ParallelPreconditioner& parPreCond)
135 const auto& gridView = this->simulator_.gridView();
136 using CCC = CombinedCriterion<OverlappingVector, decltype(gridView.comm())>;
138 Scalar linearSolverTolerance = Parameters::Get<Parameters::LinearSolverTolerance<Scalar>>();
139 Scalar linearSolverAbsTolerance = Parameters::Get<Parameters::LinearSolverAbsTolerance<Scalar>>();
140 if(linearSolverAbsTolerance < 0.0)
141 linearSolverAbsTolerance = this->simulator_.model().newtonMethod().tolerance() / 100.0;
143 convCrit_.reset(
new CCC(gridView.comm(),
144 linearSolverTolerance,
145 linearSolverAbsTolerance,
146 Parameters::Get<Parameters::LinearSolverMaxError<Scalar>>()));
148 auto bicgstabSolver =
149 std::make_shared<RawLinearSolver>(parPreCond, *convCrit_, parScalarProduct);
152 if (parOperator.overlap().myRank() == 0)
153 verbosity = Parameters::Get<Parameters::LinearSolverVerbosity>();
154 bicgstabSolver->setVerbosity(verbosity);
155 bicgstabSolver->setMaxIterations(Parameters::Get<Parameters::LinearSolverMaxIterations>());
156 bicgstabSolver->setLinearOperator(&parOperator);
157 bicgstabSolver->setRhs(this->overlappingb_);
159 return bicgstabSolver;
162 std::pair<bool,int> runSolver_(std::shared_ptr<RawLinearSolver> solver)
164 bool converged = solver->apply(*this->overlappingx_);
165 return std::make_pair(converged,
int(solver->report().iterations()));
168 void cleanupSolver_()
171 std::unique_ptr<ConvergenceCriterion<OverlappingVector> > convCrit_;
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(...))
Definition: propertysystem.hh:233
Implements a generic linear solver abstraction.
Definition: parallelbicgstabbackend.hh:42
Definition: matrixblock.hh:228
A sparse matrix interface backend for BCRSMatrix from dune-istl.
Definition: bicgstabsolver.hh:42
static void registerParameters()
Register all run-time parameters for the linear solver.
Definition: parallelbasebackend.hh:153
Declares the parameters for the black oil model.
Implements a preconditioned stabilized BiCG linear solver.
Convergence criterion which looks at the absolute value of the residual and fails if the linear solve...
Manages the initializing and running of time dependent problems.
Definition: simulator.hh:83
Definition: blackoilmodel.hh:80
Definition: parallelbicgstabbackend.hh:51
Declares the properties required by the black oil model.
The type of the linear solver to be used.
Definition: linalgproperties.hh:38
Provides the common code which is required by most linear solvers.