30 using SolverType = SolverT;
31 using PrecondType = PrecondT;
32 using AlgebraType = AlgebraT;
33 using MatrixType =
typename AlgebraType::MatrixType ;
34 using VectorType =
typename AlgebraType::VectorType ;
35 using ValueType =
typename AlgebraType::ValueType ;
37 AMGSolverT(AlgebraT& alg, SolverT& solver, PrecondT& precond)
50 if constexpr (
requires{m_solver.init();}) {
56 if constexpr (
requires{m_solver.start();}) {
63 void init(MatrixType
const& A) {
69 if constexpr (
requires{m_solver.end();}) {
74 bool solve(
const VectorType& b, VectorType& x)
76 auto iter = Alien::Iteration<AlgebraType>{m_algebra,b,0.,1,
nullptr} ;
77 m_solver.solve(m_precond,iter,*m_matrix,b,x) ;
81 AlgebraType& m_algebra ;
83 PrecondType& m_precond ;
85 MatrixType
const* m_matrix = nullptr ;
97 using AlgebraType = AlgebraT;
98 using MatrixType =
typename AlgebraType::MatrixType ;
99 using VectorType =
typename AlgebraType::VectorType ;
100 using ValueType =
typename AlgebraType::ValueType ;
114 KernelAMGSolverT(AlgebraT& alg, AMGSolverType* solver)
117 , m_amg_solver(solver)
123 if(m_matrix_converter==
nullptr)
126 m_def_matrix_converter =
129 m_vector_converter_from =
131 m_vector_converter_to =
142 m_amg_solver =
dynamic_cast<AMGSolverType*
>(solver_ptr->implem()) ;
144 m_amg_solver =
dynamic_cast<AMGSolverType*
>(solver) ;
145 assert(m_amg_solver) ;
154 m_def_matrix_converter =
158 m_vector_converter_from =
160 m_vector_converter_to =
164 virtual ~KernelAMGSolverT()
171 m_amg_solver->init() ;
182 if(m_solver_matrix.get()==
nullptr)
184 auto ptr =
new SolverMatrixType(m_matrix->impls()) ;
185 m_solver_matrix.reset(ptr) ;
187 if(m_matrix_converter)
188 m_matrix_converter->convert(A, *m_solver_matrix);
191 auto const& defA = m_matrix->impls()->template get<DefMatrixTagType>() ;
192 m_def_matrix_converter->convert(defA, *m_solver_matrix);
194 m_amg_solver->init(*m_solver_matrix) ;
200 m_solver_matrix.reset() ;
201 if constexpr (
requires{m_amg_solver->end();}) {
202 m_amg_solver->end() ;
206 bool solve(
const VectorType& b, VectorType& x)
208 if(m_solver_b.get()==
nullptr)
210 auto ptr =
new SolverVectorType(
nullptr) ;
211 ptr->init(AlgebraType::resource(*m_matrix) ,
true) ;
212 m_solver_b.reset(ptr) ;
214 m_vector_converter_from->convert(b, *m_solver_b);
215 if(m_solver_x.get()==
nullptr)
217 auto ptr =
new SolverVectorType(
nullptr) ;
218 ptr->init(AlgebraType::resource(*m_matrix),
true) ;
219 m_solver_x.reset(ptr) ;
221 m_solver_x->setValuesToZeros() ;
223 m_amg_solver->solve(*m_solver_b,*m_solver_x) ;
224 m_vector_converter_to->convert(*m_solver_x,x);
228 AlgebraType& m_algebra ;
229 AMGSolverType* m_amg_solver =
nullptr;
230 MatrixType
const* m_matrix = nullptr ;
231 std::unique_ptr<SolverMatrixType> m_solver_matrix;
232 std::unique_ptr<SolverVectorType> m_solver_b;
233 std::unique_ptr<SolverVectorType> m_solver_x;
234 MatrixConvType* m_matrix_converter = nullptr ;
235 DefMatrixConvType* m_def_matrix_converter = nullptr ;
236 VectorConvFromType* m_vector_converter_from = nullptr ;
237 VectorConvToType* m_vector_converter_to = nullptr ;