opm-simulators
Loading...
Searching...
No Matches
ISTLSolverRuntimeOptionProxy.hpp
1/*
2 Copyright 2025 Equinor ASA
3
4 This file is part of the Open Porous Media project (OPM).
5 OPM is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9 OPM is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13 You should have received a copy of the GNU General Public License
14 along with OPM. If not, see <http://www.gnu.org/licenses/>.
15*/
16
17#ifndef OPM_ISTLSOLVERRUNTIMEOPTIONPROXY_HEADER_INCLUDED
18#define OPM_ISTLSOLVERRUNTIMEOPTIONPROXY_HEADER_INCLUDED
19
20#include "opm/simulators/linalg/FlowLinearSolverParameters.hpp"
21#include <opm/simulators/linalg/setupPropertyTree.hpp>
22#include <opm/simulators/linalg/AbstractISTLSolver.hpp>
23#include <opm/simulators/linalg/ISTLSolver.hpp>
24#if COMPILE_GPU_BRIDGE
25#include <opm/simulators/linalg/ISTLSolverGpuBridge.hpp>
26#endif
27
28#if HAVE_CUDA
29#include <opm/simulators/linalg/gpuistl/ISTLSolverGPUISTL.hpp>
30#endif
31
32namespace Opm
33{
34
38template <class TypeTag>
40{
41public:
45 using Matrix = typename SparseMatrixAdapter::IstlMatrix;
46
47#if HAVE_MPI
48 using CommunicationType = Dune::OwnerOverlapCopyCommunication<int, int>;
49#else
50 using CommunicationType = Dune::Communication<int>;
51#endif
52
53
54 static void registerParameters()
55 {
56 FlowLinearSolverParameters::registerParameters();
57 }
58
66 ISTLSolverRuntimeOptionProxy(const Simulator& simulator,
67 const FlowLinearSolverParameters& parameters,
68 bool forceSerial = false)
69 {
70 createSolver(simulator, parameters, forceSerial);
71 }
72
75 explicit ISTLSolverRuntimeOptionProxy(const Simulator& simulator)
76 {
77 createSolver(simulator);
78 }
79
80
81 void eraseMatrix() override
82 {
83 istlSolver_->eraseMatrix();
84 }
85
86 void setActiveSolver(int num) override
87 {
88 istlSolver_->setActiveSolver(num);
89 }
90
91 int numAvailableSolvers() const override
92 {
93 return istlSolver_->numAvailableSolvers();
94 }
95
96 void prepare(const SparseMatrixAdapter& M, Vector& b) override
97 {
98 istlSolver_->prepare(M, b);
99 }
100
101 void prepare(const Matrix& M, Vector& b) override
102 {
103 istlSolver_->prepare(M, b);
104 }
105
106 void setResidual(Vector& b) override
107 {
108 istlSolver_->setResidual(b);
109 }
110
111 void getResidual(Vector& b) const override
112 {
113 istlSolver_->getResidual(b);
114 }
115
116 void setMatrix(const SparseMatrixAdapter& M) override
117 {
118 istlSolver_->setMatrix(M);
119 }
120
121 bool solve(Vector& x) override
122 {
123 return istlSolver_->solve(x);
124 }
125
126 int iterations() const override
127 {
128 return istlSolver_->iterations();
129 }
130
131 const CommunicationType* comm() const override
132 {
133 return istlSolver_->comm();
134 }
135
136 int getSolveCount() const override
137 {
138 return istlSolver_->getSolveCount();
139 }
140
141private:
142 std::unique_ptr<AbstractISTLSolver<TypeTag>> istlSolver_;
143
144
145 template <class... Args>
146 void createSolver(const Simulator& simulator, Args&&... args)
147 {
148 const auto backend = Parameters::linearSolverAcceleratorTypeFromCLI();
149 if (backend == Parameters::LinearSolverAcceleratorType::CPU) {
150 // Note that for now we keep the old behavior of using the bridge solver if it is available.
151#if COMPILE_GPU_BRIDGE
152 istlSolver_ = std::make_unique<ISTLSolverGpuBridge<TypeTag>>(simulator, std::forward<Args>(args)...);
153#else
154 istlSolver_ = std::make_unique<ISTLSolver<TypeTag>>(simulator, std::forward<Args>(args)...);
155#endif
156 }
157#if HAVE_CUDA
158 else if (backend == Parameters::LinearSolverAcceleratorType::GPU) {
159 istlSolver_ = std::make_unique<gpuistl::ISTLSolverGPUISTL<TypeTag>>(simulator, std::forward<Args>(args)...);
160 }
161#endif
162 else {
163 // If we reach here, it means the backend is not supported. This could be because we have added a third backend
164 // that we need to handle. A user error would be handled in the linearSolverAcceleratorTypeFromString function called above.
165 OPM_THROW(std::invalid_argument, fmt::format("Unknown backend: {}", Parameters::toString(backend)));
166 }
167 }
168};
169} // namespace Opm
170
171#endif
Abstract interface for ISTL solvers.
Definition AbstractISTLSolver.hpp:45
ISTLSolverRuntimeOptionProxy(const Simulator &simulator, const FlowLinearSolverParameters &parameters, bool forceSerial=false)
Construct a system solver.
Definition ISTLSolverRuntimeOptionProxy.hpp:66
int numAvailableSolvers() const override
Get the number of available solvers.
Definition ISTLSolverRuntimeOptionProxy.hpp:91
void setResidual(Vector &b) override
Set the residual vector.
Definition ISTLSolverRuntimeOptionProxy.hpp:106
void getResidual(Vector &b) const override
Get the residual vector.
Definition ISTLSolverRuntimeOptionProxy.hpp:111
ISTLSolverRuntimeOptionProxy(const Simulator &simulator)
Construct a system solver.
Definition ISTLSolverRuntimeOptionProxy.hpp:75
void setActiveSolver(int num) override
Set the active solver by its index.
Definition ISTLSolverRuntimeOptionProxy.hpp:86
int getSolveCount() const override
Get the count of how many times the solver has been called.
Definition ISTLSolverRuntimeOptionProxy.hpp:136
const CommunicationType * comm() const override
Get the communication object used by the solver.
Definition ISTLSolverRuntimeOptionProxy.hpp:131
bool solve(Vector &x) override
Solve the system of equations Ax = b.
Definition ISTLSolverRuntimeOptionProxy.hpp:121
void setMatrix(const SparseMatrixAdapter &M) override
Set the matrix for the solver.
Definition ISTLSolverRuntimeOptionProxy.hpp:116
void prepare(const SparseMatrixAdapter &M, Vector &b) override
Prepare the solver with the given sparse matrix and right-hand side vector.
Definition ISTLSolverRuntimeOptionProxy.hpp:96
int iterations() const override
Get the number of iterations used in the last solve.
Definition ISTLSolverRuntimeOptionProxy.hpp:126
void eraseMatrix() override
Signals that the memory for the matrix internally in the solver could be erased.
Definition ISTLSolverRuntimeOptionProxy.hpp:81
void prepare(const Matrix &M, Vector &b) override
Prepare the solver with the given matrix and right-hand side vector.
Definition ISTLSolverRuntimeOptionProxy.hpp:101
Manages the initializing and running of time dependent problems.
Definition simulator.hh:84
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition blackoilbioeffectsmodules.hh:43
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
This class carries all parameters for the NewtonIterationBlackoilInterleaved class.
Definition FlowLinearSolverParameters.hpp:98