97 requires(OperatorType op,
98 dealii::FEEvaluation<dim, -1, 0, dim + 2, number> &fe_evaluator,
99 const dealii::FEEvaluation<dim, -1, 0, dim + 2, number> &const_fe_evaluator,
100 dealii::FEFaceEvaluation<dim, -1, 0, dim + 2, number> &fe_face_evaluator,
101 const dealii::FEFaceEvaluation<dim, -1, 0, dim + 2, number> &const_fe_face_evaluator,
102 unsigned int q_index) {
107 op.local_cell_jacobian_kernel(fe_evaluator, const_fe_evaluator, q_index);
113 op.local_face_jacobian_kernel(fe_face_evaluator,
115 const_fe_face_evaluator,
116 const_fe_face_evaluator,
123 op.local_boundary_face_jacobian_kernel(fe_face_evaluator, const_fe_face_evaluator, q_index);
147 const OperatorType &implicit_operator,
148 std::variant<dealii::LinearAlgebra::distributed::Vector<number> *,
149 dealii::TrilinosWrappers::SparseMatrix *> dst,
151 const dealii::LinearAlgebra::distributed::Vector<number> ¤t_solution,
152 const dealii::MatrixFree<dim, number> &matrix_free,
153 const unsigned int dof_idx,
154 const unsigned int quad_idx)
161 phi.reinit(delta_phi.get_cell_or_face_batch_id());
162 phi.gather_evaluate(current_solution,
163 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
164 delta_phi.evaluate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
166 for (
const unsigned int q_index : delta_phi.quadrature_point_indices())
168 implicit_operator.local_cell_jacobian_kernel(delta_phi, phi, q_index);
171 delta_phi.integrate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
187 phi_m.reinit(delta_phi_m.get_cell_or_face_batch_id());
188 phi_p.reinit(delta_phi_p.get_cell_or_face_batch_id());
189 phi_m.gather_evaluate(current_solution,
190 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
191 phi_p.gather_evaluate(current_solution,
192 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
194 delta_phi_p.evaluate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
195 delta_phi_m.evaluate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
198 for (
const unsigned int q_index : delta_phi_m.quadrature_point_indices())
200 implicit_operator.local_face_jacobian_kernel(
201 delta_phi_m, delta_phi_p, phi_m, phi_p, q_index);
203 delta_phi_m.integrate(dealii::EvaluationFlags::values);
204 delta_phi_p.integrate(dealii::EvaluationFlags::values);
214 phi_boundary.reinit(delta_phi_boundary.get_cell_or_face_batch_id());
215 phi_boundary.gather_evaluate(current_solution,
216 dealii::EvaluationFlags::values |
217 dealii::EvaluationFlags::gradients);
218 delta_phi_boundary.evaluate(dealii::EvaluationFlags::values |
219 dealii::EvaluationFlags::gradients);
222 for (
const unsigned int q_index : delta_phi_boundary.quadrature_point_indices())
224 implicit_operator.local_boundary_face_jacobian_kernel(delta_phi_boundary,
228 delta_phi_boundary.integrate(dealii::EvaluationFlags::values);
234 dealii::MatrixFreeTools::compute_diagonal(
236 *std::get<dealii::LinearAlgebra::distributed::Vector<number> *>(dst),
245 dealii::MatrixFreeTools::compute_matrix(
247 dealii::AffineConstraints<number>(),
248 *std::get<dealii::TrilinosWrappers::SparseMatrix *>(dst),
257 DEAL_II_ASSERT_UNREACHABLE();
281 const dealii::LinearAlgebra::distributed::Vector<number> &solution)
283 using VectorizedArrayType = dealii::VectorizedArray<number>;
284 using ActiveCellIterator =
typename dealii::Triangulation<dim>::active_cell_iterator;
286 using AveragePairType =
287 std::pair<dealii::Tensor<1, n_components, number>,
288 dealii::Tensor<1, n_components, dealii::Tensor<1, dim, number>>>;
292 const auto exchange_cell_data_to_ghosts =
293 [](
const dealii::Triangulation<dim> &triangulation,
294 std::vector<AveragePairType> &cell_average_values) {
295 std::function<std::optional<AveragePairType>(
const ActiveCellIterator &)> pack =
296 [&](
const ActiveCellIterator &cell) -> std::optional<AveragePairType> {
297 return cell_average_values[cell->active_cell_index()];
299 std::function<void(
const ActiveCellIterator &,
const AveragePairType &)> unpack =
300 [&](
const ActiveCellIterator &cell,
const AveragePairType &value) {
301 cell_average_values[cell->active_cell_index()] = value;
303 dealii::GridTools::exchange_cell_data_to_ghosts(triangulation, pack, unpack);
308 const std::function<void(
const dealii::MatrixFree<dim, number, VectorizedArrayType> &,
309 std::vector<AveragePairType> &,
310 const dealii::LinearAlgebra::distributed::Vector<number> &,
311 const std::pair<unsigned int, unsigned int> &)>
312 cell_loop = [&](
const dealii::MatrixFree<dim, number, VectorizedArrayType> &matrix_free,
313 std::vector<AveragePairType> &dst_cell_average_values,
314 const dealii::LinearAlgebra::distributed::Vector<number> &src,
315 const std::pair<unsigned int, unsigned int> &cell_range) {
320 for (
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
322 fe_cell_integrator.reinit(cell);
323 fe_cell_integrator.gather_evaluate(src,
324 dealii::EvaluationFlags::values |
325 dealii::EvaluationFlags::gradients);
329 cell_average_gradient;
330 VectorizedArrayType cell_volume = 0.;
331 for (
const unsigned int q : fe_cell_integrator.quadrature_point_indices())
333 cell_average_value += fe_cell_integrator.get_value(q) * fe_cell_integrator.JxW(q);
334 cell_average_gradient +=
335 fe_cell_integrator.get_gradient(q) * fe_cell_integrator.JxW(q);
336 cell_volume += fe_cell_integrator.JxW(q);
338 cell_average_value /= cell_volume;
339 for (
unsigned int c = 0; c < n_components; ++c)
340 cell_average_gradient[c] /= cell_volume;
344 for (
unsigned int lane = 0; lane < mf_context.
mf.n_active_entries_per_cell_batch(cell);
347 for (
unsigned int c = 0; c < n_components; ++c)
349 dst_cell_average_values[cells[lane]->active_cell_index()].first[c] =
350 cell_average_value[c][lane];
351 for (
unsigned int d = 0; d < dim; ++d)
353 dst_cell_average_values[cells[lane]->active_cell_index()].second[c][d] =
354 cell_average_gradient[c][d][lane];
361 std::vector<AveragePairType> cell_average_values(
362 mf_context.
mf.get_dof_handler(mf_context.
dof_idx).get_triangulation().n_active_cells());
363 mf_context.
mf.cell_loop(cell_loop, cell_average_values, solution);
365 exchange_cell_data_to_ghosts(
366 mf_context.
mf.get_dof_handler(mf_context.
dof_idx).get_triangulation(), cell_average_values);
368 return cell_average_values;
std::vector< std::pair< dealii::Tensor< 1, n_components, number >, dealii::Tensor< 1, n_components, dealii::Tensor< 1, dim, number > > > > compute_cell_average_quantities(const MatrixFreeContext< dim, number > &mf_context, const dealii::LinearAlgebra::distributed::Vector< number > &solution)
Definition matrix_free_util.hpp:279
void compute_jacobian_matrix_representation(const OperatorType &implicit_operator, std::variant< dealii::LinearAlgebra::distributed::Vector< number > *, dealii::TrilinosWrappers::SparseMatrix * > dst, const MatrixRepresentationType type, const dealii::LinearAlgebra::distributed::Vector< number > ¤t_solution, const dealii::MatrixFree< dim, number > &matrix_free, const unsigned int dof_idx, const unsigned int quad_idx)
Definition matrix_free_util.hpp:146
Definition matrix_free_util.hpp:21
unsigned int quad_idx
Definition matrix_free_util.hpp:24
const dealii::MatrixFree< dim, Number > & mf
Definition matrix_free_util.hpp:22
unsigned int dof_idx
Definition matrix_free_util.hpp:23