189 const bool function_describes_relative_displacement)
199 std::vector<Point<spacedim>> points;
201 const auto mapping_q =
204 if (mapping_q !=
nullptr && this->get_degree() == mapping_q->get_degree())
213 auto &fe_values = fe_values_all.
get();
214 if (fe_values.get() ==
nullptr)
219 std::vector<Point<dim>> quadrature_points;
221 FETools::hierarchic_to_lexicographic_numbering<dim>(
222 this->polynomial_degree))
223 quadrature_points.push_back(quadrature_gl.point(i));
226 fe_values = std::make_unique<FEValues<dim, spacedim>>(
230 fe_values->reinit(cell);
231 points = fe_values->get_quadrature_points();
234 for (
auto &p : points)
235 if (function_describes_relative_displacement)
236 p += transformation_function(cell, p);
238 p = transformation_function(cell, p);
243 uses_level_info =
true;
298 const VectorType &vector,
299 const bool vector_describes_relative_displacement)
306 const unsigned int is_fe_q =
308 const unsigned int is_fe_dgq =
311 const auto lexicographic_to_hierarchic_numbering =
313 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
314 this->get_degree()));
320 const IndexSet locally_relevant_dofs =
323 locally_relevant_dofs,
325 copy_locally_owned_data_from(vector, vector_ghosted);
336 const bool interpolation_of_values_is_needed =
337 ((is_fe_q || is_fe_dgq) && fe.
degree == this->get_degree()) ==
false;
344 const bool is_active_non_artificial_cell =
345 (cell_tria->is_active() == true) &&
346 (cell_tria->is_artificial() == false);
348 const typename DoFHandler<dim, spacedim>::cell_iterator cell_dofs(
349 &cell_tria->get_triangulation(),
354 const auto mapping_q =
355 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
359 ((vector_describes_relative_displacement ||
360 (is_active_non_artificial_cell == false)) &&
361 ((mapping_q != nullptr &&
362 this->get_degree() == mapping_q->get_degree()) ==
365 (is_active_non_artificial_cell && interpolation_of_values_is_needed) )
370 auto &fe_values = fe_values_all.get();
371 if (fe_values.get() == nullptr)
373 const QGaussLobatto<dim> quadrature_gl(this->polynomial_degree +
376 std::vector<Point<dim>> quadrature_points;
378 FETools::hierarchic_to_lexicographic_numbering<dim>(
379 this->polynomial_degree))
380 quadrature_points.push_back(quadrature_gl.point(i));
381 const Quadrature<dim> quadrature(quadrature_points);
383 fe_values = std::make_unique<FEValues<dim, spacedim>>(
385 interpolation_of_values_is_needed ?
387 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
389 update_quadrature_points | update_values);
392 if (interpolation_of_values_is_needed)
393 fe_values->reinit(cell_dofs);
395 fe_values->reinit(cell_tria);
403 if (vector_describes_relative_displacement ||
404 is_active_non_artificial_cell ==
false)
406 if (mapping_q !=
nullptr &&
407 this->get_degree() == mapping_q->get_degree())
408 result = mapping_q->compute_mapping_support_points(cell_tria);
410 result = fe_values_all.
get()->get_quadrature_points();
415 if (is_active_non_artificial_cell ==
false)
421 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
425 if (interpolation_of_values_is_needed ==
false)
429 std::vector<types::global_dof_index> dof_indices(
431 cell_dofs->get_dof_indices(dof_indices);
433 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
440 if (vector_describes_relative_displacement)
441 result[
id.second][
id.first] +=
442 vector_ghosted(dof_indices[i]);
444 result[
id.second][
id.first] =
445 vector_ghosted(dof_indices[i]);
450 if (vector_describes_relative_displacement)
451 result[lexicographic_to_hierarchic_numbering[
id.second]]
452 [
id.first] += vector_ghosted(dof_indices[i]);
454 result[lexicographic_to_hierarchic_numbering[
id.second]]
455 [
id.first] = vector_ghosted(dof_indices[i]);
465 auto &fe_values = fe_values_all.
get();
467 std::vector<Vector<typename VectorType::value_type>> values(
468 fe_values->n_quadrature_points,
471 fe_values->get_function_values(vector_ghosted, values);
473 for (
unsigned int q = 0; q < fe_values->n_quadrature_points; ++q)
474 for (
unsigned int c = 0; c < spacedim; ++c)
475 if (vector_describes_relative_displacement)
476 result[q][c] += values[q][c];
478 result[q][c] = values[q][c];
484 uses_level_info =
false;
496 const bool vector_describes_relative_displacement)
506 const unsigned int is_fe_q =
508 const unsigned int is_fe_dgq =
511 const auto lexicographic_to_hierarchic_numbering =
513 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
514 this->get_degree()));
524 const IndexSet locally_relevant_dofs =
527 locally_relevant_dofs,
529 copy_locally_owned_data_from(vectors[l], vectors_ghosted[l]);
530 vectors_ghosted[l].update_ghost_values();
541 const bool interpolation_of_values_is_needed =
542 ((is_fe_q || is_fe_dgq) && fe.
degree == this->get_degree()) ==
false;
549 const bool is_non_artificial_cell =
550 cell_tria->level_subdomain_id() != numbers::artificial_subdomain_id;
552 const typename DoFHandler<dim, spacedim>::level_cell_iterator cell_dofs(
553 &cell_tria->get_triangulation(),
558 const auto mapping_q =
559 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
563 ((vector_describes_relative_displacement ||
564 (is_non_artificial_cell == false)) &&
565 ((mapping_q != nullptr &&
566 this->get_degree() == mapping_q->get_degree()) ==
569 (is_non_artificial_cell == true && interpolation_of_values_is_needed) )
574 auto &fe_values = fe_values_all.get();
575 if (fe_values.get() == nullptr)
577 const QGaussLobatto<dim> quadrature_gl(this->polynomial_degree +
580 std::vector<Point<dim>> quadrature_points;
582 FETools::hierarchic_to_lexicographic_numbering<dim>(
583 this->polynomial_degree))
584 quadrature_points.push_back(quadrature_gl.point(i));
585 const Quadrature<dim> quadrature(quadrature_points);
587 fe_values = std::make_unique<FEValues<dim, spacedim>>(
589 interpolation_of_values_is_needed ?
591 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
593 update_quadrature_points | update_values);
596 if (interpolation_of_values_is_needed)
597 fe_values->reinit(cell_dofs);
599 fe_values->reinit(cell_tria);
607 if (vector_describes_relative_displacement ||
608 (is_non_artificial_cell ==
false))
610 if (mapping_q !=
nullptr &&
611 this->get_degree() == mapping_q->get_degree())
612 result = mapping_q->compute_mapping_support_points(cell_tria);
614 result = fe_values_all.
get()->get_quadrature_points();
619 if (is_non_artificial_cell ==
false)
625 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
629 if (interpolation_of_values_is_needed ==
false)
633 std::vector<types::global_dof_index> dof_indices(
635 cell_dofs->get_mg_dof_indices(dof_indices);
637 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
644 if (vector_describes_relative_displacement)
645 result[
id.second][
id.first] +=
646 vectors_ghosted[cell_tria->level()](dof_indices[i]);
648 result[
id.second][
id.first] =
649 vectors_ghosted[cell_tria->level()](dof_indices[i]);
654 if (vector_describes_relative_displacement)
655 result[lexicographic_to_hierarchic_numbering[
id.second]]
657 vectors_ghosted[cell_tria->level()](dof_indices[i]);
659 result[lexicographic_to_hierarchic_numbering[
id.second]]
661 vectors_ghosted[cell_tria->level()](dof_indices[i]);
671 auto &fe_values = fe_values_all.
get();
673 std::vector<types::global_dof_index> dof_indices(
675 cell_dofs->get_mg_dof_indices(dof_indices);
677 std::vector<typename VectorType::value_type> dof_values(
681 dof_values[i] = vectors_ghosted[cell_tria->level()](dof_indices[i]);
683 for (
unsigned int c = 0; c < spacedim; ++c)
685 for (
unsigned int q = 0; q < fe_values->n_quadrature_points; ++q)
686 if (vector_describes_relative_displacement ==
false && i == 0)
688 dof_values[i] * fe_values->shape_value_component(i, q, c);
691 dof_values[i] * fe_values->shape_value_component(i, q, c);
697 uses_level_info =
true;