305 const VectorType & vector,
318 const auto lexicographic_to_hierarchic_numbering =
320 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
321 this->get_degree()));
331 dof_handler.get_communicator());
348 dof_handler.get_triangulation(),
351 const bool is_active_non_artificial_cell =
352 (cell_tria->is_active() == true) &&
353 (cell_tria->is_artificial() == false);
355 const typename DoFHandler<dim, spacedim>::cell_iterator cell_dofs(
356 &cell_tria->get_triangulation(),
361 const auto mapping_q =
362 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
366 ((vector_describes_relative_displacement ||
367 (is_active_non_artificial_cell == false)) &&
368 ((mapping_q != nullptr &&
369 this->get_degree() == mapping_q->get_degree()) ==
372 (is_active_non_artificial_cell && interpolation_of_values_is_needed) )
377 auto &fe_values = fe_values_all.get();
378 if (fe_values.get() == nullptr)
380 QGaussLobatto<dim> quadrature_gl(this->polynomial_degree + 1);
382 std::vector<Point<dim>> quadrature_points;
384 FETools::hierarchic_to_lexicographic_numbering<dim>(
385 this->polynomial_degree))
386 quadrature_points.push_back(quadrature_gl.point(i));
387 Quadrature<dim> quadrature(quadrature_points);
389 fe_values = std::make_unique<FEValues<dim, spacedim>>(
391 interpolation_of_values_is_needed ?
393 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
395 update_quadrature_points | update_values);
398 if (interpolation_of_values_is_needed)
399 fe_values->reinit(cell_dofs);
401 fe_values->reinit(cell_tria);
413 this->get_degree() ==
mapping_q->get_degree())
427 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
435 std::vector<types::global_dof_index> dof_indices(
436 fe.n_dofs_per_cell());
439 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
441 const auto id = fe.system_to_component_index(i);
447 result[
id.second][
id.first] +=
450 result[
id.second][
id.first] =
457 result[lexicographic_to_hierarchic_numbering[
id.second]]
460 result[lexicographic_to_hierarchic_numbering[
id.second]]
473 std::vector<Vector<typename VectorType::value_type>> values(
474 fe_values->n_quadrature_points,
479 for (
unsigned int q = 0;
q < fe_values->n_quadrature_points; ++
q)
480 for (
unsigned int c = 0; c < spacedim; ++c)
490 uses_level_info =
false;
510 vectors.max_level());
517 const auto lexicographic_to_hierarchic_numbering =
519 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
520 this->get_degree()));
528 for (
unsigned int l = vectors.min_level(); l <= vectors.max_level(); ++l)
536 dof_handler.get_communicator());
554 dof_handler.get_triangulation(),
557 const bool is_non_artificial_cell =
558 cell_tria->level_subdomain_id() != numbers::artificial_subdomain_id;
560 const typename DoFHandler<dim, spacedim>::level_cell_iterator cell_dofs(
561 &cell_tria->get_triangulation(),
566 const auto mapping_q =
567 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
571 ((vector_describes_relative_displacement ||
572 (is_non_artificial_cell == false)) &&
573 ((mapping_q != nullptr &&
574 this->get_degree() == mapping_q->get_degree()) ==
577 (is_non_artificial_cell == true && interpolation_of_values_is_needed) )
582 auto &fe_values = fe_values_all.get();
583 if (fe_values.get() == nullptr)
585 QGaussLobatto<dim> quadrature_gl(this->polynomial_degree + 1);
587 std::vector<Point<dim>> quadrature_points;
589 FETools::hierarchic_to_lexicographic_numbering<dim>(
590 this->polynomial_degree))
591 quadrature_points.push_back(quadrature_gl.point(i));
592 Quadrature<dim> quadrature(quadrature_points);
594 fe_values = std::make_unique<FEValues<dim, spacedim>>(
596 interpolation_of_values_is_needed ?
598 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
600 update_quadrature_points | update_values);
603 if (interpolation_of_values_is_needed)
604 fe_values->reinit(cell_dofs);
606 fe_values->reinit(cell_tria);
618 this->get_degree() ==
mapping_q->get_degree())
632 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
640 std::vector<types::global_dof_index> dof_indices(
641 fe.n_dofs_per_cell());
642 cell_dofs->get_mg_dof_indices(dof_indices);
644 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
646 const auto id = fe.system_to_component_index(i);
652 result[
id.second][
id.first] +=
655 result[
id.second][
id.first] =
662 result[lexicographic_to_hierarchic_numbering[
id.second]]
666 result[lexicographic_to_hierarchic_numbering[
id.second]]
680 std::vector<types::global_dof_index> dof_indices(
681 fe.n_dofs_per_cell());
682 cell_dofs->get_mg_dof_indices(dof_indices);
684 std::vector<typename VectorType::value_type>
dof_values(
685 fe.n_dofs_per_cell());
687 for (
unsigned int i = 0; i < fe.n_dofs_per_cell(); ++i)
690 for (
unsigned int c = 0; c < spacedim; ++c)
691 for (
unsigned int i = 0; i < fe.n_dofs_per_cell(); ++i)
692 for (
unsigned int q = 0;
q < fe_values->n_quadrature_points; ++
q)
695 dof_values[i] * fe_values->shape_value_component(i,
q, c);
698 dof_values[i] * fe_values->shape_value_component(i,
q, c);
704 uses_level_info =
true;
void run(const std::vector< std::vector< Iterator > > &colored_iterators, Worker worker, Copier copier, const ScratchData &sample_scratch_data, const CopyData &sample_copy_data, const unsigned int queue_length=2 *MultithreadInfo::n_threads(), const unsigned int chunk_size=8)