39 std::vector<unsigned int>
40 build_multiplicities(
const std::vector<std::vector<T>> &functions)
42 std::vector<unsigned int> multiplicities;
43 multiplicities.push_back(1);
44 for (
unsigned int i = 0; i < functions.size(); ++i)
45 multiplicities.push_back(functions[i].size());
47 return multiplicities;
54 template <
int dim,
int spacedim>
55 std::vector<const FiniteElement<dim, spacedim> *>
60 std::vector<const FiniteElement<dim, spacedim> *> fes;
61 fes.push_back(fe_base);
62 for (
unsigned int i = 0; i < fe_enriched.size(); ++i)
63 fes.push_back(fe_enriched[i]);
73 template <
int dim,
int spacedim>
77 const std::vector<unsigned int> &multiplicities,
79 const typename ::Triangulation<dim, spacedim>::cell_iterator
85 "FEs and multiplicities should have the same size"));
93 const unsigned int n_comp_base = fes[0]->n_components();
96 for (
unsigned int fe = 1; fe < fes.size(); ++fe)
104 "Only dominating FE_Nothing can be used in FE_Enriched"));
107 fes[fe]->n_components() == n_comp_base,
109 "All elements must have the same number of components"));
119 template <
int dim,
int spacedim>
125 for (
unsigned int fe = 1; fe < fes.size(); ++fe)
137template <
int dim,
int spacedim>
141 FE_Nothing<dim, spacedim>(fe_base.n_components(),
147template <
int dim,
int spacedim>
156 const typename
Triangulation<dim, spacedim>::cell_iterator &)>>>(
159 const typename
Triangulation<dim, spacedim>::cell_iterator &)>>(
161 [=](const typename
Triangulation<dim, spacedim>::cell_iterator &)
162 -> const
Function<spacedim> * {
return enrichment_function; })))
166template <
int dim,
int spacedim>
179template <
int dim,
int spacedim>
182 const std::vector<unsigned int> &multiplicities,
186 FETools::Compositing::multiply_dof_numbers(fes, multiplicities, false),
187 FETools::Compositing::compute_restriction_is_additive_flags(
190 FETools::Compositing::compute_nonzero_components(fes,
193 , enrichments(functions)
195 , fe_system(
std::make_unique<
FESystem<dim, spacedim>>(fes, multiplicities))
198 Assert(internal::FE_Enriched::consistency_check(fes,
208 for (
unsigned int fe = 1; fe < fes.size(); ++fe)
213 this->n_base_elements()));
216 for (
unsigned int system_index = 0; system_index < this->
n_dofs_per_cell();
219 const unsigned int base_no =
224 const unsigned int base_m =
229 "Size mismatch for base_no_mult_local_enriched_dofs: "
232 "; base_no = " + std::to_string(base_no) +
233 "; base_m = " + std::to_string(base_m) +
234 "; system_index = " + std::to_string(system_index)));
245 for (
unsigned int base_no = 1;
249 for (
unsigned int m = 0;
261template <
int dim,
int spacedim>
262std::vector<std::vector<std::function<const Function<spacedim> *(
270template <
int dim,
int spacedim>
278 "For enriched finite elements shape_value() can not be defined on the reference element."));
279 return fe_system->shape_value(i, p);
283template <
int dim,
int spacedim>
284std::unique_ptr<FiniteElement<dim, spacedim>>
287 std::vector<const FiniteElement<dim, spacedim> *> fes;
288 std::vector<unsigned int> multiplicities;
290 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
292 fes.push_back(&base_element(i));
293 multiplicities.push_back(this->element_multiplicity(i));
296 return std::unique_ptr<FE_Enriched<dim, spacedim>>(
301template <
int dim,
int spacedim>
305 UpdateFlags out = fe_system->requires_update_flags(flags);
324template <
int dim,
int spacedim>
326std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
334 auto update_each_flags = fes_data->update_each;
335 std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
336 data_ptr = std::make_unique<InternalData>(std::move(fes_data));
340 data.update_each = update_each_flags;
345 const unsigned int n_q_points = quadrature.
size();
347 for (
unsigned int base = 0; base < this->n_base_elements(); ++base)
349 data.enrichment[base].resize(this->element_multiplicity(base));
350 for (
unsigned int m = 0; m < this->element_multiplicity(base); ++m)
353 data.enrichment[base][m].values.resize(n_q_points);
356 data.enrichment[base][m].gradients.resize(n_q_points);
359 data.enrichment[base][m].hessians.resize(n_q_points);
367template <
int dim,
int spacedim>
368std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
379 fe_system->get_face_data(update_flags, mapping, quadrature, output_data);
388template <
int dim,
int spacedim>
389std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
399 fe_system->get_subface_data(update_flags, mapping, quadrature, output_data);
408template <
int dim,
int spacedim>
409std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
417 auto data = fe_system->get_data(flags, mapping, quadrature, output_data);
426template <
int dim,
int spacedim>
430 const std::vector<unsigned int> &multiplicities)
432 Assert(fes.size() == multiplicities.size(),
437 this->base_to_block_indices.reinit(0, 0);
439 for (
unsigned int i = 0; i < fes.size(); ++i)
440 if (multiplicities[i] > 0)
441 this->base_to_block_indices.push_back(multiplicities[i]);
446 this->system_to_component_table.resize(this->n_dofs_per_cell());
449 this->system_to_component_table,
450 this->component_to_base_table,
454 this->face_system_to_component_table.resize(this->n_unique_faces());
456 for (
unsigned int face_no = 0; face_no < this->n_unique_faces(); ++face_no)
458 this->face_system_to_component_table[0].resize(
459 this->n_dofs_per_face(face_no));
463 this->face_system_to_base_table[face_no],
464 this->face_system_to_component_table[face_no],
475 this->interface_constraints = fe_system->interface_constraints;
484 this->unit_support_points = fe_system->unit_support_points;
485 this->unit_face_support_points = fe_system->unit_face_support_points;
490 this->adjust_line_dof_index_for_line_orientation_table =
491 fe_system->adjust_line_dof_index_for_line_orientation_table;
496template <
int dim,
int spacedim>
500 std::ostringstream namebuf;
503 for (
unsigned int i = 0; i < this->n_base_elements(); ++i)
505 namebuf << base_element(i).get_name();
506 if (this->element_multiplicity(i) != 1)
507 namebuf <<
'^' << this->element_multiplicity(i);
508 if (i != this->n_base_elements() - 1)
513 return namebuf.str();
517template <
int dim,
int spacedim>
525template <
int dim,
int spacedim>
544 fe_system->fill_fe_values(cell,
554 multiply_by_enrichment(
555 quadrature, fe_data, mapping_data, cell, output_data);
559template <
int dim,
int spacedim>
563 const unsigned int face_no,
580 fe_system->fill_fe_face_values(cell,
590 multiply_by_enrichment(
591 quadrature[0], fe_data, mapping_data, cell, output_data);
595template <
int dim,
int spacedim>
599 const unsigned int face_no,
600 const unsigned int sub_no,
615 fe_system->fill_fe_subface_values(cell,
626 multiply_by_enrichment(
627 quadrature, fe_data, mapping_data, cell, output_data);
631template <
int dim,
int spacedim>
653 const unsigned int n_q_points = quadrature.
size();
663 for (
unsigned int base_no = 1; base_no < this->n_base_elements(); ++base_no)
674 for (
unsigned int system_index = 0;
675 system_index < this->n_dofs_per_cell();
677 if (this->system_to_base_table[system_index].
first.first == base_no)
679 const unsigned int base_index =
680 this->system_to_base_table[system_index].second;
690 unsigned int out_index = 0;
691 for (
unsigned int i = 0; i < system_index; ++i)
692 out_index += this->n_nonzero_components(i);
693 unsigned int in_index = 0;
694 for (
unsigned int i = 0; i < base_index; ++i)
698 Assert(this->n_nonzero_components(system_index) ==
701 for (
unsigned int s = 0;
702 s < this->n_nonzero_components(system_index);
706 for (
unsigned int q = 0; q < n_q_points; ++q)
708 base_data.shape_values(in_index + s, q);
711 for (
unsigned int q = 0; q < n_q_points; ++q)
713 base_data.shape_gradients[in_index + s][q];
716 for (
unsigned int q = 0; q < n_q_points; ++q)
718 base_data.shape_hessians[in_index + s][q];
723 Assert(base_no_mult_local_enriched_dofs.size() == fe_data.
enrichment.size(),
727 for (
unsigned int base_no = 1; base_no < this->n_base_elements(); ++base_no)
730 base_no_mult_local_enriched_dofs[base_no].
size() ==
734 for (
unsigned int m = 0;
735 m < base_no_mult_local_enriched_dofs[base_no].size();
741 if (base_no_mult_local_enriched_dofs[base_no][m].empty())
744 Assert(enrichments[base_no - 1][m](cell) !=
nullptr,
746 "The pointer to the enrichment function is not set"));
748 Assert(enrichments[base_no - 1][m](cell)->n_components == 1,
750 "Only scalar-valued enrichment functions are allowed"));
757 fe_data.
enrichment[base_no][m].hessians.size(),
759 for (
unsigned int q = 0; q < n_q_points; ++q)
761 enrichments[base_no - 1][m](cell)->hessian(
770 fe_data.
enrichment[base_no][m].gradients.size(),
772 for (
unsigned int q = 0; q < n_q_points; ++q)
774 enrichments[base_no - 1][m](cell)->gradient(
784 for (
unsigned int q = 0; q < n_q_points; ++q)
786 enrichments[base_no - 1][m](cell)->value(
800 for (
unsigned int base_no = 1; base_no < this->n_base_elements();
803 for (
unsigned int m = 0;
804 m < base_no_mult_local_enriched_dofs[base_no].size();
806 for (
unsigned int i = 0;
807 i < base_no_mult_local_enriched_dofs[base_no][m].size();
810 const unsigned int enriched_dof =
811 base_no_mult_local_enriched_dofs[base_no][m][i];
812 for (
unsigned int q = 0; q < n_q_points; ++q)
832 for (
unsigned int base_no = 1; base_no < this->n_base_elements(); ++base_no)
834 for (
unsigned int m = 0;
835 m < base_no_mult_local_enriched_dofs[base_no].size();
837 for (
unsigned int i = 0;
838 i < base_no_mult_local_enriched_dofs[base_no][m].size();
841 const unsigned int enriched_dof =
842 base_no_mult_local_enriched_dofs[base_no][m][i];
843 for (
unsigned int q = 0; q < n_q_points; ++q)
855 for (
unsigned int base_no = 1; base_no < this->n_base_elements(); ++base_no)
857 for (
unsigned int m = 0;
858 m < base_no_mult_local_enriched_dofs[base_no].size();
860 for (
unsigned int i = 0;
861 i < base_no_mult_local_enriched_dofs[base_no][m].size();
864 const unsigned int enriched_dof =
865 base_no_mult_local_enriched_dofs[base_no][m][i];
866 for (
unsigned int q = 0; q < n_q_points; ++q)
876template <
int dim,
int spacedim>
884template <
int dim,
int spacedim>
892template <
int dim,
int spacedim>
897 const unsigned int face_no)
const
902 fe_system->get_face_interpolation_matrix(fe_enr_other->get_fe_system(),
911 spacedim>::ExcInterpolationNotImplemented()));
916template <
int dim,
int spacedim>
920 const unsigned int subface,
922 const unsigned int face_no)
const
927 fe_system->get_subface_interpolation_matrix(fe_enr_other->get_fe_system(),
937 spacedim>::ExcInterpolationNotImplemented()));
942template <
int dim,
int spacedim>
943std::vector<std::pair<unsigned int, unsigned int>>
950 return fe_system->hp_vertex_dof_identities(fe_enr_other->get_fe_system());
955 return std::vector<std::pair<unsigned int, unsigned int>>();
960template <
int dim,
int spacedim>
961std::vector<std::pair<unsigned int, unsigned int>>
968 return fe_system->hp_line_dof_identities(fe_enr_other->get_fe_system());
973 return std::vector<std::pair<unsigned int, unsigned int>>();
978template <
int dim,
int spacedim>
979std::vector<std::pair<unsigned int, unsigned int>>
982 const unsigned int face_no)
const
987 return fe_system->hp_quad_dof_identities(fe_enr_other->get_fe_system(),
993 return std::vector<std::pair<unsigned int, unsigned int>>();
998template <
int dim,
int spacedim>
1002 const unsigned int codim)
const
1021 return fe_system->compare_for_domination(fe_enr_other->get_fe_system(),
1032template <
int dim,
int spacedim>
1035 const unsigned int child,
1038 return fe_system->get_prolongation_matrix(child, refinement_case);
1042template <
int dim,
int spacedim>
1045 const unsigned int child,
1048 return fe_system->get_restriction_matrix(child, refinement_case);
1055template <
int dim,
int spacedim>
1058 : fesystem_data(
std::move(fesystem_data))
1062template <
int dim,
int spacedim>
1065 const unsigned int base_no)
const
1067 return fesystem_data->get_fe_data(base_no);
1071template <
int dim,
int spacedim>
1074 const unsigned int base_no)
const
1076 return fesystem_data->get_fe_output_object(base_no);
1084 template <
int dim,
int spacedim>
1092 std::vector<bool> vertices_subdomain_1(
1097 if (predicate_1(cell))
1099 vertices_subdomain_1[cell->vertex_index(v)] =
true;
1103 if (predicate_2(cell))
1105 if (vertices_subdomain_1[cell->vertex_index(v)] ==
true)
1114 template <
int dim,
int spacedim>
1119 std::vector<unsigned int> &predicate_colors)
1121 const unsigned int num_indices = predicates.size();
1126 dsp.
reinit(num_indices, num_indices);
1133 for (
unsigned int i = 0; i < num_indices; ++i)
1134 for (
unsigned int j = i + 1; j < num_indices; ++j)
1135 if (internal::find_connection_between_subdomains(mesh,
1146 predicate_colors.resize(num_indices);
1154 template <
int dim,
int spacedim>
1159 const std::vector<unsigned int> &predicate_colors,
1160 std::map<
unsigned int, std::map<unsigned int, unsigned int>>
1161 &cellwise_color_predicate_map,
1162 std::vector<std::set<unsigned int>> &fe_sets)
1166 cellwise_color_predicate_map.clear();
1194 unsigned int map_index = 0;
1198 cell->set_active_fe_index(0);
1207 cell->set_material_id(map_index);
1208 std::set<unsigned int> color_list;
1216 std::map<unsigned int, unsigned int> &cell_map =
1217 cellwise_color_predicate_map[map_index];
1218 for (
unsigned int i = 0; i < predicates.size(); ++i)
1220 if (predicates[i](cell))
1226 auto ret = cell_map.insert(
1227 std::pair<unsigned int, unsigned int>(predicate_colors[i],
1232 "Only one enrichment function per color"));
1234 color_list.insert(predicate_colors[i]);
1251 if (!color_list.empty())
1254 std::find(fe_sets.begin(), fe_sets.end(), color_list);
1256 if (it == fe_sets.end())
1258 fe_sets.push_back(color_list);
1259 cell->set_active_fe_index(fe_sets.size() - 1);
1264 cell->set_active_fe_index(std::distance(fe_sets.begin(), it));
1311 const unsigned int fe_index = cell->active_fe_index();
1312 const std::set<unsigned int> fe_set = fe_sets.at(fe_index);
1319 if (!cell->at_boundary(face) &&
1320 cell->material_id() < cell->neighbor(face)->material_id())
1322 const auto nbr_fe_index =
1323 cell->neighbor(face)->active_fe_index();
1326 const auto nbr_fe_set = fe_sets.at(nbr_fe_index);
1329 std::set<unsigned int> intersection_set;
1330 std::set_intersection(
1335 std::inserter(intersection_set, intersection_set.begin()));
1338 if (!intersection_set.empty())
1340 const auto it = std::find(fe_sets.begin(),
1344 if (it == fe_sets.end())
1346 fe_sets.push_back(intersection_set);
1356 template <
int dim,
int spacedim>
1359 const unsigned int n_colors,
1361 const std::map<
unsigned int, std::map<unsigned int, unsigned int>>
1362 &cellwise_color_predicate_map,
1367 color_enrichments.clear();
1383 color_enrichments.resize(n_colors);
1384 for (
unsigned int i = 0; i < n_colors; ++i)
1386 color_enrichments[i] =
1389 const unsigned int id = cell->material_id();
1396 return enrichments[cellwise_color_predicate_map.at(
id).at(i + 1)]
1404 template <
int dim,
int spacedim>
1407 const unsigned int n_colors,
1408 const std::vector<std::set<unsigned int>> &fe_sets,
1418 const std::function<const Function<spacedim> *(
1424 ExcMessage(
"Called enrichment function for FE_Nothing"));
1432 for (
const auto &fe_set : fe_sets)
1434 std::vector<const FiniteElement<dim, spacedim> *> vec_fe_enriched(
1435 n_colors, &fe_nothing);
1436 std::vector<std::vector<std::function<const Function<spacedim> *(
1438 functions(n_colors, {dummy_function});
1440 for (
const unsigned int color_id : fe_set)
1445 const unsigned int ind = color_id - 1;
1455 vec_fe_enriched[ind] = &fe_enriched;
1459 functions[ind][0] = color_enrichments[ind];
1474 template <
int dim,
int spacedim>
1481 , fe_enriched(fe_enriched)
1482 , fe_nothing(fe_base.n_components(), true)
1483 , predicates(predicates)
1484 , enrichments(enrichments)
1485 , n_colors(
numbers::invalid_unsigned_int)
1490 ExcMessage(
"Number of predicates should be positive"));
1495 template <
int dim,
int spacedim>
1509 cellwise_color_predicate_map,
1513 internal::make_colorwise_enrichment_functions<dim, spacedim>(
1514 n_colors, enrichments, cellwise_color_predicate_map, color_enrichments);
1525 return fe_collection;
1531#include "fe/fe_enriched.inst"
const Triangulation< dim, spacedim > & get_triangulation() const
void reinit(const size_type m, const size_type n, const IndexSet &rowset=IndexSet())
void add(const size_type i, const size_type j)
std::vector< std::vector< EnrichmentValues > > enrichment
internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > & get_fe_output_object(const unsigned int base_no) const
InternalData(std::unique_ptr< typename FESystem< dim, spacedim >::InternalData > fesystem_data)
FiniteElement< dim, spacedim >::InternalDataBase & get_fe_data(const unsigned int base_no) const
std::unique_ptr< typename FESystem< dim, spacedim >::InternalData > fesystem_data
virtual std::string get_name() const override
std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > setup_data(std::unique_ptr< typename FESystem< dim, spacedim >::InternalData > fes_data, const UpdateFlags flags, const Quadrature< dim_1 > &quadrature) 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 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
std::vector< std::vector< std::vector< unsigned int > > > base_no_mult_local_enriched_dofs
void multiply_by_enrichment(const Quadrature< dim_1 > &quadrature, const InternalData &fe_data, const internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const typename Triangulation< dim, spacedim >::cell_iterator &cell, internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags flags, const Mapping< dim, spacedim > &mapping, const Quadrature< dim > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const hp::QCollection< dim - 1 > &quadrature, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const override
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const 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 FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const override final
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
virtual bool hp_constraints_are_implemented() 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
void initialize(const std::vector< const FiniteElement< dim, spacedim > * > &fes, const std::vector< unsigned int > &multiplicities)
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
const FESystem< dim, spacedim > & get_fe_system() const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const override
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) 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 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 const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix, const unsigned int face_no=0) const override
FE_Enriched(const FiniteElement< dim, spacedim > &fe_base, const FiniteElement< dim, spacedim > &fe_enriched, const Function< spacedim > *enrichment_function)
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) 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
bool is_dominating() const
unsigned int n_dofs_per_cell() const
unsigned int n_components() const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
unsigned int n_nonzero_components(const unsigned int i) const
Abstract base class for mapping classes.
unsigned int size() const
void copy_from(const size_type n_rows, const size_type n_cols, const ForwardIterator begin, const ForwardIterator end)
unsigned int n_vertices() const
unsigned int size() const
void push_back(const FiniteElement< dim, spacedim > &new_fe)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_NOT_IMPLEMENTED()
IteratorRange< active_cell_iterator > active_cell_iterators() const
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 & 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_quadrature_points
Transformed quadrature points.
std::vector< index_type > data
void set_cellwise_color_set_and_fe_index(DoFHandler< dim, spacedim > &dof_handler, const std::vector< predicate_function< dim, spacedim > > &predicates, const std::vector< unsigned int > &predicate_colors, std::map< unsigned int, std::map< unsigned int, unsigned int > > &cellwise_color_predicate_map, std::vector< std::set< unsigned int > > &fe_sets)
unsigned int color_predicates(const DoFHandler< dim, spacedim > &mesh, const std::vector< predicate_function< dim, spacedim > > &predicates, std::vector< unsigned int > &predicate_colors)
void make_colorwise_enrichment_functions(const unsigned int n_colors, const std::vector< std::shared_ptr< Function< spacedim > > > &enrichments, const std::map< unsigned int, std::map< unsigned int, unsigned int > > &cellwise_color_predicate_map, std::vector< std::function< const Function< spacedim > *(const typename Triangulation< dim, spacedim >::cell_iterator &)> > &color_enrichments)
bool find_connection_between_subdomains(const DoFHandler< dim, spacedim > &dof_handler, const predicate_function< dim, spacedim > &predicate_1, const predicate_function< dim, spacedim > &predicate_2)
void make_fe_collection_from_colored_enrichments(const unsigned int n_colors, const std::vector< std::set< unsigned int > > &fe_sets, const std::vector< std::function< const Function< spacedim > *(const typename Triangulation< dim, spacedim >::cell_iterator &)> > &color_enrichments, const FiniteElement< dim, spacedim > &fe_base, const FiniteElement< dim, spacedim > &fe_enriched, const FE_Nothing< dim, spacedim > &fe_nothing, hp::FECollection< dim, spacedim > &fe_collection)
std::function< bool(const typename Triangulation< dim, spacedim >::cell_iterator &)> predicate_function
@ neither_element_dominates
std::string dim_string(const int dim, const int spacedim)
std::unique_ptr< To > dynamic_unique_cast(std::unique_ptr< From > &&p)
const hp::FECollection< dim, spacedim > & build_fe_collection(DoFHandler< dim, spacedim > &dof_handler)
const FiniteElement< dim, spacedim > & fe_enriched
const std::vector< predicate_function< dim, spacedim > > predicates
const std::vector< std::shared_ptr< Function< spacedim > > > enrichments
const FiniteElement< dim, spacedim > & fe_base
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > face_indices()
static std_cxx20::ranges::iota_view< unsigned int, unsigned int > vertex_indices()
DEAL_II_HOST constexpr SymmetricTensor< 2, dim, Number > symmetrize(const Tensor< 2, dim, Number > &t)
DEAL_II_HOST constexpr SymmetricTensor< 4, dim, Number > outer_product(const SymmetricTensor< 2, dim, Number > &t1, const SymmetricTensor< 2, dim, Number > &t2)