23 #include <opm/common/ErrorMacros.hpp> 24 #include <opm/common/TimingMacros.hpp> 26 #include <opm/simulators/linalg/PreconditionerFactory.hpp> 28 #include <opm/simulators/linalg/DILU.hpp> 29 #include <opm/simulators/linalg/ExtraSmoothers.hpp> 30 #include <opm/simulators/linalg/FlexibleSolver.hpp> 31 #include <opm/simulators/linalg/FlowLinearSolverParameters.hpp> 32 #include <opm/simulators/linalg/OwningBlockPreconditioner.hpp> 33 #include <opm/simulators/linalg/OwningTwoLevelPreconditioner.hpp> 34 #include <opm/simulators/linalg/ParallelOverlappingILU0.hpp> 35 #include <opm/simulators/linalg/PressureBhpTransferPolicy.hpp> 36 #include <opm/simulators/linalg/PressureTransferPolicy.hpp> 37 #include <opm/simulators/linalg/PropertyTree.hpp> 38 #include <opm/simulators/linalg/WellOperators.hpp> 40 #include <opm/simulators/linalg/ilufirstelement.hh> 41 #include <opm/simulators/linalg/matrixblock.hh> 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> 51 #include <opm/simulators/linalg/PreconditionerFactoryGPUIncludeWrapper.hpp> 54 #include <opm/simulators/linalg/HyprePreconditioner.hpp> 58 #include <opm/simulators/linalg/AmgxPreconditioner.hpp> 63 #include <opm/simulators/linalg/StandardPreconditioners.hpp> 69 template <
class Operator,
class Comm>
70 PreconditionerFactory<Operator, Comm>::PreconditionerFactory()
75 template <
class Operator,
class Comm>
76 PreconditionerFactory<Operator, Comm>&
77 PreconditionerFactory<Operator, Comm>::instance()
79 static PreconditionerFactory singleton;
83 template <
class Operator,
class Comm>
85 PreconditionerFactory<Operator, Comm>::doCreate(
const Operator& op,
86 const PropertyTree& prm,
87 const std::function<Vector()> weightsCalculator,
88 std::size_t pressureIndex)
91 StandardPreconditioners<Operator, Comm>::add();
94 std::string type = prm.get<std::string>(
"type",
"paroverilu0");
96 std::ranges::transform(type, 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);
110 template <
class Operator,
class Comm>
112 PreconditionerFactory<Operator, Comm>::doCreate(
const Operator& op,
113 const PropertyTree& prm,
114 const std::function<Vector()> weightsCalculator,
115 std::size_t pressureIndex,
119 StandardPreconditioners<Operator, Comm>::add();
122 std::string type = prm.get<std::string>(
"type",
"paroverilu0");
124 std::ranges::transform(type, 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);
138 template <
class Operator,
class Comm>
140 PreconditionerFactory<Operator, Comm>::doAddCreator(
const std::string& type, Creator c)
145 template <
class Operator,
class Comm>
147 PreconditionerFactory<Operator, Comm>::doAddCreator(
const std::string& type, ParCreator c)
149 parallel_creators_[type] = c;
152 template <
class Operator,
class Comm>
156 const std::function<Vector()>& weightsCalculator,
157 std::size_t pressureIndex)
159 return instance().doCreate(op, prm, weightsCalculator, pressureIndex);
162 template <
class Operator,
class Comm>
166 const std::function<Vector()>& weightsCalculator,
168 std::size_t pressureIndex)
170 return instance().doCreate(op, prm, weightsCalculator, pressureIndex, comm);
174 template <
class Operator,
class Comm>
179 std::size_t pressureIndex)
181 return instance().doCreate(op, prm, std::function<Vector()>(), pressureIndex, comm);
184 template <
class Operator,
class Comm>
188 instance().doAddCreator(type, creator);
191 template <
class Operator,
class Comm>
195 instance().doAddCreator(type, creator);
198 using CommSeq = Dune::Amg::SequentialInformation;
200 template<
class Scalar,
int Dim>
201 using OpFSeq = Dune::MatrixAdapter<Dune::BCRSMatrix<Dune::FieldMatrix<Scalar, Dim, Dim>>,
202 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
203 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>>;
204 template<
class Scalar,
int Dim>
205 using OpBSeq = Dune::MatrixAdapter<Dune::BCRSMatrix<MatrixBlock<Scalar, Dim, Dim>>,
206 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
207 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>>;
209 template<
class Scalar,
int Dim,
bool overlap>
211 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
212 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>>;
214 template<
class Scalar,
int Dim,
bool overlap>
216 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
217 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
221 using CommPar = Dune::OwnerOverlapCopyCommunication<int, int>;
223 template<
class Scalar,
int Dim>
224 using OpFPar = Dune::OverlappingSchwarzOperator<Dune::BCRSMatrix<Dune::FieldMatrix<Scalar, Dim, Dim>>,
225 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
226 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
229 template<
class Scalar,
int Dim>
230 using OpBPar = Dune::OverlappingSchwarzOperator<Dune::BCRSMatrix<MatrixBlock<Scalar, Dim, Dim>>,
231 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
232 Dune::BlockVector<Dune::FieldVector<Scalar, Dim>>,
234 template<
class Scalar,
int Dim>
236 Dune::BlockVector<Dune::FieldVector<Scalar,Dim>>,
237 Dune::BlockVector<Dune::FieldVector<Scalar,Dim>>,
240 template<
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) Adapter to combine a matrix and another linear operator into a combined linear operator.
Definition: WellOperators.hpp:298
Adapter to combine a matrix and another linear operator into a combined linear operator.
Definition: WellOperators.hpp:224
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: blackoilbioeffectsmodules.hh:45
static void addCreator(const std::string &type, Creator creator)
Add a creator for a serial preconditioner to the PreconditionerFactory.
Definition: PreconditionerFactory_impl.hpp:186
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 PrecPtr create(const Operator &op, const PropertyTree &prm, const std::function< Vector()> &weightsCalculator={}, std::size_t pressureIndex=std::numeric_limits< std::size_t >::max())
Create a new serial preconditioner and return a pointer to it.
Definition: PreconditionerFactory_impl.hpp:154
Dune linear operator that assumes ghost rows are ordered after interior rows.
Definition: WellOperators.hpp:401
Hierarchical collection of key/value pairs.
Definition: PropertyTree.hpp:38
std::shared_ptr< Dune::PreconditionerWithUpdate< Vector, Vector > > PrecPtr
The type of pointer returned by create().
Definition: PreconditionerFactory.hpp:71