292 const VectorType &vector,
305 const auto lexicographic_to_hierarchic_numbering =
307 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
308 this->get_degree()));
318 dof_handler.get_communicator());
335 dof_handler.get_triangulation(),
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);
400 this->get_degree() ==
mapping_q->get_degree())
414 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
422 std::vector<types::global_dof_index> dof_indices(
423 fe.n_dofs_per_cell());
426 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
428 const auto id = fe.system_to_component_index(i);
434 result[
id.second][
id.first] +=
437 result[
id.second][
id.first] =
444 result[lexicographic_to_hierarchic_numbering[
id.second]]
447 result[lexicographic_to_hierarchic_numbering[
id.second]]
460 std::vector<Vector<typename VectorType::value_type>>
values(
461 fe_values->n_quadrature_points,
466 for (
unsigned int q = 0;
q < fe_values->n_quadrature_points; ++
q)
467 for (
unsigned int c = 0; c < spacedim; ++c)
477 uses_level_info =
false;
497 vectors.max_level());
504 const auto lexicographic_to_hierarchic_numbering =
506 FETools::hierarchic_to_lexicographic_numbering<spacedim>(
507 this->get_degree()));
515 for (
unsigned int l = vectors.min_level(); l <= vectors.max_level(); ++l)
521 dof_handler.get_communicator());
539 dof_handler.get_triangulation(),
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);
603 this->get_degree() ==
mapping_q->get_degree())
617 Utilities::pow<unsigned int>(this->get_degree() + 1, dim));
625 std::vector<types::global_dof_index> dof_indices(
626 fe.n_dofs_per_cell());
627 cell_dofs->get_mg_dof_indices(dof_indices);
629 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
631 const auto id = fe.system_to_component_index(i);
637 result[
id.second][
id.first] +=
640 result[
id.second][
id.first] =
647 result[lexicographic_to_hierarchic_numbering[
id.second]]
651 result[lexicographic_to_hierarchic_numbering[
id.second]]
665 std::vector<types::global_dof_index> dof_indices(
666 fe.n_dofs_per_cell());
667 cell_dofs->get_mg_dof_indices(dof_indices);
669 std::vector<typename VectorType::value_type>
dof_values(
670 fe.n_dofs_per_cell());
672 for (
unsigned int i = 0; i < fe.n_dofs_per_cell(); ++i)
675 for (
unsigned int c = 0; c < spacedim; ++c)
676 for (
unsigned int i = 0; i < fe.n_dofs_per_cell(); ++i)
677 for (
unsigned int q = 0;
q < fe_values->n_quadrature_points; ++
q)
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;
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)