38 count_nonzeros(
const std::vector<unsigned int> &vec)
40 return std::count_if(vec.begin(), vec.end(), [](
const unsigned int i) {
48 template <
int dim,
int spacedim>
50 const unsigned int n_base_elements)
51 : base_fe_datas(n_base_elements)
52 , base_fe_output_objects(n_base_elements)
57 template <
int dim,
int spacedim>
61 for (
unsigned int i = 0; i < base_fe_datas.size(); ++i)
62 base_fe_datas[i].reset();
66 template <
int dim,
int spacedim>
69 const unsigned int base_no)
const
72 return *base_fe_datas[base_no];
77 template <
int dim,
int spacedim>
80 const unsigned int base_no,
84 base_fe_datas[base_no] = std::move(ptr);
89 template <
int dim,
int spacedim>
92 const unsigned int base_no)
const
95 return base_fe_output_objects[base_no];
103 template <
int dim,
int spacedim>
107 template <
int dim,
int spacedim>
109 const unsigned int n_elements)
117 std::vector<const FiniteElement<dim, spacedim> *> fes;
119 std::vector<unsigned int> multiplicities;
120 multiplicities.push_back(n_elements);
126 template <
int dim,
int spacedim>
128 const unsigned int n1,
130 const unsigned int n2)
138 , base_elements((n1 > 0) + (n2 > 0))
140 std::vector<const FiniteElement<dim, spacedim> *> fes;
143 std::vector<unsigned int> multiplicities;
144 multiplicities.push_back(n1);
145 multiplicities.push_back(n2);
151 template <
int dim,
int spacedim>
153 const unsigned int n1,
155 const unsigned int n2,
157 const unsigned int n3)
172 , base_elements((n1 > 0) + (n2 > 0) + (n3 > 0))
174 std::vector<const FiniteElement<dim, spacedim> *> fes;
178 std::vector<unsigned int> multiplicities;
179 multiplicities.push_back(n1);
180 multiplicities.push_back(n2);
181 multiplicities.push_back(n3);
187 template <
int dim,
int spacedim>
189 const unsigned int n1,
191 const unsigned int n2,
193 const unsigned int n3,
195 const unsigned int n4)
221 , base_elements((n1 > 0) + (n2 > 0) + (n3 > 0) + (n4 > 0))
223 std::vector<const FiniteElement<dim, spacedim> *> fes;
228 std::vector<unsigned int> multiplicities;
229 multiplicities.push_back(n1);
230 multiplicities.push_back(n2);
231 multiplicities.push_back(n3);
232 multiplicities.push_back(n4);
238 template <
int dim,
int spacedim>
240 const unsigned int n1,
242 const unsigned int n2,
244 const unsigned int n3,
246 const unsigned int n4,
248 const unsigned int n5)
251 multiply_dof_numbers(&fe1, n1, &fe2, n2, &fe3, n3, &fe4, n4, &fe5, n5),
272 , base_elements((n1 > 0) + (n2 > 0) + (n3 > 0) + (n4 > 0) + (n5 > 0))
274 std::vector<const FiniteElement<dim, spacedim> *> fes;
280 std::vector<unsigned int> multiplicities;
281 multiplicities.push_back(n1);
282 multiplicities.push_back(n2);
283 multiplicities.push_back(n3);
284 multiplicities.push_back(n4);
285 multiplicities.push_back(n5);
291 template <
int dim,
int spacedim>
294 const std::vector<unsigned int> & multiplicities)
301 , base_elements(count_nonzeros(multiplicities))
308 template <
int dim,
int spacedim>
319 std::ostringstream namebuf;
322 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
324 namebuf << base_element(i).get_name();
325 if (this->element_multiplicity(i) != 1)
326 namebuf <<
'^' << this->element_multiplicity(i);
327 if (i != this->n_base_elements() - 1)
332 return namebuf.str();
337 template <
int dim,
int spacedim>
338 std::unique_ptr<FiniteElement<dim, spacedim>>
341 std::vector<const FiniteElement<dim, spacedim> *> fes;
342 std::vector<unsigned int> multiplicities;
344 for (
unsigned int i = 0; i < this->n_base_elements(); i++)
346 fes.push_back(&base_element(i));
347 multiplicities.push_back(this->element_multiplicity(i));
349 return std::make_unique<FESystem<dim, spacedim>>(fes, multiplicities);
354 template <
int dim,
int spacedim>
357 const unsigned int first_component,
358 const unsigned int n_selected_components)
const
360 Assert(first_component + n_selected_components <= this->n_components(),
361 ExcMessage(
"Invalid arguments (not a part of this FiniteElement)."));
363 const unsigned int base_index =
364 this->component_to_base_table[first_component].first.first;
365 const unsigned int component_in_base =
366 this->component_to_base_table[first_component].first.second;
367 const unsigned int base_components =
368 this->base_element(base_index).n_components();
372 if (n_selected_components <= base_components)
373 return this->base_element(base_index)
374 .get_sub_fe(component_in_base, n_selected_components);
376 Assert(n_selected_components == this->n_components(),
377 ExcMessage(
"You can not select a part of a FiniteElement."));
383 template <
int dim,
int spacedim>
389 Assert(this->is_primitive(i),
393 return (base_element(this->system_to_base_table[i].
first.first)
394 .shape_value(this->system_to_base_table[i].second, p));
399 template <
int dim,
int spacedim>
402 const unsigned int i,
404 const unsigned int component)
const
411 if (this->nonzero_components[i][component] ==
false)
419 const unsigned int base = this->component_to_base_index(component).first;
420 const unsigned int component_in_base =
421 this->component_to_base_index(component).second;
429 return (base_element(base).shape_value_component(
430 this->system_to_base_table[i].
second, p, component_in_base));
435 template <
int dim,
int spacedim>
441 Assert(this->is_primitive(i),
445 return (base_element(this->system_to_base_table[i].
first.first)
446 .shape_grad(this->system_to_base_table[i].second, p));
451 template <
int dim,
int spacedim>
454 const unsigned int i,
456 const unsigned int component)
const
462 if (this->nonzero_components[i][component] ==
false)
467 const unsigned int base = this->component_to_base_index(component).first;
468 const unsigned int component_in_base =
469 this->component_to_base_index(component).second;
474 return (base_element(base).shape_grad_component(
475 this->system_to_base_table[i].
second, p, component_in_base));
480 template <
int dim,
int spacedim>
486 Assert(this->is_primitive(i),
490 return (base_element(this->system_to_base_table[i].
first.first)
491 .shape_grad_grad(this->system_to_base_table[i].second, p));
496 template <
int dim,
int spacedim>
499 const unsigned int i,
501 const unsigned int component)
const
507 if (this->nonzero_components[i][component] ==
false)
512 const unsigned int base = this->component_to_base_index(component).first;
513 const unsigned int component_in_base =
514 this->component_to_base_index(component).second;
519 return (base_element(base).shape_grad_grad_component(
520 this->system_to_base_table[i].
second, p, component_in_base));
525 template <
int dim,
int spacedim>
531 Assert(this->is_primitive(i),
535 return (base_element(this->system_to_base_table[i].
first.first)
536 .shape_3rd_derivative(this->system_to_base_table[i].second, p));
541 template <
int dim,
int spacedim>
544 const unsigned int i,
546 const unsigned int component)
const
552 if (this->nonzero_components[i][component] ==
false)
557 const unsigned int base = this->component_to_base_index(component).first;
558 const unsigned int component_in_base =
559 this->component_to_base_index(component).second;
564 return (base_element(base).shape_3rd_derivative_component(
565 this->system_to_base_table[i].
second, p, component_in_base));
570 template <
int dim,
int spacedim>
576 Assert(this->is_primitive(i),
580 return (base_element(this->system_to_base_table[i].
first.first)
581 .shape_4th_derivative(this->system_to_base_table[i].second, p));
586 template <
int dim,
int spacedim>
589 const unsigned int i,
591 const unsigned int component)
const
597 if (this->nonzero_components[i][component] ==
false)
602 const unsigned int base = this->component_to_base_index(component).first;
603 const unsigned int component_in_base =
604 this->component_to_base_index(component).second;
609 return (base_element(base).shape_4th_derivative_component(
610 this->system_to_base_table[i].
second, p, component_in_base));
615 template <
int dim,
int spacedim>
625 Assert((interpolation_matrix.
m() == this->n_dofs_per_cell()) ||
628 this->n_dofs_per_cell()));
630 (this->n_dofs_per_cell() == 0),
640 (x_source_fe.
get_name().find(
"FESystem<") == 0) ||
654 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
658 spacedim>::ExcInterpolationNotImplemented()));
667 std::vector<FullMatrix<double>> base_matrices(this->n_base_elements());
668 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
670 base_matrices[i].reinit(base_element(i).n_dofs_per_cell(),
672 base_element(i).get_interpolation_matrix(source_fe.
base_element(i),
679 interpolation_matrix = 0;
680 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
682 if (this->system_to_base_table[i].
first ==
684 interpolation_matrix(i, j) =
685 (base_matrices[this->system_to_base_table[i].first.first](
686 this->system_to_base_table[i].second,
692 template <
int dim,
int spacedim>
695 const unsigned int child,
702 "Restriction matrices are only available for refined cells!"));
706 if (this->restriction[refinement_case - 1][child].n() == 0)
708 std::lock_guard<std::mutex> lock(this->mutex);
711 if (this->restriction[refinement_case - 1][child].n() ==
712 this->n_dofs_per_cell())
713 return this->restriction[refinement_case - 1][child];
716 bool do_restriction =
true;
719 std::vector<const FullMatrix<double> *> base_matrices(
720 this->n_base_elements());
722 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
725 &base_element(i).get_restriction_matrix(child, refinement_case);
726 if (base_matrices[i]->n() != base_element(i).n_dofs_per_cell())
727 do_restriction =
false;
736 this->n_dofs_per_cell());
746 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
747 for (
unsigned int j = 0; j < this->n_dofs_per_cell(); ++j)
754 if (this->system_to_base_table[i].
first !=
755 this->system_to_base_table[j].
first)
759 const unsigned int base =
760 this->system_to_base_table[i].first.first;
762 const unsigned int base_index_i =
763 this->system_to_base_table[i].second,
765 this->system_to_base_table[j].second;
770 (*base_matrices[base])(base_index_i, base_index_j);
774 this->restriction[refinement_case - 1][child]));
778 return this->restriction[refinement_case - 1][child];
783 template <
int dim,
int spacedim>
786 const unsigned int child,
793 "Restriction matrices are only available for refined cells!"));
798 if (this->prolongation[refinement_case - 1][child].n() == 0)
800 std::lock_guard<std::mutex> lock(this->mutex);
802 if (this->prolongation[refinement_case - 1][child].n() ==
803 this->n_dofs_per_cell())
804 return this->prolongation[refinement_case - 1][child];
806 bool do_prolongation =
true;
807 std::vector<const FullMatrix<double> *> base_matrices(
808 this->n_base_elements());
809 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
812 &base_element(i).get_prolongation_matrix(child, refinement_case);
813 if (base_matrices[i]->n() != base_element(i).n_dofs_per_cell())
814 do_prolongation =
false;
822 this->n_dofs_per_cell());
824 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
825 for (
unsigned int j = 0; j < this->n_dofs_per_cell(); ++j)
827 if (this->system_to_base_table[i].
first !=
828 this->system_to_base_table[j].
first)
830 const unsigned int base =
831 this->system_to_base_table[i].first.first;
833 const unsigned int base_index_i =
834 this->system_to_base_table[i].second,
836 this->system_to_base_table[j].second;
838 (*base_matrices[base])(base_index_i, base_index_j);
841 this->prolongation[refinement_case - 1][child]));
845 return this->prolongation[refinement_case - 1][child];
849 template <
int dim,
int spacedim>
852 const unsigned int face,
853 const bool face_orientation,
854 const bool face_flip,
855 const bool face_rotation)
const
860 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
861 face_base_index = this->face_system_to_base_index(face_dof_index, face);
863 const unsigned int base_face_to_cell_index =
864 this->base_element(face_base_index.first.first)
865 .face_to_cell_index(face_base_index.second,
876 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> target =
877 std::make_pair(face_base_index.first, base_face_to_cell_index);
878 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
879 if (this->system_to_base_index(i) == target)
894 template <
int dim,
int spacedim>
901 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
902 out |= base_element(base_no).requires_update_flags(flags);
908 template <
int dim,
int spacedim>
909 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
925 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
926 data_ptr = std::make_unique<InternalData>(this->n_base_elements());
928 data.update_each = requires_update_flags(flags);
942 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
945 &base_fe_output_object = data.get_fe_output_object(base_no);
948 base_element(base_no),
949 flags | base_element(base_no).requires_update_flags(flags));
957 auto base_fe_data = base_element(base_no).get_data(flags,
960 base_fe_output_object);
962 data.set_fe_data(base_no, std::move(base_fe_data));
971 template <
int dim,
int spacedim>
972 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
988 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
989 data_ptr = std::make_unique<InternalData>(this->n_base_elements());
991 data.update_each = requires_update_flags(flags);
1005 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
1008 &base_fe_output_object = data.get_fe_output_object(base_no);
1011 base_element(base_no),
1012 flags | base_element(base_no).requires_update_flags(flags));
1020 auto base_fe_data = base_element(base_no).get_face_data(
1021 flags, mapping, quadrature, base_fe_output_object);
1023 data.set_fe_data(base_no, std::move(base_fe_data));
1034 template <
int dim,
int spacedim>
1035 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1051 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1052 data_ptr = std::make_unique<InternalData>(this->n_base_elements());
1055 data.update_each = requires_update_flags(flags);
1069 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
1072 &base_fe_output_object = data.get_fe_output_object(base_no);
1075 base_element(base_no),
1076 flags | base_element(base_no).requires_update_flags(flags));
1084 auto base_fe_data = base_element(base_no).get_subface_data(
1085 flags, mapping, quadrature, base_fe_output_object);
1087 data.set_fe_data(base_no, std::move(base_fe_data));
1095 template <
int dim,
int spacedim>
1103 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1111 compute_fill(mapping,
1113 invalid_face_number,
1114 invalid_face_number,
1125 template <
int dim,
int spacedim>
1129 const unsigned int face_no,
1133 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1141 compute_fill(mapping,
1144 invalid_face_number,
1155 template <
int dim,
int spacedim>
1159 const unsigned int face_no,
1160 const unsigned int sub_no,
1164 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1172 compute_fill(mapping,
1186 template <
int dim,
int spacedim>
1187 template <
int dim_1>
1192 const unsigned int face_no,
1193 const unsigned int sub_no,
1230 for (
unsigned int base_no = 0; base_no < this->n_base_elements(); ++base_no)
1243 const Quadrature<dim - 1> * sub_face_quadrature =
nullptr;
1244 const unsigned int n_q_points = quadrature.
size() == 1 ?
1245 quadrature[0].
size() :
1246 quadrature[face_no].
size();
1251 if (face_no == invalid_face_number)
1253 const Subscriptor *quadrature_base_pointer = &quadrature[0];
1256 quadrature_base_pointer) !=
nullptr,
1262 else if (sub_no == invalid_face_number)
1264 const Subscriptor *quadrature_base_pointer = &quadrature;
1267 quadrature_base_pointer) !=
nullptr,
1271 quadrature_base_pointer);
1275 const Subscriptor *quadrature_base_pointer = &quadrature[0];
1278 quadrature_base_pointer) !=
nullptr,
1281 sub_face_quadrature =
1282 static_cast<const Quadrature<dim - 1
> *>(quadrature_base_pointer);
1293 if (face_no == invalid_face_number)
1302 else if (sub_no == invalid_face_number)
1315 *sub_face_quadrature,
1335 const UpdateFlags base_flags = base_fe_data.update_each;
1342 for (
unsigned int system_index = 0;
1343 system_index < this->n_dofs_per_cell();
1345 if (this->system_to_base_table[system_index].
first.first == base_no)
1347 const unsigned int base_index =
1348 this->system_to_base_table[system_index].second;
1358 unsigned int out_index = 0;
1359 for (
unsigned int i = 0; i < system_index; ++i)
1360 out_index += this->n_nonzero_components(i);
1361 unsigned int in_index = 0;
1362 for (
unsigned int i = 0; i < base_index; ++i)
1366 Assert(this->n_nonzero_components(system_index) ==
1371 for (
unsigned int s = 0;
1372 s < this->n_nonzero_components(system_index);
1374 for (
unsigned int q = 0; q < n_q_points; ++q)
1376 base_data.shape_values(in_index + s, q);
1379 for (
unsigned int s = 0;
1380 s < this->n_nonzero_components(system_index);
1382 for (
unsigned int q = 0; q < n_q_points; ++q)
1384 base_data.shape_gradients[in_index + s][q];
1387 for (
unsigned int s = 0;
1388 s < this->n_nonzero_components(system_index);
1390 for (
unsigned int q = 0; q < n_q_points; ++q)
1392 base_data.shape_hessians[in_index + s][q];
1395 for (
unsigned int s = 0;
1396 s < this->n_nonzero_components(system_index);
1398 for (
unsigned int q = 0; q < n_q_points; ++q)
1400 base_data.shape_3rd_derivatives[in_index + s][q];
1406 template <
int dim,
int spacedim>
1413 const unsigned int face_no = 0;
1419 for (
unsigned int base = 0; base < this->n_base_elements(); ++base)
1420 if (base_element(base).constraints_are_implemented() ==
false)
1423 this->interface_constraints.TableBase<2, double>::reinit(
1424 this->interface_constraints_size());
1434 for (
unsigned int n = 0; n < this->interface_constraints.n(); ++n)
1435 for (
unsigned int m = 0; m < this->interface_constraints.m(); ++m)
1444 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1445 n_index = this->face_system_to_base_table[face_no][n];
1449 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> m_index;
1466 if (m < this->n_dofs_per_vertex())
1467 m_index = this->system_to_base_table[m];
1471 const unsigned int index_in_line =
1472 (m - this->n_dofs_per_vertex()) % this->n_dofs_per_line();
1473 const unsigned int sub_line =
1474 (m - this->n_dofs_per_vertex()) / this->n_dofs_per_line();
1481 const unsigned int tmp1 =
1482 2 * this->n_dofs_per_vertex() + index_in_line;
1484 this->face_system_to_base_table[face_no][tmp1].first;
1496 this->face_system_to_base_table[face_no][tmp1].
second >=
1498 base_element(m_index.first.first).n_dofs_per_vertex(),
1500 const unsigned int tmp2 =
1501 this->face_system_to_base_table[face_no][tmp1].second -
1502 2 * base_element(m_index.first.first).n_dofs_per_vertex();
1503 Assert(tmp2 < base_element(m_index.first.first)
1507 base_element(m_index.first.first).n_dofs_per_vertex() +
1508 base_element(m_index.first.first).n_dofs_per_line() *
1522 if (m < 5 * this->n_dofs_per_vertex())
1523 m_index = this->system_to_base_table[m];
1526 if (m < 5 * this->n_dofs_per_vertex() +
1527 12 * this->n_dofs_per_line())
1530 const unsigned int index_in_line =
1531 (m - 5 * this->n_dofs_per_vertex()) %
1532 this->n_dofs_per_line();
1533 const unsigned int sub_line =
1534 (m - 5 * this->n_dofs_per_vertex()) /
1535 this->n_dofs_per_line();
1538 const unsigned int tmp1 =
1539 4 * this->n_dofs_per_vertex() + index_in_line;
1541 this->face_system_to_base_table[face_no][tmp1].first;
1544 this->face_system_to_base_table[face_no][tmp1].
second >=
1546 base_element(m_index.first.first).n_dofs_per_vertex(),
1548 const unsigned int tmp2 =
1549 this->face_system_to_base_table[face_no][tmp1].second -
1550 4 * base_element(m_index.first.first).n_dofs_per_vertex();
1551 Assert(tmp2 < base_element(m_index.first.first)
1556 base_element(m_index.first.first).n_dofs_per_vertex() +
1557 base_element(m_index.first.first).n_dofs_per_line() *
1565 const unsigned int index_in_quad =
1566 (m - 5 * this->n_dofs_per_vertex() -
1567 12 * this->n_dofs_per_line()) %
1568 this->n_dofs_per_quad(face_no);
1569 Assert(index_in_quad < this->n_dofs_per_quad(face_no),
1571 const unsigned int sub_quad =
1572 ((m - 5 * this->n_dofs_per_vertex() -
1573 12 * this->n_dofs_per_line()) /
1574 this->n_dofs_per_quad(face_no));
1577 const unsigned int tmp1 = 4 * this->n_dofs_per_vertex() +
1578 4 * this->n_dofs_per_line() +
1581 this->face_system_to_base_table[face_no].size(),
1584 this->face_system_to_base_table[face_no][tmp1].first;
1587 this->face_system_to_base_table[face_no][tmp1].
second >=
1588 4 * base_element(m_index.first.first)
1589 .n_dofs_per_vertex() +
1591 base_element(m_index.first.first).n_dofs_per_line(),
1593 const unsigned int tmp2 =
1594 this->face_system_to_base_table[face_no][tmp1].second -
1596 base_element(m_index.first.first).n_dofs_per_vertex() -
1597 4 * base_element(m_index.first.first).n_dofs_per_line();
1598 Assert(tmp2 < base_element(m_index.first.first)
1599 .n_dofs_per_quad(face_no),
1603 base_element(m_index.first.first).n_dofs_per_vertex() +
1604 12 * base_element(m_index.first.first).n_dofs_per_line() +
1605 base_element(m_index.first.first)
1606 .n_dofs_per_quad(face_no) *
1621 if (n_index.first == m_index.first)
1622 this->interface_constraints(m, n) =
1623 (base_element(n_index.first.first)
1624 .constraints()(m_index.second, n_index.second));
1630 template <
int dim,
int spacedim>
1634 const std::vector<unsigned int> & multiplicities)
1636 Assert(fes.size() == multiplicities.size(),
1639 ExcMessage(
"Need to pass at least one finite element."));
1640 Assert(count_nonzeros(multiplicities) > 0,
1641 ExcMessage(
"You only passed FiniteElements with multiplicity 0."));
1646 this->base_to_block_indices.reinit(0, 0);
1648 for (
unsigned int i = 0; i < fes.size(); i++)
1649 if (multiplicities[i] > 0)
1650 this->base_to_block_indices.push_back(multiplicities[i]);
1655 unsigned int ind = 0;
1656 for (
unsigned int i = 0; i < fes.size(); i++)
1657 if (multiplicities[i] > 0)
1660 base_elements[ind] = {fes[i]->clone(), multiplicities[i]};
1674 this->system_to_component_table.resize(this->n_dofs_per_cell());
1677 this->system_to_component_table,
1678 this->component_to_base_table,
1681 this->face_system_to_component_table.resize(this->n_unique_faces());
1683 for (
unsigned int face_no = 0; face_no < this->n_unique_faces(); ++face_no)
1685 this->face_system_to_component_table[0].resize(
1686 this->n_dofs_per_face(face_no));
1689 this->face_system_to_base_table[face_no],
1690 this->face_system_to_component_table[face_no],
1711 for (
unsigned int base_el = 0; base_el < this->n_base_elements(); ++base_el)
1712 if (!base_element(base_el).has_support_points() &&
1713 base_element(base_el).n_dofs_per_cell() != 0)
1722 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
1724 const unsigned int base = this->system_to_base_table[i].first.first,
1725 base_index = this->system_to_base_table[i].second;
1730 base_element(base).unit_support_points[base_index];
1737 for (
unsigned int face_no = 0; face_no < this->n_unique_faces();
1750 bool flag_has_no_support_points =
false;
1752 for (
unsigned int base_el = 0; base_el < this->n_base_elements();
1754 if (!base_element(base_el).has_support_points() &&
1755 (base_element(base_el).n_dofs_per_face(face_no) > 0))
1757 this->unit_face_support_points[face_no].resize(0);
1758 flag_has_no_support_points =
true;
1763 if (flag_has_no_support_points)
1768 this->unit_face_support_points[face_no].resize(
1769 this->n_dofs_per_face(face_no));
1771 for (
unsigned int i = 0; i < this->n_dofs_per_face(face_no); ++i)
1773 const unsigned int base_i =
1774 this->face_system_to_base_table[face_no][i].first.first;
1775 const unsigned int index_in_base =
1776 this->face_system_to_base_table[face_no][i].second;
1780 base_element(base_i).unit_face_support_points[face_no].size(),
1783 this->unit_face_support_points[face_no][i] =
1784 base_element(base_i)
1785 .unit_face_support_points[face_no][index_in_base];
1798 generalized_support_points_index_table.resize(this->n_base_elements());
1800 for (
unsigned int base = 0; base < this->n_base_elements(); ++base)
1811 if (!base_element(base).has_generalized_support_points())
1814 for (
const auto &
point :
1815 base_element(base).get_generalized_support_points())
1819 std::find(
std::begin(this->generalized_support_points),
1820 std::end(this->generalized_support_points),
1823 if (p ==
std::end(this->generalized_support_points))
1826 const auto n = this->generalized_support_points.size();
1827 generalized_support_points_index_table[base].push_back(n);
1828 this->generalized_support_points.push_back(
point);
1833 const auto n = p -
std::begin(this->generalized_support_points);
1834 generalized_support_points_index_table[base].push_back(n);
1841 for (
unsigned int i = 0; i < base_elements.size(); ++i)
1843 if (!base_element(i).has_generalized_support_points())
1846 const auto &points =
1847 base_elements[i].first->get_generalized_support_points();
1848 for (
unsigned int j = 0; j < points.size(); ++j)
1850 const auto n = generalized_support_points_index_table[i][j];
1851 Assert(this->generalized_support_points[n] == points[j],
1861 for (
unsigned int face_no = 0; face_no < this->n_unique_faces();
1866 Assert(this->adjust_quad_dof_index_for_face_orientation_table[face_no]
1867 .n_elements() == 8 * this->n_dofs_per_quad(face_no),
1872 unsigned int index = 0;
1873 for (
unsigned int b = 0;
b < this->n_base_elements(); ++
b)
1876 this->base_element(
b)
1877 .adjust_quad_dof_index_for_face_orientation_table[face_no];
1878 for (
unsigned int c = 0; c < this->element_multiplicity(
b); ++c)
1880 for (
unsigned int i = 0; i < temp.size(0); ++i)
1881 for (
unsigned int j = 0; j < 8; ++j)
1882 this->adjust_quad_dof_index_for_face_orientation_table
1883 [face_no](index + i, j) = temp(i, j);
1884 index += temp.size(0);
1891 Assert(this->adjust_line_dof_index_for_line_orientation_table.size() ==
1892 this->n_dofs_per_line(),
1894 unsigned int index = 0;
1895 for (
unsigned int b = 0;
b < this->n_base_elements(); ++
b)
1897 const std::vector<int> &temp2 =
1898 this->base_element(
b)
1899 .adjust_line_dof_index_for_line_orientation_table;
1900 for (
unsigned int c = 0; c < this->element_multiplicity(
b); ++c)
1905 this->adjust_line_dof_index_for_line_orientation_table.begin() +
1907 index += temp2.size();
1919 template <
int dim,
int spacedim>
1923 for (
unsigned int b = 0;
b < this->n_base_elements(); ++
b)
1924 if (base_element(
b).hp_constraints_are_implemented() ==
false)
1932 template <
int dim,
int spacedim>
1937 const unsigned int face_no)
const
1939 Assert(interpolation_matrix.
n() == this->n_dofs_per_face(face_no),
1941 this->n_dofs_per_face(face_no)));
1956 if (
const auto *fe_other_system =
1960 interpolation_matrix = 0;
1964 unsigned int base_index = 0, base_index_other = 0;
1965 unsigned int multiplicity = 0, multiplicity_other = 0;
1980 base_to_base_interpolation.reinit(base_other.n_dofs_per_face(face_no),
1983 base_to_base_interpolation,
1989 for (
unsigned int i = 0; i < this->n_dofs_per_face(face_no); ++i)
1990 if (this->face_system_to_base_index(i, face_no).first ==
1991 std::make_pair(base_index, multiplicity))
1992 for (
unsigned int j = 0;
1993 j < fe_other_system->n_dofs_per_face(face_no);
1995 if (fe_other_system->face_system_to_base_index(j, face_no)
1997 std::make_pair(base_index_other, multiplicity_other))
1998 interpolation_matrix(j, i) = base_to_base_interpolation(
1999 fe_other_system->face_system_to_base_index(j, face_no)
2001 this->face_system_to_base_index(i, face_no).second);
2007 if (multiplicity == this->element_multiplicity(base_index))
2012 ++multiplicity_other;
2013 if (multiplicity_other ==
2014 fe_other_system->element_multiplicity(base_index_other))
2016 multiplicity_other = 0;
2022 if (base_index == this->n_base_elements())
2024 Assert(base_index_other == fe_other_system->n_base_elements(),
2031 Assert(base_index_other != fe_other_system->n_base_elements(),
2042 spacedim>::ExcInterpolationNotImplemented()));
2048 template <
int dim,
int spacedim>
2052 const unsigned int subface,
2054 const unsigned int face_no)
const
2057 (x_source_fe.
get_name().find(
"FESystem<") == 0) ||
2061 Assert(interpolation_matrix.
n() == this->n_dofs_per_face(face_no),
2063 this->n_dofs_per_face(face_no)));
2080 if (fe_other_system !=
nullptr)
2083 interpolation_matrix = 0;
2087 unsigned int base_index = 0, base_index_other = 0;
2088 unsigned int multiplicity = 0, multiplicity_other = 0;
2103 base_to_base_interpolation.reinit(base_other.n_dofs_per_face(face_no),
2107 base_to_base_interpolation,
2113 for (
unsigned int i = 0; i < this->n_dofs_per_face(face_no); ++i)
2114 if (this->face_system_to_base_index(i, face_no).first ==
2115 std::make_pair(base_index, multiplicity))
2116 for (
unsigned int j = 0;
2121 std::make_pair(base_index_other, multiplicity_other))
2122 interpolation_matrix(j, i) = base_to_base_interpolation(
2125 this->face_system_to_base_index(i, face_no).second);
2131 if (multiplicity == this->element_multiplicity(base_index))
2136 ++multiplicity_other;
2137 if (multiplicity_other ==
2140 multiplicity_other = 0;
2146 if (base_index == this->n_base_elements())
2163 fe_other_system !=
nullptr,
2165 spacedim>::ExcInterpolationNotImplemented()));
2171 template <
int dim,
int spacedim>
2172 template <
int structdim>
2173 std::vector<std::pair<unsigned int, unsigned int>>
2176 const unsigned int face_no)
const
2195 unsigned int base_index = 0, base_index_other = 0;
2196 unsigned int multiplicity = 0, multiplicity_other = 0;
2200 unsigned int dof_offset = 0, dof_offset_other = 0;
2202 std::vector<std::pair<unsigned int, unsigned int>> identities;
2216 std::vector<std::pair<unsigned int, unsigned int>> base_identities;
2233 for (
const auto &base_identity : base_identities)
2234 identities.emplace_back(base_identity.first + dof_offset,
2235 base_identity.second + dof_offset_other);
2238 dof_offset += base.template n_dofs_per_object<structdim>();
2240 base_other.template n_dofs_per_object<structdim>();
2246 if (multiplicity == this->element_multiplicity(base_index))
2251 ++multiplicity_other;
2252 if (multiplicity_other ==
2253 fe_other_system->element_multiplicity(base_index_other))
2255 multiplicity_other = 0;
2261 if (base_index == this->n_base_elements())
2263 Assert(base_index_other == fe_other_system->n_base_elements(),
2270 Assert(base_index_other != fe_other_system->n_base_elements(),
2279 return std::vector<std::pair<unsigned int, unsigned int>>();
2285 template <
int dim,
int spacedim>
2286 std::vector<std::pair<unsigned int, unsigned int>>
2290 return hp_object_dof_identities<0>(fe_other);
2293 template <
int dim,
int spacedim>
2294 std::vector<std::pair<unsigned int, unsigned int>>
2298 return hp_object_dof_identities<1>(fe_other);
2303 template <
int dim,
int spacedim>
2304 std::vector<std::pair<unsigned int, unsigned int>>
2307 const unsigned int face_no)
const
2309 return hp_object_dof_identities<2>(fe_other, face_no);
2314 template <
int dim,
int spacedim>
2318 const unsigned int codim)
const
2329 Assert(this->n_components() == fe_sys_other->n_components(),
2331 Assert(this->n_base_elements() == fe_sys_other->n_base_elements(),
2338 for (
unsigned int b = 0;
b < this->n_base_elements(); ++
b)
2340 Assert(this->base_element(
b).n_components() ==
2341 fe_sys_other->base_element(
b).n_components(),
2343 Assert(this->element_multiplicity(
b) ==
2344 fe_sys_other->element_multiplicity(
b),
2350 (this->base_element(
b).compare_for_domination(
2351 fe_sys_other->base_element(
b), codim));
2352 domination = domination & base_domination;
2364 template <
int dim,
int spacedim>
2369 return *base_elements[index].first;
2374 template <
int dim,
int spacedim>
2377 const unsigned int shape_index,
2378 const unsigned int face_index)
const
2380 return (base_element(this->system_to_base_index(shape_index).
first.first)
2381 .has_support_on_face(this->system_to_base_index(shape_index).second,
2387 template <
int dim,
int spacedim>
2393 (this->unit_support_points.size() == 0),
2402 return (base_element(this->system_to_base_index(index).
first.first)
2403 .unit_support_point(this->system_to_base_index(index).second));
2408 template <
int dim,
int spacedim>
2411 const unsigned int index,
2412 const unsigned int face_no)
const
2416 (this->unit_face_support_points[this->n_unique_faces() == 1 ? 0 : face_no]
2417 .size() == this->n_dofs_per_face(face_no)) ||
2418 (this->unit_face_support_points[this->n_unique_faces() == 1 ? 0 : face_no]
2423 if (this->unit_face_support_points[this->n_unique_faces() == 1 ? 0 : face_no]
2426 ->unit_face_support_points[this->n_unique_faces() == 1 ? 0 : face_no]
2432 base_element(this->face_system_to_base_index(index, face_no).
first.first)
2433 .unit_face_support_point(
2434 this->face_system_to_base_index(index, face_no).second, face_no));
2439 template <
int dim,
int spacedim>
2440 std::pair<Table<2, bool>, std::vector<unsigned int>>
2446 Table<2, bool> constant_modes(this->n_components(), this->n_dofs_per_cell());
2447 std::vector<unsigned int> components;
2448 for (
unsigned int i = 0; i < base_elements.size(); ++i)
2450 const std::pair<Table<2, bool>, std::vector<unsigned int>> base_table =
2451 base_elements[i].first->get_constant_modes();
2453 const unsigned int element_multiplicity = this->element_multiplicity(i);
2458 const unsigned int comp = components.size();
2459 if (constant_modes.n_rows() <
2460 comp + base_table.first.n_rows() * element_multiplicity)
2462 Table<2, bool> new_constant_modes(comp + base_table.first.n_rows() *
2463 element_multiplicity,
2464 constant_modes.n_cols());
2465 for (
unsigned int r = 0; r < comp; ++r)
2466 for (
unsigned int c = 0; c < this->n_dofs_per_cell(); ++c)
2467 new_constant_modes(r, c) = constant_modes(r, c);
2468 constant_modes.swap(new_constant_modes);
2473 for (
unsigned int k = 0; k < this->n_dofs_per_cell(); ++k)
2475 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> ind =
2476 this->system_to_base_index(k);
2477 if (ind.first.first == i)
2478 for (
unsigned int c = 0; c < base_table.first.n_rows(); ++c)
2479 constant_modes(comp +
2480 ind.first.second * base_table.first.n_rows() + c,
2481 k) = base_table.first(c, ind.second);
2483 for (
unsigned int r = 0; r < element_multiplicity; ++r)
2484 for (
const unsigned int c : base_table.second)
2485 components.push_back(
2486 comp + r * this->base_elements[i].
first->n_components() + c);
2489 return std::pair<Table<2, bool>, std::vector<unsigned int>>(constant_modes,
2495 template <
int dim,
int spacedim>
2499 std::vector<double> & dof_values)
const
2501 Assert(this->has_generalized_support_points(),
2502 ExcMessage(
"The FESystem does not have generalized support points"));
2505 this->get_generalized_support_points().size());
2508 std::vector<double> base_dof_values;
2509 std::vector<Vector<double>> base_point_values;
2514 unsigned int current_vector_component = 0;
2515 for (
unsigned int base = 0; base < base_elements.size(); ++base)
2520 const auto & base_element = this->base_element(base);
2521 const unsigned int multiplicity = this->element_multiplicity(base);
2522 const unsigned int n_base_dofs = base_element.n_dofs_per_cell();
2523 const unsigned int n_base_components = base_element.n_components();
2528 if (n_base_dofs == 0)
2530 current_vector_component += multiplicity * n_base_components;
2534 if (base_element.has_generalized_support_points())
2536 const unsigned int n_base_points =
2537 base_element.get_generalized_support_points().size();
2539 base_dof_values.resize(n_base_dofs);
2540 base_point_values.resize(n_base_points);
2542 for (
unsigned int m = 0; m < multiplicity;
2543 ++m, current_vector_component += n_base_components)
2547 for (
unsigned int j = 0; j < base_point_values.size(); ++j)
2549 base_point_values[j].reinit(n_base_components,
false);
2552 generalized_support_points_index_table[base][j];
2558 const auto end =
begin + n_base_components;
2563 .convert_generalized_support_point_values_to_dof_values(
2564 base_point_values, base_dof_values);
2573 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
2574 if (this->system_to_base_index(i).first ==
2575 std::make_pair(base, m))
2577 base_dof_values[this->system_to_base_index(i).second];
2589 for (
unsigned int m = 0; m < multiplicity; ++m)
2590 for (
unsigned int i = 0; i < this->n_dofs_per_cell(); ++i)
2591 if (this->system_to_base_index(i).first ==
2592 std::make_pair(base, m))
2593 dof_values[i] = std::numeric_limits<double>::signaling_NaN();
2595 current_vector_component += multiplicity * n_base_components;
2602 template <
int dim,
int spacedim>
2610 sizeof(base_elements));
2611 for (
unsigned int i = 0; i < base_elements.size(); ++i)
2619 #include "fe_system.inst"
void set_fe_data(const unsigned int base_no, std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase >)
InternalData(const unsigned int n_base_elements)
FiniteElement< dim, spacedim >::InternalDataBase & get_fe_data(const unsigned int base_no) const
internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > & get_fe_output_object(const unsigned int base_no) const
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 void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
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 hp::QCollection< 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 std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const hp::QCollection< 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 unsigned int face_no=0) const override
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) 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
virtual Point< dim - 1 > unit_face_support_point(const unsigned int index, const unsigned int face_no=0) const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
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 typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
std::vector< std::pair< std::unique_ptr< const FiniteElement< dim, spacedim > >, unsigned int > > base_elements
virtual std::size_t memory_consumption() const override
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
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 Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual Point< dim > unit_support_point(const unsigned int index) const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
virtual std::string get_name() const override
virtual const FiniteElement< dim, spacedim > & get_sub_fe(const unsigned int first_component, const unsigned int n_selected_components) const override
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
void build_interface_constraints()
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 bool hp_constraints_are_implemented() const override
void initialize(const std::vector< const FiniteElement< dim, spacedim > * > &fes, const std::vector< unsigned int > &multiplicities)
std::vector< std::pair< unsigned int, unsigned int > > hp_object_dof_identities(const FiniteElement< dim, spacedim > &fe_other, const unsigned int face_no=0) const
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const override final
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const hp::QCollection< 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 typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
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 typename FiniteElement< dim, spacedim >::InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual Tensor< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
unsigned int n_dofs_per_cell() const
unsigned int n_dofs_per_face(unsigned int face_no=0, unsigned int child=0) const
unsigned int n_components() 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
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > face_system_to_base_index(const unsigned int index, const unsigned int face_no=0) const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) 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 void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix, const unsigned int face_no=0) const
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const hp::QCollection< 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
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
unsigned int element_multiplicity(const unsigned int index) const
unsigned int n_nonzero_components(const unsigned int i) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other, const unsigned int face_no=0) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
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
unsigned int n_base_elements() const
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix, const unsigned int face_no=0) const
virtual std::size_t memory_consumption() const
unsigned int size() const
unsigned int size() const
unsigned int max_n_quadrature_points() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
@ update_hessians
Second derivatives of shape functions.
@ update_values
Shape function values.
@ update_3rd_derivatives
Third derivatives of shape functions.
@ update_gradients
Shape function gradients.
@ update_default
No update.
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotImplemented()
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
Task< RT > new_task(const std::function< RT()> &function)
@ neither_element_dominates
std::enable_if< std::is_fundamental< T >::value, std::size_t >::type memory_consumption(const T &t)
Point< spacedim > point(const gp_Pnt &p, const double tolerance=1e-10)
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
VectorType::value_type * begin(VectorType &V)
VectorType::value_type * end(VectorType &V)
std::string dim_string(const int dim, const int spacedim)
std::vector< Point< dim > > unit_support_points(const std::vector< Point< 1 >> &line_support_points, const std::vector< unsigned int > &renumbering)
void copy(const T *begin, const T *end, U *dest)
static const unsigned int invalid_unsigned_int