116 typedef CellIntegrator<dim, n_components, Number> Integrator;
119 JacobiPreconditioner(dealii::MatrixFree<dim, Number>
const & matrix_free,
120 unsigned int const dof_index,
121 unsigned int const quad_index,
122 Operator
const & underlying_operator_in,
123 bool const initialize)
124 : underlying_operator(underlying_operator_in)
126 integrator = std::make_shared<Integrator>(matrix_free, dof_index, quad_index);
128 underlying_operator.initialize_dof_vector(global_inverse_diagonal);
137 setup(
unsigned int cell)
final
139 integrator->reinit(cell);
140 integrator->read_dof_values(global_inverse_diagonal, 0);
146 underlying_operator.calculate_inverse_diagonal(global_inverse_diagonal);
148 this->update_needed =
false;
155 vmult(dealii::VectorizedArray<Number> * dst,
156 dealii::VectorizedArray<Number>
const * src)
const final
158 for(
unsigned int i = 0; i < integrator->dofs_per_cell; ++i)
160 dst[i] = integrator->begin_dof_values()[i] * src[i];
165 std::shared_ptr<Integrator> integrator;
167 Operator
const & underlying_operator;
169 dealii::LinearAlgebra::distributed::Vector<Number> global_inverse_diagonal;
178class InverseMassPreconditioner
182 typedef CellIntegrator<dim, n_components, Number> Integrator;
185 typedef dealii::MatrixFreeOperators::CellwiseInverseMassMatrix<dim, -1, n_components, Number>
188 InverseMassPreconditioner(dealii::MatrixFree<dim, Number>
const & matrix_free,
189 unsigned int const dof_index,
190 unsigned int const quad_index)
192 integrator = std::make_shared<Integrator>(matrix_free, dof_index, quad_index);
193 inverse = std::make_shared<CellwiseInverseMass>(*integrator);
195 dealii::FiniteElement<dim>
const & fe = matrix_free.get_dof_handler(dof_index).get_fe();
199 fe.conforms(dealii::FiniteElementData<dim>::L2),
201 "The elementwise inverse mass preconditioner is only implemented for DG (L2-conforming) elements."));
206 fe.base_element(0).dofs_per_cell == dealii::Utilities::pow(fe.degree + 1, dim),
208 "The elementwise inverse mass preconditioner is only implemented for tensor-product DG elements."));
213 matrix_free.get_shape_info(0, quad_index).data[0].n_q_points_1d == fe.degree + 1,
215 "The elementwise inverse mass preconditioner is only available if n_q_points_1d = n_nodes_1d."));
217 this->update_needed =
false;
221 setup(
unsigned int const cell)
final
223 integrator->reinit(cell);
237 vmult(dealii::VectorizedArray<Number> * dst,
238 dealii::VectorizedArray<Number>
const * src)
const final
240 inverse->apply(src, dst);
244 std::shared_ptr<Integrator> integrator;
246 std::shared_ptr<CellwiseInverseMass> inverse;