16 #include <deal.II/base/memory_consumption.h> 17 #include <deal.II/base/qprojector.h> 18 #include <deal.II/base/quadrature.h> 19 #include <deal.II/base/std_cxx14/memory.h> 21 #include <deal.II/dofs/dof_accessor.h> 23 #include <deal.II/fe/fe_system.h> 24 #include <deal.II/fe/fe_tools.h> 25 #include <deal.II/fe/fe_values.h> 26 #include <deal.II/fe/mapping.h> 28 #include <deal.II/grid/tria.h> 29 #include <deal.II/grid/tria_iterator.h> 34 DEAL_II_NAMESPACE_OPEN
39 count_nonzeros(
const std::vector<unsigned int> &vec)
41 return std::count_if(vec.begin(), vec.end(), [](
const unsigned int i) {
49 template <
int dim,
int spacedim>
51 const unsigned int n_base_elements)
52 : base_fe_datas(n_base_elements)
53 , base_fe_output_objects(n_base_elements)
58 template <
int dim,
int spacedim>
62 for (
unsigned int i = 0; i < base_fe_datas.size(); ++i)
63 base_fe_datas[i].reset();
67 template <
int dim,
int spacedim>
70 const unsigned int base_no)
const 72 Assert(base_no < base_fe_datas.size(),
74 return *base_fe_datas[base_no];
79 template <
int dim,
int spacedim>
82 const unsigned int base_no,
85 Assert(base_no < base_fe_datas.size(),
87 base_fe_datas[base_no] = std::move(ptr);
92 template <
int dim,
int spacedim>
95 const unsigned int base_no)
const 97 Assert(base_no < base_fe_output_objects.size(),
99 return base_fe_output_objects[base_no];
107 template <
int dim,
int spacedim>
111 template <
int dim,
int spacedim>
113 const unsigned int n_elements)
115 FETools::Compositing::multiply_dof_numbers(&fe, n_elements),
116 FETools::Compositing::compute_restriction_is_additive_flags(&fe,
118 FETools::Compositing::compute_nonzero_components(&fe, n_elements))
121 std::vector<const FiniteElement<dim, spacedim> *> fes;
123 std::vector<unsigned int> multiplicities;
124 multiplicities.push_back(n_elements);
130 template <
int dim,
int spacedim>
132 const unsigned int n1,
134 const unsigned int n2)
136 FETools::Compositing::multiply_dof_numbers(&fe1, n1, &fe2, n2),
137 FETools::Compositing::compute_restriction_is_additive_flags(&fe1,
141 FETools::Compositing::compute_nonzero_components(&fe1, n1, &fe2, n2))
142 , base_elements((n1 > 0) + (n2 > 0))
144 std::vector<const FiniteElement<dim, spacedim> *> fes;
147 std::vector<unsigned int> multiplicities;
148 multiplicities.push_back(n1);
149 multiplicities.push_back(n2);
155 template <
int dim,
int spacedim>
157 const unsigned int n1,
159 const unsigned int n2,
161 const unsigned int n3)
163 FETools::Compositing::multiply_dof_numbers(&fe1, n1, &fe2, n2, &fe3, n3),
164 FETools::Compositing::compute_restriction_is_additive_flags(&fe1,
170 FETools::Compositing::compute_nonzero_components(&fe1,
176 , base_elements((n1 > 0) + (n2 > 0) + (n3 > 0))
178 std::vector<const FiniteElement<dim, spacedim> *> fes;
182 std::vector<unsigned int> multiplicities;
183 multiplicities.push_back(n1);
184 multiplicities.push_back(n2);
185 multiplicities.push_back(n3);
191 template <
int dim,
int spacedim>
193 const unsigned int n1,
195 const unsigned int n2,
197 const unsigned int n3,
199 const unsigned int n4)
201 FETools::Compositing::multiply_dof_numbers(&fe1,
209 FETools::Compositing::compute_restriction_is_additive_flags(&fe1,
217 FETools::Compositing::compute_nonzero_components(&fe1,
225 , base_elements((n1 > 0) + (n2 > 0) + (n3 > 0) + (n4 > 0))
227 std::vector<const FiniteElement<dim, spacedim> *> fes;
232 std::vector<unsigned int> multiplicities;
233 multiplicities.push_back(n1);
234 multiplicities.push_back(n2);
235 multiplicities.push_back(n3);
236 multiplicities.push_back(n4);
242 template <
int dim,
int spacedim>
244 const unsigned int n1,
246 const unsigned int n2,
248 const unsigned int n3,
250 const unsigned int n4,
252 const unsigned int n5)
255 multiply_dof_numbers(&fe1, n1, &fe2, n2, &fe3, n3, &fe4, n4, &fe5, n5),
256 FETools::Compositing::compute_restriction_is_additive_flags(&fe1,
266 FETools::Compositing::compute_nonzero_components(&fe1,
276 , base_elements((n1 > 0) + (n2 > 0) + (n3 > 0) + (n4 > 0) + (n5 > 0))
278 std::vector<const FiniteElement<dim, spacedim> *> fes;
284 std::vector<unsigned int> multiplicities;
285 multiplicities.push_back(n1);
286 multiplicities.push_back(n2);
287 multiplicities.push_back(n3);
288 multiplicities.push_back(n4);
289 multiplicities.push_back(n5);
295 template <
int dim,
int spacedim>
298 const std::vector<unsigned int> & multiplicities)
300 FETools::Compositing::multiply_dof_numbers(fes, multiplicities),
301 FETools::Compositing::compute_restriction_is_additive_flags(
304 FETools::Compositing::compute_nonzero_components(fes, multiplicities))
305 , base_elements(count_nonzeros(multiplicities))
312 template <
int dim,
int spacedim>
323 std::ostringstream namebuf;
326 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
328 namebuf << base_element(i).get_name();
329 if (this->element_multiplicity(i) != 1)
330 namebuf <<
'^' << this->element_multiplicity(i);
331 if (i != this->n_base_elements() - 1)
336 return namebuf.str();
341 template <
int dim,
int spacedim>
342 std::unique_ptr<FiniteElement<dim, spacedim>>
345 std::vector<const FiniteElement<dim, spacedim> *> fes;
346 std::vector<unsigned int> multiplicities;
348 for (
unsigned int i = 0; i < this->n_base_elements(); i++)
350 fes.push_back(&base_element(i));
351 multiplicities.push_back(this->element_multiplicity(i));
353 return std_cxx14::make_unique<FESystem<dim, spacedim>>(fes, multiplicities);
358 template <
int dim,
int spacedim>
361 const unsigned int first_component,
362 const unsigned int n_selected_components)
const 365 ExcMessage(
"Invalid arguments (not a part of this FiniteElement)."));
367 const unsigned int base_index =
368 this->component_to_base_table[first_component].first.first;
369 const unsigned int component_in_base =
370 this->component_to_base_table[first_component].first.second;
371 const unsigned int base_components =
372 this->base_element(base_index).n_components();
376 if (n_selected_components <= base_components)
377 return this->base_element(base_index)
378 .get_sub_fe(component_in_base, n_selected_components);
381 ExcMessage(
"You can not select a part of a FiniteElement."));
387 template <
int dim,
int spacedim>
393 Assert(this->is_primitive(i),
397 return (base_element(this->system_to_base_table[i].first.first)
398 .shape_value(this->system_to_base_table[i].second, p));
403 template <
int dim,
int spacedim>
406 const unsigned int i,
408 const unsigned int component)
const 416 if (this->nonzero_components[i][component] ==
false)
424 const unsigned int base = this->component_to_base_index(component).first;
425 const unsigned int component_in_base =
426 this->component_to_base_index(component).second;
434 return (base_element(base).shape_value_component(
435 this->system_to_base_table[i].second, p, component_in_base));
440 template <
int dim,
int spacedim>
446 Assert(this->is_primitive(i),
450 return (base_element(this->system_to_base_table[i].first.first)
451 .shape_grad(this->system_to_base_table[i].second, p));
456 template <
int dim,
int spacedim>
459 const unsigned int i,
461 const unsigned int component)
const 468 if (this->nonzero_components[i][component] ==
false)
473 const unsigned int base = this->component_to_base_index(component).first;
474 const unsigned int component_in_base =
475 this->component_to_base_index(component).second;
480 return (base_element(base).shape_grad_component(
481 this->system_to_base_table[i].second, p, component_in_base));
486 template <
int dim,
int spacedim>
492 Assert(this->is_primitive(i),
496 return (base_element(this->system_to_base_table[i].first.first)
497 .shape_grad_grad(this->system_to_base_table[i].second, p));
502 template <
int dim,
int spacedim>
505 const unsigned int i,
507 const unsigned int component)
const 514 if (this->nonzero_components[i][component] ==
false)
519 const unsigned int base = this->component_to_base_index(component).first;
520 const unsigned int component_in_base =
521 this->component_to_base_index(component).second;
526 return (base_element(base).shape_grad_grad_component(
527 this->system_to_base_table[i].second, p, component_in_base));
532 template <
int dim,
int spacedim>
538 Assert(this->is_primitive(i),
542 return (base_element(this->system_to_base_table[i].first.first)
543 .shape_3rd_derivative(this->system_to_base_table[i].second, p));
548 template <
int dim,
int spacedim>
551 const unsigned int i,
553 const unsigned int component)
const 560 if (this->nonzero_components[i][component] ==
false)
565 const unsigned int base = this->component_to_base_index(component).first;
566 const unsigned int component_in_base =
567 this->component_to_base_index(component).second;
572 return (base_element(base).shape_3rd_derivative_component(
573 this->system_to_base_table[i].second, p, component_in_base));
578 template <
int dim,
int spacedim>
584 Assert(this->is_primitive(i),
588 return (base_element(this->system_to_base_table[i].first.first)
589 .shape_4th_derivative(this->system_to_base_table[i].second, p));
594 template <
int dim,
int spacedim>
597 const unsigned int i,
599 const unsigned int component)
const 606 if (this->nonzero_components[i][component] ==
false)
611 const unsigned int base = this->component_to_base_index(component).first;
612 const unsigned int component_in_base =
613 this->component_to_base_index(component).second;
618 return (base_element(base).shape_4th_derivative_component(
619 this->system_to_base_table[i].second, p, component_in_base));
624 template <
int dim,
int spacedim>
634 Assert((interpolation_matrix.
m() == this->dofs_per_cell) ||
638 (this->dofs_per_cell == 0),
648 (x_source_fe.
get_name().find(
"FESystem<") == 0) ||
662 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
666 spacedim>::ExcInterpolationNotImplemented()));
675 std::vector<FullMatrix<double>> base_matrices(this->n_base_elements());
676 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
678 base_matrices[i].reinit(base_element(i).dofs_per_cell,
680 base_element(i).get_interpolation_matrix(source_fe.
base_element(i),
687 interpolation_matrix = 0;
688 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
690 if (this->system_to_base_table[i].first ==
692 interpolation_matrix(i, j) =
693 (base_matrices[this->system_to_base_table[i].first.first](
694 this->system_to_base_table[i].second,
700 template <
int dim,
int spacedim>
703 const unsigned int child,
712 "Restriction matrices are only available for refined cells!"));
719 if (this->restriction[refinement_case - 1][child].n() == 0)
721 std::lock_guard<std::mutex> lock(this->mutex);
724 if (this->restriction[refinement_case - 1][child].n() ==
726 return this->restriction[refinement_case - 1][child];
729 bool do_restriction =
true;
732 std::vector<const FullMatrix<double> *> base_matrices(
733 this->n_base_elements());
735 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
738 &base_element(i).get_restriction_matrix(child, refinement_case);
739 if (base_matrices[i]->n() != base_element(i).dofs_per_cell)
740 do_restriction =
false;
749 this->dofs_per_cell);
759 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
760 for (
unsigned int j = 0; j < this->dofs_per_cell; ++j)
767 if (this->system_to_base_table[i].first !=
768 this->system_to_base_table[j].first)
772 const unsigned int base =
773 this->system_to_base_table[i].first.first;
775 const unsigned int base_index_i =
776 this->system_to_base_table[i].second,
778 this->system_to_base_table[j].second;
783 (*base_matrices[base])(base_index_i, base_index_j);
787 this->restriction[refinement_case - 1][child]));
791 return this->restriction[refinement_case - 1][child];
796 template <
int dim,
int spacedim>
799 const unsigned int child,
808 "Restriction matrices are only available for refined cells!"));
816 if (this->prolongation[refinement_case - 1][child].n() == 0)
818 std::lock_guard<std::mutex> lock(this->mutex);
820 if (this->prolongation[refinement_case - 1][child].n() ==
822 return this->prolongation[refinement_case - 1][child];
824 bool do_prolongation =
true;
825 std::vector<const FullMatrix<double> *> base_matrices(
826 this->n_base_elements());
827 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
830 &base_element(i).get_prolongation_matrix(child, refinement_case);
831 if (base_matrices[i]->n() != base_element(i).dofs_per_cell)
832 do_prolongation =
false;
840 this->dofs_per_cell);
842 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
843 for (
unsigned int j = 0; j < this->dofs_per_cell; ++j)
845 if (this->system_to_base_table[i].first !=
846 this->system_to_base_table[j].first)
848 const unsigned int base =
849 this->system_to_base_table[i].first.first;
851 const unsigned int base_index_i =
852 this->system_to_base_table[i].second,
854 this->system_to_base_table[j].second;
856 (*base_matrices[base])(base_index_i, base_index_j);
859 this->prolongation[refinement_case - 1][child]));
863 return this->prolongation[refinement_case - 1][child];
867 template <
int dim,
int spacedim>
870 const unsigned int face,
871 const bool face_orientation,
872 const bool face_flip,
873 const bool face_rotation)
const 878 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
879 face_base_index = this->face_system_to_base_index(face_dof_index);
881 const unsigned int base_face_to_cell_index =
882 this->base_element(face_base_index.first.first)
883 .face_to_cell_index(face_base_index.second,
894 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> target =
895 std::make_pair(face_base_index.first, base_face_to_cell_index);
896 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
897 if (this->system_to_base_index(i) == target)
912 template <
int dim,
int spacedim>
919 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
920 out |= base_element(base_no).requires_update_flags(flags);
926 template <
int dim,
int spacedim>
927 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
943 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
944 data_ptr = std_cxx14::make_unique<InternalData>(this->n_base_elements());
960 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
963 &base_fe_output_object = data.get_fe_output_object(base_no);
966 base_element(base_no),
967 flags | base_element(base_no).requires_update_flags(flags));
975 auto base_fe_data = base_element(base_no).get_data(flags,
978 base_fe_output_object);
980 data.set_fe_data(base_no, std::move(base_fe_data));
989 template <
int dim,
int spacedim>
990 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1006 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1007 data_ptr = std_cxx14::make_unique<InternalData>(this->n_base_elements());
1023 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
1026 &base_fe_output_object = data.get_fe_output_object(base_no);
1029 base_element(base_no),
1030 flags | base_element(base_no).requires_update_flags(flags));
1038 auto base_fe_data = base_element(base_no).get_face_data(
1039 flags, mapping, quadrature, base_fe_output_object);
1041 data.set_fe_data(base_no, std::move(base_fe_data));
1052 template <
int dim,
int spacedim>
1053 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1069 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1070 data_ptr = std_cxx14::make_unique<InternalData>(this->n_base_elements());
1087 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
1090 &base_fe_output_object = data.get_fe_output_object(base_no);
1093 base_element(base_no),
1094 flags | base_element(base_no).requires_update_flags(flags));
1102 auto base_fe_data = base_element(base_no).get_subface_data(
1103 flags, mapping, quadrature, base_fe_output_object);
1105 data.set_fe_data(base_no, std::move(base_fe_data));
1113 template <
int dim,
int spacedim>
1121 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1129 compute_fill(mapping,
1131 invalid_face_number,
1132 invalid_face_number,
1143 template <
int dim,
int spacedim>
1147 const unsigned int face_no,
1151 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1159 compute_fill(mapping,
1162 invalid_face_number,
1173 template <
int dim,
int spacedim>
1177 const unsigned int face_no,
1178 const unsigned int sub_no,
1182 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1190 compute_fill(mapping,
1204 template <
int dim,
int spacedim>
1205 template <
int dim_1>
1210 const unsigned int face_no,
1211 const unsigned int sub_no,
1225 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
1248 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
1260 const Quadrature<dim - 1> *face_quadrature =
nullptr;
1261 const unsigned int n_q_points = quadrature.
size();
1265 const Subscriptor *quadrature_base_pointer = &quadrature;
1267 if (face_no == invalid_face_number)
1271 quadrature_base_pointer) !=
nullptr,
1281 quadrature_base_pointer) !=
nullptr,
1285 static_cast<const Quadrature<dim - 1
> *>(quadrature_base_pointer);
1296 if (face_no == invalid_face_number)
1305 else if (sub_no == invalid_face_number)
1345 for (
unsigned int system_index = 0; system_index < this->dofs_per_cell;
1347 if (this->system_to_base_table[system_index].first.first == base_no)
1349 const unsigned int base_index =
1350 this->system_to_base_table[system_index].second;
1359 unsigned int out_index = 0;
1360 for (
unsigned int i = 0; i < system_index; ++i)
1361 out_index += this->n_nonzero_components(i);
1362 unsigned int in_index = 0;
1363 for (
unsigned int i = 0; i < base_index; ++i)
1367 Assert(this->n_nonzero_components(system_index) ==
1372 for (
unsigned int s = 0;
1373 s < this->n_nonzero_components(system_index);
1375 for (
unsigned int q = 0; q < n_q_points; ++q)
1377 base_data.shape_values(in_index + s, q);
1380 for (
unsigned int s = 0;
1381 s < this->n_nonzero_components(system_index);
1383 for (
unsigned int q = 0; q < n_q_points; ++q)
1385 base_data.shape_gradients[in_index + s][q];
1388 for (
unsigned int s = 0;
1389 s < this->n_nonzero_components(system_index);
1391 for (
unsigned int q = 0; q < n_q_points; ++q)
1393 base_data.shape_hessians[in_index + s][q];
1396 for (
unsigned int s = 0;
1397 s < this->n_nonzero_components(system_index);
1399 for (
unsigned int q = 0; q < n_q_points; ++q)
1401 base_data.shape_3rd_derivatives[in_index + s][q];
1407 template <
int dim,
int spacedim>
1415 for (
unsigned int base = 0; base < this->n_base_elements(); ++base)
1416 if (base_element(base).constraints_are_implemented() ==
false)
1419 this->interface_constraints.TableBase<2, double>::reinit(
1420 this->interface_constraints_size());
1430 for (
unsigned int n = 0; n < this->interface_constraints.n(); ++n)
1431 for (
unsigned int m = 0; m < this->interface_constraints.m(); ++m)
1440 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1441 n_index = this->face_system_to_base_table[n];
1445 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> m_index;
1462 if (m < this->dofs_per_vertex)
1463 m_index = this->system_to_base_table[m];
1467 const unsigned int index_in_line =
1468 (m - this->dofs_per_vertex) % this->dofs_per_line;
1469 const unsigned int sub_line =
1470 (m - this->dofs_per_vertex) / this->dofs_per_line;
1477 const unsigned int tmp1 =
1478 2 * this->dofs_per_vertex + index_in_line;
1479 m_index.first = this->face_system_to_base_table[tmp1].first;
1491 this->face_system_to_base_table[tmp1].second >=
1492 2 * base_element(m_index.first.first).dofs_per_vertex,
1494 const unsigned int tmp2 =
1495 this->face_system_to_base_table[tmp1].second -
1496 2 * base_element(m_index.first.first).dofs_per_vertex;
1498 base_element(m_index.first.first).dofs_per_line,
1501 base_element(m_index.first.first).dofs_per_vertex +
1502 base_element(m_index.first.first).dofs_per_line *
1516 if (m < 5 * this->dofs_per_vertex)
1517 m_index = this->system_to_base_table[m];
1520 if (m < 5 * this->dofs_per_vertex + 12 * this->dofs_per_line)
1523 const unsigned int index_in_line =
1524 (m - 5 * this->dofs_per_vertex) % this->dofs_per_line;
1525 const unsigned int sub_line =
1526 (m - 5 * this->dofs_per_vertex) / this->dofs_per_line;
1529 const unsigned int tmp1 =
1530 4 * this->dofs_per_vertex + index_in_line;
1531 m_index.first = this->face_system_to_base_table[tmp1].first;
1534 this->face_system_to_base_table[tmp1].second >=
1535 4 * base_element(m_index.first.first).dofs_per_vertex,
1537 const unsigned int tmp2 =
1538 this->face_system_to_base_table[tmp1].second -
1539 4 * base_element(m_index.first.first).dofs_per_vertex;
1541 base_element(m_index.first.first).dofs_per_line,
1544 5 * base_element(m_index.first.first).dofs_per_vertex +
1545 base_element(m_index.first.first).dofs_per_line *
1553 const unsigned int index_in_quad =
1554 (m - 5 * this->dofs_per_vertex -
1555 12 * this->dofs_per_line) %
1556 this->dofs_per_quad;
1557 Assert(index_in_quad < this->dofs_per_quad,
1559 const unsigned int sub_quad =
1560 ((m - 5 * this->dofs_per_vertex -
1561 12 * this->dofs_per_line) /
1562 this->dofs_per_quad);
1565 const unsigned int tmp1 = 4 * this->dofs_per_vertex +
1566 4 * this->dofs_per_line +
1568 Assert(tmp1 < this->face_system_to_base_table.size(),
1570 m_index.first = this->face_system_to_base_table[tmp1].first;
1573 this->face_system_to_base_table[tmp1].second >=
1574 4 * base_element(m_index.first.first).dofs_per_vertex +
1575 4 * base_element(m_index.first.first).dofs_per_line,
1577 const unsigned int tmp2 =
1578 this->face_system_to_base_table[tmp1].second -
1579 4 * base_element(m_index.first.first).dofs_per_vertex -
1580 4 * base_element(m_index.first.first).dofs_per_line;
1582 base_element(m_index.first.first).dofs_per_quad,
1585 5 * base_element(m_index.first.first).dofs_per_vertex +
1586 12 * base_element(m_index.first.first).dofs_per_line +
1587 base_element(m_index.first.first).dofs_per_quad *
1602 if (n_index.first == m_index.first)
1603 this->interface_constraints(m, n) =
1604 (base_element(n_index.first.first)
1605 .constraints()(m_index.second, n_index.second));
1611 template <
int dim,
int spacedim>
1615 const std::vector<unsigned int> & multiplicities)
1617 Assert(fes.size() == multiplicities.size(),
1620 ExcMessage(
"Need to pass at least one finite element."));
1621 Assert(count_nonzeros(multiplicities) > 0,
1622 ExcMessage(
"You only passed FiniteElements with multiplicity 0."));
1627 this->base_to_block_indices.reinit(0, 0);
1629 for (
unsigned int i = 0; i < fes.size(); i++)
1630 if (multiplicities[i] > 0)
1631 this->base_to_block_indices.push_back(multiplicities[i]);
1636 unsigned int ind = 0;
1637 for (
unsigned int i = 0; i < fes.size(); i++)
1638 if (multiplicities[i] > 0)
1641 base_elements[ind] = {fes[i]->clone(), multiplicities[i]};
1655 this->system_to_component_table.resize(this->dofs_per_cell);
1656 this->face_system_to_component_table.resize(this->dofs_per_face);
1659 this->system_to_component_table,
1660 this->component_to_base_table,
1664 this->face_system_to_base_table,
1665 this->face_system_to_component_table,
1683 for (
unsigned int base_el = 0; base_el < this->n_base_elements(); ++base_el)
1684 if (!base_element(base_el).has_support_points() &&
1685 base_element(base_el).dofs_per_cell != 0)
1687 this->unit_support_points.resize(0);
1692 this->unit_support_points.resize(this->dofs_per_cell);
1694 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
1696 const unsigned int base = this->system_to_base_table[i].first.first,
1697 base_index = this->system_to_base_table[i].second;
1699 Assert(base_index < base_element(base).unit_support_points.size(),
1701 this->unit_support_points[i] =
1702 base_element(base).unit_support_points[base_index];
1719 for (
unsigned int base_el = 0; base_el < this->n_base_elements();
1721 if (!base_element(base_el).has_support_points() &&
1722 (base_element(base_el).dofs_per_face > 0))
1724 this->unit_face_support_points.resize(0);
1731 this->unit_face_support_points.resize(this->dofs_per_face);
1733 for (
unsigned int i = 0; i < this->dofs_per_face; ++i)
1735 const unsigned int base_i =
1736 this->face_system_to_base_table[i].first.first;
1737 const unsigned int index_in_base =
1738 this->face_system_to_base_table[i].second;
1741 base_element(base_i).unit_face_support_points.size(),
1744 this->unit_face_support_points[i] =
1745 base_element(base_i).unit_face_support_points[index_in_base];
1757 generalized_support_points_index_table.resize(this->n_base_elements());
1759 for (
unsigned int base = 0; base < this->n_base_elements(); ++base)
1770 if (!base_element(base).has_generalized_support_points())
1773 for (
const auto &point :
1774 base_element(base).get_generalized_support_points())
1778 std::find(std::begin(this->generalized_support_points),
1779 std::end(this->generalized_support_points),
1782 if (p == std::end(this->generalized_support_points))
1785 const auto n = this->generalized_support_points.size();
1786 generalized_support_points_index_table[base].push_back(n);
1787 this->generalized_support_points.push_back(point);
1792 const auto n = p - std::begin(this->generalized_support_points);
1793 generalized_support_points_index_table[base].push_back(n);
1800 for (
unsigned int i = 0; i < base_elements.size(); ++i)
1802 if (!base_element(i).has_generalized_support_points())
1805 const auto &points =
1806 base_elements[i].first->get_generalized_support_points();
1807 for (
unsigned int j = 0; j < points.size(); ++j)
1809 const auto n = generalized_support_points_index_table[i][j];
1810 Assert(this->generalized_support_points[n] == points[j],
1822 Assert(this->adjust_quad_dof_index_for_face_orientation_table
1823 .n_elements() == 8 * this->dofs_per_quad,
1828 unsigned int index = 0;
1829 for (
unsigned int b = 0; b < this->n_base_elements(); ++b)
1832 this->base_element(b)
1833 .adjust_quad_dof_index_for_face_orientation_table;
1834 for (
unsigned int c = 0; c < this->element_multiplicity(b); ++c)
1836 for (
unsigned int i = 0; i < temp.
size(0); ++i)
1837 for (
unsigned int j = 0; j < 8; ++j)
1838 this->adjust_quad_dof_index_for_face_orientation_table(
1839 index + i, j) = temp(i, j);
1840 index += temp.
size(0);
1846 Assert(this->adjust_line_dof_index_for_line_orientation_table.size() ==
1847 this->dofs_per_line,
1850 for (
unsigned int b = 0; b < this->n_base_elements(); ++b)
1852 const std::vector<int> &temp2 =
1853 this->base_element(b)
1854 .adjust_line_dof_index_for_line_orientation_table;
1855 for (
unsigned int c = 0; c < this->element_multiplicity(b); ++c)
1860 this->adjust_line_dof_index_for_line_orientation_table.begin() +
1862 index += temp2.size();
1869 init_tasks.join_all();
1874 template <
int dim,
int spacedim>
1878 for (
unsigned int b = 0; b < this->n_base_elements(); ++b)
1879 if (base_element(b).hp_constraints_are_implemented() ==
false)
1887 template <
int dim,
int spacedim>
1893 Assert(interpolation_matrix.
n() == this->dofs_per_face,
1909 if (
const auto *fe_other_system =
1913 interpolation_matrix = 0;
1917 unsigned int base_index = 0, base_index_other = 0;
1918 unsigned int multiplicity = 0, multiplicity_other = 0;
1933 base_to_base_interpolation.
reinit(base_other.dofs_per_face,
1936 base_to_base_interpolation);
1941 for (
unsigned int i = 0; i < this->dofs_per_face; ++i)
1942 if (this->face_system_to_base_index(i).first ==
1943 std::make_pair(base_index, multiplicity))
1944 for (
unsigned int j = 0; j < fe_other_system->dofs_per_face; ++j)
1945 if (fe_other_system->face_system_to_base_index(j).first ==
1946 std::make_pair(base_index_other, multiplicity_other))
1947 interpolation_matrix(j, i) = base_to_base_interpolation(
1948 fe_other_system->face_system_to_base_index(j).second,
1949 this->face_system_to_base_index(i).second);
1955 if (multiplicity == this->element_multiplicity(base_index))
1960 ++multiplicity_other;
1961 if (multiplicity_other ==
1962 fe_other_system->element_multiplicity(base_index_other))
1964 multiplicity_other = 0;
1970 if (base_index == this->n_base_elements())
1972 Assert(base_index_other == fe_other_system->n_base_elements(),
1979 Assert(base_index_other != fe_other_system->n_base_elements(),
1990 spacedim>::ExcInterpolationNotImplemented()));
1996 template <
int dim,
int spacedim>
2000 const unsigned int subface,
2004 (x_source_fe.
get_name().find(
"FESystem<") == 0) ||
2008 Assert(interpolation_matrix.
n() == this->dofs_per_face,
2026 if (fe_other_system !=
nullptr)
2029 interpolation_matrix = 0;
2033 unsigned int base_index = 0, base_index_other = 0;
2034 unsigned int multiplicity = 0, multiplicity_other = 0;
2049 base_to_base_interpolation.
reinit(base_other.dofs_per_face,
2053 base_to_base_interpolation);
2058 for (
unsigned int i = 0; i < this->dofs_per_face; ++i)
2059 if (this->face_system_to_base_index(i).first ==
2060 std::make_pair(base_index, multiplicity))
2061 for (
unsigned int j = 0; j < fe_other_system->
dofs_per_face; ++j)
2063 std::make_pair(base_index_other, multiplicity_other))
2064 interpolation_matrix(j, i) = base_to_base_interpolation(
2066 this->face_system_to_base_index(i).second);
2072 if (multiplicity == this->element_multiplicity(base_index))
2077 ++multiplicity_other;
2078 if (multiplicity_other ==
2081 multiplicity_other = 0;
2087 if (base_index == this->n_base_elements())
2104 fe_other_system !=
nullptr,
2106 spacedim>::ExcInterpolationNotImplemented()));
2112 template <
int dim,
int spacedim>
2113 template <
int structdim>
2114 std::vector<std::pair<unsigned int, unsigned int>>
2135 unsigned int base_index = 0, base_index_other = 0;
2136 unsigned int multiplicity = 0, multiplicity_other = 0;
2140 unsigned int dof_offset = 0, dof_offset_other = 0;
2142 std::vector<std::pair<unsigned int, unsigned int>> identities;
2156 std::vector<std::pair<unsigned int, unsigned int>> base_identities;
2172 for (
const auto &base_identity : base_identities)
2173 identities.emplace_back(base_identity.first + dof_offset,
2174 base_identity.second + dof_offset_other);
2177 dof_offset += base.template n_dofs_per_object<structdim>();
2179 base_other.template n_dofs_per_object<structdim>();
2185 if (multiplicity == this->element_multiplicity(base_index))
2190 ++multiplicity_other;
2191 if (multiplicity_other ==
2192 fe_other_system->element_multiplicity(base_index_other))
2194 multiplicity_other = 0;
2200 if (base_index == this->n_base_elements())
2202 Assert(base_index_other == fe_other_system->n_base_elements(),
2209 Assert(base_index_other != fe_other_system->n_base_elements(),
2218 return std::vector<std::pair<unsigned int, unsigned int>>();
2224 template <
int dim,
int spacedim>
2225 std::vector<std::pair<unsigned int, unsigned int>>
2229 return hp_object_dof_identities<0>(fe_other);
2232 template <
int dim,
int spacedim>
2233 std::vector<std::pair<unsigned int, unsigned int>>
2237 return hp_object_dof_identities<1>(fe_other);
2242 template <
int dim,
int spacedim>
2243 std::vector<std::pair<unsigned int, unsigned int>>
2247 return hp_object_dof_identities<2>(fe_other);
2252 template <
int dim,
int spacedim>
2256 const unsigned int codim)
const 2269 Assert(this->n_base_elements() == fe_sys_other->n_base_elements(),
2276 for (
unsigned int b = 0; b < this->n_base_elements(); ++b)
2279 fe_sys_other->base_element(b).n_components(),
2281 Assert(this->element_multiplicity(b) ==
2282 fe_sys_other->element_multiplicity(b),
2288 (this->base_element(b).compare_for_domination(
2289 fe_sys_other->base_element(b), codim));
2290 domination = domination & base_domination;
2302 template <
int dim,
int spacedim>
2306 Assert(index < base_elements.size(),
2308 return *base_elements[index].first;
2313 template <
int dim,
int spacedim>
2316 const unsigned int shape_index,
2317 const unsigned int face_index)
const 2319 return (base_element(this->system_to_base_index(shape_index).first.first)
2320 .has_support_on_face(this->system_to_base_index(shape_index).second,
2326 template <
int dim,
int spacedim>
2330 Assert(index < this->dofs_per_cell,
2332 Assert((this->unit_support_points.size() == this->dofs_per_cell) ||
2333 (this->unit_support_points.size() == 0),
2337 if (this->unit_support_points.size() != 0)
2338 return this->unit_support_points[index];
2342 return (base_element(this->system_to_base_index(index).first.first)
2343 .unit_support_point(this->system_to_base_index(index).second));
2348 template <
int dim,
int spacedim>
2352 Assert(index < this->dofs_per_face,
2354 Assert((this->unit_face_support_points.size() == this->dofs_per_face) ||
2355 (this->unit_face_support_points.size() == 0),
2359 if (this->unit_face_support_points.size() != 0)
2360 return this->unit_face_support_points[index];
2364 return (base_element(this->face_system_to_base_index(index).first.first)
2365 .unit_face_support_point(
2366 this->face_system_to_base_index(index).second));
2371 template <
int dim,
int spacedim>
2372 std::pair<Table<2, bool>, std::vector<unsigned int>>
2379 std::vector<unsigned int> components;
2380 for (
unsigned int i = 0; i < base_elements.size(); ++i)
2382 const std::pair<Table<2, bool>, std::vector<unsigned int>> base_table =
2383 base_elements[i].first->get_constant_modes();
2385 const unsigned int element_multiplicity = this->element_multiplicity(i);
2390 const unsigned int comp = components.size();
2391 if (constant_modes.n_rows() <
2392 comp + base_table.first.n_rows() * element_multiplicity)
2394 Table<2, bool> new_constant_modes(comp + base_table.first.n_rows() *
2395 element_multiplicity,
2396 constant_modes.n_cols());
2397 for (
unsigned int r = 0; r < comp; ++r)
2398 for (
unsigned int c = 0; c < this->dofs_per_cell; ++c)
2399 new_constant_modes(r, c) = constant_modes(r, c);
2400 constant_modes.
swap(new_constant_modes);
2405 for (
unsigned int k = 0; k < this->dofs_per_cell; ++k)
2407 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> ind =
2408 this->system_to_base_index(k);
2409 if (ind.first.first == i)
2410 for (
unsigned int c = 0; c < base_table.first.n_rows(); ++c)
2411 constant_modes(comp +
2412 ind.first.second * base_table.first.n_rows() + c,
2413 k) = base_table.first(c, ind.second);
2415 for (
unsigned int r = 0; r < element_multiplicity; ++r)
2416 for (
const unsigned int c : base_table.second)
2417 components.push_back(
2418 comp + r * this->base_elements[i].first->n_components() + c);
2421 return std::pair<Table<2, bool>, std::vector<unsigned int>>(constant_modes,
2427 template <
int dim,
int spacedim>
2431 std::vector<double> & dof_values)
const 2433 Assert(this->has_generalized_support_points(),
2434 ExcMessage(
"The FESystem does not have generalized support points"));
2437 this->get_generalized_support_points().size());
2440 std::vector<double> base_dof_values;
2441 std::vector<Vector<double>> base_point_values;
2446 unsigned int current_vector_component = 0;
2447 for (
unsigned int base = 0; base < base_elements.size(); ++base)
2452 const auto & base_element = this->base_element(base);
2453 const unsigned int multiplicity = this->element_multiplicity(base);
2454 const unsigned int n_base_dofs = base_element.dofs_per_cell;
2455 const unsigned int n_base_components = base_element.n_components();
2460 if (n_base_dofs == 0)
2462 current_vector_component += multiplicity * n_base_components;
2466 if (base_element.has_generalized_support_points())
2468 const unsigned int n_base_points =
2469 base_element.get_generalized_support_points().size();
2471 base_dof_values.resize(n_base_dofs);
2472 base_point_values.resize(n_base_points);
2474 for (
unsigned int m = 0; m < multiplicity;
2475 ++m, current_vector_component += n_base_components)
2479 for (
unsigned int j = 0; j < base_point_values.size(); ++j)
2481 base_point_values[j].reinit(n_base_components,
false);
2484 generalized_support_points_index_table[base][j];
2489 std::begin(point_values[n]) + current_vector_component;
2490 const auto end = begin + n_base_components;
2491 std::copy(begin, end, std::begin(base_point_values[j]));
2495 .convert_generalized_support_point_values_to_dof_values(
2496 base_point_values, base_dof_values);
2505 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
2506 if (this->system_to_base_index(i).first ==
2507 std::make_pair(base, m))
2509 base_dof_values[this->system_to_base_index(i).second];
2521 for (
unsigned int m = 0; m < multiplicity; ++m)
2522 for (
unsigned int i = 0; i < this->dofs_per_cell; ++i)
2523 if (this->system_to_base_index(i).first ==
2524 std::make_pair(base, m))
2525 dof_values[i] = std::numeric_limits<double>::signaling_NaN();
2527 current_vector_component += multiplicity * n_base_components;
2534 template <
int dim,
int spacedim>
2542 sizeof(base_elements));
2543 for (
unsigned int i = 0; i < base_elements.size(); ++i)
2551 #include "fe_system.inst" 2553 DEAL_II_NAMESPACE_CLOSE
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
virtual std::size_t memory_consumption() const override
virtual Point< dim > unit_support_point(const unsigned int index) const override
static const unsigned int invalid_unsigned_int
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
void build_interface_constraints()
#define AssertDimension(dim1, dim2)
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
void initialize(const std::vector< const FiniteElement< dim, spacedim > *> &fes, const std::vector< unsigned int > &multiplicities)
virtual std::string get_name() const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
void swap(TableBase< N, T > &v)
std::vector< std::pair< unsigned int, unsigned int > > hp_object_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
unsigned int n_nonzero_components(const unsigned int i) const
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const override
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
Task< RT > new_task(const std::function< RT()> &function)
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double >> &support_point_values, std::vector< double > &dof_values) const override
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const override
#define AssertThrow(cond, exc)
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
virtual unsigned int face_to_cell_index(const unsigned int face_dof_index, const unsigned int face, const bool face_orientation=true, const bool face_flip=false, const bool face_rotation=false) const override
static ::ExceptionBase & ExcInterpolationNotImplemented()
virtual const FiniteElement< dim, spacedim > & get_sub_fe(const unsigned int first_component, const unsigned int n_selected_components) const override
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
static ::ExceptionBase & ExcIndexRange(int arg1, int arg2, int arg3)
InternalData(const unsigned int n_base_elements)
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const override
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
static ::ExceptionBase & ExcMessage(std::string arg1)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
virtual std::size_t memory_consumption() const
Third derivatives of shape functions.
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
#define Assert(cond, exc)
unsigned int element_multiplicity(const unsigned int index) const
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
Abstract base class for mapping classes.
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
void set_fe_data(const unsigned int base_no, std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase >)
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_subface_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const Quadrature< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
virtual std::string get_name() const =0
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
Second derivatives of shape functions.
virtual bool hp_constraints_are_implemented() const override
std::string dim_string(const int dim, const int spacedim)
unsigned int size() const
const unsigned int dofs_per_cell
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const override
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const override final
virtual Tensor< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
size_type size(const unsigned int i) const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > face_system_to_base_index(const unsigned int index) const
unsigned int n_components() const
FiniteElement< dim, spacedim >::InternalDataBase & get_fe_data(const unsigned int base_no) const
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
Shape function gradients.
FESystem(const FiniteElement< dim, spacedim > &fe, const unsigned int n_elements)
const unsigned int dofs_per_face
internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > & get_fe_output_object(const unsigned int base_no) const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
static ::ExceptionBase & ExcNotImplemented()
void compute_fill(const Mapping< dim, spacedim > &mapping, const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim_1 > &quadrature, const CellSimilarity::Similarity cell_similarity, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const typename FiniteElement< dim, spacedim >::InternalDataBase &fe_data, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
unsigned int n_components(const DoFHandler< dim, spacedim > &dh)
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
unsigned int n_base_elements() const
virtual void fill_fe_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const CellSimilarity::Similarity cell_similarity, const Quadrature< dim > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
std::vector< std::pair< std::unique_ptr< const FiniteElement< dim, spacedim > >, unsigned int > > base_elements
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
virtual Point< dim - 1 > unit_face_support_point(const unsigned int index) const override
static ::ExceptionBase & ExcInternalError()