Reference documentation for deal.II version 9.4.0
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
fe.h
Go to the documentation of this file.
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1998 - 2022 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE.md at
12 // the top level directory of deal.II.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii_fe_h
17 #define dealii_fe_h
18 
19 #include <deal.II/base/config.h>
20 
21 #include <deal.II/fe/block_mask.h>
23 #include <deal.II/fe/fe_data.h>
26 #include <deal.II/fe/mapping.h>
27 
29 #include <deal.II/lac/vector.h>
30 
31 #include <memory>
32 
33 
35 
36 // Forward declarations:
37 #ifndef DOXYGEN
38 template <int dim, int spacedim>
39 class FEValuesBase;
40 template <int dim, int spacedim>
41 class FEValues;
42 template <int dim, int spacedim>
43 class FEFaceValues;
44 template <int dim, int spacedim>
45 class FESubfaceValues;
46 namespace NonMatching
47 {
48  template <int dim>
49  class FEImmersedSurfaceValues;
50 }
51 template <int dim, int spacedim>
52 class FESystem;
53 #endif
54 
653 template <int dim, int spacedim = dim>
654 class FiniteElement : public Subscriptor, public FiniteElementData<dim>
655 {
656 public:
660  static constexpr unsigned int space_dimension = spacedim;
661 
687  {
688  public:
694 
698  virtual ~InternalDataBase() = default;
699 
704 
720 
724  virtual std::size_t
726  };
727 
728 public:
772  const std::vector<bool> & restriction_is_additive_flags,
773  const std::vector<ComponentMask> &nonzero_components);
774 
779 
784 
789  virtual ~FiniteElement() override = default;
790 
799  std::pair<std::unique_ptr<FiniteElement<dim, spacedim>>, unsigned int>
800  operator^(const unsigned int multiplicity) const;
801 
813  virtual std::unique_ptr<FiniteElement<dim, spacedim>>
814  clone() const = 0;
815 
826  virtual std::string
827  get_name() const = 0;
828 
854  operator[](const unsigned int fe_index) const;
855 
881  virtual double
882  shape_value(const unsigned int i, const Point<dim> &p) const;
883 
890  virtual double
891  shape_value_component(const unsigned int i,
892  const Point<dim> & p,
893  const unsigned int component) const;
894 
916  virtual Tensor<1, dim>
917  shape_grad(const unsigned int i, const Point<dim> &p) const;
918 
925  virtual Tensor<1, dim>
926  shape_grad_component(const unsigned int i,
927  const Point<dim> & p,
928  const unsigned int component) const;
929 
951  virtual Tensor<2, dim>
952  shape_grad_grad(const unsigned int i, const Point<dim> &p) const;
953 
960  virtual Tensor<2, dim>
961  shape_grad_grad_component(const unsigned int i,
962  const Point<dim> & p,
963  const unsigned int component) const;
964 
986  virtual Tensor<3, dim>
987  shape_3rd_derivative(const unsigned int i, const Point<dim> &p) const;
988 
995  virtual Tensor<3, dim>
996  shape_3rd_derivative_component(const unsigned int i,
997  const Point<dim> & p,
998  const unsigned int component) const;
999 
1021  virtual Tensor<4, dim>
1022  shape_4th_derivative(const unsigned int i, const Point<dim> &p) const;
1023 
1030  virtual Tensor<4, dim>
1031  shape_4th_derivative_component(const unsigned int i,
1032  const Point<dim> & p,
1033  const unsigned int component) const;
1044  virtual bool
1045  has_support_on_face(const unsigned int shape_index,
1046  const unsigned int face_index) const;
1047 
1049 
1069  virtual const FullMatrix<double> &
1070  get_restriction_matrix(const unsigned int child,
1071  const RefinementCase<dim> &refinement_case =
1073 
1103  virtual const FullMatrix<double> &
1104  get_prolongation_matrix(const unsigned int child,
1105  const RefinementCase<dim> &refinement_case =
1107 
1129  bool
1131 
1147  bool
1149 
1171  bool
1173 
1189  bool
1191 
1192 
1201  bool
1202  restriction_is_additive(const unsigned int index) const;
1203 
1215  const FullMatrix<double> &
1216  constraints(const ::internal::SubfaceCase<dim> &subface_case =
1218 
1234  bool
1236  const ::internal::SubfaceCase<dim> &subface_case =
1238 
1239 
1261  virtual bool
1263 
1264 
1276  virtual void
1278  FullMatrix<double> & matrix) const;
1280 
1298  virtual void
1301  const unsigned int face_no = 0) const;
1302 
1303 
1315  virtual void
1317  const unsigned int subface,
1319  const unsigned int face_no = 0) const;
1321 
1322 
1343  virtual std::vector<std::pair<unsigned int, unsigned int>>
1345 
1350  virtual std::vector<std::pair<unsigned int, unsigned int>>
1352 
1357  virtual std::vector<std::pair<unsigned int, unsigned int>>
1359  const unsigned int face_no = 0) const;
1360 
1378  const unsigned int codim = 0) const;
1379 
1381 
1412  virtual bool
1414 
1419  bool
1421 
1457  std::pair<unsigned int, unsigned int>
1458  system_to_component_index(const unsigned int index) const;
1459 
1469  unsigned int
1470  component_to_system_index(const unsigned int component,
1471  const unsigned int index) const;
1472 
1482  std::pair<unsigned int, unsigned int>
1483  face_system_to_component_index(const unsigned int index,
1484  const unsigned int face_no = 0) const;
1485 
1494  unsigned int
1496  const unsigned int face_no,
1497  const bool face_orientation,
1498  const bool face_flip,
1499  const bool face_rotation) const;
1500 
1555  virtual unsigned int
1556  face_to_cell_index(const unsigned int face_dof_index,
1557  const unsigned int face,
1558  const bool face_orientation = true,
1559  const bool face_flip = false,
1560  const bool face_rotation = false) const;
1561 
1569  unsigned int
1571  const bool line_orientation) const;
1572 
1589  const ComponentMask &
1590  get_nonzero_components(const unsigned int i) const;
1591 
1602  unsigned int
1603  n_nonzero_components(const unsigned int i) const;
1604 
1613  bool
1614  is_primitive() const;
1615 
1626  bool
1627  is_primitive(const unsigned int i) const;
1628 
1640  unsigned int
1642 
1647  virtual const FiniteElement<dim, spacedim> &
1648  base_element(const unsigned int index) const;
1649 
1656  unsigned int
1657  element_multiplicity(const unsigned int index) const;
1658 
1732  get_sub_fe(const ComponentMask &mask) const;
1733 
1742  virtual const FiniteElement<dim, spacedim> &
1743  get_sub_fe(const unsigned int first_component,
1744  const unsigned int n_selected_components) const;
1745 
1768  std::pair<std::pair<unsigned int, unsigned int>, unsigned int>
1769  system_to_base_index(const unsigned int index) const;
1770 
1779  std::pair<std::pair<unsigned int, unsigned int>, unsigned int>
1780  face_system_to_base_index(const unsigned int index,
1781  const unsigned int face_no = 0) const;
1782 
1788  first_block_of_base(const unsigned int b) const;
1789 
1802  std::pair<unsigned int, unsigned int>
1803  component_to_base_index(const unsigned int component) const;
1804 
1805 
1810  std::pair<unsigned int, unsigned int>
1811  block_to_base_index(const unsigned int block) const;
1812 
1816  std::pair<unsigned int, types::global_dof_index>
1817  system_to_block_index(const unsigned int component) const;
1818 
1822  unsigned int
1823  component_to_block_index(const unsigned int component) const;
1824 
1826 
1846 
1861 
1877  const FEValuesExtractors::SymmetricTensor<2> &sym_tensor) const;
1878 
1895 
1916  BlockMask
1918 
1935  BlockMask
1937 
1955  BlockMask
1957 
1980  BlockMask
1982 
1998  virtual std::pair<Table<2, bool>, std::vector<unsigned int>>
2000 
2002 
2038  const std::vector<Point<dim>> &
2040 
2058  bool
2060 
2073  virtual Point<dim>
2074  unit_support_point(const unsigned int index) const;
2075 
2102  const std::vector<Point<dim - 1>> &
2103  get_unit_face_support_points(const unsigned int face_no = 0) const;
2104 
2113  bool
2114  has_face_support_points(const unsigned int face_no = 0) const;
2115 
2120  virtual Point<dim - 1>
2121  unit_face_support_point(const unsigned int index,
2122  const unsigned int face_no = 0) const;
2123 
2136  const std::vector<Point<dim>> &
2138 
2148  bool
2150 
2195  get_associated_geometry_primitive(const unsigned int cell_dof_index) const;
2196 
2197 
2275  virtual void
2277  const std::vector<Vector<double>> &support_point_values,
2278  std::vector<double> & nodal_values) const;
2279 
2281 
2290  virtual std::size_t
2292 
2299  int,
2300  << "The shape function with index " << arg1
2301  << " is not primitive, i.e. it is vector-valued and "
2302  << "has more than one non-zero vector component. This "
2303  << "function cannot be called for these shape functions. "
2304  << "Maybe you want to use the same function with the "
2305  << "_component suffix?");
2319  "You are trying to access the values or derivatives of shape functions "
2320  "on the reference cell of an element that does not define its shape "
2321  "functions through mapping from the reference cell. Consequently, "
2322  "you cannot ask for shape function values or derivatives on the "
2323  "reference cell.");
2324 
2332  "You are trying to access the support points of a finite "
2333  "element that either has no support points at all, or for "
2334  "which the corresponding tables have not been implemented.");
2335 
2343  "You are trying to access the matrices that describe how "
2344  "to embed a finite element function on one cell into the "
2345  "finite element space on one of its children (i.e., the "
2346  "'embedding' or 'prolongation' matrices). However, the "
2347  "current finite element can either not define this sort of "
2348  "operation, or it has not yet been implemented.");
2349 
2358  "You are trying to access the matrices that describe how "
2359  "to restrict a finite element function from the children "
2360  "of one cell to the finite element space defined on their "
2361  "parent (i.e., the 'restriction' or 'projection' matrices). "
2362  "However, the current finite element can either not define "
2363  "this sort of operation, or it has not yet been "
2364  "implemented.");
2365 
2371  int,
2372  int,
2373  << "The interface matrix has a size of " << arg1 << 'x' << arg2
2374  << ", which is not reasonable for the current element "
2375  "in the present dimension.");
2381 
2382 protected:
2396  void
2398  const bool isotropic_restriction_only = false,
2399  const bool isotropic_prolongation_only = false);
2400 
2413  std::vector<std::vector<FullMatrix<double>>> restriction;
2414 
2427  std::vector<std::vector<FullMatrix<double>>> prolongation;
2428 
2440 
2451  std::vector<Point<dim>> unit_support_points;
2452 
2458  std::vector<std::vector<Point<dim - 1>>> unit_face_support_points;
2459 
2464  std::vector<Point<dim>> generalized_support_points;
2465 
2470  std::vector<std::vector<Point<dim - 1>>> generalized_face_support_points;
2471 
2488 
2503 
2507  std::vector<std::pair<unsigned int, unsigned int>> system_to_component_table;
2508 
2518  std::vector<std::vector<std::pair<unsigned int, unsigned int>>>
2520 
2537  std::vector<std::pair<std::pair<unsigned int, unsigned int>, unsigned int>>
2539 
2543  std::vector<
2544  std::vector<std::pair<std::pair<unsigned int, unsigned int>, unsigned int>>>
2546 
2552 
2573  std::vector<std::pair<std::pair<unsigned int, unsigned int>, unsigned int>>
2575 
2581  const std::vector<bool> restriction_is_additive_flags;
2582 
2590  const std::vector<ComponentMask> nonzero_components;
2591 
2599  const std::vector<unsigned int> n_nonzero_components_table;
2600 
2607 
2621 
2627  static std::vector<unsigned int>
2629  const std::vector<ComponentMask> &nonzero_components);
2630 
2651  virtual UpdateFlags
2652  requires_update_flags(const UpdateFlags update_flags) const = 0;
2653 
2730  virtual std::unique_ptr<InternalDataBase>
2731  get_data(const UpdateFlags update_flags,
2732  const Mapping<dim, spacedim> &mapping,
2733  const Quadrature<dim> & quadrature,
2735  FiniteElementRelatedData<dim, spacedim> &output_data) const = 0;
2736 
2778  virtual std::unique_ptr<InternalDataBase>
2779  get_face_data(const UpdateFlags update_flags,
2780  const Mapping<dim, spacedim> & mapping,
2781  const hp::QCollection<dim - 1> &quadrature,
2783  FiniteElementRelatedData<dim, spacedim> &output_data) const;
2784 
2788  virtual std::unique_ptr<InternalDataBase>
2790  const UpdateFlags update_flags,
2791  const Mapping<dim, spacedim> &mapping,
2792  const Quadrature<dim - 1> & quadrature,
2794  &output_data) const;
2795 
2837  virtual std::unique_ptr<InternalDataBase>
2839  const UpdateFlags update_flags,
2840  const Mapping<dim, spacedim> &mapping,
2841  const Quadrature<dim - 1> & quadrature,
2843  spacedim>
2844  &output_data) const;
2845 
2926  virtual void
2928  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
2929  const CellSimilarity::Similarity cell_similarity,
2930  const Quadrature<dim> & quadrature,
2931  const Mapping<dim, spacedim> & mapping,
2932  const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
2933  const ::internal::FEValuesImplementation::MappingRelatedData<dim,
2934  spacedim>
2935  & mapping_data,
2936  const InternalDataBase &fe_internal,
2938  spacedim>
2939  &output_data) const = 0;
2940 
2983  virtual void
2985  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
2986  const unsigned int face_no,
2987  const hp::QCollection<dim - 1> & quadrature,
2988  const Mapping<dim, spacedim> & mapping,
2989  const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
2990  const ::internal::FEValuesImplementation::MappingRelatedData<dim,
2991  spacedim>
2992  & mapping_data,
2993  const InternalDataBase &fe_internal,
2995  spacedim>
2996  &output_data) const;
2997 
3001  virtual void
3003  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
3004  const unsigned int face_no,
3005  const Quadrature<dim - 1> & quadrature,
3006  const Mapping<dim, spacedim> & mapping,
3007  const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
3009  & mapping_data,
3010  const InternalDataBase &fe_internal,
3012  &output_data) const;
3013 
3059  virtual void
3061  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
3062  const unsigned int face_no,
3063  const unsigned int sub_no,
3064  const Quadrature<dim - 1> & quadrature,
3065  const Mapping<dim, spacedim> & mapping,
3066  const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
3067  const ::internal::FEValuesImplementation::MappingRelatedData<dim,
3068  spacedim>
3069  & mapping_data,
3070  const InternalDataBase &fe_internal,
3072  spacedim>
3073  &output_data) const = 0;
3074 
3075  friend class InternalDataBase;
3076  friend class FEValuesBase<dim, spacedim>;
3077  friend class FEValues<dim, spacedim>;
3078  friend class FEFaceValues<dim, spacedim>;
3079  friend class FESubfaceValues<dim, spacedim>;
3080  friend class NonMatching::FEImmersedSurfaceValues<dim>;
3081  friend class FESystem<dim, spacedim>;
3082 
3083  // explicitly check for sensible template arguments, but not on windows
3084  // because MSVC creates bogus warnings during normal compilation
3085 #ifndef DEAL_II_MSVC
3086  static_assert(dim <= spacedim,
3087  "The dimension <dim> of a FiniteElement must be less than or "
3088  "equal to the space dimension <spacedim> in which it lives.");
3089 #endif
3090 };
3091 
3092 
3093 //----------------------------------------------------------------------//
3094 
3095 
3096 template <int dim, int spacedim>
3097 inline const FiniteElement<dim, spacedim> &
3098 FiniteElement<dim, spacedim>::operator[](const unsigned int fe_index) const
3099 {
3100  (void)fe_index;
3101  Assert(fe_index == 0,
3102  ExcMessage("A fe_index of zero is the only index allowed here"));
3103  return *this;
3104 }
3105 
3106 
3107 
3108 template <int dim, int spacedim>
3109 inline std::pair<unsigned int, unsigned int>
3111  const unsigned int index) const
3112 {
3114  Assert(is_primitive(index),
3116  index)));
3118 }
3119 
3120 
3121 
3122 template <int dim, int spacedim>
3123 inline unsigned int
3125 {
3126  return base_to_block_indices.size();
3127 }
3128 
3129 
3130 
3131 template <int dim, int spacedim>
3132 inline unsigned int
3134  const unsigned int index) const
3135 {
3136  return static_cast<unsigned int>(base_to_block_indices.block_size(index));
3137 }
3138 
3139 
3140 
3141 template <int dim, int spacedim>
3142 inline unsigned int
3144  const unsigned int component,
3145  const unsigned int index) const
3146 {
3147  AssertIndexRange(component, this->n_components());
3148  const std::vector<std::pair<unsigned int, unsigned int>>::const_iterator it =
3149  std::find(system_to_component_table.begin(),
3151  std::pair<unsigned int, unsigned int>(component, index));
3152 
3153  Assert(it != system_to_component_table.end(),
3154  ExcMessage("You are asking for the number of the shape function "
3155  "within a system element that corresponds to vector "
3156  "component " +
3157  Utilities::int_to_string(component) +
3158  " and within this to "
3159  "index " +
3160  Utilities::int_to_string(index) +
3161  ". But no such "
3162  "shape function exists."));
3163  return std::distance(system_to_component_table.begin(), it);
3164 }
3165 
3166 
3167 
3168 template <int dim, int spacedim>
3169 inline std::pair<unsigned int, unsigned int>
3171  const unsigned int index,
3172  const unsigned int face_no) const
3173 {
3175  index,
3176  face_system_to_component_table[this->n_unique_faces() == 1 ? 0 : face_no]
3177  .size());
3178 
3179  // in debug mode, check whether the
3180  // function is primitive, since
3181  // otherwise the result may have no
3182  // meaning
3183  //
3184  // since the primitivity tables are
3185  // all geared towards cell dof
3186  // indices, rather than face dof
3187  // indices, we have to work a
3188  // little bit...
3189  //
3190  // in 1d, the face index is equal
3191  // to the cell index
3192  Assert(is_primitive(this->face_to_cell_index(index, face_no)),
3194  index)));
3195 
3196  return face_system_to_component_table[this->n_unique_faces() == 1 ?
3197  0 :
3198  face_no][index];
3199 }
3200 
3201 
3202 
3203 template <int dim, int spacedim>
3204 inline std::pair<std::pair<unsigned int, unsigned int>, unsigned int>
3206  const unsigned int index) const
3207 {
3208  AssertIndexRange(index, system_to_base_table.size());
3209  return system_to_base_table[index];
3210 }
3211 
3212 
3213 
3214 template <int dim, int spacedim>
3215 inline std::pair<std::pair<unsigned int, unsigned int>, unsigned int>
3217  const unsigned int index,
3218  const unsigned int face_no) const
3219 {
3221  index,
3222  face_system_to_base_table[this->n_unique_faces() == 1 ? 0 : face_no]
3223  .size());
3224  return face_system_to_base_table[this->n_unique_faces() == 1 ? 0 : face_no]
3225  [index];
3226 }
3227 
3228 
3229 
3230 template <int dim, int spacedim>
3233  const unsigned int index) const
3234 {
3235  return base_to_block_indices.block_start(index);
3236 }
3237 
3238 
3239 
3240 template <int dim, int spacedim>
3241 inline std::pair<unsigned int, unsigned int>
3243  const unsigned int index) const
3244 {
3246 
3247  return component_to_base_table[index].first;
3248 }
3249 
3250 
3251 
3252 template <int dim, int spacedim>
3253 inline std::pair<unsigned int, unsigned int>
3255  const unsigned int index) const
3256 {
3257  return base_to_block_indices.global_to_local(index);
3258 }
3259 
3260 
3261 
3262 template <int dim, int spacedim>
3263 inline std::pair<unsigned int, types::global_dof_index>
3265  const unsigned int index) const
3266 {
3267  AssertIndexRange(index, this->n_dofs_per_cell());
3268  // The block is computed simply as
3269  // first block of this base plus
3270  // the index within the base blocks
3271  return std::pair<unsigned int, types::global_dof_index>(
3273  system_to_base_table[index].first.second,
3274  system_to_base_table[index].second);
3275 }
3276 
3277 
3278 
3279 template <int dim, int spacedim>
3280 inline bool
3282  const unsigned int index) const
3283 {
3284  AssertIndexRange(index, this->n_dofs_per_cell());
3285  return restriction_is_additive_flags[index];
3286 }
3287 
3288 
3289 
3290 template <int dim, int spacedim>
3291 inline const ComponentMask &
3292 FiniteElement<dim, spacedim>::get_nonzero_components(const unsigned int i) const
3293 {
3294  AssertIndexRange(i, this->n_dofs_per_cell());
3295  return nonzero_components[i];
3296 }
3297 
3298 
3299 
3300 template <int dim, int spacedim>
3301 inline unsigned int
3302 FiniteElement<dim, spacedim>::n_nonzero_components(const unsigned int i) const
3303 {
3304  AssertIndexRange(i, this->n_dofs_per_cell());
3305  return n_nonzero_components_table[i];
3306 }
3307 
3308 
3309 
3310 template <int dim, int spacedim>
3311 inline bool
3313 {
3314  return cached_primitivity;
3315 }
3316 
3317 
3318 
3319 template <int dim, int spacedim>
3320 inline bool
3321 FiniteElement<dim, spacedim>::is_primitive(const unsigned int i) const
3322 {
3323  AssertIndexRange(i, this->n_dofs_per_cell());
3324 
3325  // return primitivity of a shape
3326  // function by checking whether it
3327  // has more than one non-zero
3328  // component or not. we could cache
3329  // this value in an array of bools,
3330  // but accessing a bit-vector (as
3331  // std::vector<bool> is) is
3332  // probably more expensive than
3333  // just comparing against 1
3334  //
3335  // for good measure, short circuit the test
3336  // if the entire FE is primitive
3337  return (is_primitive() || (n_nonzero_components_table[i] == 1));
3338 }
3339 
3340 
3341 
3342 template <int dim, int spacedim>
3343 inline GeometryPrimitive
3345  const unsigned int cell_dof_index) const
3346 {
3347  AssertIndexRange(cell_dof_index, this->n_dofs_per_cell());
3348 
3349  // just go through the usual cases, taking into account how DoFs
3350  // are enumerated on the reference cell
3351  if (cell_dof_index < this->get_first_line_index())
3353  else if (cell_dof_index < this->get_first_quad_index(0))
3354  return GeometryPrimitive::line;
3355  else if (cell_dof_index < this->get_first_hex_index())
3356  return GeometryPrimitive::quad;
3357  else
3358  return GeometryPrimitive::hex;
3359 }
3360 
3361 
3362 
3364 
3365 #endif
size_type block_size(const unsigned int i) const
unsigned int size() const
size_type block_start(const unsigned int i) const
std::pair< unsigned int, size_type > global_to_local(const size_type i) const
unsigned int get_first_line_index() const
unsigned int n_dofs_per_cell() const
unsigned int get_first_quad_index(const unsigned int quad_no=0) const
unsigned int n_components() const
unsigned int n_unique_faces() const
unsigned int get_first_hex_index() const
virtual ~InternalDataBase()=default
InternalDataBase(const InternalDataBase &)=delete
UpdateFlags update_each
Definition: fe.h:719
virtual std::size_t memory_consumption() const
bool constraints_are_implemented(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) const
bool isotropic_prolongation_is_implemented() const
virtual std::string get_name() const =0
virtual FiniteElementDomination::Domination compare_for_domination(const FiniteElement< dim, spacedim > &fe_other, const unsigned int codim=0) const
const std::vector< unsigned int > n_nonzero_components_table
Definition: fe.h:2599
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
const std::vector< Point< dim > > & get_generalized_support_points() const
std::vector< std::vector< Point< dim - 1 > > > unit_face_support_points
Definition: fe.h:2458
virtual Tensor< 2, dim > shape_grad_grad(const unsigned int i, const Point< dim > &p) const
std::pair< unsigned int, unsigned int > block_to_base_index(const unsigned int block) const
bool prolongation_is_implemented() const
std::pair< unsigned int, unsigned int > system_to_component_index(const unsigned int index) const
ComponentMask component_mask(const BlockMask &block_mask) const
std::pair< unsigned int, unsigned int > component_to_base_index(const unsigned int component) const
ComponentMask component_mask(const FEValuesExtractors::SymmetricTensor< 2 > &sym_tensor) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual Tensor< 2, dim > shape_grad_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
const std::vector< Point< dim > > & get_unit_support_points() const
bool is_primitive(const unsigned int i) const
bool has_face_support_points(const unsigned int face_no=0) const
const bool cached_primitivity
Definition: fe.h:2606
ComponentMask component_mask(const FEValuesExtractors::Scalar &scalar) const
bool operator!=(const FiniteElement< dim, spacedim > &) 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
ComponentMask component_mask(const FEValuesExtractors::Vector &vector) const
bool has_support_points() const
std::vector< std::vector< FullMatrix< double > > > restriction
Definition: fe.h:2413
std::pair< unsigned int, types::global_dof_index > system_to_block_index(const unsigned int component) const
virtual const FiniteElement< dim, spacedim > & get_sub_fe(const unsigned int first_component, const unsigned int n_selected_components) const
TableIndices< 2 > interface_constraints_size() const
bool has_generalized_support_points() const
std::vector< Table< 2, int > > adjust_quad_dof_index_for_face_orientation_table
Definition: fe.h:2487
virtual bool operator==(const FiniteElement< dim, spacedim > &fe) const
unsigned int adjust_line_dof_index_for_line_orientation(const unsigned int index, const bool line_orientation) const
virtual Tensor< 4, dim > shape_4th_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) 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
const ComponentMask & get_nonzero_components(const unsigned int i) const
static constexpr unsigned int space_dimension
Definition: fe.h:660
BlockIndices base_to_block_indices
Definition: fe.h:2551
bool is_primitive() const
void reinit_restriction_and_prolongation_matrices(const bool isotropic_restriction_only=false, const bool isotropic_prolongation_only=false)
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const =0
bool isotropic_restriction_is_implemented() const
std::vector< std::vector< Point< dim - 1 > > > generalized_face_support_points
Definition: fe.h:2470
std::vector< int > adjust_line_dof_index_for_line_orientation_table
Definition: fe.h:2502
virtual Point< dim > unit_support_point(const unsigned int index) const
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > face_system_to_base_index(const unsigned int index, const unsigned int face_no=0) const
bool restriction_is_additive(const unsigned int 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
std::pair< std::unique_ptr< FiniteElement< dim, spacedim > >, unsigned int > operator^(const unsigned int multiplicity) const
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const
virtual Tensor< 4, dim > shape_4th_derivative(const unsigned int i, const Point< dim > &p) const
virtual double shape_value_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
const FullMatrix< double > & constraints(const ::internal::SubfaceCase< dim > &subface_case=::internal::SubfaceCase< dim >::case_isotropic) 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
FiniteElement(const FiniteElement< dim, spacedim > &)=default
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
unsigned int component_to_block_index(const unsigned int component) const
virtual void fill_fe_face_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const hp::QCollection< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const
BlockMask block_mask(const FEValuesExtractors::Scalar &scalar) const
virtual std::unique_ptr< 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
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 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 std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > system_to_base_table
Definition: fe.h:2538
virtual Tensor< 3, dim > shape_3rd_derivative(const unsigned int i, const Point< dim > &p) const
FiniteElement(const FiniteElementData< dim > &fe_data, const std::vector< bool > &restriction_is_additive_flags, const std::vector< ComponentMask > &nonzero_components)
BlockMask block_mask(const FEValuesExtractors::Vector &vector) const
BlockMask block_mask(const ComponentMask &component_mask) const
std::vector< std::pair< unsigned int, unsigned int > > system_to_component_table
Definition: fe.h:2507
const FiniteElement< dim, spacedim > & get_sub_fe(const ComponentMask &mask) const
unsigned int element_multiplicity(const unsigned int index) const
virtual Tensor< 3, dim > shape_3rd_derivative_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
const FiniteElement< dim, spacedim > & operator[](const unsigned int fe_index) const
const std::vector< bool > restriction_is_additive_flags
Definition: fe.h:2581
virtual Point< dim - 1 > unit_face_support_point(const unsigned int index, const unsigned int face_no=0) const
virtual ~FiniteElement() override=default
std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > component_to_base_table
Definition: fe.h:2574
std::vector< std::vector< std::pair< std::pair< unsigned int, unsigned int >, unsigned int > > > face_system_to_base_table
Definition: fe.h:2545
std::vector< Point< dim > > unit_support_points
Definition: fe.h:2451
bool restriction_is_implemented() const
std::vector< std::vector< std::pair< unsigned int, unsigned int > > > face_system_to_component_table
Definition: fe.h:2519
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
static std::vector< unsigned int > compute_n_nonzero_components(const std::vector< ComponentMask > &nonzero_components)
FiniteElement(FiniteElement< dim, spacedim > &&)=default
unsigned int n_nonzero_components(const unsigned int i) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other, const unsigned int face_no=0) const
const std::vector< Point< dim - 1 > > & get_unit_face_support_points(const unsigned int face_no=0) const
FullMatrix< double > interface_constraints
Definition: fe.h:2439
std::pair< unsigned int, unsigned int > face_system_to_component_index(const unsigned int index, const unsigned int face_no=0) const
virtual Tensor< 1, dim > shape_grad(const unsigned int i, const Point< dim > &p) const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const
virtual void fill_fe_subface_values(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int sub_no, const Quadrature< dim - 1 > &quadrature, const Mapping< dim, spacedim > &mapping, const typename Mapping< dim, spacedim >::InternalDataBase &mapping_internal, const ::internal::FEValuesImplementation::MappingRelatedData< dim, spacedim > &mapping_data, const InternalDataBase &fe_internal, ::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &output_data) const =0
BlockMask block_mask(const FEValuesExtractors::SymmetricTensor< 2 > &sym_tensor) const
unsigned int n_base_elements() const
std::pair< std::pair< unsigned int, unsigned int >, unsigned int > system_to_base_index(const unsigned int index) 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
GeometryPrimitive get_associated_geometry_primitive(const unsigned int cell_dof_index) const
std::vector< Point< dim > > generalized_support_points
Definition: fe.h:2464
unsigned int component_to_system_index(const unsigned int component, const unsigned int index) const
unsigned int adjust_quad_dof_index_for_face_orientation(const unsigned int index, const unsigned int face_no, const bool face_orientation, const bool face_flip, const bool face_rotation) const
const std::vector< ComponentMask > nonzero_components
Definition: fe.h:2590
virtual Tensor< 1, dim > shape_grad_component(const unsigned int i, const Point< dim > &p, const unsigned int component) const
virtual const FullMatrix< double > & get_prolongation_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
virtual bool hp_constraints_are_implemented() const
std::vector< std::vector< FullMatrix< double > > > prolongation
Definition: fe.h:2427
types::global_dof_index first_block_of_base(const unsigned int b) const
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const
Definition: point.h:111
Definition: vector.h:109
#define DEAL_II_DEPRECATED
Definition: config.h:164
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:442
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:443
UpdateFlags
Point< 2 > first
Definition: grid_out.cc:4603
static ::ExceptionBase & ExcFEHasNoSupportPoints()
#define DeclException0(Exception0)
Definition: exceptions.h:464
static ::ExceptionBase & ExcWrongInterfaceMatrixSize(int arg1, int arg2)
static ::ExceptionBase & ExcUnitShapeValuesDoNotExist()
static ::ExceptionBase & ExcEmbeddingVoid()
#define Assert(cond, exc)
Definition: exceptions.h:1473
#define DeclException2(Exception2, type1, type2, outsequence)
Definition: exceptions.h:532
#define AssertIndexRange(index, range)
Definition: exceptions.h:1732
#define DeclExceptionMsg(Exception, defaulttext)
Definition: exceptions.h:487
static ::ExceptionBase & ExcShapeFunctionNotPrimitive(int arg1)
#define DeclException1(Exception1, type1, outsequence)
Definition: exceptions.h:509
static ::ExceptionBase & ExcFENotPrimitive()
static ::ExceptionBase & ExcInterpolationNotImplemented()
static ::ExceptionBase & ExcProjectionVoid()
static ::ExceptionBase & ExcMessage(std::string arg1)
@ matrix
Contents is actually a matrix.
SymmetricTensor< 2, dim, Number > b(const Tensor< 2, dim, Number > &F)
std::string int_to_string(const unsigned int value, const unsigned int digits=numbers::invalid_unsigned_int)
Definition: utilities.cc:473
unsigned int global_dof_index
Definition: types.h:76