35template <
int dim,
int spacedim>
44template <
int dim,
int spacedim>
54template <
int dim,
int spacedim>
67template <
int dim,
int spacedim>
68std::unique_ptr<Mapping<dim, spacedim>>
71 return std::make_unique<MappingQCache<dim, spacedim>>(*this);
76template <
int dim,
int spacedim>
85template <
int dim,
int spacedim>
99 const auto mapping_q =
101 if (mapping_q !=
nullptr && this->
get_degree() == mapping_q->get_degree())
103 boost::container::small_vector<Point<spacedim>, 200> points;
104 mapping_q->compute_mapping_support_points(cell, points);
105 return std::vector<Point<spacedim>>(points.begin(), points.end());
112 auto &fe_values = fe_values_all.
get();
113 if (fe_values.get() ==
nullptr)
118 std::vector<Point<dim>> quadrature_points;
122 quadrature_points.push_back(quadrature_gl.point(i));
125 fe_values = std::make_unique<FEValues<dim, spacedim>>(
129 fe_values->reinit(cell);
130 return fe_values->get_quadrature_points();
137template <
int dim,
int spacedim>
143 &compute_points_on_cell)
150 std::make_shared<std::vector<std::vector<std::vector<Point<spacedim>>>>>(
152 for (
unsigned int l = 0; l < triangulation.
n_levels(); ++l)
156 triangulation.
begin(),
161 const auto result = compute_points_on_cell(cell);
162 (*support_point_cache)[cell->level()][cell->index()].assign(
163 result.begin(), result.end());
167 const unsigned int d = this->get_degree() + 1;
169 (*support_point_cache)[cell->level()][cell->index()].size(),
170 Utilities::pow(d, dim));
172 std::function<
void(
void *)>(),
183template <
int dim,
int spacedim>
191 const bool function_describes_relative_displacement)
201 boost::container::small_vector<Point<spacedim>, 200> points;
203 const auto mapping_q =
206 if (mapping_q !=
nullptr && this->
get_degree() == mapping_q->get_degree())
208 mapping_q->compute_mapping_support_points(cell, points);
215 auto &fe_values = fe_values_all.
get();
216 if (fe_values.get() ==
nullptr)
221 std::vector<Point<dim>> quadrature_points;
225 quadrature_points.push_back(quadrature_gl.point(i));
228 fe_values = std::make_unique<FEValues<dim, spacedim>>(
232 fe_values->reinit(cell);
233 const auto &quadrature_points = fe_values->get_quadrature_points();
234 points.assign(quadrature_points.begin(), quadrature_points.end());
237 for (
auto &p : points)
238 if (function_describes_relative_displacement)
239 p += transformation_function(cell, p);
241 p = transformation_function(cell, p);
243 return std::vector<Point<spacedim>>(points.begin(), points.end());
251template <
int dim,
int spacedim>
257 const bool function_describes_relative_displacement)
264 [&](
const auto &,
const auto &point) {
266 for (
unsigned int c = 0; c < spacedim; ++c)
267 new_point[c] = transformation_function.
value(point, c);
270 function_describes_relative_displacement);
279 template <
typename VectorType>
281 copy_locally_owned_data_from(
282 const VectorType &vector,
287 temp.
reinit(vector.locally_owned_elements());
295template <
int dim,
int spacedim>
296template <
typename VectorType>
301 const VectorType &vector,
302 const bool vector_describes_relative_displacement)
309 const unsigned int is_fe_q =
311 const unsigned int is_fe_dgq =
314 const auto lexicographic_to_hierarchic_numbering =
323 const IndexSet locally_relevant_dofs =
326 locally_relevant_dofs,
328 copy_locally_owned_data_from(vector, vector_ghosted);
339 const bool interpolation_of_values_is_needed =
347 const bool is_active_non_artificial_cell =
348 (cell_tria->is_active() == true) &&
349 (cell_tria->is_artificial() == false);
351 const typename DoFHandler<dim, spacedim>::cell_iterator cell_dofs(
352 &cell_tria->get_triangulation(),
357 const auto mapping_q =
358 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
362 ((vector_describes_relative_displacement ||
363 (is_active_non_artificial_cell == false)) &&
364 ((mapping_q != nullptr &&
365 this->get_degree() == mapping_q->get_degree()) ==
368 (is_active_non_artificial_cell && interpolation_of_values_is_needed) )
373 auto &fe_values = fe_values_all.get();
374 if (fe_values.get() == nullptr)
376 const QGaussLobatto<dim> quadrature_gl(this->polynomial_degree +
379 std::vector<Point<dim>> quadrature_points;
381 FETools::hierarchic_to_lexicographic_numbering<dim>(
382 this->polynomial_degree))
383 quadrature_points.push_back(quadrature_gl.point(i));
384 const Quadrature<dim> quadrature(quadrature_points);
386 fe_values = std::make_unique<FEValues<dim, spacedim>>(
388 interpolation_of_values_is_needed ?
390 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
392 update_quadrature_points | update_values);
395 if (interpolation_of_values_is_needed)
396 fe_values->reinit(cell_dofs);
398 fe_values->reinit(cell_tria);
406 if (vector_describes_relative_displacement ||
407 is_active_non_artificial_cell ==
false)
409 if (mapping_q !=
nullptr &&
410 this->
get_degree() == mapping_q->get_degree())
412 mapping_q->compute_mapping_support_points(cell_tria, points);
416 const auto &quadrature_points =
417 fe_values_all.
get()->get_quadrature_points();
418 points.assign(quadrature_points.begin(), quadrature_points.end());
424 if (is_active_non_artificial_cell ==
false)
425 return std::vector<Point<spacedim>>(points.begin(), points.end());
434 if (interpolation_of_values_is_needed ==
false)
438 std::vector<types::global_dof_index> dof_indices(
440 cell_dofs->get_dof_indices(dof_indices);
442 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
449 if (vector_describes_relative_displacement)
450 points[
id.second][
id.first] +=
451 vector_ghosted(dof_indices[i]);
453 points[
id.second][
id.first] =
454 vector_ghosted(dof_indices[i]);
459 if (vector_describes_relative_displacement)
460 points[lexicographic_to_hierarchic_numbering[
id.second]]
461 [
id.first] += vector_ghosted(dof_indices[i]);
463 points[lexicographic_to_hierarchic_numbering[
id.second]]
464 [
id.first] = vector_ghosted(dof_indices[i]);
474 auto &fe_values = fe_values_all.
get();
476 std::vector<Vector<typename VectorType::value_type>> values(
477 fe_values->n_quadrature_points,
480 fe_values->get_function_values(vector_ghosted, values);
482 for (
unsigned int q = 0; q < fe_values->n_quadrature_points; ++q)
483 for (
unsigned int c = 0; c < spacedim; ++c)
484 if (vector_describes_relative_displacement)
485 points[q][c] += values[q][c];
487 points[q][c] = values[q][c];
490 return std::vector<Point<spacedim>>(points.begin(), points.end());
493 uses_level_info =
false;
498template <
int dim,
int spacedim>
499template <
typename VectorType>
505 const bool vector_describes_relative_displacement)
515 const unsigned int is_fe_q =
517 const unsigned int is_fe_dgq =
520 const auto lexicographic_to_hierarchic_numbering =
533 const IndexSet locally_relevant_dofs =
536 locally_relevant_dofs,
538 copy_locally_owned_data_from(vectors[l], vectors_ghosted[l]);
539 vectors_ghosted[l].update_ghost_values();
550 const bool interpolation_of_values_is_needed =
558 const bool is_non_artificial_cell =
559 cell_tria->level_subdomain_id() != numbers::artificial_subdomain_id;
561 const typename DoFHandler<dim, spacedim>::level_cell_iterator cell_dofs(
562 &cell_tria->get_triangulation(),
567 const auto mapping_q =
568 dynamic_cast<const MappingQ<dim, spacedim> *>(&mapping);
572 ((vector_describes_relative_displacement ||
573 (is_non_artificial_cell == false)) &&
574 ((mapping_q != nullptr &&
575 this->get_degree() == mapping_q->get_degree()) ==
578 (is_non_artificial_cell == true && interpolation_of_values_is_needed) )
583 auto &fe_values = fe_values_all.get();
584 if (fe_values.get() == nullptr)
586 const QGaussLobatto<dim> quadrature_gl(this->polynomial_degree +
589 std::vector<Point<dim>> quadrature_points;
591 FETools::hierarchic_to_lexicographic_numbering<dim>(
592 this->polynomial_degree))
593 quadrature_points.push_back(quadrature_gl.point(i));
594 const Quadrature<dim> quadrature(quadrature_points);
596 fe_values = std::make_unique<FEValues<dim, spacedim>>(
598 interpolation_of_values_is_needed ?
600 static_cast<const FiniteElement<dim, spacedim> &>(fe_nothing),
602 update_quadrature_points | update_values);
605 if (interpolation_of_values_is_needed)
606 fe_values->reinit(cell_dofs);
608 fe_values->reinit(cell_tria);
616 if (vector_describes_relative_displacement ||
617 (is_non_artificial_cell ==
false))
619 if (mapping_q !=
nullptr &&
620 this->
get_degree() == mapping_q->get_degree())
622 mapping_q->compute_mapping_support_points(cell_tria, points);
626 const auto &quadrature_points =
627 fe_values_all.
get()->get_quadrature_points();
628 points.assign(quadrature_points.begin(), quadrature_points.end());
634 if (is_non_artificial_cell ==
false)
635 return std::vector<Point<spacedim>>(points.begin(), points.end());
644 if (interpolation_of_values_is_needed ==
false)
648 std::vector<types::global_dof_index> dof_indices(
650 cell_dofs->get_mg_dof_indices(dof_indices);
652 for (
unsigned int i = 0; i < dof_indices.size(); ++i)
659 if (vector_describes_relative_displacement)
660 points[
id.second][
id.first] +=
661 vectors_ghosted[cell_tria->
level()](dof_indices[i]);
663 points[
id.second][
id.first] =
664 vectors_ghosted[cell_tria->
level()](dof_indices[i]);
669 if (vector_describes_relative_displacement)
670 points[lexicographic_to_hierarchic_numbering[
id.second]]
672 vectors_ghosted[cell_tria->
level()](dof_indices[i]);
674 points[lexicographic_to_hierarchic_numbering[
id.second]]
676 vectors_ghosted[cell_tria->
level()](dof_indices[i]);
686 auto &fe_values = fe_values_all.
get();
688 std::vector<types::global_dof_index> dof_indices(
690 cell_dofs->get_mg_dof_indices(dof_indices);
692 std::vector<typename VectorType::value_type> dof_values(
696 dof_values[i] = vectors_ghosted[cell_tria->
level()](dof_indices[i]);
698 for (
unsigned int c = 0; c < spacedim; ++c)
700 for (
unsigned int q = 0; q < fe_values->n_quadrature_points; ++q)
701 if (vector_describes_relative_displacement ==
false && i == 0)
703 dof_values[i] * fe_values->shape_value_component(i, q, c);
706 dof_values[i] * fe_values->shape_value_component(i, q, c);
709 return std::vector<Point<spacedim>>(points.begin(), points.end());
712 uses_level_info =
true;
717template <
int dim,
int spacedim>
722 return sizeof(*this) +
725 return sizeof(*this);
730template <
int dim,
int spacedim>
737 ExcMessage(
"Must call MappingQCache::initialize() before "
738 "using it or after mesh has changed!"));
744 const auto &cached_points =
745 (*support_point_cache)[cell->
level()][cell->
index()];
746 points.assign(cached_points.begin(), cached_points.end());
751template <
int dim,
int spacedim>
752boost::container::small_vector<Point<spacedim>,
763 ExcMessage(
"Must call MappingQCache::initialize() before "
764 "using it or after mesh has changed!"));
770 const auto ptr = (*support_point_cache)[cell->
level()][cell->
index()].begin();
771 return boost::container::small_vector<Point<spacedim>,
783#include "fe/mapping_q_cache.inst"
const hp::FECollection< dim, spacedim > & get_fe_collection() const
const FiniteElement< dim, spacedim > & get_fe(const types::fe_index index=0) const
const IndexSet & locally_owned_mg_dofs(const unsigned int level) const
const Triangulation< dim, spacedim > & get_triangulation() const
const IndexSet & locally_owned_dofs() const
MPI_Comm get_mpi_communicator() const
const unsigned int degree
unsigned int n_dofs_per_cell() const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
unsigned int element_multiplicity(const unsigned int index) const
unsigned int n_base_elements() const
const unsigned int n_components
virtual RangeNumberType value(const Point< dim > &p, const unsigned int component=0) const
void import_elements(const ::Vector< Number > &vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
virtual void reinit(const size_type size, const bool omit_zeroing_entries=false)
void update_ghost_values() const
void import_elements(const Vector< Number, MemorySpace2 > &src, VectorOperation::values operation)
void reinit(const size_type size, const bool omit_zeroing_entries=false)
unsigned int max_level() const
unsigned int min_level() const
std::shared_ptr< std::vector< std::vector< std::vector< Point< spacedim > > > > > support_point_cache
std::size_t memory_consumption() const
virtual bool preserves_vertex_locations() const override
MappingQCache(const unsigned int polynomial_degree)
virtual boost::container::small_vector< Point< spacedim >, ReferenceCells::max_n_vertices< dim >() > get_vertices(const typename Triangulation< dim, spacedim >::cell_iterator &cell) const override
virtual std::unique_ptr< Mapping< dim, spacedim > > clone() const override
void initialize(const Mapping< dim, spacedim > &mapping, const Triangulation< dim, spacedim > &triangulation)
boost::signals2::connection clear_signal
virtual void compute_mapping_support_points(const typename Triangulation< dim, spacedim >::cell_iterator &cell, boost::container::small_vector< Point< spacedim >, 200 > &a) const override
friend class MappingQCache
const unsigned int polynomial_degree
MappingQ(const unsigned int polynomial_degree)
unsigned int get_degree() const
Abstract base class for mapping classes.
static unsigned int n_threads()
A class that provides a separate storage location on each thread that accesses the object.
unsigned int n_vertices() const
cell_iterator begin(const unsigned int level=0) const
unsigned int n_levels() const
cell_iterator end() const
unsigned int n_raw_cells(const unsigned int level) const
virtual unsigned int n_global_levels() const
unsigned int size() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcMessage(std::string arg1)
TriaIterator< CellAccessor< dim, spacedim > > cell_iterator
@ update_quadrature_points
Transformed quadrature points.
MappingQ< dim, spacedim > StaticMappingQ1< dim, spacedim >::mapping
std::enable_if_t< std::is_fundamental_v< T >, std::size_t > memory_consumption(const T &t)
constexpr unsigned int max_n_vertices()
constexpr T pow(const T base, const int iexp)
std::vector< Integer > invert_permutation(const std::vector< Integer > &permutation)
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)
static constexpr unsigned int vertices_per_cell
boost::signals2::signal< void()> any_change