44class DistributedPreconditionedSolver
48 typename IterativeSolver::BackendType,
49 typename Precond::BackendType>::value,
50 "Backends for preconditioner and iterative solver should be compatible");
54 typedef typename IterativeSolver::BackendType backend_type;
55 using BackendType = backend_type;
57 typedef typename backend_type::value_type value_type;
58 typedef typename backend_type::params backend_params;
59 typedef typename BuiltinBackend<value_type>::matrix build_matrix;
60 typedef typename math::scalar_of<value_type>::type scalar_type;
65 typename IterativeSolver::params
solver;
70 : ARCCORE_ALINA_PARAMS_IMPORT_CHILD(p, precond)
71 , ARCCORE_ALINA_PARAMS_IMPORT_CHILD(p, solver)
73 p.check_params({
"precond",
"solver" });
76 void get(PropertyTree& p,
const std::string& path =
"")
const
78 ARCCORE_ALINA_PARAMS_EXPORT_CHILD(p, path,
precond);
79 ARCCORE_ALINA_PARAMS_EXPORT_CHILD(p, path,
solver);
83 template <
class Matrix>
84 DistributedPreconditionedSolver(mpi_communicator comm,
const Matrix& A,
86 const backend_params& bprm = backend_params())
88 , n(backend::nbRow(A))
89 , P(comm, A, prm.precond, bprm)
90 , S(backend::nbRow(A), prm.solver, bprm, DistributedInnerProduct(comm))
93 DistributedPreconditionedSolver(mpi_communicator comm,
94 std::shared_ptr<matrix> A,
96 const backend_params& bprm = backend_params())
99 , P(comm, A, prm.precond, bprm)
100 , S(n, prm.solver, bprm, DistributedInnerProduct(comm))
104 template <
class Backend>
105 DistributedPreconditionedSolver(mpi_communicator comm,
106 std::shared_ptr<DistributedMatrix<Backend>> A,
108 const backend_params& bprm = backend_params())
111 , P(comm, std::make_shared<matrix>(*A), prm.precond, bprm)
112 , S(n, prm.solver, bprm, DistributedInnerProduct(comm))
114 A->move_to_backend(bprm);
117 DistributedPreconditionedSolver(mpi_communicator comm, std::shared_ptr<build_matrix> A,
119 const backend_params& bprm = backend_params())
121 , n(backend::nbRow(*A))
122 , P(comm, A, prm.precond, bprm)
123 , S(backend::nbRow(*A), prm.solver, bprm, DistributedInnerProduct(comm))
126 template <
class Matrix,
class Vec1,
class Vec2>
127 SolverResult operator()(
const Matrix& A,
const Vec1& rhs, Vec2&& x)
const
129 return S(A, P, rhs, x);
132 template <
class Vec1,
class Vec2>
133 SolverResult operator()(
const Vec1& rhs, Vec2&& x)
const
138 template <
class Vec1,
class Vec2>
139 void apply(
const Vec1& rhs, Vec2&& x)
const
145 const Precond& precond()
const
155 const IterativeSolver& solver()
const
160 std::shared_ptr<matrix> system_matrix_ptr()
const
162 return P.system_matrix_ptr();
165 const matrix& system_matrix()
const
167 return P.system_matrix();
170 void get_params(Alina::PropertyTree& p)
const
180 friend std::ostream& operator<<(std::ostream& os,
const DistributedPreconditionedSolver& M)
182 return os << M.S << std::endl