17 #ifndef OPM_STANDARDPRECONDITIONERS_GPU_MPI_HEADER 18 #define OPM_STANDARDPRECONDITIONERS_GPU_MPI_HEADER 20 #include <dune/istl/bcrsmatrix.hh> 23 #include <opm/simulators/linalg/PreconditionerFactory.hpp> 24 #include <opm/simulators/linalg/PropertyTree.hpp> 25 #include <opm/simulators/linalg/is_gpu_operator.hpp> 29 #include <opm/simulators/linalg/gpuistl_hip/GpuDILU.hpp> 30 #include <opm/simulators/linalg/gpuistl_hip/GpuSeqILU0.hpp> 31 #include <opm/simulators/linalg/gpuistl_hip/GpuJac.hpp> 32 #include <opm/simulators/linalg/gpuistl_hip/OpmGpuILU0.hpp> 33 #include <opm/simulators/linalg/gpuistl_hip/GpuBlockPreconditioner.hpp> 34 #include <opm/simulators/linalg/gpuistl_hip/detail/gpu_preconditioner_utils.hpp> 36 #include <opm/simulators/linalg/gpuistl/GpuDILU.hpp> 37 #include <opm/simulators/linalg/gpuistl/GpuSeqILU0.hpp> 38 #include <opm/simulators/linalg/gpuistl/GpuJac.hpp> 39 #include <opm/simulators/linalg/gpuistl/OpmGpuILU0.hpp> 40 #include <opm/simulators/linalg/gpuistl/GpuBlockPreconditioner.hpp> 41 #include <opm/simulators/linalg/gpuistl/detail/gpu_preconditioner_utils.hpp> 47 template <
class Operator,
class Comm>
54 using V =
typename F::Vector;
58 using field_type =
typename V::field_type;
60 static constexpr
int maxblocksize = 6;
65 F::addCreator(
"ilu0", [](
const O& op,
const P& prm,
const std::function<V()>&, std::size_t,
const C& comm) {
66 const double w = prm.
get<
double>(
"relaxation", 1.0);
68 auto gpuPrec = std::make_shared<GpuILU0>(op.getmat(), w);
69 return std::make_shared<gpuistl::GpuBlockPreconditioner<V, V, C>>(gpuPrec, comm);
72 F::addCreator(
"jac", [](
const O& op,
const P& prm,
const std::function<V()>&, std::size_t,
const C& comm) {
73 const double w = prm.
get<
double>(
"relaxation", 1.0);
75 auto gpuPrec = std::make_shared<GpuJac>(op.getmat(), w);
76 return std::make_shared<gpuistl::GpuBlockPreconditioner<V, V, C>>(gpuPrec, comm);
79 F::addCreator(
"dilu", [](
const O& op, [[maybe_unused]]
const P& prm,
const std::function<V()>&, std::size_t,
const C& comm) -> PrecPtr {
80 return op.getmat().dispatchOnBlocksize([&](
auto blockSizeVal) -> PrecPtr {
81 constexpr
int blockSize = decltype(blockSizeVal)::value;
82 const auto cpuMatrix = gpuistl::detail::makeCPUMatrix<O, Dune::FieldMatrix<field_type, blockSize, blockSize>>(op);
83 const bool split_matrix = prm.get<
bool>(
"split_matrix",
true);
84 const bool tune_gpu_kernels = prm.get<
bool>(
"tune_gpu_kernels",
true);
85 const int mixed_precision_scheme = prm.get<
int>(
"mixed_precision_scheme", 0);
86 const bool reorder = prm.get<
bool>(
"reorder",
true);
87 using CPUMatrixType = std::remove_const_t<std::remove_reference_t<decltype(cpuMatrix)>>;
89 auto gpuPrec = std::make_shared<GPUDILU>(op.getmat(), cpuMatrix, split_matrix, tune_gpu_kernels, mixed_precision_scheme, reorder);
90 return std::make_shared<gpuistl::GpuBlockPreconditioner<V, V, C>>(gpuPrec, comm);
94 F::addCreator(
"opmilu0", [](
const O& op, [[maybe_unused]]
const P& prm,
const std::function<V()>&, std::size_t,
const C& comm) -> PrecPtr {
95 return op.getmat().dispatchOnBlocksize([&](
auto blockSizeVal) -> PrecPtr {
96 constexpr
int blockSize = decltype(blockSizeVal)::value;
97 const auto cpuMatrix = gpuistl::detail::makeCPUMatrix<O, Dune::FieldMatrix<field_type, blockSize, blockSize>>(op);
98 const bool split_matrix = prm.get<
bool>(
"split_matrix",
true);
99 const bool tune_gpu_kernels = prm.get<
bool>(
"tune_gpu_kernels",
true);
100 const int mixed_precision_scheme = prm.get<
int>(
"mixed_precision_scheme", 0);
101 using CPUMatrixType = std::remove_const_t<std::remove_reference_t<decltype(cpuMatrix)>>;
103 auto gpuPrec = std::make_shared<GPUILU0>(op.getmat(), cpuMatrix, split_matrix, tune_gpu_kernels, mixed_precision_scheme);
104 return std::make_shared<gpuistl::GpuBlockPreconditioner<V, V, C>>(gpuPrec, comm);
116 #endif // OPM_STANDARDPRECONDITIONERS_GPU_MPI_HEADER T get(const std::string &key) const
Retrieve property value given hierarchical property key.
Definition: PropertyTree.cpp:59
typename Operator::matrix_type Matrix
Linear algebra types.
Definition: PreconditionerFactory.hpp:67
Structs needed for tpfalinearizer and its gpuparams struct extracted to be defined in one place that ...
Definition: blackoilbioeffectsmodules.hh:45
ILU0 preconditioner on the GPU.
Definition: OpmGpuILU0.hpp:50
DILU preconditioner on the GPU.
Definition: GpuDILU.hpp:52
Sequential ILU0 preconditioner on the GPU through the CuSparse library.
Definition: GpuSeqILU0.hpp:51
Jacobi preconditioner on the GPU.
Definition: GpuJac.hpp:46
Hierarchical collection of key/value pairs.
Definition: PropertyTree.hpp:38
Definition: StandardPreconditioners_mpi.hpp:134
This is an object factory for creating preconditioners.
Definition: OwningTwoLevelPreconditioner.hpp:43
std::shared_ptr< Dune::PreconditionerWithUpdate< Vector, Vector > > PrecPtr
The type of pointer returned by create().
Definition: PreconditionerFactory.hpp:71