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
95 op.get_matrix_free().cell_loop(&THIS::solve_elementwise,
this, dst, src);
102 solve_elementwise(dealii::MatrixFree<dim, Number>
const & matrix_free,
105 std::pair<unsigned int, unsigned int>
const & cell_range)
const
107 CellIntegrator<dim, number_of_equations, Number> integrator(matrix_free,
109 op.get_quad_index());
111 unsigned int const dofs_per_cell = integrator.dofs_per_cell;
113 dealii::AlignedVector<dealii::VectorizedArray<Number>> solution(dofs_per_cell);
116 if(iterative_solver_data.solver_type == Solver::CG)
118 solver = std::make_shared<
120 dofs_per_cell, iterative_solver_data.solver_data);
122 else if(iterative_solver_data.solver_type == Solver::GMRES)
124 solver = std::make_shared<
126 dofs_per_cell, iterative_solver_data.solver_data);
130 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
134 for(
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
136 integrator.reinit(cell);
137 integrator.read_dof_values(src, 0);
140 op.setup(cell, dofs_per_cell);
141 preconditioner.setup(cell);
144 solver->solve(&op, solution.begin(), integrator.begin_dof_values(), &preconditioner);
147 for(
unsigned int j = 0; j < dofs_per_cell; ++j)
148 integrator.begin_dof_values()[j] = solution[j];
149 integrator.set_dof_values(dst, 0);
153 mutable std::shared_ptr<
154 Elementwise::SolverBase<dealii::VectorizedArray<Number>, Operator, Preconditioner>>
159 Preconditioner & preconditioner;
161 IterativeSolverData
const iterative_solver_data;