63 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
65 typedef IterativeSolver<dim, number_of_equations, Number, Operator, Preconditioner> THIS;
67 IterativeSolver(Operator & operator_in,
68 Preconditioner & preconditioner_in,
70 : op(operator_in), preconditioner(preconditioner_in), iterative_solver_data(solver_data_in)
74 virtual ~IterativeSolver()
79 update_preconditioner(
bool const update_preconditioner)
const override
81 if(preconditioner.needs_update() or update_preconditioner)
83 preconditioner.update();
91 solve(VectorType & dst, VectorType
const & src)
const override
93 op.get_matrix_free().cell_loop(&THIS::solve_elementwise,
this, dst, src);
100 solve_elementwise(dealii::MatrixFree<dim, Number>
const & matrix_free,
103 std::pair<unsigned int, unsigned int>
const & cell_range)
const
105 CellIntegrator<dim, number_of_equations, Number> integrator(matrix_free,
107 op.get_quad_index());
109 unsigned int const dofs_per_cell = integrator.dofs_per_cell;
111 dealii::AlignedVector<dealii::VectorizedArray<Number>> solution(
112 dofs_per_cell, dealii::make_vectorized_array<Number>(0.0));
115 if(iterative_solver_data.solver_type == Solver::CG)
117 solver = std::make_shared<
119 dofs_per_cell, iterative_solver_data.solver_data);
121 else if(iterative_solver_data.solver_type == Solver::GMRES)
123 solver = std::make_shared<
125 dofs_per_cell, iterative_solver_data.solver_data);
129 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
133 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
135 integrator.reinit(cell);
136 integrator.read_dof_values(src, 0);
139 op.setup(cell, dofs_per_cell);
140 preconditioner.setup(cell);
143 solver->solve(&op, solution.begin(), integrator.begin_dof_values(), &preconditioner);
146 for(
unsigned int j = 0; j < dofs_per_cell; ++j)
147 integrator.begin_dof_values()[j] = solution[j];
148 integrator.set_dof_values(dst, 0);
152 mutable std::shared_ptr<
153 Elementwise::SolverBase<dealii::VectorizedArray<Number>, Operator, Preconditioner>>
158 Preconditioner & preconditioner;
160 IterativeSolverData
const iterative_solver_data;