Reference documentation for deal.II version 9.1.0-pre
fe_enriched.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2016 - 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_enriched_h
17 #define dealii_fe_enriched_h
18 
19 #include <deal.II/base/config.h>
20 
21 #include <deal.II/base/function.h>
22 #include <deal.II/base/quadrature.h>
24 
25 #include <deal.II/fe/fe.h>
26 #include <deal.II/fe/fe_nothing.h>
27 #include <deal.II/fe/fe_system.h>
28 #include <deal.II/fe/fe_update_flags.h>
29 
30 #include <numeric>
31 #include <utility>
32 #include <vector>
33 
34 DEAL_II_NAMESPACE_OPEN
35 
210 template <int dim, int spacedim = dim>
211 class FE_Enriched : public FiniteElement<dim, spacedim>
212 {
213 public:
222  const FiniteElement<dim, spacedim> &fe_enriched,
223  const Function<spacedim> * enrichment_function);
224 
236 
284  FE_Enriched(
285  const FiniteElement<dim, spacedim> * fe_base,
286  const std::vector<const FiniteElement<dim, spacedim> *> &fe_enriched,
287  const std::vector<std::vector<std::function<const Function<spacedim> *(
289  &functions);
290 
291 private:
298  FE_Enriched(
299  const std::vector<const FiniteElement<dim, spacedim> *> &fes,
300  const std::vector<unsigned int> & multiplicities,
301  const std::vector<std::vector<std::function<const Function<spacedim> *(
303  &functions);
304 
305 public:
306  virtual std::unique_ptr<FiniteElement<dim, spacedim>>
307  clone() const override;
308 
309  virtual UpdateFlags
310  requires_update_flags(const UpdateFlags update_flags) const override;
311 
315  virtual std::string
316  get_name() const override;
317 
324  virtual const FiniteElement<dim, spacedim> &
325  base_element(const unsigned int index) const override;
326 
335  virtual double
336  shape_value(const unsigned int i, const Point<dim> &p) const override;
337 
349  virtual const FullMatrix<double> &
351  const unsigned int child,
352  const RefinementCase<dim> &refinement_case =
354 
361  virtual const FullMatrix<double> &
363  const unsigned int child,
364  const RefinementCase<dim> &refinement_case =
366 
368 
380  virtual bool
381  hp_constraints_are_implemented() const override;
382 
395  virtual void
397  FullMatrix<double> &matrix) const override;
398 
411  virtual void
413  const unsigned int subface,
414  FullMatrix<double> &matrix) const override;
415 
431  virtual std::vector<std::pair<unsigned int, unsigned int>>
433  const FiniteElement<dim, spacedim> &fe_other) const override;
434 
439  virtual std::vector<std::pair<unsigned int, unsigned int>>
441  const FiniteElement<dim, spacedim> &fe_other) const override;
442 
447  virtual std::vector<std::pair<unsigned int, unsigned int>>
449  const FiniteElement<dim, spacedim> &fe_other) const override;
450 
462  const FiniteElement<dim, spacedim> &fe_other) const override;
464 
465 
469  const std::vector<std::vector<std::function<const Function<spacedim> *(
471  get_enrichments() const;
472 
477  get_fe_system() const;
478 
479 protected:
484  class InternalData : public FiniteElement<dim, spacedim>::InternalDataBase
485  {
486  public:
493  {
494  std::vector<double> values;
495  std::vector<Tensor<1, spacedim>> gradients;
496  std::vector<SymmetricTensor<2, spacedim>> hessians;
497  };
498 
509  InternalData(std::unique_ptr<typename FESystem<dim, spacedim>::InternalData>
510  fesystem_data);
511 
517  get_fe_data(const unsigned int base_no) const;
518 
525  get_fe_output_object(const unsigned int base_no) const;
526 
531  std::unique_ptr<typename FESystem<dim, spacedim>::InternalData>
533 
549  mutable std::vector<std::vector<EnrichmentValues>> enrichment;
550  };
551 
558  std::vector<std::vector<std::vector<unsigned int>>>
560 
568  const std::vector<std::vector<std::function<const Function<spacedim> *(
571 
581  const bool is_enriched;
582 
593  template <int dim_1>
594  std::unique_ptr<typename FiniteElement<dim, spacedim>::InternalDataBase>
595  setup_data(
596  std::unique_ptr<typename FESystem<dim, spacedim>::InternalData> fes_data,
597  const UpdateFlags flags,
598  const Quadrature<dim_1> &quadrature) const;
599 
606  virtual std::unique_ptr<
608  get_data(
609  const UpdateFlags flags,
610  const Mapping<dim, spacedim> &mapping,
611  const Quadrature<dim> & quadrature,
613  spacedim>
614  &output_data) const override;
615 
616  virtual std::unique_ptr<
619  const UpdateFlags update_flags,
620  const Mapping<dim, spacedim> &mapping,
621  const Quadrature<dim - 1> & quadrature,
623  spacedim>
624  &output_data) const override;
625 
626  virtual std::unique_ptr<
629  const UpdateFlags update_flags,
630  const Mapping<dim, spacedim> &mapping,
631  const Quadrature<dim - 1> & quadrature,
633  spacedim>
634  &output_data) const override;
635 
636  virtual void
637  fill_fe_values(
638  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
639  const CellSimilarity::Similarity cell_similarity,
640  const Quadrature<dim> & quadrature,
641  const Mapping<dim, spacedim> & mapping,
642  const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
643  const ::internal::FEValuesImplementation::MappingRelatedData<dim,
644  spacedim>
645  & mapping_data,
646  const typename FiniteElement<dim, spacedim>::InternalDataBase &fe_internal,
648  spacedim>
649  &output_data) const override;
650 
651  virtual void
652  fill_fe_face_values(
653  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
654  const unsigned int face_no,
655  const Quadrature<dim - 1> & quadrature,
656  const Mapping<dim, spacedim> & mapping,
657  const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
658  const ::internal::FEValuesImplementation::MappingRelatedData<dim,
659  spacedim>
660  & mapping_data,
661  const typename FiniteElement<dim, spacedim>::InternalDataBase &fe_internal,
663  spacedim>
664  &output_data) const override;
665 
666  virtual void
667  fill_fe_subface_values(
668  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
669  const unsigned int face_no,
670  const unsigned int sub_no,
671  const Quadrature<dim - 1> & quadrature,
672  const Mapping<dim, spacedim> & mapping,
673  const typename Mapping<dim, spacedim>::InternalDataBase &mapping_internal,
674  const ::internal::FEValuesImplementation::MappingRelatedData<dim,
675  spacedim>
676  & mapping_data,
677  const typename FiniteElement<dim, spacedim>::InternalDataBase &fe_internal,
679  spacedim>
680  &output_data) const override;
681 
682 private:
687  void
688  initialize(const std::vector<const FiniteElement<dim, spacedim> *> &fes,
689  const std::vector<unsigned int> &multiplicities);
690 
694  const std::unique_ptr<const FESystem<dim, spacedim>> fe_system;
695 
701  template <int dim_1>
702  void
704  const Quadrature<dim_1> &quadrature,
705  const InternalData & fe_data,
707  & mapping_data,
708  const typename Triangulation<dim, spacedim>::cell_iterator &cell,
710  &output_data) const;
711 };
712 
713 //}
714 DEAL_II_NAMESPACE_CLOSE
715 
716 #endif // dealii_fe_enriched_h
virtual const FiniteElement< dim, spacedim > & base_element(const unsigned int index) const override
Definition: fe_enriched.cc:504
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_line_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_enriched.cc:941
virtual void get_face_interpolation_matrix(const FiniteElement< dim, spacedim > &source, FullMatrix< double > &matrix) const override
Definition: fe_enriched.cc:877
virtual const FullMatrix< double > & get_restriction_matrix(const unsigned int child, const RefinementCase< dim > &refinement_case=RefinementCase< dim >::isotropic_refinement) const override
InternalData(std::unique_ptr< typename FESystem< dim, spacedim >::InternalData > fesystem_data)
FE_Enriched(const FiniteElement< dim, spacedim > &fe_base, const FiniteElement< dim, spacedim > &fe_enriched, const Function< spacedim > *enrichment_function)
Definition: fe_enriched.cc:145
const std::vector< std::vector< std::function< const Function< spacedim > *(const typename Triangulation< dim, spacedim >::cell_iterator &)> > > get_enrichments() const
Definition: fe_enriched.cc:262
virtual FiniteElementDomination::Domination compare_for_face_domination(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_enriched.cc:977
std::vector< std::vector< EnrichmentValues > > enrichment
Definition: fe_enriched.h:549
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
Definition: fe_enriched.cc:325
const bool is_enriched
Definition: fe_enriched.h:581
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
Definition: fe_enriched.cc:620
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_vertex_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_enriched.cc:923
virtual std::string get_name() const override
Definition: fe_enriched.cc:483
const std::vector< std::vector< std::function< const Function< spacedim > *(const typename Triangulation< dim, spacedim >::cell_iterator &)> > > enrichments
Definition: fe_enriched.h:570
void initialize(const std::vector< const FiniteElement< dim, spacedim > * > &fes, const std::vector< unsigned int > &multiplicities)
Definition: fe_enriched.cc:422
std::unique_ptr< typename FESystem< dim, spacedim >::InternalData > fesystem_data
Definition: fe_enriched.h:532
const std::unique_ptr< const FESystem< dim, spacedim > > fe_system
Definition: fe_enriched.h:694
UpdateFlags
Abstract base class for mapping classes.
Definition: dof_tools.h:57
Definition: fe.h:42
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
Definition: fe_enriched.cc:404
internal::FEValuesImplementation::FiniteElementRelatedData< dim, spacedim > & get_fe_output_object(const unsigned int base_no) const
virtual double shape_value(const unsigned int i, const Point< dim > &p) const override
Definition: fe_enriched.cc:270
virtual UpdateFlags requires_update_flags(const UpdateFlags update_flags) const override
Definition: fe_enriched.cc:301
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_subface_interpolation_matrix(const FiniteElement< dim, spacedim > &source, const unsigned int subface, FullMatrix< double > &matrix) const override
Definition: fe_enriched.cc:899
std::vector< std::vector< std::vector< unsigned int > > > base_no_mult_local_enriched_dofs
Definition: fe_enriched.h:559
virtual std::unique_ptr< FiniteElement< dim, spacedim > > clone() const override
Definition: fe_enriched.cc:283
const FESystem< dim, spacedim > & get_fe_system() const
Definition: fe_enriched.cc:861
virtual std::vector< std::pair< unsigned int, unsigned int > > hp_quad_dof_identities(const FiniteElement< dim, spacedim > &fe_other) const override
Definition: fe_enriched.cc:959
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
Definition: fe_enriched.cc:384
FiniteElement< dim, spacedim >::InternalDataBase & get_fe_data(const unsigned int base_no) const
virtual bool hp_constraints_are_implemented() const override
Definition: fe_enriched.cc:869
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
Definition: fe_enriched.cc:365