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>
67 template <
int dim,
int spacedim>
70 const unsigned int base_no)
const 79 template <
int dim,
int spacedim>
82 const unsigned int base_no,
92 template <
int dim,
int spacedim>
95 const unsigned int base_no)
const 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))
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,
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,
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))
312 template <
int dim,
int spacedim>
323 std::ostringstream namebuf;
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;
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 =
369 const unsigned int component_in_base =
371 const unsigned int base_components =
376 if (n_selected_components <= base_components)
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>
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 425 const unsigned int component_in_base =
440 template <
int dim,
int spacedim>
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 474 const unsigned int component_in_base =
486 template <
int dim,
int spacedim>
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 520 const unsigned int component_in_base =
532 template <
int dim,
int spacedim>
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 566 const unsigned int component_in_base =
578 template <
int dim,
int spacedim>
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 612 const unsigned int component_in_base =
624 template <
int dim,
int spacedim>
648 (x_source_fe.
get_name().find(
"FESystem<") == 0) ||
675 std::vector<FullMatrix<double>> base_matrices(this->
n_base_elements());
687 interpolation_matrix = 0;
692 interpolation_matrix(i, j) =
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)
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(
738 &
base_element(i).get_restriction_matrix(child, refinement_case);
740 do_restriction =
false;
772 const unsigned int base =
775 const unsigned int base_index_i =
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)
820 if (this->
prolongation[refinement_case - 1][child].n() ==
824 bool do_prolongation =
true;
825 std::vector<const FullMatrix<double> *> base_matrices(
830 &
base_element(i).get_prolongation_matrix(child, refinement_case);
832 do_prolongation =
false;
848 const unsigned int base =
851 const unsigned int base_index_i =
856 (*base_matrices[base])(base_index_i, base_index_j);
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>
881 const unsigned int base_face_to_cell_index =
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);
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 auto data = std_cxx14::make_unique<InternalData>(this->
n_base_elements());
958 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
961 &base_fe_output_object = data->get_fe_output_object(base_no);
965 flags |
base_element(base_no).requires_update_flags(flags));
973 auto base_fe_data =
base_element(base_no).get_data(flags,
976 base_fe_output_object);
978 data->set_fe_data(base_no, std::move(base_fe_data));
981 return std::move(data);
987 template <
int dim,
int spacedim>
988 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1004 auto data = std_cxx14::make_unique<InternalData>(this->
n_base_elements());
1019 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1022 &base_fe_output_object = data->get_fe_output_object(base_no);
1026 flags |
base_element(base_no).requires_update_flags(flags));
1034 auto base_fe_data =
base_element(base_no).get_face_data(
1035 flags, mapping, quadrature, base_fe_output_object);
1037 data->set_fe_data(base_no, std::move(base_fe_data));
1040 return std::move(data);
1048 template <
int dim,
int spacedim>
1049 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
1065 auto data = std_cxx14::make_unique<InternalData>(this->
n_base_elements());
1080 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1083 &base_fe_output_object = data->get_fe_output_object(base_no);
1087 flags |
base_element(base_no).requires_update_flags(flags));
1095 auto base_fe_data =
base_element(base_no).get_subface_data(
1096 flags, mapping, quadrature, base_fe_output_object);
1098 data->set_fe_data(base_no, std::move(base_fe_data));
1101 return std::move(data);
1106 template <
int dim,
int spacedim>
1114 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1136 template <
int dim,
int spacedim>
1140 const unsigned int face_no,
1144 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1166 template <
int dim,
int spacedim>
1170 const unsigned int face_no,
1171 const unsigned int sub_no,
1175 const ::internal::FEValuesImplementation::MappingRelatedData<dim,
1197 template <
int dim,
int spacedim>
1198 template <
int dim_1>
1203 const unsigned int face_no,
1204 const unsigned int sub_no,
1218 Assert(dynamic_cast<const InternalData *>(&fe_internal) !=
nullptr,
1241 for (
unsigned int base_no = 0; base_no < this->
n_base_elements(); ++base_no)
1253 const Quadrature<dim - 1> *face_quadrature =
nullptr;
1254 const unsigned int n_q_points = quadrature.
size();
1258 const Subscriptor *quadrature_base_pointer = &quadrature;
1264 quadrature_base_pointer) !=
nullptr,
1274 quadrature_base_pointer) !=
nullptr,
1278 static_cast<const Quadrature<dim - 1
> *>(quadrature_base_pointer);
1338 for (
unsigned int system_index = 0; system_index < this->
dofs_per_cell;
1342 const unsigned int base_index =
1352 unsigned int out_index = 0;
1353 for (
unsigned int i = 0; i < system_index; ++i)
1355 unsigned int in_index = 0;
1356 for (
unsigned int i = 0; i < base_index; ++i)
1365 for (
unsigned int s = 0;
1368 for (
unsigned int q = 0; q < n_q_points; ++q)
1370 base_data.shape_values(in_index + s, q);
1373 for (
unsigned int s = 0;
1376 for (
unsigned int q = 0; q < n_q_points; ++q)
1378 base_data.shape_gradients[in_index + s][q];
1381 for (
unsigned int s = 0;
1384 for (
unsigned int q = 0; q < n_q_points; ++q)
1386 base_data.shape_hessians[in_index + s][q];
1389 for (
unsigned int s = 0;
1392 for (
unsigned int q = 0; q < n_q_points; ++q)
1394 base_data.shape_3rd_derivatives[in_index + s][q];
1400 template <
int dim,
int spacedim>
1409 if (
base_element(base).constraints_are_implemented() ==
false)
1433 const std::pair<std::pair<unsigned int, unsigned int>,
unsigned int>
1438 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> m_index;
1460 const unsigned int index_in_line =
1462 const unsigned int sub_line =
1470 const unsigned int tmp1 =
1471 2 * this->dofs_per_vertex + index_in_line;
1487 const unsigned int tmp2 =
1513 if (m < 5 * this->dofs_per_vertex + 12 * this->
dofs_per_line)
1516 const unsigned int index_in_line =
1518 const unsigned int sub_line =
1522 const unsigned int tmp1 =
1523 4 * this->dofs_per_vertex + index_in_line;
1530 const unsigned int tmp2 =
1537 5 *
base_element(m_index.first.first).dofs_per_vertex +
1546 const unsigned int index_in_quad =
1547 (m - 5 * this->dofs_per_vertex -
1552 const unsigned int sub_quad =
1553 ((m - 5 * this->dofs_per_vertex -
1555 this->dofs_per_quad);
1558 const unsigned int tmp1 = 4 * this->dofs_per_vertex +
1567 4 *
base_element(m_index.first.first).dofs_per_vertex +
1570 const unsigned int tmp2 =
1572 4 *
base_element(m_index.first.first).dofs_per_vertex -
1578 5 *
base_element(m_index.first.first).dofs_per_vertex +
1595 if (n_index.first == m_index.first)
1598 .constraints()(m_index.second, n_index.second));
1604 template <
int dim,
int spacedim>
1608 const std::vector<unsigned int> & multiplicities)
1610 Assert(fes.size() == multiplicities.size(),
1613 ExcMessage(
"Need to pass at least one finite element."));
1614 Assert(count_nonzeros(multiplicities) > 0,
1615 ExcMessage(
"You only passed FiniteElements with multiplicity 0."));
1622 for (
unsigned int i = 0; i < fes.size(); i++)
1623 if (multiplicities[i] > 0)
1629 unsigned int ind = 0;
1630 for (
unsigned int i = 0; i < fes.size(); i++)
1631 if (multiplicities[i] > 0)
1676 for (
unsigned int base_el = 0; base_el < this->
n_base_elements(); ++base_el)
1728 const unsigned int base_i =
1730 const unsigned int index_in_base =
1738 base_element(base_i).unit_face_support_points[index_in_base];
1763 if (!
base_element(base).has_generalized_support_points())
1766 for (
const auto &point :
1798 const auto &points =
1800 for (
unsigned int j = 0; j < points.size(); ++j)
1821 unsigned int index = 0;
1826 .adjust_quad_dof_index_for_face_orientation_table;
1829 for (
unsigned int i = 0; i < temp.
size(0); ++i)
1830 for (
unsigned int j = 0; j < 8; ++j)
1832 index + i, j) = temp(i, j);
1833 index += temp.
size(0);
1845 const std::vector<int> &temp2 =
1847 .adjust_line_dof_index_for_line_orientation_table;
1855 index += temp2.size();
1862 init_tasks.join_all();
1867 template <
int dim,
int spacedim>
1872 if (
base_element(b).hp_constraints_are_implemented() ==
false)
1880 template <
int dim,
int spacedim>
1902 if (
const auto *fe_other_system =
1906 interpolation_matrix = 0;
1910 unsigned int base_index = 0, base_index_other = 0;
1911 unsigned int multiplicity = 0, multiplicity_other = 0;
1919 fe_other_system->base_element(
1926 base_to_base_interpolation.
reinit(base_other.dofs_per_face,
1929 base_to_base_interpolation);
1936 std::make_pair(base_index, multiplicity))
1937 for (
unsigned int j = 0; j < fe_other_system->dofs_per_face; ++j)
1938 if (fe_other_system->face_system_to_base_index(j).first ==
1939 std::make_pair(base_index_other, multiplicity_other))
1940 interpolation_matrix(j, i) = base_to_base_interpolation(
1941 fe_other_system->face_system_to_base_index(j).second,
1953 ++multiplicity_other;
1954 if (multiplicity_other ==
1955 fe_other_system->element_multiplicity(base_index_other))
1957 multiplicity_other = 0;
1965 Assert(base_index_other == fe_other_system->n_base_elements(),
1972 Assert(base_index_other != fe_other_system->n_base_elements(),
1989 template <
int dim,
int spacedim>
1993 const unsigned int subface,
1997 (x_source_fe.
get_name().find(
"FE_System<") == 0) ||
2019 if (fe_other_system !=
nullptr)
2022 interpolation_matrix = 0;
2026 unsigned int base_index = 0, base_index_other = 0;
2027 unsigned int multiplicity = 0, multiplicity_other = 0;
2042 base_to_base_interpolation.
reinit(base_other.dofs_per_face,
2046 base_to_base_interpolation);
2053 std::make_pair(base_index, multiplicity))
2054 for (
unsigned int j = 0; j < fe_other_system->
dofs_per_face; ++j)
2056 std::make_pair(base_index_other, multiplicity_other))
2057 interpolation_matrix(j, i) = base_to_base_interpolation(
2070 ++multiplicity_other;
2071 if (multiplicity_other ==
2074 multiplicity_other = 0;
2097 fe_other_system !=
nullptr,
2105 template <
int dim,
int spacedim>
2106 template <
int structdim>
2107 std::vector<std::pair<unsigned int, unsigned int>>
2128 unsigned int base_index = 0, base_index_other = 0;
2129 unsigned int multiplicity = 0, multiplicity_other = 0;
2133 unsigned int dof_offset = 0, dof_offset_other = 0;
2135 std::vector<std::pair<unsigned int, unsigned int>> identities;
2141 fe_other_system->base_element(
2149 std::vector<std::pair<unsigned int, unsigned int>> base_identities;
2165 for (
unsigned int i = 0; i < base_identities.size(); ++i)
2166 identities.emplace_back(base_identities[i].first + dof_offset,
2167 base_identities[i].second +
2171 dof_offset += base.template n_dofs_per_object<structdim>();
2173 base_other.template n_dofs_per_object<structdim>();
2184 ++multiplicity_other;
2185 if (multiplicity_other ==
2186 fe_other_system->element_multiplicity(base_index_other))
2188 multiplicity_other = 0;
2196 Assert(base_index_other == fe_other_system->n_base_elements(),
2203 Assert(base_index_other != fe_other_system->n_base_elements(),
2212 return std::vector<std::pair<unsigned int, unsigned int>>();
2218 template <
int dim,
int spacedim>
2219 std::vector<std::pair<unsigned int, unsigned int>>
2223 return hp_object_dof_identities<0>(fe_other);
2226 template <
int dim,
int spacedim>
2227 std::vector<std::pair<unsigned int, unsigned int>>
2231 return hp_object_dof_identities<1>(fe_other);
2236 template <
int dim,
int spacedim>
2237 std::vector<std::pair<unsigned int, unsigned int>>
2241 return hp_object_dof_identities<2>(fe_other);
2246 template <
int dim,
int spacedim>
2268 fe_sys_other->base_element(b).n_components(),
2271 fe_sys_other->element_multiplicity(b),
2278 fe_sys_other->base_element(b)));
2279 domination = domination & base_domination;
2291 template <
int dim,
int spacedim>
2302 template <
int dim,
int spacedim>
2305 const unsigned int shape_index,
2306 const unsigned int face_index)
const 2309 .has_support_on_face(this->system_to_base_index(shape_index).second,
2315 template <
int dim,
int spacedim>
2337 template <
int dim,
int spacedim>
2354 .unit_face_support_point(
2360 template <
int dim,
int spacedim>
2361 std::pair<Table<2, bool>, std::vector<unsigned int>>
2371 const std::pair<Table<2, bool>, std::vector<unsigned int>> base_table =
2379 const unsigned int comp = components.size();
2380 if (constant_modes.n_rows() <
2383 Table<2, bool> new_constant_modes(comp + base_table.first.n_rows() *
2385 constant_modes.n_cols());
2386 for (
unsigned int r = 0; r < comp; ++r)
2388 new_constant_modes(r, c) = constant_modes(r, c);
2389 constant_modes.
swap(new_constant_modes);
2396 std::pair<std::pair<unsigned int, unsigned int>,
unsigned int> ind =
2398 if (ind.first.first == i)
2399 for (
unsigned int c = 0; c < base_table.first.n_rows(); ++c)
2400 constant_modes(comp +
2401 ind.first.second * base_table.first.n_rows() + c,
2402 k) = base_table.first(c, ind.second);
2405 for (
unsigned int c = 0; c < base_table.second.size(); ++c)
2406 components.push_back(
2407 comp + r * this->base_elements[i].first->n_components() +
2408 base_table.second[c]);
2411 return std::pair<Table<2, bool>, std::vector<unsigned int>>(constant_modes,
2417 template <
int dim,
int spacedim>
2421 std::vector<double> & dof_values)
const 2424 ExcMessage(
"The FESystem does not have generalized support points"));
2430 std::vector<double> base_dof_values;
2431 std::vector<Vector<double>> base_point_values;
2436 unsigned int current_vector_component = 0;
2437 for (
unsigned int base = 0; base <
base_elements.size(); ++base)
2444 const unsigned int n_base_dofs =
base_element.dofs_per_cell;
2445 const unsigned int n_base_components =
base_element.n_components();
2450 if (n_base_dofs == 0)
2452 current_vector_component += multiplicity * n_base_components;
2458 const unsigned int n_base_points =
2461 base_dof_values.resize(n_base_dofs);
2462 base_point_values.resize(n_base_points);
2464 for (
unsigned int m = 0; m < multiplicity;
2465 ++m, current_vector_component += n_base_components)
2469 for (
unsigned int j = 0; j < base_point_values.size(); ++j)
2471 base_point_values[j].reinit(n_base_components,
false);
2479 std::begin(point_values[n]) + current_vector_component;
2480 const auto end = begin + n_base_components;
2481 std::copy(begin, end, std::begin(base_point_values[j]));
2485 .convert_generalized_support_point_values_to_dof_values(
2486 base_point_values, base_dof_values);
2497 std::make_pair(base, m))
2511 for (
unsigned int m = 0; m < multiplicity; ++m)
2514 std::make_pair(base, m))
2515 dof_values[i] = std::numeric_limits<double>::signaling_NaN();
2517 current_vector_component += multiplicity * n_base_components;
2524 template <
int dim,
int spacedim>
2541 #include "fe_system.inst" 2543 DEAL_II_NAMESPACE_CLOSE
virtual std::size_t memory_consumption() const override
virtual Point< dim > unit_support_point(const unsigned int index) const override
std::vector< internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > > base_fe_output_objects
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
FiniteElement< dim, spacedim >::InternalDataBase & get_fe_data(const unsigned int base_no) const
std::vector< std::vector< FullMatrix< double > > > restriction
void build_interface_constraints()
const unsigned int components
#define AssertDimension(dim1, dim2)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual std::string get_name() const override
std::vector< Point< dim > > generalized_support_points
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const override
void swap(TableBase< N, T > &v)
FullMatrix< double > interface_constraints
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
const unsigned int dofs_per_quad
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
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
std::vector< Point< dim-1 > > unit_face_support_points
TableIndices< 2 > interface_constraints_size() const
#define AssertThrow(cond, exc)
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
bool is_primitive() 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 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
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)
const unsigned int dofs_per_line
InternalData(const unsigned int n_base_elements)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const override
std::vector< Point< dim > > unit_support_points
std::vector< std::vector< std::size_t > > generalized_support_points_index_table
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
unsigned int element_multiplicity(const unsigned int index) const
std::vector< std::pair< unsigned int, unsigned int > > hp_object_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
unsigned int size() const
static::ExceptionBase & ExcMessage(std::string arg1)
std::vector< std::vector< FullMatrix< double > > > prolongation
Third derivatives of shape functions.
void reinit(const TableIndices< N > &new_size, const bool omit_default_initialization=false)
size_type size(const unsigned int i) const
#define Assert(cond, exc)
unsigned int n_nonzero_components(const unsigned int i) const
static const unsigned int invalid_face_number
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.
void reinit(const unsigned int n_blocks, const size_type n_elements_per_block)
std::pair< unsigned int, unsigned int > component_to_base_index(const unsigned int component) const
void set_fe_data(const unsigned int base_no, std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase >)
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const override
virtual std::string get_name() const =0
internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > & get_fe_output_object(const unsigned int base_no) const
unsigned int n_base_elements() const
bool has_generalized_support_points() const
unsigned int n_components() const
virtual std::size_t memory_consumption() const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > system_to_base_index(const unsigned int index) const
Second derivatives of shape functions.
virtual bool hp_constraints_are_implemented() const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const
std::string dim_string(const int dim, const int spacedim)
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
const unsigned int dofs_per_cell
const std::vector< Point< dim > > & get_generalized_support_points() const
std::vector< std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > > base_fe_datas
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
void initialize(const std::vector< const FiniteElement< dim, spacedim > * > &fes, const std::vector< unsigned int > &multiplicities)
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) 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
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
Table< 2, int > adjust_quad_dof_index_for_face_orientation_table
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > face_system_to_base_index(const unsigned int index) 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.
std::vector< std::pair< unsigned int, unsigned int > > system_to_component_table
FESystem(const FiniteElement< dim, spacedim > &fe, const unsigned int n_elements)
void push_back(const size_type size)
const unsigned int dofs_per_face
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
const std::vector< ComponentMask > nonzero_components
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
static::ExceptionBase & ExcNotImplemented()
const unsigned int dofs_per_vertex
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const override
std::vector< std::pair< unsigned int, unsigned int > > face_system_to_component_table
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 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 void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
BlockIndices base_to_block_indices
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const override
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > face_system_to_base_table
std::vector< int > adjust_line_dof_index_for_line_orientation_table
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::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
virtual Point< dim-1 > unit_face_support_point(const unsigned int index) 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)
static::ExceptionBase & ExcInternalError()