146 requires(OperatorType op,
147 dealii::FEEvaluation<dim, -1, 0, dim + 2, number> &fe_evaluator,
148 const dealii::FEEvaluation<dim, -1, 0, dim + 2, number> &const_fe_evaluator,
149 dealii::FEFaceEvaluation<dim, -1, 0, dim + 2, number> &fe_face_evaluator,
150 const dealii::FEFaceEvaluation<dim, -1, 0, dim + 2, number> &const_fe_face_evaluator,
151 unsigned int q_index) {
156 op.local_cell_jacobian_kernel(fe_evaluator, const_fe_evaluator, q_index);
162 op.local_face_jacobian_kernel(fe_face_evaluator,
164 const_fe_face_evaluator,
165 const_fe_face_evaluator,
172 op.local_boundary_face_jacobian_kernel(fe_face_evaluator, const_fe_face_evaluator, q_index);
196 const OperatorType &implicit_operator,
197 std::variant<dealii::LinearAlgebra::distributed::Vector<number> *,
198 dealii::TrilinosWrappers::SparseMatrix *> dst,
200 const dealii::LinearAlgebra::distributed::Vector<number> ¤t_solution,
201 const dealii::MatrixFree<dim, number> &matrix_free,
202 const unsigned int dof_idx,
203 const unsigned int quad_idx)
210 phi.reinit(delta_phi.get_cell_or_face_batch_id());
211 phi.gather_evaluate(current_solution,
212 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
213 delta_phi.evaluate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
215 for (
const unsigned int q_index : delta_phi.quadrature_point_indices())
217 implicit_operator.local_cell_jacobian_kernel(delta_phi, phi, q_index);
220 delta_phi.integrate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
236 phi_m.reinit(delta_phi_m.get_cell_or_face_batch_id());
237 phi_p.reinit(delta_phi_p.get_cell_or_face_batch_id());
238 phi_m.gather_evaluate(current_solution,
239 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
240 phi_p.gather_evaluate(current_solution,
241 dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
243 delta_phi_p.evaluate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
244 delta_phi_m.evaluate(dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients);
247 for (
const unsigned int q_index : delta_phi_m.quadrature_point_indices())
249 implicit_operator.local_face_jacobian_kernel(
250 delta_phi_m, delta_phi_p, phi_m, phi_p, q_index);
252 delta_phi_m.integrate(dealii::EvaluationFlags::values);
253 delta_phi_p.integrate(dealii::EvaluationFlags::values);
263 phi_boundary.reinit(delta_phi_boundary.get_cell_or_face_batch_id());
264 phi_boundary.gather_evaluate(current_solution,
265 dealii::EvaluationFlags::values |
266 dealii::EvaluationFlags::gradients);
267 delta_phi_boundary.evaluate(dealii::EvaluationFlags::values |
268 dealii::EvaluationFlags::gradients);
271 for (
const unsigned int q_index : delta_phi_boundary.quadrature_point_indices())
273 implicit_operator.local_boundary_face_jacobian_kernel(delta_phi_boundary,
277 delta_phi_boundary.integrate(dealii::EvaluationFlags::values);
283 dealii::MatrixFreeTools::compute_diagonal(
285 *std::get<dealii::LinearAlgebra::distributed::Vector<number> *>(dst),
294 dealii::MatrixFreeTools::compute_matrix(
296 dealii::AffineConstraints<number>(),
297 *std::get<dealii::TrilinosWrappers::SparseMatrix *>(dst),
306 DEAL_II_ASSERT_UNREACHABLE();
330 const dealii::LinearAlgebra::distributed::Vector<number> &solution)
332 using VectorizedArrayType = dealii::VectorizedArray<number>;
333 using ActiveCellIterator =
typename dealii::Triangulation<dim>::active_cell_iterator;
335 using AveragePairType =
336 std::pair<dealii::Tensor<1, n_components, number>,
337 dealii::Tensor<1, n_components, dealii::Tensor<1, dim, number>>>;
341 const auto exchange_cell_data_to_ghosts =
342 [](
const dealii::Triangulation<dim> &triangulation,
343 std::vector<AveragePairType> &cell_average_values) {
344 std::function<std::optional<AveragePairType>(
const ActiveCellIterator &)> pack =
345 [&](
const ActiveCellIterator &cell) -> std::optional<AveragePairType> {
346 return cell_average_values[cell->active_cell_index()];
348 std::function<void(
const ActiveCellIterator &,
const AveragePairType &)> unpack =
349 [&](
const ActiveCellIterator &cell,
const AveragePairType &value) {
350 cell_average_values[cell->active_cell_index()] = value;
352 dealii::GridTools::exchange_cell_data_to_ghosts(triangulation, pack, unpack);
357 const std::function<void(
const dealii::MatrixFree<dim, number, VectorizedArrayType> &,
358 std::vector<AveragePairType> &,
359 const dealii::LinearAlgebra::distributed::Vector<number> &,
360 const std::pair<unsigned int, unsigned int> &)>
361 cell_loop = [&](
const dealii::MatrixFree<dim, number, VectorizedArrayType> &matrix_free,
362 std::vector<AveragePairType> &dst_cell_average_values,
363 const dealii::LinearAlgebra::distributed::Vector<number> &src,
364 const std::pair<unsigned int, unsigned int> &cell_range) {
369 for (
unsigned int cell = cell_range.first; cell < cell_range.second; ++cell)
371 fe_cell_integrator.reinit(cell);
372 fe_cell_integrator.gather_evaluate(src,
373 dealii::EvaluationFlags::values |
374 dealii::EvaluationFlags::gradients);
378 cell_average_gradient;
379 VectorizedArrayType cell_volume = 0.;
380 for (
const unsigned int q : fe_cell_integrator.quadrature_point_indices())
382 cell_average_value += fe_cell_integrator.get_value(q) * fe_cell_integrator.JxW(q);
383 cell_average_gradient +=
384 fe_cell_integrator.get_gradient(q) * fe_cell_integrator.JxW(q);
385 cell_volume += fe_cell_integrator.JxW(q);
387 cell_average_value /= cell_volume;
388 for (
unsigned int c = 0; c < n_components; ++c)
389 cell_average_gradient[c] /= cell_volume;
393 for (
unsigned int lane = 0; lane < mf_context.
mf.n_active_entries_per_cell_batch(cell);
396 for (
unsigned int c = 0; c < n_components; ++c)
398 dst_cell_average_values[cells[lane]->active_cell_index()].first[c] =
399 cell_average_value[c][lane];
400 for (
unsigned int d = 0; d < dim; ++d)
402 dst_cell_average_values[cells[lane]->active_cell_index()].second[c][d] =
403 cell_average_gradient[c][d][lane];
410 std::vector<AveragePairType> cell_average_values(
411 mf_context.
mf.get_dof_handler(mf_context.
dof_idx).get_triangulation().n_active_cells());
412 mf_context.
mf.cell_loop(cell_loop, cell_average_values, solution);
414 exchange_cell_data_to_ghosts(
415 mf_context.
mf.get_dof_handler(mf_context.
dof_idx).get_triangulation(), cell_average_values);
417 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:328
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:195
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