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(
const AlinaContext& context,
85 AlinaCommunicator comm,
const Matrix& A,
87 const backend_params& bprm = backend_params())
89 , n(backend::nbRow(A))
90 , P(context, comm, A, prm.precond, bprm)
91 , S(context, backend::nbRow(A), prm.solver, bprm, DistributedInnerProduct(comm))
94 DistributedPreconditionedSolver(
const AlinaContext& context,
95 AlinaCommunicator comm,
96 std::shared_ptr<matrix> A,
98 const backend_params& bprm = backend_params())
101 , P(context, comm, A, prm.precond, bprm)
102 , S(context, n, prm.solver, bprm, DistributedInnerProduct(comm))
106 template <
class Backend>
107 DistributedPreconditionedSolver(
const AlinaContext& context,
108 AlinaCommunicator comm,
109 std::shared_ptr<DistributedMatrix<Backend>> A,
111 const backend_params& bprm = backend_params())
114 , P(context, comm, std::make_shared<matrix>(*A), prm.precond, bprm)
115 , S(context, n, prm.solver, bprm, DistributedInnerProduct(comm))
117 A->move_to_backend(bprm);
120 DistributedPreconditionedSolver(
const AlinaContext& context,
121 AlinaCommunicator comm,
122 std::shared_ptr<build_matrix> A,
124 const backend_params& bprm = backend_params())
126 , n(backend::nbRow(*A))
127 , P(comm, A, prm.precond, bprm)
128 , S(context, backend::nbRow(*A), prm.solver, bprm, DistributedInnerProduct(comm))
131 template <
class Matrix,
class Vec1,
class Vec2>
132 SolverResult operator()(
const Matrix& A,
const Vec1& rhs, Vec2&& x)
const
134 return S(A, P, rhs, x);
137 template <
class Vec1,
class Vec2>
138 SolverResult operator()(
const Vec1& rhs, Vec2&& x)
const
143 template <
class Vec1,
class Vec2>
144 void apply(
const Vec1& rhs, Vec2&& x)
const
150 const Precond& precond()
const
160 const IterativeSolver& solver()
const
165 std::shared_ptr<matrix> system_matrix_ptr()
const
167 return P.system_matrix_ptr();
170 const matrix& system_matrix()
const
172 return P.system_matrix();
175 void get_params(Alina::PropertyTree& p)
const
185 friend std::ostream& operator<<(std::ostream& os,
const DistributedPreconditionedSolver& M)
187 return os << M.S << std::endl