mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Adding functions for pressure system manipulation to well models.
Also add well-aware operator and transfer policy. This will be used for CPR with custom operators.
This commit is contained in:
committed by
Atgeirr Flø Rasmussen
parent
0bb293aeb0
commit
f3acfcde0b
@@ -35,27 +35,25 @@ namespace Dune
|
||||
/// (operator, scalar product, iterative solver and preconditioner) and sets
|
||||
/// them up based on runtime parameters, using the PreconditionerFactory for
|
||||
/// setting up preconditioners.
|
||||
template <class MatrixTypeT, class VectorTypeT>
|
||||
class FlexibleSolver : public Dune::InverseOperator<VectorTypeT, VectorTypeT>
|
||||
template <class Operator>
|
||||
class FlexibleSolver : public Dune::InverseOperator<typename Operator::domain_type,
|
||||
typename Operator::range_type>
|
||||
{
|
||||
public:
|
||||
using MatrixType = MatrixTypeT;
|
||||
using VectorType = VectorTypeT;
|
||||
using VectorType = typename Operator::domain_type; // Assuming symmetry: domain == range
|
||||
|
||||
/// Base class type of the operator passed to the solver.
|
||||
using AbstractOperatorType = Dune::AssembledLinearOperator<MatrixType, VectorType, VectorType>;
|
||||
/// Base class type of the contained preconditioner.
|
||||
using AbstractPrecondType = Dune::PreconditionerWithUpdate<VectorType, VectorType>;
|
||||
|
||||
/// Create a sequential solver.
|
||||
FlexibleSolver(AbstractOperatorType& op,
|
||||
FlexibleSolver(Operator& op,
|
||||
const Opm::PropertyTree& prm,
|
||||
const std::function<VectorType()>& weightsCalculator,
|
||||
std::size_t pressureIndex);
|
||||
|
||||
/// Create a parallel solver (if Comm is e.g. OwnerOverlapCommunication).
|
||||
template <class Comm>
|
||||
FlexibleSolver(AbstractOperatorType& op,
|
||||
FlexibleSolver(Operator& op,
|
||||
const Comm& comm,
|
||||
const Opm::PropertyTree& prm,
|
||||
const std::function<VectorType()>& weightsCalculator,
|
||||
@@ -76,11 +74,11 @@ private:
|
||||
|
||||
// Machinery for making sequential or parallel operators/preconditioners/scalar products.
|
||||
template <class Comm>
|
||||
void initOpPrecSp(AbstractOperatorType& op, const Opm::PropertyTree& prm,
|
||||
void initOpPrecSp(Operator& op, const Opm::PropertyTree& prm,
|
||||
const std::function<VectorType()> weightsCalculator, const Comm& comm,
|
||||
std::size_t pressureIndex);
|
||||
|
||||
void initOpPrecSp(AbstractOperatorType& op, const Opm::PropertyTree& prm,
|
||||
void initOpPrecSp(Operator& op, const Opm::PropertyTree& prm,
|
||||
const std::function<VectorType()> weightsCalculator, const Dune::Amg::SequentialInformation&,
|
||||
std::size_t pressureIndex);
|
||||
|
||||
@@ -89,14 +87,13 @@ private:
|
||||
// Main initialization routine.
|
||||
// Call with Comm == Dune::Amg::SequentialInformation to get a serial solver.
|
||||
template <class Comm>
|
||||
void init(AbstractOperatorType& op,
|
||||
void init(Operator& op,
|
||||
const Comm& comm,
|
||||
const Opm::PropertyTree& prm,
|
||||
const std::function<VectorType()> weightsCalculator,
|
||||
std::size_t pressureIndex);
|
||||
|
||||
AbstractOperatorType* linearoperator_for_solver_;
|
||||
std::shared_ptr<AbstractOperatorType> linearoperator_for_precond_;
|
||||
Operator* linearoperator_for_solver_;
|
||||
std::shared_ptr<AbstractPrecondType> preconditioner_;
|
||||
std::shared_ptr<AbstractScalarProductType> scalarproduct_;
|
||||
std::shared_ptr<AbstractSolverType> linsolver_;
|
||||
@@ -104,6 +101,7 @@ private:
|
||||
|
||||
} // namespace Dune
|
||||
|
||||
#include <opm/simulators/linalg/FlexibleSolver_impl.hpp>
|
||||
|
||||
|
||||
#endif // OPM_FLEXIBLE_SOLVER_HEADER_INCLUDED
|
||||
|
||||
Reference in New Issue
Block a user