Go to the documentation of this file.
23#include <opm/common/ErrorMacros.hpp>
24#include <opm/common/TimingMacros.hpp>
43#include <dune/common/unused.hh>
44#include <dune/istl/owneroverlapcopy.hh>
45#include <dune/istl/paamg/amg.hh>
46#include <dune/istl/paamg/fastamg.hh>
47#include <dune/istl/paamg/kamg.hh>
48#include <dune/istl/preconditioners.hh>
69template < class Operator, class Comm>
70PreconditionerFactory<Operator, Comm>::PreconditionerFactory()
75template < class Operator, class Comm>
76PreconditionerFactory<Operator, Comm>&
77PreconditionerFactory<Operator, Comm>::instance()
79 static PreconditionerFactory singleton;
83template < class Operator, class Comm>
85PreconditionerFactory<Operator, Comm>::doCreate( const Operator& op,
86 const PropertyTree& prm,
87 const std::function<Vector()> weightsCalculator,
88 std::size_t pressureIndex)
94 std::string type = prm.get<std::string>( "type", "paroverilu0");
96 std::transform(type.begin(), type.end(), type.begin(), ::tolower);
97 auto it = creators_.find(type);
98 if (it == creators_.end()) {
99 std::ostringstream msg;
100 msg << "Preconditioner type " << type << " is not registered in the factory. Available types are: ";
101 for ( const auto& prec : creators_) {
102 msg << prec.first << ' ';
105 OPM_THROW(std::invalid_argument, msg.str());
107 return it->second(op, prm, weightsCalculator, pressureIndex);
110template < class Operator, class Comm>
112PreconditionerFactory<Operator, Comm>::doCreate( const Operator& op,
113 const PropertyTree& prm,
114 const std::function<Vector()> weightsCalculator,
115 std::size_t pressureIndex,
122 std::string type = prm.get<std::string>( "type", "paroverilu0");
124 std::transform(type.begin(), type.end(), type.begin(), ::tolower);
125 auto it = parallel_creators_.find(type);
126 if (it == parallel_creators_.end()) {
127 std::ostringstream msg;
128 msg << "Parallel preconditioner type " << type << " is not registered in the factory. Available types are: ";
129 for ( const auto& prec : parallel_creators_) {
130 msg << prec.first << ' ';
133 OPM_THROW(std::invalid_argument, msg.str());
135 return it->second(op, prm, weightsCalculator, pressureIndex, comm);
138template < class Operator, class Comm>
140PreconditionerFactory<Operator, Comm>::doAddCreator( const std::string& type, Creator c)
145template < class Operator, class Comm>
147PreconditionerFactory<Operator, Comm>::doAddCreator( const std::string& type, ParCreator c)
149 parallel_creators_[type] = c;
152template < class Operator, class Comm>
156 const std::function< Vector()>& weightsCalculator,
157 std::size_t pressureIndex)
159 return instance().doCreate(op, prm, weightsCalculator, pressureIndex);
162template < class Operator, class Comm>
166 const std::function< Vector()>& weightsCalculator,
168 std::size_t pressureIndex)
170 return instance().doCreate(op, prm, weightsCalculator, pressureIndex, comm);
174template < class Operator, class Comm>
179 std::size_t pressureIndex)
181 return instance().doCreate(op, prm, std::function< Vector()>(), pressureIndex, comm);
184template < class Operator, class Comm>
188 instance().doAddCreator(type, creator);
191template < class Operator, class Comm>
195 instance().doAddCreator(type, creator);
198using CommSeq = Dune::Amg::SequentialInformation;
200template< class Scalar, int Dim>
201using OpFSeq = Dune::MatrixAdapter<Dune::BCRSMatrix<Dune::FieldMatrix<Scalar, Dim, Dim>>,
202 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
203 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>>;
204template< class Scalar, int Dim>
205using OpBSeq = Dune::MatrixAdapter<Dune::BCRSMatrix<MatrixBlock<Scalar, Dim, Dim>>,
206 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
207 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>>;
209template< class Scalar, int Dim, bool overlap>
211 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
212 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>>;
214template< class Scalar, int Dim, bool overlap>
216 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
217 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
221using CommPar = Dune::OwnerOverlapCopyCommunication<int, int>;
223template< class Scalar, int Dim>
224using OpFPar = Dune::OverlappingSchwarzOperator<Dune::BCRSMatrix<Dune::FieldMatrix<Scalar, Dim, Dim>>,
225 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
226 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
229template< class Scalar, int Dim>
230using OpBPar = Dune::OverlappingSchwarzOperator<Dune::BCRSMatrix<MatrixBlock<Scalar, Dim, Dim>>,
231 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
232 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
234template< class Scalar, int Dim>
236 Dune::BlockVector<Dune::FieldVector<Scalar,Dim>>,
237 Dune::BlockVector<Dune::FieldVector<Scalar,Dim>>,
240template< class Scalar, int Dim>
242 Dune::BlockVector<Dune::FieldVector<Scalar,Dim>>,
243 Dune::BlockVector<Dune::FieldVector<Scalar,Dim>>,
246#define INSTANTIATE_PF_PAR(T,Dim) \
247 template class PreconditionerFactory<OpBSeq<T,Dim>, CommPar>; \
248 template class PreconditionerFactory<OpFPar<T,Dim>, CommPar>; \
249 template class PreconditionerFactory<OpBPar<T,Dim>, CommPar>; \
250 template class PreconditionerFactory<OpGLFPar<T,Dim>, CommPar>; \
251 template class PreconditionerFactory<OpGLBPar<T,Dim>, CommPar>; \
252 template class PreconditionerFactory<OpW<T,Dim, false>, CommPar>; \
253 template class PreconditionerFactory<OpWG<T,Dim, true>, CommPar>; \
254 template class PreconditionerFactory<OpBPar<T,Dim>, CommSeq>; \
255 template class PreconditionerFactory<OpGLBPar<T,Dim>, CommSeq>;
258#define INSTANTIATE_PF_SEQ(T,Dim) \
259 template class PreconditionerFactory<OpFSeq<T,Dim>, CommSeq>; \
260 template class PreconditionerFactory<OpBSeq<T,Dim>, CommSeq>; \
261 template class PreconditionerFactory<OpW<T,Dim, false>, CommSeq>; \
262 template class PreconditionerFactory<OpWG<T,Dim, true>, CommSeq>;
265#define INSTANTIATE_PF(T,Dim) \
266 INSTANTIATE_PF_PAR(T,Dim) \
267 INSTANTIATE_PF_SEQ(T,Dim)
269#define INSTANTIATE_PF(T,Dim) INSTANTIATE_PF_SEQ(T,Dim)
Dune::OwnerOverlapCopyCommunication< int, int > Comm Definition: FlexibleSolver_impl.hpp:304
Dune linear operator that assumes ghost rows are ordered after interior rows. Avoids some computation... Definition: WellOperators.hpp:402
static PrecPtr create(const Operator &op, const PropertyTree &prm, const std::function< Vector()> &weightsCalculator={}, std::size_t pressureIndex=std::numeric_limits< std::size_t >::max()) Definition: PreconditionerFactory_impl.hpp:154
std::function< PrecPtr(const Operator &, const PropertyTree &, const std::function< Vector()> &, std::size_t, const Comm &)> ParCreator Definition: PreconditionerFactory.hpp:77
typename Operator::domain_type Vector Definition: PreconditionerFactory.hpp:68
std::function< PrecPtr(const Operator &, const PropertyTree &, const std::function< Vector()> &, std::size_t)> Creator The type of creator functions passed to addCreator(). Definition: PreconditionerFactory.hpp:75
static void addCreator(const std::string &type, Creator creator) Definition: PreconditionerFactory_impl.hpp:186
std::shared_ptr< Dune::PreconditionerWithUpdate< Vector, Vector > > PrecPtr The type of pointer returned by create(). Definition: PreconditionerFactory.hpp:71
Hierarchical collection of key/value pairs. Definition: PropertyTree.hpp:39
Adapter to combine a matrix and another linear operator into a combined linear operator. Definition: WellOperators.hpp:299
Adapter to combine a matrix and another linear operator into a combined linear operator. Definition: WellOperators.hpp:225
Definition: blackoilboundaryratevector.hh:39
Dune::MatrixAdapter< Dune::BCRSMatrix< MatrixBlock< Scalar, Dim, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > > > OpBSeq Definition: PreconditionerFactory_impl.hpp:207
Dune::OverlappingSchwarzOperator< Dune::BCRSMatrix< MatrixBlock< Scalar, Dim, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > >, CommPar > OpBPar Definition: PreconditionerFactory_impl.hpp:233
Dune::MatrixAdapter< Dune::BCRSMatrix< Dune::FieldMatrix< Scalar, Dim, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > > > OpFSeq Definition: PreconditionerFactory_impl.hpp:203
Dune::Amg::SequentialInformation CommSeq Definition: PreconditionerFactory_impl.hpp:198
Dune::OverlappingSchwarzOperator< Dune::BCRSMatrix< Dune::FieldMatrix< Scalar, Dim, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > >, Dune::BlockVector< Dune::FieldVector< Scalar, Dim > >, CommPar > OpFPar Definition: PreconditionerFactory_impl.hpp:227
Dune::OwnerOverlapCopyCommunication< int, int > CommPar Definition: PreconditionerFactory_impl.hpp:221
static void add() Definition: StandardPreconditioners_mpi.hpp:129
|