Reference documentation for deal.II version 9.1.0-pre
fe_face.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2009 - 2018 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_face_h
17 #define dealii_fe_face_h
18 
19 #include <deal.II/base/config.h>
20 
21 #include <deal.II/base/polynomial_space.h>
22 #include <deal.II/base/tensor_product_polynomials.h>
23 
24 #include <deal.II/fe/fe_poly_face.h>
25 
26 DEAL_II_NAMESPACE_OPEN
27 
28 
56 template <int dim, int spacedim = dim>
57 class FE_FaceQ
58  : public FE_PolyFace<TensorProductPolynomials<dim - 1>, dim, spacedim>
59 {
60 public:
66  FE_FaceQ(const unsigned int p);
67 
68  virtual std::unique_ptr<FiniteElement<dim, spacedim>>
69  clone() const override;
70 
76  virtual std::string
77  get_name() const override;
78 
86  virtual void
88  const std::vector<Vector<double>> &support_point_values,
89  std::vector<double> & nodal_values) const override;
90 
99  virtual void
101  FullMatrix<double> &matrix) const override;
102 
111  virtual void
113  const unsigned int subface,
114  FullMatrix<double> &matrix) const override;
115 
120  virtual bool
121  has_support_on_face(const unsigned int shape_index,
122  const unsigned int face_index) const override;
123 
146  virtual std::vector<std::pair<unsigned int, unsigned int>>
148  const FiniteElement<dim, spacedim> &fe_other) const override;
149 
156  virtual std::vector<std::pair<unsigned int, unsigned int>>
158  const FiniteElement<dim, spacedim> &fe_other) const override;
159 
166  virtual std::vector<std::pair<unsigned int, unsigned int>>
168  const FiniteElement<dim, spacedim> &fe_other) const override;
169 
174  virtual bool
175  hp_constraints_are_implemented() const override;
176 
188  const FiniteElement<dim, spacedim> &fe_other) const override;
197  virtual std::pair<Table<2, bool>, std::vector<unsigned int>>
198  get_constant_modes() const override;
199 
200 private:
204  static std::vector<unsigned int>
205  get_dpo_vector(const unsigned int deg);
206 };
207 
208 
209 
222 template <int spacedim>
223 class FE_FaceQ<1, spacedim> : public FiniteElement<1, spacedim>
224 {
225 public:
229  FE_FaceQ(const unsigned int p);
230 
231  virtual std::unique_ptr<FiniteElement<1, spacedim>>
232  clone() const override;
233 
239  virtual std::string
240  get_name() const override;
241 
242  // for documentation, see the FiniteElement base class
243  virtual UpdateFlags
244  requires_update_flags(const UpdateFlags update_flags) const override;
245 
254  virtual void
256  FullMatrix<double> &matrix) const override;
257 
266  virtual void
268  const unsigned int subface,
269  FullMatrix<double> &matrix) const override;
270 
275  virtual bool
276  has_support_on_face(const unsigned int shape_index,
277  const unsigned int face_index) const override;
278 
283  virtual bool
284  hp_constraints_are_implemented() const override;
285 
303  virtual std::vector<std::pair<unsigned int, unsigned int>>
305  const FiniteElement<1, spacedim> &fe_other) const override;
306 
313  virtual std::vector<std::pair<unsigned int, unsigned int>>
315  const FiniteElement<1, spacedim> &fe_other) const override;
316 
323  virtual std::vector<std::pair<unsigned int, unsigned int>>
325  const FiniteElement<1, spacedim> &fe_other) const override;
326 
338  const FiniteElement<1, spacedim> &fe_other) const override;
339 
344  virtual std::pair<Table<2, bool>, std::vector<unsigned int>>
345  get_constant_modes() const override;
346 
347 protected:
348  /*
349  * NOTE: The following functions have their definitions inlined into the class
350  * declaration because we otherwise run into a compiler error with MS Visual
351  * Studio.
352  */
353 
354 
355  virtual std::unique_ptr<typename FiniteElement<1, spacedim>::InternalDataBase>
356  get_data(
357  const UpdateFlags /*update_flags*/,
358  const Mapping<1, spacedim> & /*mapping*/,
359  const Quadrature<1> & /*quadrature*/,
361  spacedim>
362  & /*output_data*/) const override
363  {
364  return std_cxx14::make_unique<
366  }
367 
368  std::unique_ptr<typename FiniteElement<1, spacedim>::InternalDataBase>
370  const UpdateFlags update_flags,
371  const Mapping<1, spacedim> & /*mapping*/,
372  const Quadrature<0> &quadrature,
374  spacedim>
375  & /*output_data*/) const override
376  {
377  // generate a new data object and initialize some fields
378  auto data = std_cxx14::make_unique<
380  data->update_each = requires_update_flags(update_flags);
381 
382  const unsigned int n_q_points = quadrature.size();
383  AssertDimension(n_q_points, 1);
384  (void)n_q_points;
385 
386  // No derivatives of this element are implemented.
387  if (data->update_each & update_gradients ||
388  data->update_each & update_hessians)
389  {
390  Assert(false, ExcNotImplemented());
391  }
392 
393  return std::move(data);
394  }
395 
396  std::unique_ptr<typename FiniteElement<1, spacedim>::InternalDataBase>
398  const UpdateFlags update_flags,
399  const Mapping<1, spacedim> &mapping,
400  const Quadrature<0> & quadrature,
402  spacedim>
403  &output_data) const override
404  {
405  return get_face_data(update_flags, mapping, quadrature, output_data);
406  }
407 
408  virtual void
409  fill_fe_values(
410  const typename Triangulation<1, spacedim>::cell_iterator &cell,
411  const CellSimilarity::Similarity cell_similarity,
412  const Quadrature<1> & quadrature,
413  const Mapping<1, spacedim> & mapping,
414  const typename Mapping<1, spacedim>::InternalDataBase & mapping_internal,
415  const ::internal::FEValuesImplementation::MappingRelatedData<1,
416  spacedim>
417  & mapping_data,
418  const typename FiniteElement<1, spacedim>::InternalDataBase &fe_internal,
420  spacedim>
421  &output_data) const override;
422 
423  virtual void
424  fill_fe_face_values(
425  const typename Triangulation<1, spacedim>::cell_iterator &cell,
426  const unsigned int face_no,
427  const Quadrature<0> & quadrature,
428  const Mapping<1, spacedim> & mapping,
429  const typename Mapping<1, spacedim>::InternalDataBase & mapping_internal,
430  const ::internal::FEValuesImplementation::MappingRelatedData<1,
431  spacedim>
432  & mapping_data,
433  const typename FiniteElement<1, spacedim>::InternalDataBase &fe_internal,
435  spacedim>
436  &output_data) const override;
437 
438  virtual void
439  fill_fe_subface_values(
440  const typename Triangulation<1, spacedim>::cell_iterator &cell,
441  const unsigned int face_no,
442  const unsigned int sub_no,
443  const Quadrature<0> & quadrature,
444  const Mapping<1, spacedim> & mapping,
445  const typename Mapping<1, spacedim>::InternalDataBase & mapping_internal,
446  const ::internal::FEValuesImplementation::MappingRelatedData<1,
447  spacedim>
448  & mapping_data,
449  const typename FiniteElement<1, spacedim>::InternalDataBase &fe_internal,
451  spacedim>
452  &output_data) const override;
453 
454 private:
458  static std::vector<unsigned int>
459  get_dpo_vector(const unsigned int deg);
460 };
461 
462 
463 
488 template <int dim, int spacedim = dim>
489 class FE_FaceP : public FE_PolyFace<PolynomialSpace<dim - 1>, dim, spacedim>
490 {
491 public:
497  FE_FaceP(unsigned int p);
498 
499  virtual std::unique_ptr<FiniteElement<dim, spacedim>>
500  clone() const override;
501 
507  virtual std::string
508  get_name() const override;
509 
518  virtual void
520  FullMatrix<double> &matrix) const override;
521 
530  virtual void
532  const unsigned int subface,
533  FullMatrix<double> &matrix) const override;
534 
539  virtual bool
540  has_support_on_face(const unsigned int shape_index,
541  const unsigned int face_index) const override;
542 
547  virtual bool
548  hp_constraints_are_implemented() const override;
549 
561  const FiniteElement<dim, spacedim> &fe_other) const override;
562 
569  virtual std::pair<Table<2, bool>, std::vector<unsigned int>>
570  get_constant_modes() const override;
571 
572 private:
576  static std::vector<unsigned int>
577  get_dpo_vector(const unsigned int deg);
578 };
579 
580 
581 
586 template <int spacedim>
587 class FE_FaceP<1, spacedim> : public FE_FaceQ<1, spacedim>
588 {
589 public:
593  FE_FaceP(const unsigned int p);
594 
598  std::string
599  get_name() const override;
600 };
601 
602 
603 DEAL_II_NAMESPACE_CLOSE
604 
605 #endif
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
virtual std::pair< Table< 2, bool >, std::vector< unsigned int > > get_constant_modes() const override
Definition: fe_face.cc:476
#define AssertDimension(dim1, dim2)
Definition: exceptions.h:1366
virtual bool has_support_on_face(const unsigned int shape_index, const unsigned int face_index) const override
Definition: fe_face.cc:249
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
Definition: fe_face.cc:122
std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_face_data(const UpdateFlags update_flags, const Mapping< dim, spacedim > &, const Quadrature< dim-1 > &quadrature,::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &) const override
Definition: fe_poly_face.h:102
unsigned int size() const
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_face.cc:293
#define Assert(cond, exc)
Definition: exceptions.h:1227
UpdateFlags
virtual std::unique_ptr< typename FiniteElement< dim, spacedim >::InternalDataBase > get_data(const UpdateFlags, const Mapping< dim, spacedim > &, const Quadrature< dim > &,::internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > &) const override
Definition: fe_poly_face.h:90
Abstract base class for mapping classes.
Definition: dof_tools.h:57
virtual void get_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const override
Definition: fe_face.cc:160
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_face.cc:439
FE_FaceQ(const unsigned int p)
Definition: fe_face.cc:51
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_face.cc:282
virtual std::string get_name() const override
Definition: fe_face.cc:131
Second derivatives of shape functions.
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_face.cc:362
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
Definition: fe_poly_face.h:157
Shape function gradients.
static std::vector< unsigned int > get_dpo_vector(const unsigned int deg)
Definition: fe_face.cc:260
static::ExceptionBase & ExcNotImplemented()
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
Definition: fe_face.cc:147
virtual void convert_generalized_support_point_values_to_dof_values(const std::vector< Vector< double >> &support_point_values, std::vector< double > &nodal_values) const override
Definition: fe_face.cc:487
virtual bool hp_constraints_are_implemented() const override
Definition: fe_face.cc:273