40 count_nonzeros(
const std::vector<unsigned int> &vec)
42 return std::count_if(vec.begin(), vec.end(), [](
const unsigned int i) {
55 template <
int dim,
int spacedim = dim>
58 const unsigned int base_no)
66 unsigned int out_index = 0;
67 for (
unsigned int system_index = 0; system_index < fe.
n_dofs_per_cell();
74 const unsigned int base_component =
76 const unsigned int base_index =
81 table[base_component][base_index] = out_index;
92 template <
int dim,
int spacedim = dim>
93 std::vector<typename FESystem<dim, spacedim>::BaseOffsets>
95 const unsigned int base_no)
97 std::vector<typename FESystem<dim, spacedim>::BaseOffsets> table;
100 unsigned int out_index = 0;
101 for (
unsigned int system_index = 0; system_index < fe.
n_dofs_per_cell();
106 const unsigned int base_index =
109 table.emplace_back();
111 table.back().n_nonzero_components =
113 unsigned int in_index = 0;
114 for (
unsigned int i = 0; i < base_index; ++i)
117 table.back().in_index = in_index;
118 table.back().out_index = out_index;
133 template <
int dim,
int spacedim = dim>
137 const unsigned int base_no,
147 const unsigned int n_dofs_per_cell =
150 auto copy_row = [](
const auto row_in,
auto row_out) {
151 std::copy(row_in.begin(), row_in.end(), row_out.begin());
155 for (
unsigned int component = 0; component < n_components; ++component)
156 for (
unsigned int b = 0;
b < n_dofs_per_cell; ++
b)
159 output_data.
shape_values[base_to_system_table[component][
b]]);
162 for (
unsigned int component = 0; component < n_components; ++component)
163 for (
unsigned int b = 0;
b < n_dofs_per_cell; ++
b)
169 for (
unsigned int component = 0; component < n_components; ++component)
170 for (
unsigned int b = 0;
b < n_dofs_per_cell; ++
b)
176 for (
unsigned int component = 0; component < n_components; ++component)
177 for (
unsigned int b = 0;
b < n_dofs_per_cell; ++
b)
188 template <
int dim,
int spacedim = dim>
192 const unsigned int base_no,
193 const unsigned int n_q_points,
205 for (
const auto &offset : offsets)
208 for (
unsigned int s = 0; s < offset.n_nonzero_components; ++s)
209 for (
unsigned int q = 0; q < n_q_points; ++q)
214 for (
unsigned int s = 0; s < offset.n_nonzero_components; ++s)
215 for (
unsigned int q = 0; q < n_q_points; ++q)
220 for (
unsigned int s = 0; s < offset.n_nonzero_components; ++s)
221 for (
unsigned int q = 0; q < n_q_points; ++q)
226 for (
unsigned int s = 0; s < offset.n_nonzero_components; ++s)
227 for (
unsigned int q = 0; q < n_q_points; ++q)
236template <
int dim,
int spacedim>
238 const unsigned int n_base_elements)
239 : base_fe_datas(n_base_elements)
240 , base_fe_output_objects(n_base_elements)
245template <
int dim,
int spacedim>
249 for (
unsigned int i = 0; i < base_fe_datas.size(); ++i)
250 base_fe_datas[i].reset();
254template <
int dim,
int spacedim>
257 const unsigned int base_no)
const
260 return *base_fe_datas[base_no];
265template <
int dim,
int spacedim>
268 const unsigned int base_no,
272 base_fe_datas[base_no] = std::move(ptr);
277template <
int dim,
int spacedim>
280 const unsigned int base_no)
const
283 return base_fe_output_objects[base_no];
291template <
int dim,
int spacedim>
295template <
int dim,
int spacedim>
297 const unsigned int n_elements)
303 , base_elements((n_elements > 0))
305 std::vector<const FiniteElement<dim, spacedim> *> fes;
307 std::vector<unsigned int> multiplicities;
308 multiplicities.push_back(n_elements);
309 initialize(fes, multiplicities);
314template <
int dim,
int spacedim>
316 const unsigned int n1,
318 const unsigned int n2)
326 , base_elements(static_cast<
int>(n1 > 0) + static_cast<
int>(n2 > 0))
328 std::vector<const FiniteElement<dim, spacedim> *> fes;
331 std::vector<unsigned int> multiplicities;
332 multiplicities.push_back(n1);
333 multiplicities.push_back(n2);
334 initialize(fes, multiplicities);
339template <
int dim,
int spacedim>
341 const unsigned int n1,
343 const unsigned int n2,
345 const unsigned int n3)
360 , base_elements(static_cast<
int>(n1 > 0) + static_cast<
int>(n2 > 0) +
361 static_cast<
int>(n3 > 0))
363 std::vector<const FiniteElement<dim, spacedim> *> fes;
367 std::vector<unsigned int> multiplicities;
368 multiplicities.push_back(n1);
369 multiplicities.push_back(n2);
370 multiplicities.push_back(n3);
371 initialize(fes, multiplicities);
376template <
int dim,
int spacedim>
378 const unsigned int n1,
380 const unsigned int n2,
382 const unsigned int n3,
384 const unsigned int n4)
410 , base_elements(static_cast<
int>(n1 > 0) + static_cast<
int>(n2 > 0) +
411 static_cast<
int>(n3 > 0) + static_cast<
int>(n4 > 0))
413 std::vector<const FiniteElement<dim, spacedim> *> fes;
418 std::vector<unsigned int> multiplicities;
419 multiplicities.push_back(n1);
420 multiplicities.push_back(n2);
421 multiplicities.push_back(n3);
422 multiplicities.push_back(n4);
423 initialize(fes, multiplicities);
428template <
int dim,
int spacedim>
430 const unsigned int n1,
432 const unsigned int n2,
434 const unsigned int n3,
436 const unsigned int n4,
438 const unsigned int n5)
441 multiply_dof_numbers(&fe1, n1, &fe2, n2, &fe3, n3, &fe4, n4, &fe5, n5),
462 , base_elements(static_cast<
int>(n1 > 0) + static_cast<
int>(n2 > 0) +
463 static_cast<
int>(n3 > 0) + static_cast<
int>(n4 > 0) +
464 static_cast<
int>(n5 > 0))
466 std::vector<const FiniteElement<dim, spacedim> *> fes;
472 std::vector<unsigned int> multiplicities;
473 multiplicities.push_back(n1);
474 multiplicities.push_back(n2);
475 multiplicities.push_back(n3);
476 multiplicities.push_back(n4);
477 multiplicities.push_back(n5);
478 initialize(fes, multiplicities);
483template <
int dim,
int spacedim>
486 const std::vector<unsigned int> & multiplicities)
493 , base_elements(count_nonzeros(multiplicities))
495 initialize(fes, multiplicities);
500template <
int dim,
int spacedim>
511 std::ostringstream namebuf;
524 return namebuf.str();
529template <
int dim,
int spacedim>
530std::unique_ptr<FiniteElement<dim, spacedim>>
533 std::vector<const FiniteElement<dim, spacedim> *> fes;
534 std::vector<unsigned int> multiplicities;
541 return std::make_unique<FESystem<dim, spacedim>>(fes, multiplicities);
546template <
int dim,
int spacedim>
549 const unsigned int first_component,
550 const unsigned int n_selected_components)
const
553 ExcMessage(
"Invalid arguments (not a part of this FiniteElement)."));
555 const unsigned int base_index =
557 const unsigned int component_in_base =
559 const unsigned int base_components =
564 if (n_selected_components <= base_components)
566 .
get_sub_fe(component_in_base, n_selected_components);
569 ExcMessage(
"You can not select a part of a FiniteElement."));
575template <
int dim,
int spacedim>
586 .
shape_value(this->system_to_base_table[i].second, p));
591template <
int dim,
int spacedim>
594 const unsigned int i,
596 const unsigned int component)
const
612 const unsigned int component_in_base =
627template <
int dim,
int spacedim>
638 .
shape_grad(this->system_to_base_table[i].second, p));
643template <
int dim,
int spacedim>
646 const unsigned int i,
648 const unsigned int component)
const
660 const unsigned int component_in_base =
672template <
int dim,
int spacedim>
688template <
int dim,
int spacedim>
691 const unsigned int i,
693 const unsigned int component)
const
705 const unsigned int component_in_base =
717template <
int dim,
int spacedim>
733template <
int dim,
int spacedim>
736 const unsigned int i,
738 const unsigned int component)
const
750 const unsigned int component_in_base =
762template <
int dim,
int spacedim>
778template <
int dim,
int spacedim>
781 const unsigned int i,
783 const unsigned int component)
const
795 const unsigned int component_in_base =
807template <
int dim,
int spacedim>
817 Assert((interpolation_matrix.
m() == this->n_dofs_per_cell()) ||
820 this->n_dofs_per_cell()));
822 (this->n_dofs_per_cell() == 0),
832 (x_source_fe.
get_name().find(
"FESystem<") == 0) ||
859 std::vector<FullMatrix<double>> base_matrices(this->
n_base_elements());
871 interpolation_matrix = 0;
876 interpolation_matrix(i, j) =
884template <
int dim,
int spacedim>
887 const unsigned int child,
894 "Restriction matrices are only available for refined cells!"));
898 if (this->
restriction[refinement_case - 1][child].n() == 0)
900 std::lock_guard<std::mutex> lock(this->
mutex);
903 if (this->
restriction[refinement_case - 1][child].n() ==
905 return this->
restriction[refinement_case - 1][child];
908 bool do_restriction =
true;
911 std::vector<const FullMatrix<double> *> base_matrices(
919 do_restriction =
false;
951 const unsigned int base =
954 const unsigned int base_index_i =
962 (*base_matrices[base])(base_index_i, base_index_j);
970 return this->
restriction[refinement_case - 1][child];
975template <
int dim,
int spacedim>
978 const unsigned int child,
985 "Restriction matrices are only available for refined cells!"));
990 if (this->
prolongation[refinement_case - 1][child].n() == 0)
992 std::lock_guard<std::mutex> lock(this->
mutex);
994 if (this->
prolongation[refinement_case - 1][child].n() ==
998 bool do_prolongation =
true;
999 std::vector<const FullMatrix<double> *> base_matrices(
1006 do_prolongation =
false;
1011 if (do_prolongation)
1022 const unsigned int base =
1025 const unsigned int base_index_i =
1030 (*base_matrices[base])(base_index_i, base_index_j);
1041template <
int dim,
int spacedim>
1044 const unsigned int face,
1045 const bool face_orientation,
1046 const bool face_flip,
1047 const bool face_rotation)
const
1052 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1055 const unsigned int base_face_to_cell_index =
1068 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> target =
1069 std::make_pair(face_base_index.first, base_face_to_cell_index);
1086template <
int dim,
int spacedim>
1093 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1100template <
int dim,
int spacedim>
1101std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1117 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1119 auto &data =
dynamic_cast<InternalData &
>(*data_ptr);
1134 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1137 &base_fe_output_object = data.get_fe_output_object(base_no);
1152 base_fe_output_object);
1154 data.set_fe_data(base_no, std::move(base_fe_data));
1163template <
int dim,
int spacedim>
1164std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1180 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1182 auto &data =
dynamic_cast<InternalData &
>(*data_ptr);
1197 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1200 &base_fe_output_object = data.get_fe_output_object(base_no);
1213 flags, mapping, quadrature, base_fe_output_object);
1215 data.set_fe_data(base_no, std::move(base_fe_data));
1226template <
int dim,
int spacedim>
1227std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1243 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1245 auto &data =
dynamic_cast<InternalData &
>(*data_ptr);
1261 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1264 &base_fe_output_object = data.get_fe_output_object(base_no);
1277 flags, mapping, quadrature, base_fe_output_object);
1279 data.set_fe_data(base_no, std::move(base_fe_data));
1287template <
int dim,
int spacedim>
1316template <
int dim,
int spacedim>
1320 const unsigned int face_no,
1345template <
int dim,
int spacedim>
1349 const unsigned int face_no,
1350 const unsigned int sub_no,
1375template <
int dim,
int spacedim>
1376template <
class Q_or_QC>
1381 const unsigned int face_no,
1382 const unsigned int sub_no,
1383 const Q_or_QC & quadrature,
1396 Assert(
dynamic_cast<const InternalData *
>(&fe_internal) !=
nullptr,
1398 const InternalData &fe_data =
static_cast<const InternalData &
>(fe_internal);
1415 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1419 fe_data.get_fe_data(base_no);
1422 &base_data = fe_data.get_fe_output_object(base_no);
1428 const Quadrature<dim - 1> * sub_face_quadrature =
nullptr;
1434 const Subscriptor *quadrature_base_pointer = &quadrature;
1436 quadrature_base_pointer) !=
nullptr,
1441 n_q_points = cell_quadrature->
size();
1445 const Subscriptor *quadrature_base_pointer = &quadrature;
1447 quadrature_base_pointer) !=
nullptr,
1453 quadrature_base_pointer);
1455 (*face_quadrature)[face_quadrature->size() == 1 ? 0 : face_no]
1460 const Subscriptor *quadrature_base_pointer = &quadrature;
1462 quadrature_base_pointer) !=
nullptr,
1465 sub_face_quadrature =
1466 static_cast<const Quadrature<dim - 1
> *>(quadrature_base_pointer);
1467 n_q_points = sub_face_quadrature->
size();
1501 *sub_face_quadrature,
1511 const UpdateFlags base_flags = base_fe_data.update_each;
1538template <
int dim,
int spacedim>
1553 const unsigned int face_no = 0;
1576 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1581 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> m_index;
1603 const unsigned int index_in_line =
1605 const unsigned int sub_line =
1613 const unsigned int tmp1 =
1632 const unsigned int tmp2 =
1662 const unsigned int index_in_line =
1665 const unsigned int sub_line =
1670 const unsigned int tmp1 =
1680 const unsigned int tmp2 =
1697 const unsigned int index_in_quad =
1703 const unsigned int sub_quad =
1725 const unsigned int tmp2 =
1753 if (n_index.first == m_index.first)
1762template <
int dim,
int spacedim>
1766 const std::vector<unsigned int> & multiplicities)
1768 Assert(fes.size() == multiplicities.size(),
1771 ExcMessage(
"Need to pass at least one finite element."));
1772 Assert(count_nonzeros(multiplicities) > 0,
1773 ExcMessage(
"You only passed FiniteElements with multiplicity 0."));
1780 for (
unsigned int i = 0; i < fes.size(); ++i)
1781 if (multiplicities[i] > 0)
1787 unsigned int ind = 0;
1788 for (
unsigned int i = 0; i < fes.size(); ++i)
1789 if (multiplicities[i] > 0)
1815 for (
unsigned int face_no = 0; face_no < this->
n_unique_faces(); ++face_no)
1843 for (
unsigned int base_el = 0; base_el < this->
n_base_elements(); ++base_el)
1869 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1878 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1900 bool flag_has_no_support_points =
false;
1908 flag_has_no_support_points =
true;
1913 if (flag_has_no_support_points)
1923 const unsigned int base_i =
1925 const unsigned int index_in_base =
1964 for (
const auto &
point :
1996 const auto &points =
1998 for (
unsigned int j = 0; j < points.size(); ++j)
2024 unsigned int index = 0;
2032 for (
unsigned int i = 0; i < temp.size(0); ++i)
2033 for (
unsigned int j = 0;
2038 [face_no](index + i, j) = temp(i, j);
2039 index += temp.size(0);
2047 this->n_dofs_per_line(),
2049 unsigned int index = 0;
2052 const std::vector<int> &temp2 =
2060 this->adjust_line_dof_index_for_line_orientation_table.begin() +
2062 index += temp2.size();
2069 init_tasks.join_all();
2074template <
int dim,
int spacedim>
2087template <
int dim,
int spacedim>
2092 const unsigned int face_no)
const
2094 Assert(interpolation_matrix.
n() == this->n_dofs_per_face(face_no),
2096 this->n_dofs_per_face(face_no)));
2111 if (
const auto *fe_other_system =
2115 interpolation_matrix = 0;
2119 unsigned int base_index = 0, base_index_other = 0;
2120 unsigned int multiplicity = 0, multiplicity_other = 0;
2135 base_to_base_interpolation.reinit(base_other.n_dofs_per_face(face_no),
2138 base_to_base_interpolation,
2146 std::make_pair(base_index, multiplicity))
2147 for (
unsigned int j = 0;
2148 j < fe_other_system->n_dofs_per_face(face_no);
2150 if (fe_other_system->face_system_to_base_index(j, face_no)
2152 std::make_pair(base_index_other, multiplicity_other))
2153 interpolation_matrix(j, i) = base_to_base_interpolation(
2154 fe_other_system->face_system_to_base_index(j, face_no)
2156 this->face_system_to_base_index(i, face_no).second);
2167 ++multiplicity_other;
2168 if (multiplicity_other ==
2169 fe_other_system->element_multiplicity(base_index_other))
2171 multiplicity_other = 0;
2179 Assert(base_index_other == fe_other_system->n_base_elements(),
2186 Assert(base_index_other != fe_other_system->n_base_elements(),
2203template <
int dim,
int spacedim>
2207 const unsigned int subface,
2209 const unsigned int face_no)
const
2212 (x_source_fe.
get_name().find(
"FESystem<") == 0) ||
2216 Assert(interpolation_matrix.
n() == this->n_dofs_per_face(face_no),
2218 this->n_dofs_per_face(face_no)));
2235 if (fe_other_system !=
nullptr)
2238 interpolation_matrix = 0;
2242 unsigned int base_index = 0, base_index_other = 0;
2243 unsigned int multiplicity = 0, multiplicity_other = 0;
2258 base_to_base_interpolation.reinit(base_other.n_dofs_per_face(face_no),
2262 base_to_base_interpolation,
2270 std::make_pair(base_index, multiplicity))
2271 for (
unsigned int j = 0;
2276 std::make_pair(base_index_other, multiplicity_other))
2277 interpolation_matrix(j, i) = base_to_base_interpolation(
2280 this->face_system_to_base_index(i, face_no).second);
2291 ++multiplicity_other;
2292 if (multiplicity_other ==
2295 multiplicity_other = 0;
2318 fe_other_system !=
nullptr,
2326template <
int dim,
int spacedim>
2327template <
int structdim>
2328std::vector<std::pair<unsigned int, unsigned int>>
2331 const unsigned int face_no)
const
2350 unsigned int base_index = 0, base_index_other = 0;
2351 unsigned int multiplicity = 0, multiplicity_other = 0;
2355 unsigned int dof_offset = 0, dof_offset_other = 0;
2357 std::vector<std::pair<unsigned int, unsigned int>> identities;
2371 std::vector<std::pair<unsigned int, unsigned int>> base_identities;
2388 for (
const auto &base_identity : base_identities)
2389 identities.emplace_back(base_identity.first + dof_offset,
2390 base_identity.second + dof_offset_other);
2393 dof_offset += base.template n_dofs_per_object<structdim>();
2395 base_other.template n_dofs_per_object<structdim>();
2406 ++multiplicity_other;
2407 if (multiplicity_other ==
2410 multiplicity_other = 0;
2434 return std::vector<std::pair<unsigned int, unsigned int>>();
2440template <
int dim,
int spacedim>
2441std::vector<std::pair<unsigned int, unsigned int>>
2445 return hp_object_dof_identities<0>(fe_other);
2448template <
int dim,
int spacedim>
2449std::vector<std::pair<unsigned int, unsigned int>>
2453 return hp_object_dof_identities<1>(fe_other);
2458template <
int dim,
int spacedim>
2459std::vector<std::pair<unsigned int, unsigned int>>
2462 const unsigned int face_no)
const
2464 return hp_object_dof_identities<2>(fe_other, face_no);
2469template <
int dim,
int spacedim>
2473 const unsigned int codim)
const
2496 fe_sys_other->base_element(
b).n_components(),
2499 fe_sys_other->element_multiplicity(
b),
2506 fe_sys_other->base_element(
b), codim));
2507 domination = domination & base_domination;
2519template <
int dim,
int spacedim>
2529template <
int dim,
int spacedim>
2532 const unsigned int shape_index,
2533 const unsigned int face_index)
const
2542template <
int dim,
int spacedim>
2548 (this->unit_support_points.size() == 0),
2563template <
int dim,
int spacedim>
2566 const unsigned int index,
2567 const unsigned int face_no)
const
2581 ->unit_face_support_points[this->
n_unique_faces() == 1 ? 0 : face_no]
2589 this->face_system_to_base_index(index, face_no).second, face_no));
2594template <
int dim,
int spacedim>
2595std::pair<Table<2, bool>, std::vector<unsigned int>>
2605 const std::pair<Table<2, bool>, std::vector<unsigned int>> base_table =
2614 if (constant_modes.n_rows() <
2617 Table<2, bool> new_constant_modes(comp + base_table.first.n_rows() *
2619 constant_modes.n_cols());
2620 for (
unsigned int r = 0; r < comp; ++r)
2622 new_constant_modes(r, c) = constant_modes(r, c);
2623 constant_modes.swap(new_constant_modes);
2630 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> ind =
2632 if (ind.first.first == i)
2633 for (
unsigned int c = 0; c < base_table.first.n_rows(); ++c)
2634 constant_modes(comp +
2635 ind.first.second * base_table.first.n_rows() + c,
2636 k) = base_table.first(c, ind.second);
2639 for (
const unsigned int c : base_table.second)
2644 return std::pair<Table<2, bool>, std::vector<unsigned int>>(constant_modes,
2650template <
int dim,
int spacedim>
2654 std::vector<double> & dof_values)
const
2657 ExcMessage(
"The FESystem does not have generalized support points"));
2660 this->get_generalized_support_points().size());
2663 std::vector<double> base_dof_values;
2664 std::vector<Vector<double>> base_point_values;
2669 unsigned int current_vector_component = 0;
2670 for (
unsigned int base = 0; base <
base_elements.size(); ++base)
2683 if (n_base_dofs == 0)
2685 current_vector_component += multiplicity * n_base_components;
2691 const unsigned int n_base_points =
2694 base_dof_values.resize(n_base_dofs);
2695 base_point_values.resize(n_base_points);
2697 for (
unsigned int m = 0; m < multiplicity;
2698 ++m, current_vector_component += n_base_components)
2702 for (
unsigned int j = 0; j < base_point_values.size(); ++j)
2704 base_point_values[j].reinit(n_base_components,
false);
2713 const auto end =
begin + n_base_components;
2719 base_point_values, base_dof_values);
2730 std::make_pair(base, m))
2744 for (
unsigned int m = 0; m < multiplicity; ++m)
2747 std::make_pair(base, m))
2748 dof_values[i] = std::numeric_limits<double>::signaling_NaN();
2750 current_vector_component += multiplicity * n_base_components;
2757template <
int dim,
int spacedim>
2774#include "fe_system.inst"
void push_back(const size_type size)
void reinit(const unsigned int n_blocks, const size_type n_elements_per_block)
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 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 override
virtual Point< dim > unit_support_point(const unsigned int index) const override
std::vector< std::vector< BaseOffsets > > nonprimitive_offset_tables
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 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
std::vector< std::pair< std::unique_ptr< const FiniteElement< dim, spacedim > >, unsigned int > > base_elements
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const override
std::vector< Table< 2, unsigned int > > primitive_offset_tables
virtual std::string get_name() 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 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_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const override final
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 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
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 Q_or_QC &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< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) 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 bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
virtual Tensor< 1, dim > shape_grad(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
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) 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
static const unsigned int invalid_face_number
virtual bool hp_constraints_are_implemented() const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
void build_interface_constraints()
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual Point< dim - 1 > unit_face_support_point(const unsigned int index, const unsigned int face_no=0) const override
void initialize(const std::vector< const FiniteElement< dim, spacedim > * > &fes, const std::vector< unsigned int > &multiplicities)
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
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 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 double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
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 Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
std::vector< std::vector< std::size_t > > generalized_support_points_index_table
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual std::size_t memory_consumption() const override
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const override
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
unsigned int n_dofs_per_vertex() const
const unsigned int components
unsigned int n_dofs_per_cell() const
unsigned int n_dofs_per_line() const
unsigned int n_dofs_per_face(unsigned int face_no=0, unsigned int child=0) const
unsigned int n_components() const
ReferenceCell reference_cell() const
unsigned int n_unique_faces() const
unsigned int n_dofs_per_quad(unsigned int face_no=0) const
bool constraints_are_implemented(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
virtual std::string get_name() const =0
virtual Point< dim > unit_support_point(const unsigned int index) const
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const
virtual std::unique_ptr< InternalDataBase > get_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) 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
std::vector< std::vector< Point< dim - 1 > > > unit_face_support_points
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
virtual std::unique_ptr< 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
std::pair< unsigned int, unsigned int > component_to_base_index(const unsigned int component) const
virtual Point< dim - 1 > unit_face_support_point(const unsigned int index, const unsigned int face_no=0) const
virtual std::unique_ptr< 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
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
bool has_support_points() const
std::vector< std::vector< FullMatrix< double > > > restriction
bool has_generalized_support_points() const
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const
std::vector< Table< 2, int > > adjust_quad_dof_index_for_face_orientation_table
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
BlockIndices base_to_block_indices
bool is_primitive() const
std::vector< int > adjust_line_dof_index_for_line_orientation_table
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
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
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
const FiniteElement< dim, spacedim > & get_sub_fe(const ComponentMask &mask) const
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 UpdateFlags requires_update_flags(const UpdateFlags update_flags) const =0
virtual void get_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double > > &support_point_values, std::vector< double > &nodal_values) const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > system_to_base_index(const unsigned int index) const
std::vector< std::pair< unsigned int, unsigned int > > system_to_component_table
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
const FullMatrix< double > & constraints(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
unsigned int element_multiplicity(const unsigned int index) const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
TableIndices< 2 > interface_constraints_size() const
std::vector< std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > > face_system_to_base_table
std::vector< Point< dim > > unit_support_points
std::vector< std::vector< std::pair< unsigned int, unsigned int > > > face_system_to_component_table
unsigned int n_nonzero_components(const unsigned int i) const
FullMatrix< double > interface_constraints
const std::vector< Point< dim > > & get_generalized_support_points() const
unsigned int n_base_elements() const
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
virtual double shape_value(const unsigned int i, const Point< dim > &p) 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
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const
std::vector< Point< dim > > generalized_support_points
const std::vector< ComponentMask > nonzero_components
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual bool hp_constraints_are_implemented() const
std::vector< std::vector< FullMatrix< double > > > prolongation
unsigned int size() const
unsigned int n_face_orientations(const unsigned int face_no) const
unsigned int max_n_quadrature_points() const
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
static ::ExceptionBase & ExcImpossibleInDim(int arg1)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcInterpolationNotImplemented()
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
@ 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.
Task< RT > new_task(const std::function< RT()> &function)
@ neither_element_dominates
std::enable_if_t< std::is_fundamental< T >::value, std::size_t > 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 * end(VectorType &V)
VectorType::value_type * begin(VectorType &V)
std::string dim_string(const int dim, const int spacedim)
void copy(const T *begin, const T *end, U *dest)
std::vector< typename FESystem< dim, spacedim >::BaseOffsets > setup_nonprimitive_offset_table(const FESystem< dim, spacedim > &fe, const unsigned int base_no)
Table< 2, unsigned int > setup_primitive_offset_table(const FESystem< dim, spacedim > &fe, const unsigned int base_no)
void copy_nonprimitive_base_element_values(const FESystem< dim, spacedim > &fe, const unsigned int base_no, const unsigned int n_q_points, const UpdateFlags base_flags, const std::vector< typename FESystem< dim, spacedim >::BaseOffsets > &offsets, const FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &base_data, FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data)
void copy_primitive_base_element_values(const FESystem< dim, spacedim > &fe, const unsigned int base_no, const UpdateFlags base_flags, const Table< 2, unsigned int > &base_to_system_table, const FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &base_data, FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data)
static const unsigned int invalid_unsigned_int