184 const bool function_describes_relative_displacement)
194 std::vector<Point<spacedim>> points;
196 const auto mapping_q =
199 if (mapping_q !=
nullptr && this->get_degree() == mapping_q->get_degree())
208 auto &fe_values = fe_values_all.
get();
209 if (fe_values.get() ==
nullptr)
213 std::vector<Point<dim>> quadrature_points;
215 FETools::hierarchic_to_lexicographic_numbering<dim>(
216 this->polynomial_degree))
217 quadrature_points.push_back(quadrature_gl.point(i));
220 fe_values = std::make_unique<FEValues<dim, spacedim>>(
224 fe_values->reinit(cell);
225 points = fe_values->get_quadrature_points();
228 for (
auto &p : points)
229 if (function_describes_relative_displacement)
230 p += transformation_function(cell, p);
232 p = transformation_function(cell, p);
237 uses_level_info =
true;
292 const VectorType &vector,
293 const bool vector_describes_relative_displacement)
300 const unsigned int is_fe_q =
302 const unsigned int is_fe_dgq =
305 const auto lexicographic_to_hierarchic_numbering =
307 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
308 this->get_degree()));
314 const IndexSet locally_relevant_dofs =
317 locally_relevant_dofs,
319 copy_locally_owned_data_from(vector, vector_ghosted);
330 const bool interpolation_of_values_is_needed =
331 ((is_fe_q || is_fe_dgq) && fe.
degree == this->get_degree()) ==
false;
338 const bool is_active_non_artificial_cell =
339 (cell_tria->is_active() == true) &&
340 (cell_tria->is_artificial() == false);
342 const typename DoFHandler<dim, spacedim>::cell_iterator cell_dofs(
343 &cell_tria->get_triangulation(),
348 const auto mapping_q =
349 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
353 ((vector_describes_relative_displacement ||
354 (is_active_non_artificial_cell == false)) &&
355 ((mapping_q != nullptr &&
356 this->get_degree() == mapping_q->get_degree()) ==
359 (is_active_non_artificial_cell && interpolation_of_values_is_needed) )
364 auto &fe_values = fe_values_all.get();
365 if (fe_values.get() == nullptr)
367 QGaussLobatto<dim> quadrature_gl(this->polynomial_degree + 1);
369 std::vector<Point<dim>> quadrature_points;
371 FETools::hierarchic_to_lexicographic_numbering<dim>(
372 this->polynomial_degree))
373 quadrature_points.push_back(quadrature_gl.point(i));
374 Quadrature<dim> quadrature(quadrature_points);
376 fe_values = std::make_unique<FEValues<dim, spacedim>>(
378 interpolation_of_values_is_needed ?
380 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
382 update_quadrature_points | update_values);
385 if (interpolation_of_values_is_needed)
386 fe_values->reinit(cell_dofs);
388 fe_values->reinit(cell_tria);
396 if (vector_describes_relative_displacement ||
397 is_active_non_artificial_cell ==
false)
399 if (mapping_q !=
nullptr &&
400 this->get_degree() == mapping_q->get_degree())
401 result = mapping_q->compute_mapping_support_points(cell_tria);
403 result = fe_values_all.
get()->get_quadrature_points();
408 if (is_active_non_artificial_cell ==
false)
414 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
418 if (interpolation_of_values_is_needed ==
false)
422 std::vector<types::global_dof_index> dof_indices(
424 cell_dofs->get_dof_indices(dof_indices);
426 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
433 if (vector_describes_relative_displacement)
434 result[
id.second][
id.first] +=
435 vector_ghosted(dof_indices[i]);
437 result[
id.second][
id.first] =
438 vector_ghosted(dof_indices[i]);
443 if (vector_describes_relative_displacement)
444 result[lexicographic_to_hierarchic_numbering[
id.second]]
445 [
id.first] += vector_ghosted(dof_indices[i]);
447 result[lexicographic_to_hierarchic_numbering[
id.second]]
448 [
id.first] = vector_ghosted(dof_indices[i]);
458 auto &fe_values = fe_values_all.
get();
460 std::vector<Vector<typename VectorType::value_type>> values(
461 fe_values->n_quadrature_points,
464 fe_values->get_function_values(vector_ghosted, values);
466 for (
unsigned int q = 0; q < fe_values->n_quadrature_points; ++q)
467 for (
unsigned int c = 0; c < spacedim; ++c)
468 if (vector_describes_relative_displacement)
469 result[q][c] += values[q][c];
471 result[q][c] = values[q][c];
477 uses_level_info =
false;
489 const bool vector_describes_relative_displacement)
499 const unsigned int is_fe_q =
501 const unsigned int is_fe_dgq =
504 const auto lexicographic_to_hierarchic_numbering =
506 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
507 this->get_degree()));
517 const IndexSet locally_relevant_dofs =
520 locally_relevant_dofs,
522 copy_locally_owned_data_from(vectors[l], vectors_ghosted[l]);
523 vectors_ghosted[l].update_ghost_values();
534 const bool interpolation_of_values_is_needed =
535 ((is_fe_q || is_fe_dgq) && fe.
degree == this->get_degree()) ==
false;
542 const bool is_non_artificial_cell =
543 cell_tria->level_subdomain_id() != numbers::artificial_subdomain_id;
545 const typename DoFHandler<dim, spacedim>::level_cell_iterator cell_dofs(
546 &cell_tria->get_triangulation(),
551 const auto mapping_q =
552 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
556 ((vector_describes_relative_displacement ||
557 (is_non_artificial_cell == false)) &&
558 ((mapping_q != nullptr &&
559 this->get_degree() == mapping_q->get_degree()) ==
562 (is_non_artificial_cell == true && interpolation_of_values_is_needed) )
567 auto &fe_values = fe_values_all.get();
568 if (fe_values.get() == nullptr)
570 QGaussLobatto<dim> quadrature_gl(this->polynomial_degree + 1);
572 std::vector<Point<dim>> quadrature_points;
574 FETools::hierarchic_to_lexicographic_numbering<dim>(
575 this->polynomial_degree))
576 quadrature_points.push_back(quadrature_gl.point(i));
577 Quadrature<dim> quadrature(quadrature_points);
579 fe_values = std::make_unique<FEValues<dim, spacedim>>(
581 interpolation_of_values_is_needed ?
583 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
585 update_quadrature_points | update_values);
588 if (interpolation_of_values_is_needed)
589 fe_values->reinit(cell_dofs);
591 fe_values->reinit(cell_tria);
599 if (vector_describes_relative_displacement ||
600 (is_non_artificial_cell ==
false))
602 if (mapping_q !=
nullptr &&
603 this->get_degree() == mapping_q->get_degree())
604 result = mapping_q->compute_mapping_support_points(cell_tria);
606 result = fe_values_all.
get()->get_quadrature_points();
611 if (is_non_artificial_cell ==
false)
617 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
621 if (interpolation_of_values_is_needed ==
false)
625 std::vector<types::global_dof_index> dof_indices(
627 cell_dofs->get_mg_dof_indices(dof_indices);
629 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
636 if (vector_describes_relative_displacement)
637 result[
id.second][
id.first] +=
638 vectors_ghosted[cell_tria->level()](dof_indices[i]);
640 result[
id.second][
id.first] =
641 vectors_ghosted[cell_tria->level()](dof_indices[i]);
646 if (vector_describes_relative_displacement)
647 result[lexicographic_to_hierarchic_numbering[
id.second]]
649 vectors_ghosted[cell_tria->level()](dof_indices[i]);
651 result[lexicographic_to_hierarchic_numbering[
id.second]]
653 vectors_ghosted[cell_tria->level()](dof_indices[i]);
663 auto &fe_values = fe_values_all.
get();
665 std::vector<types::global_dof_index> dof_indices(
667 cell_dofs->get_mg_dof_indices(dof_indices);
669 std::vector<typename VectorType::value_type> dof_values(
673 dof_values[i] = vectors_ghosted[cell_tria->level()](dof_indices[i]);
675 for (
unsigned int c = 0; c < spacedim; ++c)
677 for (
unsigned int q = 0; q < fe_values->n_quadrature_points; ++q)
678 if (vector_describes_relative_displacement ==
false && i == 0)
680 dof_values[i] * fe_values->shape_value_component(i, q, c);
683 dof_values[i] * fe_values->shape_value_component(i, q, c);
689 uses_level_info =
true;