Reference documentation for deal.II version GIT 29f9da0a34 2023-12-07 10:00:01+00:00
\(\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_values.h
Go to the documentation of this file.
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 1998 - 2023 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_values_h
17 #define dealii_fe_values_h
18 
19 
20 #include <deal.II/base/config.h>
21 
24 #include <deal.II/base/point.h>
29 
32 
33 #include <deal.II/fe/fe.h>
37 #include <deal.II/fe/mapping.h>
39 
40 #include <deal.II/grid/tria.h>
42 
44 
46 
47 #include <algorithm>
48 #include <memory>
49 #include <type_traits>
50 
52 
62 template <int dim, int spacedim = dim>
63 class FEValues : public FEValuesBase<dim, spacedim>
64 {
65 public:
70  static constexpr unsigned int integral_dimension = dim;
71 
80 
91 
100 
109  const UpdateFlags update_flags);
110 
117  template <bool level_dof_access>
118  void
121 
135  void
137 
142  const Quadrature<dim> &
143  get_quadrature() const;
144 
149  std::size_t
151 
168 
169 private:
174 
178  void
180 
187  void
189 };
190 
191 
201 template <int dim, int spacedim = dim>
202 class FEFaceValuesBase : public FEValuesBase<dim, spacedim>
203 {
204 public:
209  static constexpr unsigned int integral_dimension = dim - 1;
210 
222  FEFaceValuesBase(const unsigned int dofs_per_cell,
227 
234  FEFaceValuesBase(const unsigned int dofs_per_cell,
239 
247  const Tensor<1, spacedim> &
248  boundary_form(const unsigned int q_point) const;
249 
256  const std::vector<Tensor<1, spacedim>> &
258 
263  unsigned int
265 
270  unsigned int
271  get_face_index() const;
272 
277  const Quadrature<dim - 1> &
278  get_quadrature() const;
279 
284  std::size_t
286 
287 protected:
292  unsigned int present_face_no;
293 
298  unsigned int present_face_index;
299 
303  const hp::QCollection<dim - 1> quadrature;
304 };
305 
306 
307 
321 template <int dim, int spacedim = dim>
322 class FEFaceValues : public FEFaceValuesBase<dim, spacedim>
323 {
324 public:
329  static constexpr unsigned int dimension = dim;
330 
331  static constexpr unsigned int space_dimension = spacedim;
332 
337  static constexpr unsigned int integral_dimension = dim - 1;
338 
346  const UpdateFlags update_flags);
347 
357  const UpdateFlags update_flags);
358 
366  const UpdateFlags update_flags);
367 
376  const UpdateFlags update_flags);
377 
382  template <bool level_dof_access>
383  void
386  const unsigned int face_no);
387 
394  template <bool level_dof_access>
395  void
398  const typename Triangulation<dim, spacedim>::face_iterator &face);
399 
413  void
415  const unsigned int face_no);
416 
417  /*
418  * Reinitialize the gradients, Jacobi determinants, etc for the given face
419  * on a given cell of type "iterator into a Triangulation object", and the
420  * given finite element. Since iterators into a triangulation alone only
421  * convey information about the geometry of a cell, but not about degrees of
422  * freedom possibly associated with this cell, you will not be able to call
423  * some functions of this class if they need information about degrees of
424  * freedom. These functions are, above all, the
425  * <tt>get_function_value/gradients/hessians/third_derivatives</tt>
426  * functions. If you want to call these functions, you have to call the @p
427  * reinit variants that take iterators into DoFHandler or other DoF handler
428  * type objects.
429  *
430  * @note @p face must be one of @p cell's face iterators.
431  */
432  void
434  const typename Triangulation<dim, spacedim>::face_iterator &face);
435 
452 
453 private:
457  void
459 
466  void
467  do_reinit(const unsigned int face_no);
468 };
469 
470 
487 template <int dim, int spacedim = dim>
488 class FESubfaceValues : public FEFaceValuesBase<dim, spacedim>
489 {
490 public:
494  static constexpr unsigned int dimension = dim;
495 
499  static constexpr unsigned int space_dimension = spacedim;
500 
505  static constexpr unsigned int integral_dimension = dim - 1;
506 
513  const Quadrature<dim - 1> &face_quadrature,
514  const UpdateFlags update_flags);
515 
524  const hp::QCollection<dim - 1> &face_quadrature,
525  const UpdateFlags update_flags);
526 
533  const Quadrature<dim - 1> &face_quadrature,
534  const UpdateFlags update_flags);
535 
543  const hp::QCollection<dim - 1> &face_quadrature,
544  const UpdateFlags update_flags);
545 
552  template <bool level_dof_access>
553  void
556  const unsigned int face_no,
557  const unsigned int subface_no);
558 
563  template <bool level_dof_access>
564  void
567  const typename Triangulation<dim, spacedim>::face_iterator &face,
568  const typename Triangulation<dim, spacedim>::face_iterator &subface);
569 
583  void
585  const unsigned int face_no,
586  const unsigned int subface_no);
587 
607  void
609  const typename Triangulation<dim, spacedim>::face_iterator &face,
610  const typename Triangulation<dim, spacedim>::face_iterator &subface);
611 
628 
635 
642 
643 private:
647  void
649 
656  void
657  do_reinit(const unsigned int face_no, const unsigned int subface_no);
658 };
659 
660 
661 #ifndef DOXYGEN
662 
663 
664 /*--------------------- Inline functions: FEValues --------------------------*/
665 
666 
667 template <int dim, int spacedim>
668 inline const Quadrature<dim> &
670 {
671  return quadrature;
672 }
673 
674 
675 
676 template <int dim, int spacedim>
677 inline const FEValues<dim, spacedim> &
679 {
680  return *this;
681 }
682 
683 
684 /*---------------------- Inline functions: FEFaceValuesBase -----------------*/
685 
686 
687 template <int dim, int spacedim>
688 inline unsigned int
690 {
691  return present_face_no;
692 }
693 
694 
695 template <int dim, int spacedim>
696 inline unsigned int
698 {
699  return present_face_index;
700 }
701 
702 
703 /*----------------------- Inline functions: FE*FaceValues -------------------*/
704 
705 template <int dim, int spacedim>
706 inline const Quadrature<dim - 1> &
708 {
709  return quadrature[quadrature.size() == 1 ? 0 : present_face_no];
710 }
711 
712 
713 
714 template <int dim, int spacedim>
715 inline const FEFaceValues<dim, spacedim> &
717 {
718  return *this;
719 }
720 
721 
722 
723 template <int dim, int spacedim>
724 inline const FESubfaceValues<dim, spacedim> &
726 {
727  return *this;
728 }
729 
730 
731 
732 template <int dim, int spacedim>
733 inline const Tensor<1, spacedim> &
734 FEFaceValuesBase<dim, spacedim>::boundary_form(const unsigned int q_point) const
735 {
736  AssertIndexRange(q_point, this->mapping_output.boundary_forms.size());
737  Assert(this->update_flags & update_boundary_forms,
739  "update_boundary_forms")));
740 
741  return this->mapping_output.boundary_forms[q_point];
742 }
743 
744 #endif // DOXYGEN
745 
747 
748 #endif
static constexpr unsigned int integral_dimension
Definition: fe_values.h:209
const std::vector< Tensor< 1, spacedim > > & get_boundary_forms() const
unsigned int get_face_index() const
unsigned int present_face_no
Definition: fe_values.h:292
const Tensor< 1, spacedim > & boundary_form(const unsigned int q_point) const
const Quadrature< dim - 1 > & get_quadrature() const
FEFaceValuesBase(const unsigned int dofs_per_cell, const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const hp::QCollection< dim - 1 > &quadrature)
unsigned int present_face_index
Definition: fe_values.h:298
FEFaceValuesBase(const unsigned int dofs_per_cell, const UpdateFlags update_flags, const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &quadrature)
std::size_t memory_consumption() const
unsigned int get_face_number() const
const hp::QCollection< dim - 1 > quadrature
Definition: fe_values.h:303
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access >> &cell, const unsigned int face_no)
FEFaceValues(const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &quadrature, const UpdateFlags update_flags)
void initialize(const UpdateFlags update_flags)
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no)
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access >> &cell, const typename Triangulation< dim, spacedim >::face_iterator &face)
const FEFaceValues< dim, spacedim > & get_present_fe_values() const
static constexpr unsigned int integral_dimension
Definition: fe_values.h:337
void do_reinit(const unsigned int face_no)
FEFaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &quadrature, const UpdateFlags update_flags)
static constexpr unsigned int space_dimension
Definition: fe_values.h:331
static constexpr unsigned int dimension
Definition: fe_values.h:329
FEFaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const hp::QCollection< dim - 1 > &quadrature, const UpdateFlags update_flags)
FEFaceValues(const FiniteElement< dim, spacedim > &fe, const hp::QCollection< dim - 1 > &quadrature, const UpdateFlags update_flags)
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const typename Triangulation< dim, spacedim >::face_iterator &face)
FESubfaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &face_quadrature, const UpdateFlags update_flags)
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const unsigned int face_no, const unsigned int subface_no)
static constexpr unsigned int space_dimension
Definition: fe_values.h:499
static constexpr unsigned int integral_dimension
Definition: fe_values.h:505
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access >> &cell, const unsigned int face_no, const unsigned int subface_no)
void initialize(const UpdateFlags update_flags)
static constexpr unsigned int dimension
Definition: fe_values.h:494
FESubfaceValues(const FiniteElement< dim, spacedim > &fe, const Quadrature< dim - 1 > &face_quadrature, const UpdateFlags update_flags)
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access >> &cell, const typename Triangulation< dim, spacedim >::face_iterator &face, const typename Triangulation< dim, spacedim >::face_iterator &subface)
const FESubfaceValues< dim, spacedim > & get_present_fe_values() const
void do_reinit(const unsigned int face_no, const unsigned int subface_no)
FESubfaceValues(const FiniteElement< dim, spacedim > &fe, const hp::QCollection< dim - 1 > &face_quadrature, const UpdateFlags update_flags)
FESubfaceValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const hp::QCollection< dim - 1 > &face_quadrature, const UpdateFlags update_flags)
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell, const typename Triangulation< dim, spacedim >::face_iterator &face, const typename Triangulation< dim, spacedim >::face_iterator &subface)
const SmartPointer< const Mapping< dim, spacedim >, FEValuesBase< dim, spacedim > > mapping
const unsigned int dofs_per_cell
const SmartPointer< const FiniteElement< dim, spacedim >, FEValuesBase< dim, spacedim > > fe
FEValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const Quadrature< dim > &quadrature, const UpdateFlags update_flags)
void do_reinit()
void reinit(const TriaIterator< DoFCellAccessor< dim, spacedim, level_dof_access >> &cell)
const Quadrature< dim > quadrature
Definition: fe_values.h:173
FEValues(const FiniteElement< dim, spacedim > &fe, const hp::QCollection< dim > &quadrature, const UpdateFlags update_flags)
FEValues(const Mapping< dim, spacedim > &mapping, const FiniteElement< dim, spacedim > &fe, const hp::QCollection< dim > &quadrature, const UpdateFlags update_flags)
FEValues(const FiniteElement< dim, spacedim > &fe, const Quadrature< dim > &quadrature, const UpdateFlags update_flags)
void initialize(const UpdateFlags update_flags)
void reinit(const typename Triangulation< dim, spacedim >::cell_iterator &cell)
const FEValues< dim, spacedim > & get_present_fe_values() const
static constexpr unsigned int integral_dimension
Definition: fe_values.h:70
const Quadrature< dim > & get_quadrature() const
std::size_t memory_consumption() const
#define DEAL_II_NAMESPACE_OPEN
Definition: config.h:477
#define DEAL_II_NAMESPACE_CLOSE
Definition: config.h:478
#define DeclException0(Exception0)
Definition: exceptions.h:472
static ::ExceptionBase & ExcReinitCalledWithBoundaryFace()
#define Assert(cond, exc)
Definition: exceptions.h:1631
#define AssertIndexRange(index, range)
Definition: exceptions.h:1888
static ::ExceptionBase & ExcFaceHasNoSubfaces()
UpdateFlags
@ update_boundary_forms
Outer normal vector, not normalized.